From 9c9c52f753a9caf51189ad9e1293476f2384676b Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 15 Jun 2013 16:48:36 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@5858 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- .project | 11 - docs/Doxyfile_chm | 1787 ----------- docs/Doxyfile_html | 1787 ----------- docs/html/logo_small.png | Bin 7697 -> 0 bytes docs/index.html | 8 - docs/readme.txt | 11 - docs/reports/AT91SAM7X-48-ARM.txt | 164 - docs/reports/AT91SAM7X-48-THUMB.txt | 164 - docs/reports/ATmega128-16.txt | 149 - docs/reports/LPC1114-48-GCC.txt | 164 - docs/reports/LPC1114-48-RVCT.txt | 165 - docs/reports/LPC1343-72-GCC.txt | 164 - docs/reports/LPC1343-72-IAR.txt | 165 - docs/reports/LPC1343-72-RVCT.txt | 165 - docs/reports/LPC2148-48-ARM.txt | 164 - docs/reports/LPC2148-48-THUMB.txt | 164 - docs/reports/MSP430F1611-0.75.txt | 164 - docs/reports/MSP430F1611-8.txt | 164 - docs/reports/SPC560B50-64.txt | 164 - docs/reports/SPC560P50-64.txt | 164 - docs/reports/SPC563M64-80.txt | 164 - docs/reports/SPC564A64-150.txt | 164 - docs/reports/SPC56EL60-120.txt | 164 - docs/reports/STM32F051-48-GCC.txt | 164 - docs/reports/STM32F100-24-GCC.txt | 164 - docs/reports/STM32F100-24-IAR.txt | 165 - docs/reports/STM32F100-24-RVCT.txt | 165 - docs/reports/STM32F103-48-GCC.txt | 164 - docs/reports/STM32F103-72-GCC-compact.txt | 164 - docs/reports/STM32F103-72-GCC.txt | 164 - docs/reports/STM32F103-72-IAR-compact.txt | 165 - docs/reports/STM32F103-72-IAR.txt | 165 - docs/reports/STM32F103-72-RVCT-compact.txt | 165 - docs/reports/STM32F103-72-RVCT.txt | 165 - docs/reports/STM32F107-72-GCC.txt | 164 - docs/reports/STM32F303-72-GCC.txt | 164 - docs/reports/STM32F373-72-GCC.txt | 164 - docs/reports/STM32F407-168-GCC-FPU.txt | 164 - docs/reports/STM32F407-168-GCC.txt | 164 - docs/reports/STM32F407-168-IAR.txt | 165 - docs/reports/STM32F407-168-RVCT.txt | 165 - docs/reports/STM32L152-32-GCC.txt | 164 - docs/reports/STM32L152-32-IAR.txt | 165 - docs/reports/STM32L152-32-RVCT.txt | 165 - docs/reports/STM8L152-16-Cosmic.txt | 7 - docs/reports/STM8L152-16-Raisonance.txt | 164 - docs/reports/STM8S105-16-Cosmic.txt | 7 - docs/reports/STM8S105-16-Raisonance.txt | 164 - docs/reports/STM8S208-16-Raisonance.txt | 164 - docs/reports/build.txt | 45 - docs/reports/coverage.txt | 75 - docs/reports/kernel.txt | 216 -- docs/rsc/custom.css | 800 ----- docs/rsc/footer_chm.html | 4 - docs/rsc/footer_html.html | 24 - docs/rsc/header_chm.html | 21 - docs/rsc/header_html.html | 41 - docs/rsc/layout.xml | 184 -- docs/rsc/logo.png | Bin 16818 -> 0 bytes docs/rsc/workspace.eps | 870 ------ docs/rsc/workspace.png | Bin 20994 -> 0 bytes docs/rsc/workspace.svg | 280 -- docs/src/concepts.dox | 410 --- docs/src/main.dox | 65 - documentation.html | 8 - ext/ext.dox | 39 - ext/fatfs-0.9-patched.zip | Bin 681290 -> 0 bytes ext/lwip-1.4.1_patched.zip | Bin 622298 -> 0 bytes ext/readme.txt | 30 - ext/uip-1.0.patches.zip | Bin 21462 -> 0 bytes ext/uip-1.0.tar.gz | Bin 1348599 -> 0 bytes license.txt | 674 ----- readme.txt | 2661 ----------------- testhal/LPC11xx/EXT/Makefile | 194 -- testhal/LPC11xx/EXT/chconf.h | 533 ---- testhal/LPC11xx/EXT/halconf.h | 314 -- testhal/LPC11xx/EXT/main.c | 92 - testhal/LPC11xx/EXT/mcuconf.h | 106 - testhal/LPC11xx/IRQ_STORM/Makefile | 196 -- testhal/LPC11xx/IRQ_STORM/chconf.h | 531 ---- testhal/LPC11xx/IRQ_STORM/halconf.h | 312 -- testhal/LPC11xx/IRQ_STORM/main.c | 324 -- testhal/LPC11xx/IRQ_STORM/mcuconf.h | 79 - testhal/LPC11xx/IRQ_STORM/readme.txt | 25 - testhal/LPC11xx/PWM/Makefile | 194 -- testhal/LPC11xx/PWM/chconf.h | 532 ---- testhal/LPC11xx/PWM/halconf.h | 314 -- testhal/LPC11xx/PWM/main.c | 106 - testhal/LPC11xx/PWM/mcuconf.h | 106 - testhal/LPC122x/EXT/Makefile | 196 -- testhal/LPC122x/EXT/chconf.h | 532 ---- testhal/LPC122x/EXT/halconf.h | 313 -- testhal/LPC122x/EXT/main.c | 111 - testhal/LPC122x/EXT/mcuconf.h | 124 - testhal/LPC122x/IRQ_STORM/Makefile | 196 -- testhal/LPC122x/IRQ_STORM/chconf.h | 531 ---- testhal/LPC122x/IRQ_STORM/halconf.h | 312 -- testhal/LPC122x/IRQ_STORM/main.c | 324 -- testhal/LPC122x/IRQ_STORM/mcuconf.h | 84 - testhal/LPC122x/IRQ_STORM/readme.txt | 25 - testhal/LPC122x/PWM/Makefile | 196 -- testhal/LPC122x/PWM/chconf.h | 532 ---- testhal/LPC122x/PWM/halconf.h | 313 -- testhal/LPC122x/PWM/main.c | 96 - testhal/LPC122x/PWM/mcuconf.h | 124 - testhal/LPC122x/RTC/Makefile | 199 -- testhal/LPC122x/RTC/chconf.h | 532 ---- testhal/LPC122x/RTC/halconf.h | 313 -- testhal/LPC122x/RTC/main.c | 286 -- testhal/LPC122x/RTC/mcuconf.h | 124 - testhal/LPC13xx/IRQ_STORM/Makefile | 197 -- testhal/LPC13xx/IRQ_STORM/chconf.h | 531 ---- testhal/LPC13xx/IRQ_STORM/halconf.h | 312 -- testhal/LPC13xx/IRQ_STORM/main.c | 324 -- testhal/LPC13xx/IRQ_STORM/mcuconf.h | 76 - testhal/LPC13xx/IRQ_STORM/readme.txt | 25 - testhal/SPC560BCxx/CAN/Makefile | 140 - testhal/SPC560BCxx/CAN/chconf.h | 529 ---- testhal/SPC560BCxx/CAN/halconf.h | 371 --- testhal/SPC560BCxx/CAN/main.c | 149 - testhal/SPC560BCxx/CAN/mcuconf.h | 223 -- testhal/SPC560BCxx/CAN/readme.txt | 27 - testhal/SPC560BCxx/ICU-PWM/Makefile | 121 - testhal/SPC560BCxx/ICU-PWM/chconf.h | 536 ---- testhal/SPC560BCxx/ICU-PWM/halconf.h | 367 --- testhal/SPC560BCxx/ICU-PWM/main.c | 151 - testhal/SPC560BCxx/ICU-PWM/mcuconf.h | 242 -- testhal/SPC560BCxx/ICU-PWM/readme.txt | 27 - testhal/SPC560Dxx/SPI/.cproject | 51 - testhal/SPC560Dxx/SPI/.project | 38 - testhal/SPC560Dxx/SPI/Makefile | 168 -- testhal/SPC560Dxx/SPI/UDE/debug .wsx | 273 -- ...pc560b_spc560d40_minimodule_debug_jtag.cfg | 160 - testhal/SPC560Dxx/SPI/chconf.h | 531 ---- testhal/SPC560Dxx/SPI/halconf.h | 312 -- testhal/SPC560Dxx/SPI/main.c | 157 - testhal/SPC560Dxx/SPI/mcuconf.h | 230 -- testhal/SPC560Dxx/SPI/readme.txt | 25 - testhal/SPC560Pxx/CAN/.cproject | 51 - testhal/SPC560Pxx/CAN/.project | 38 - testhal/SPC560Pxx/CAN/Makefile | 140 - testhal/SPC560Pxx/CAN/chconf.h | 529 ---- testhal/SPC560Pxx/CAN/halconf.h | 371 --- testhal/SPC560Pxx/CAN/main.c | 149 - testhal/SPC560Pxx/CAN/mcuconf.h | 190 -- testhal/SPC560Pxx/CAN/readme.txt | 27 - testhal/SPC560Pxx/PWM-ICU/.cproject | 51 - testhal/SPC560Pxx/PWM-ICU/.project | 38 - testhal/SPC560Pxx/PWM-ICU/Makefile | 167 -- testhal/SPC560Pxx/PWM-ICU/chconf.h | 525 ---- testhal/SPC560Pxx/PWM-ICU/halconf.h | 367 --- testhal/SPC560Pxx/PWM-ICU/main.c | 140 - testhal/SPC560Pxx/PWM-ICU/mcuconf.h | 298 -- testhal/SPC560Pxx/PWM-ICU/readme.txt | 27 - testhal/SPC560Pxx/SPI/.cproject | 51 - testhal/SPC560Pxx/SPI/.project | 38 - testhal/SPC560Pxx/SPI/Makefile | 168 -- testhal/SPC560Pxx/SPI/chconf.h | 531 ---- testhal/SPC560Pxx/SPI/halconf.h | 312 -- testhal/SPC560Pxx/SPI/main.c | 157 - testhal/SPC560Pxx/SPI/mcuconf.h | 298 -- testhal/SPC560Pxx/SPI/readme.txt | 25 - testhal/SPC563Mxx/ADC/.cproject | 56 - testhal/SPC563Mxx/ADC/.project | 38 - testhal/SPC563Mxx/ADC/Makefile | 168 -- testhal/SPC563Mxx/ADC/adc_cfg.c | 743 ----- testhal/SPC563Mxx/ADC/adc_cfg.h | 38 - testhal/SPC563Mxx/ADC/chconf.h | 531 ---- testhal/SPC563Mxx/ADC/halconf.h | 312 -- testhal/SPC563Mxx/ADC/main.c | 115 - testhal/SPC563Mxx/ADC/mcuconf.h | 122 - testhal/SPC563Mxx/ADC/readme.txt | 27 - testhal/SPC563Mxx/ICU-PWM/.cproject | 51 - testhal/SPC563Mxx/ICU-PWM/.project | 38 - testhal/SPC563Mxx/ICU-PWM/Makefile | 168 -- testhal/SPC563Mxx/ICU-PWM/chconf.h | 536 ---- testhal/SPC563Mxx/ICU-PWM/halconf.h | 367 --- testhal/SPC563Mxx/ICU-PWM/main.c | 142 - testhal/SPC563Mxx/ICU-PWM/mcuconf.h | 100 - testhal/SPC563Mxx/ICU-PWM/readme.txt | 27 - testhal/SPC563Mxx/SPI/.cproject | 51 - testhal/SPC563Mxx/SPI/.project | 38 - testhal/SPC563Mxx/SPI/Makefile | 168 -- testhal/SPC563Mxx/SPI/chconf.h | 531 ---- testhal/SPC563Mxx/SPI/halconf.h | 312 -- testhal/SPC563Mxx/SPI/main.c | 158 - testhal/SPC563Mxx/SPI/mcuconf.h | 122 - testhal/SPC563Mxx/SPI/readme.txt | 25 - testhal/SPC564Axx/ICU-PWM/Makefile | 121 - testhal/SPC564Axx/ICU-PWM/chconf.h | 536 ---- testhal/SPC564Axx/ICU-PWM/halconf.h | 367 --- testhal/SPC564Axx/ICU-PWM/main.c | 142 - testhal/SPC564Axx/ICU-PWM/mcuconf.h | 108 - testhal/SPC564Axx/ICU-PWM/readme.txt | 27 - testhal/SPC564Axx/SPI/.cproject | 51 - testhal/SPC564Axx/SPI/.project | 38 - testhal/SPC564Axx/SPI/Makefile | 168 -- testhal/SPC564Axx/SPI/chconf.h | 531 ---- testhal/SPC564Axx/SPI/halconf.h | 312 -- testhal/SPC564Axx/SPI/main.c | 158 - testhal/SPC564Axx/SPI/mcuconf.h | 139 - testhal/SPC564Axx/SPI/readme.txt | 25 - testhal/SPC56ELxx/CAN/.cproject | 51 - testhal/SPC56ELxx/CAN/.project | 38 - testhal/SPC56ELxx/CAN/Makefile | 139 - testhal/SPC56ELxx/CAN/chconf.h | 529 ---- testhal/SPC56ELxx/CAN/halconf.h | 371 --- testhal/SPC56ELxx/CAN/main.c | 148 - testhal/SPC56ELxx/CAN/mcuconf.h | 236 -- testhal/SPC56ELxx/CAN/readme.txt | 27 - testhal/SPC56ELxx/PWM-ICU/.cproject | 51 - testhal/SPC56ELxx/PWM-ICU/.project | 38 - testhal/SPC56ELxx/PWM-ICU/Makefile | 167 -- testhal/SPC56ELxx/PWM-ICU/chconf.h | 525 ---- testhal/SPC56ELxx/PWM-ICU/halconf.h | 367 --- testhal/SPC56ELxx/PWM-ICU/main.c | 139 - testhal/SPC56ELxx/PWM-ICU/mcuconf.h | 280 -- testhal/SPC56ELxx/PWM-ICU/readme.txt | 27 - testhal/SPC56ELxx/SPI/.cproject | 51 - testhal/SPC56ELxx/SPI/.project | 38 - testhal/SPC56ELxx/SPI/Makefile | 168 -- testhal/SPC56ELxx/SPI/chconf.h | 531 ---- testhal/SPC56ELxx/SPI/halconf.h | 312 -- testhal/SPC56ELxx/SPI/main.c | 157 - testhal/SPC56ELxx/SPI/mcuconf.h | 280 -- testhal/SPC56ELxx/SPI/readme.txt | 25 - testhal/STM32F0xx/ADC/.cproject | 51 - testhal/STM32F0xx/ADC/.project | 38 - testhal/STM32F0xx/ADC/Makefile | 207 -- testhal/STM32F0xx/ADC/chconf.h | 531 ---- testhal/STM32F0xx/ADC/halconf.h | 312 -- testhal/STM32F0xx/ADC/main.c | 152 - testhal/STM32F0xx/ADC/mcuconf.h | 147 - testhal/STM32F0xx/ADC/readme.txt | 31 - testhal/STM32F0xx/EXT/.cproject | 51 - testhal/STM32F0xx/EXT/.project | 38 - testhal/STM32F0xx/EXT/Makefile | 207 -- testhal/STM32F0xx/EXT/chconf.h | 531 ---- testhal/STM32F0xx/EXT/halconf.h | 312 -- testhal/STM32F0xx/EXT/main.c | 99 - testhal/STM32F0xx/EXT/mcuconf.h | 147 - testhal/STM32F0xx/EXT/readme.txt | 30 - testhal/STM32F0xx/IRQ_STORM/.cproject | 51 - testhal/STM32F0xx/IRQ_STORM/.project | 38 - testhal/STM32F0xx/IRQ_STORM/Makefile | 207 -- testhal/STM32F0xx/IRQ_STORM/chconf.h | 531 ---- testhal/STM32F0xx/IRQ_STORM/halconf.h | 312 -- testhal/STM32F0xx/IRQ_STORM/main.c | 328 -- testhal/STM32F0xx/IRQ_STORM/mcuconf.h | 147 - testhal/STM32F0xx/IRQ_STORM/readme.txt | 31 - testhal/STM32F0xx/PWM-ICU/.cproject | 51 - testhal/STM32F0xx/PWM-ICU/.project | 38 - testhal/STM32F0xx/PWM-ICU/Makefile | 207 -- testhal/STM32F0xx/PWM-ICU/chconf.h | 531 ---- testhal/STM32F0xx/PWM-ICU/halconf.h | 312 -- testhal/STM32F0xx/PWM-ICU/main.c | 143 - testhal/STM32F0xx/PWM-ICU/mcuconf.h | 147 - testhal/STM32F0xx/PWM-ICU/readme.txt | 30 - testhal/STM32F0xx/SPI/.cproject | 51 - testhal/STM32F0xx/SPI/.project | 38 - testhal/STM32F0xx/SPI/Makefile | 207 -- testhal/STM32F0xx/SPI/chconf.h | 531 ---- testhal/STM32F0xx/SPI/halconf.h | 312 -- testhal/STM32F0xx/SPI/main.c | 162 - testhal/STM32F0xx/SPI/mcuconf.h | 147 - testhal/STM32F0xx/SPI/readme.txt | 30 - testhal/STM32F0xx/UART/.cproject | 51 - testhal/STM32F0xx/UART/.project | 38 - testhal/STM32F0xx/UART/Makefile | 207 -- testhal/STM32F0xx/UART/chconf.h | 531 ---- testhal/STM32F0xx/UART/halconf.h | 312 -- testhal/STM32F0xx/UART/main.c | 144 - testhal/STM32F0xx/UART/mcuconf.h | 147 - testhal/STM32F0xx/UART/readme.txt | 31 - testhal/STM32F1xx/ADC/Makefile | 209 -- testhal/STM32F1xx/ADC/chconf.h | 531 ---- testhal/STM32F1xx/ADC/halconf.h | 312 -- testhal/STM32F1xx/ADC/main.c | 157 - testhal/STM32F1xx/ADC/mcuconf.h | 199 -- testhal/STM32F1xx/ADC/readme.txt | 26 - testhal/STM32F1xx/CAN/Makefile | 209 -- testhal/STM32F1xx/CAN/chconf.h | 531 ---- testhal/STM32F1xx/CAN/halconf.h | 312 -- testhal/STM32F1xx/CAN/main.c | 111 - testhal/STM32F1xx/CAN/mcuconf.h | 199 -- testhal/STM32F1xx/CAN/readme.txt | 26 - testhal/STM32F1xx/EXT/Makefile | 208 -- testhal/STM32F1xx/EXT/chconf.h | 531 ---- testhal/STM32F1xx/EXT/halconf.h | 312 -- testhal/STM32F1xx/EXT/main.c | 99 - testhal/STM32F1xx/EXT/mcuconf.h | 199 -- testhal/STM32F1xx/EXT/readme.txt | 26 - testhal/STM32F1xx/GPT/Makefile | 209 -- testhal/STM32F1xx/GPT/chconf.h | 531 ---- testhal/STM32F1xx/GPT/halconf.h | 312 -- testhal/STM32F1xx/GPT/main.c | 93 - testhal/STM32F1xx/GPT/mcuconf.h | 199 -- testhal/STM32F1xx/GPT/readme.txt | 26 - testhal/STM32F1xx/I2C/Makefile | 220 -- testhal/STM32F1xx/I2C/chconf.h | 505 ---- testhal/STM32F1xx/I2C/fake.c | 61 - testhal/STM32F1xx/I2C/fake.h | 22 - testhal/STM32F1xx/I2C/halconf.h | 312 -- testhal/STM32F1xx/I2C/i2c_pns.c | 47 - testhal/STM32F1xx/I2C/i2c_pns.h | 24 - testhal/STM32F1xx/I2C/lis3.c | 91 - testhal/STM32F1xx/I2C/lis3.h | 44 - testhal/STM32F1xx/I2C/main.c | 135 - testhal/STM32F1xx/I2C/mcuconf.h | 199 -- testhal/STM32F1xx/I2C/tmp75.c | 60 - testhal/STM32F1xx/I2C/tmp75.h | 29 - testhal/STM32F1xx/IRQ_STORM/Makefile | 209 -- testhal/STM32F1xx/IRQ_STORM/chconf.h | 531 ---- testhal/STM32F1xx/IRQ_STORM/halconf.h | 312 -- testhal/STM32F1xx/IRQ_STORM/main.c | 326 -- testhal/STM32F1xx/IRQ_STORM/mcuconf.h | 199 -- testhal/STM32F1xx/IRQ_STORM/readme.txt | 31 - testhal/STM32F1xx/PWM-ICU/Makefile | 209 -- testhal/STM32F1xx/PWM-ICU/chconf.h | 531 ---- testhal/STM32F1xx/PWM-ICU/halconf.h | 312 -- testhal/STM32F1xx/PWM-ICU/main.c | 139 - testhal/STM32F1xx/PWM-ICU/mcuconf.h | 199 -- testhal/STM32F1xx/PWM-ICU/readme.txt | 28 - testhal/STM32F1xx/RTC/Makefile | 211 -- testhal/STM32F1xx/RTC/chconf.h | 505 ---- testhal/STM32F1xx/RTC/halconf.h | 312 -- testhal/STM32F1xx/RTC/main.c | 118 - testhal/STM32F1xx/RTC/mcuconf.h | 199 -- testhal/STM32F1xx/RTC_FATTIME/Makefile | 213 -- testhal/STM32F1xx/RTC_FATTIME/chconf.h | 531 ---- testhal/STM32F1xx/RTC_FATTIME/ffconf.h | 193 -- testhal/STM32F1xx/RTC_FATTIME/halconf.h | 312 -- testhal/STM32F1xx/RTC_FATTIME/main.c | 570 ---- testhal/STM32F1xx/RTC_FATTIME/mcuconf.h | 199 -- testhal/STM32F1xx/RTC_FATTIME/readme.txt | 26 - testhal/STM32F1xx/SDC/Makefile | 212 -- testhal/STM32F1xx/SDC/chconf.h | 531 ---- testhal/STM32F1xx/SDC/halconf.h | 312 -- testhal/STM32F1xx/SDC/main.c | 109 - testhal/STM32F1xx/SDC/mcuconf.h | 199 -- testhal/STM32F1xx/SDC/readme.txt | 26 - testhal/STM32F1xx/SPI/Makefile | 209 -- testhal/STM32F1xx/SPI/chconf.h | 531 ---- testhal/STM32F1xx/SPI/halconf.h | 312 -- testhal/STM32F1xx/SPI/main.c | 134 - testhal/STM32F1xx/SPI/mcuconf.h | 199 -- testhal/STM32F1xx/SPI/readme.txt | 26 - testhal/STM32F1xx/UART/Makefile | 209 -- testhal/STM32F1xx/UART/chconf.h | 531 ---- testhal/STM32F1xx/UART/halconf.h | 312 -- testhal/STM32F1xx/UART/main.c | 143 - testhal/STM32F1xx/UART/mcuconf.h | 199 -- testhal/STM32F1xx/UART/readme.txt | 26 - testhal/STM32F1xx/USB_CDC/Makefile | 209 -- testhal/STM32F1xx/USB_CDC/chconf.h | 531 ---- testhal/STM32F1xx/USB_CDC/halconf.h | 312 -- testhal/STM32F1xx/USB_CDC/main.c | 509 ---- testhal/STM32F1xx/USB_CDC/mcuconf.h | 199 -- testhal/STM32F1xx/USB_CDC/readme.txt | 26 - testhal/STM32F1xx/USB_CDC_F107/.cproject | 50 - testhal/STM32F1xx/USB_CDC_F107/.project | 95 - testhal/STM32F1xx/USB_CDC_F107/Makefile | 209 -- testhal/STM32F1xx/USB_CDC_F107/chconf.h | 531 ---- testhal/STM32F1xx/USB_CDC_F107/halconf.h | 312 -- testhal/STM32F1xx/USB_CDC_F107/main.c | 509 ---- testhal/STM32F1xx/USB_CDC_F107/mcuconf.h | 207 -- testhal/STM32F1xx/USB_CDC_F107/readme.txt | 26 - testhal/STM32F1xx/USB_MSC/Makefile | 210 -- testhal/STM32F1xx/USB_MSC/chconf.h | 531 ---- testhal/STM32F1xx/USB_MSC/halconf.h | 312 -- testhal/STM32F1xx/USB_MSC/main.c | 313 -- testhal/STM32F1xx/USB_MSC/mcuconf.h | 199 -- testhal/STM32F30x/ADC/.cproject | 50 - testhal/STM32F30x/ADC/.project | 90 - testhal/STM32F30x/ADC/Makefile | 221 -- testhal/STM32F30x/ADC/chconf.h | 531 ---- testhal/STM32F30x/ADC/halconf.h | 312 -- testhal/STM32F30x/ADC/main.c | 172 -- testhal/STM32F30x/ADC/mcuconf.h | 212 -- testhal/STM32F30x/ADC/readme.txt | 30 - testhal/STM32F30x/ADC_DUAL/.cproject | 50 - testhal/STM32F30x/ADC_DUAL/.project | 90 - testhal/STM32F30x/ADC_DUAL/Makefile | 221 -- testhal/STM32F30x/ADC_DUAL/chconf.h | 531 ---- testhal/STM32F30x/ADC_DUAL/halconf.h | 312 -- testhal/STM32F30x/ADC_DUAL/main.c | 196 -- testhal/STM32F30x/ADC_DUAL/mcuconf.h | 212 -- testhal/STM32F30x/ADC_DUAL/readme.txt | 30 - testhal/STM32F30x/CAN/.cproject | 51 - testhal/STM32F30x/CAN/.project | 90 - testhal/STM32F30x/CAN/Makefile | 221 -- testhal/STM32F30x/CAN/chconf.h | 531 ---- testhal/STM32F30x/CAN/halconf.h | 312 -- testhal/STM32F30x/CAN/main.c | 109 - testhal/STM32F30x/CAN/mcuconf.h | 212 -- testhal/STM32F30x/CAN/readme.txt | 26 - testhal/STM32F30x/EXT/.cproject | 50 - testhal/STM32F30x/EXT/.project | 90 - testhal/STM32F30x/EXT/Makefile | 221 -- testhal/STM32F30x/EXT/chconf.h | 531 ---- testhal/STM32F30x/EXT/halconf.h | 312 -- testhal/STM32F30x/EXT/main.c | 101 - testhal/STM32F30x/EXT/mcuconf.h | 212 -- testhal/STM32F30x/EXT/readme.txt | 30 - testhal/STM32F30x/IRQ_STORM/.cproject | 51 - testhal/STM32F30x/IRQ_STORM/.project | 38 - testhal/STM32F30x/IRQ_STORM/Makefile | 221 -- testhal/STM32F30x/IRQ_STORM/chconf.h | 533 ---- testhal/STM32F30x/IRQ_STORM/halconf.h | 312 -- testhal/STM32F30x/IRQ_STORM/main.c | 331 -- testhal/STM32F30x/IRQ_STORM/mcuconf.h | 212 -- testhal/STM32F30x/IRQ_STORM/readme.txt | 32 - testhal/STM32F30x/PWM-ICU/.cproject | 51 - testhal/STM32F30x/PWM-ICU/.project | 38 - testhal/STM32F30x/PWM-ICU/Makefile | 221 -- testhal/STM32F30x/PWM-ICU/chconf.h | 531 ---- testhal/STM32F30x/PWM-ICU/halconf.h | 312 -- testhal/STM32F30x/PWM-ICU/main.c | 138 - testhal/STM32F30x/PWM-ICU/mcuconf.h | 212 -- testhal/STM32F30x/PWM-ICU/readme.txt | 30 - testhal/STM32F30x/SPI/.cproject | 51 - testhal/STM32F30x/SPI/.project | 90 - testhal/STM32F30x/SPI/Makefile | 221 -- testhal/STM32F30x/SPI/chconf.h | 531 ---- testhal/STM32F30x/SPI/halconf.h | 312 -- testhal/STM32F30x/SPI/main.c | 162 - testhal/STM32F30x/SPI/mcuconf.h | 212 -- testhal/STM32F30x/SPI/readme.txt | 30 - testhal/STM32F30x/UART/.cproject | 50 - testhal/STM32F30x/UART/.project | 90 - testhal/STM32F30x/UART/Makefile | 221 -- testhal/STM32F30x/UART/chconf.h | 531 ---- testhal/STM32F30x/UART/halconf.h | 312 -- testhal/STM32F30x/UART/main.c | 144 - testhal/STM32F30x/UART/mcuconf.h | 212 -- testhal/STM32F30x/UART/readme.txt | 31 - testhal/STM32F30x/USB_CDC/.cproject | 51 - testhal/STM32F30x/USB_CDC/.project | 43 - testhal/STM32F30x/USB_CDC/Makefile | 222 -- testhal/STM32F30x/USB_CDC/chconf.h | 531 ---- testhal/STM32F30x/USB_CDC/halconf.h | 312 -- testhal/STM32F30x/USB_CDC/main.c | 516 ---- testhal/STM32F30x/USB_CDC/mcuconf.h | 212 -- testhal/STM32F30x/USB_CDC/readme.txt | 26 - testhal/STM32F37x/ADC/.cproject | 51 - testhal/STM32F37x/ADC/.project | 38 - testhal/STM32F37x/ADC/Makefile | 220 -- testhal/STM32F37x/ADC/chconf.h | 531 ---- testhal/STM32F37x/ADC/halconf.h | 312 -- testhal/STM32F37x/ADC/main.c | 172 -- testhal/STM32F37x/ADC/mcuconf.h | 209 -- testhal/STM32F37x/ADC/readme.txt | 31 - testhal/STM32F37x/CAN/.cproject | 51 - testhal/STM32F37x/CAN/.project | 38 - testhal/STM32F37x/CAN/Makefile | 221 -- testhal/STM32F37x/CAN/chconf.h | 531 ---- testhal/STM32F37x/CAN/halconf.h | 312 -- testhal/STM32F37x/CAN/main.c | 109 - testhal/STM32F37x/CAN/mcuconf.h | 208 -- testhal/STM32F37x/CAN/readme.txt | 26 - testhal/STM32F37x/EXT/.cproject | 51 - testhal/STM32F37x/EXT/.project | 38 - testhal/STM32F37x/EXT/Makefile | 221 -- testhal/STM32F37x/EXT/chconf.h | 531 ---- testhal/STM32F37x/EXT/halconf.h | 312 -- testhal/STM32F37x/EXT/main.c | 101 - testhal/STM32F37x/EXT/mcuconf.h | 208 -- testhal/STM32F37x/EXT/readme.txt | 30 - testhal/STM32F37x/I2C/.cproject | 51 - testhal/STM32F37x/I2C/.project | 38 - testhal/STM32F37x/I2C/Makefile | 221 -- testhal/STM32F37x/I2C/chconf.h | 531 ---- testhal/STM32F37x/I2C/halconf.h | 312 -- testhal/STM32F37x/I2C/main.c | 110 - testhal/STM32F37x/I2C/mcuconf.h | 208 -- testhal/STM32F37x/I2C/readme.txt | 30 - testhal/STM32F37x/IRQ_STORM/.cproject | 51 - testhal/STM32F37x/IRQ_STORM/.project | 38 - testhal/STM32F37x/IRQ_STORM/Makefile | 221 -- testhal/STM32F37x/IRQ_STORM/chconf.h | 533 ---- testhal/STM32F37x/IRQ_STORM/halconf.h | 312 -- testhal/STM32F37x/IRQ_STORM/main.c | 330 -- testhal/STM32F37x/IRQ_STORM/mcuconf.h | 208 -- testhal/STM32F37x/IRQ_STORM/readme.txt | 31 - testhal/STM32F37x/PWM-ICU/.cproject | 51 - testhal/STM32F37x/PWM-ICU/.project | 38 - testhal/STM32F37x/PWM-ICU/Makefile | 221 -- testhal/STM32F37x/PWM-ICU/chconf.h | 531 ---- testhal/STM32F37x/PWM-ICU/halconf.h | 312 -- testhal/STM32F37x/PWM-ICU/main.c | 136 - testhal/STM32F37x/PWM-ICU/mcuconf.h | 208 -- testhal/STM32F37x/PWM-ICU/readme.txt | 30 - testhal/STM32F37x/SDADC/.cproject | 51 - testhal/STM32F37x/SDADC/.project | 38 - testhal/STM32F37x/SDADC/Makefile | 221 -- testhal/STM32F37x/SDADC/chconf.h | 531 ---- testhal/STM32F37x/SDADC/halconf.h | 312 -- testhal/STM32F37x/SDADC/main.c | 164 - testhal/STM32F37x/SDADC/mcuconf.h | 208 -- testhal/STM32F37x/SDADC/readme.txt | 31 - testhal/STM32F37x/SPI/.cproject | 51 - testhal/STM32F37x/SPI/.project | 38 - testhal/STM32F37x/SPI/Makefile | 221 -- testhal/STM32F37x/SPI/chconf.h | 531 ---- testhal/STM32F37x/SPI/halconf.h | 312 -- testhal/STM32F37x/SPI/main.c | 158 - testhal/STM32F37x/SPI/mcuconf.h | 208 -- testhal/STM32F37x/SPI/readme.txt | 30 - testhal/STM32F37x/UART/.cproject | 51 - testhal/STM32F37x/UART/.project | 38 - testhal/STM32F37x/UART/Makefile | 221 -- testhal/STM32F37x/UART/chconf.h | 531 ---- testhal/STM32F37x/UART/halconf.h | 312 -- testhal/STM32F37x/UART/main.c | 142 - testhal/STM32F37x/UART/mcuconf.h | 208 -- testhal/STM32F37x/UART/readme.txt | 31 - testhal/STM32F37x/USB_CDC/.cproject | 51 - testhal/STM32F37x/USB_CDC/.project | 43 - testhal/STM32F37x/USB_CDC/Makefile | 223 -- testhal/STM32F37x/USB_CDC/chconf.h | 531 ---- testhal/STM32F37x/USB_CDC/halconf.h | 312 -- testhal/STM32F37x/USB_CDC/main.c | 515 ---- testhal/STM32F37x/USB_CDC/mcuconf.h | 208 -- testhal/STM32F37x/USB_CDC/readme.txt | 26 - testhal/STM32F4xx/ADC/.cproject | 51 - testhal/STM32F4xx/ADC/.project | 38 - testhal/STM32F4xx/ADC/Makefile | 222 -- testhal/STM32F4xx/ADC/chconf.h | 531 ---- testhal/STM32F4xx/ADC/halconf.h | 312 -- testhal/STM32F4xx/ADC/main.c | 160 - testhal/STM32F4xx/ADC/mcuconf.h | 278 -- testhal/STM32F4xx/ADC/readme.txt | 30 - testhal/STM32F4xx/CAN/.cproject | 51 - testhal/STM32F4xx/CAN/.project | 90 - testhal/STM32F4xx/CAN/Makefile | 221 -- testhal/STM32F4xx/CAN/chconf.h | 531 ---- testhal/STM32F4xx/CAN/halconf.h | 312 -- testhal/STM32F4xx/CAN/main.c | 127 - testhal/STM32F4xx/CAN/mcuconf.h | 278 -- testhal/STM32F4xx/CAN/readme.txt | 26 - testhal/STM32F4xx/DMA_STORM/.cproject | 51 - testhal/STM32F4xx/DMA_STORM/.project | 38 - testhal/STM32F4xx/DMA_STORM/Makefile | 222 -- testhal/STM32F4xx/DMA_STORM/chconf.h | 531 ---- testhal/STM32F4xx/DMA_STORM/halconf.h | 312 -- testhal/STM32F4xx/DMA_STORM/main.c | 229 -- testhal/STM32F4xx/DMA_STORM/mcuconf.h | 278 -- testhal/STM32F4xx/EXT/.cproject | 51 - testhal/STM32F4xx/EXT/.project | 38 - testhal/STM32F4xx/EXT/Makefile | 222 -- testhal/STM32F4xx/EXT/chconf.h | 531 ---- testhal/STM32F4xx/EXT/halconf.h | 312 -- testhal/STM32F4xx/EXT/main.c | 101 - testhal/STM32F4xx/EXT/mcuconf.h | 278 -- testhal/STM32F4xx/EXT/readme.txt | 30 - testhal/STM32F4xx/GPT/.cproject | 51 - testhal/STM32F4xx/GPT/.project | 38 - testhal/STM32F4xx/GPT/Makefile | 222 -- testhal/STM32F4xx/GPT/chconf.h | 531 ---- testhal/STM32F4xx/GPT/halconf.h | 312 -- testhal/STM32F4xx/GPT/main.c | 94 - testhal/STM32F4xx/GPT/mcuconf.h | 278 -- testhal/STM32F4xx/GPT/readme.txt | 30 - testhal/STM32F4xx/I2C/.cproject | 51 - testhal/STM32F4xx/I2C/.project | 38 - testhal/STM32F4xx/I2C/Makefile | 222 -- testhal/STM32F4xx/I2C/chconf.h | 508 ---- testhal/STM32F4xx/I2C/halconf.h | 312 -- testhal/STM32F4xx/I2C/main.c | 181 -- testhal/STM32F4xx/I2C/mcuconf.h | 278 -- testhal/STM32F4xx/IRQ_STORM/.cproject | 51 - testhal/STM32F4xx/IRQ_STORM/.project | 38 - testhal/STM32F4xx/IRQ_STORM/Makefile | 222 -- testhal/STM32F4xx/IRQ_STORM/chconf.h | 533 ---- testhal/STM32F4xx/IRQ_STORM/halconf.h | 312 -- testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp | 2289 -------------- testhal/STM32F4xx/IRQ_STORM/iar/ch.eww | 10 - testhal/STM32F4xx/IRQ_STORM/iar/ch.icf | 39 - testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj | 945 ------ testhal/STM32F4xx/IRQ_STORM/main.c | 327 -- testhal/STM32F4xx/IRQ_STORM/mcuconf.h | 278 -- testhal/STM32F4xx/IRQ_STORM/readme.txt | 31 - testhal/STM32F4xx/IRQ_STORM_FPU/.cproject | 51 - testhal/STM32F4xx/IRQ_STORM_FPU/.project | 38 - testhal/STM32F4xx/IRQ_STORM_FPU/Makefile | 222 -- testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h | 531 ---- testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c | 23 - testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h | 312 -- testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp | 2292 -------------- testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww | 10 - testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf | 39 - .../STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj | 945 ------ testhal/STM32F4xx/IRQ_STORM_FPU/main.c | 300 -- testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h | 278 -- testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt | 30 - testhal/STM32F4xx/PWM-ICU/.cproject | 51 - testhal/STM32F4xx/PWM-ICU/.project | 38 - testhal/STM32F4xx/PWM-ICU/Makefile | 222 -- testhal/STM32F4xx/PWM-ICU/chconf.h | 531 ---- testhal/STM32F4xx/PWM-ICU/halconf.h | 312 -- testhal/STM32F4xx/PWM-ICU/main.c | 138 - testhal/STM32F4xx/PWM-ICU/mcuconf.h | 278 -- testhal/STM32F4xx/PWM-ICU/readme.txt | 30 - testhal/STM32F4xx/RTC/.cproject | 51 - testhal/STM32F4xx/RTC/.project | 38 - testhal/STM32F4xx/RTC/Makefile | 226 -- testhal/STM32F4xx/RTC/chconf.h | 508 ---- testhal/STM32F4xx/RTC/halconf.h | 312 -- testhal/STM32F4xx/RTC/main.c | 239 -- testhal/STM32F4xx/RTC/mcuconf.h | 278 -- testhal/STM32F4xx/RTC_FATTIME/Makefile | 217 -- testhal/STM32F4xx/RTC_FATTIME/chconf.h | 534 ---- testhal/STM32F4xx/RTC_FATTIME/ffconf.h | 193 -- testhal/STM32F4xx/RTC_FATTIME/halconf.h | 319 -- testhal/STM32F4xx/RTC_FATTIME/main.c | 218 -- testhal/STM32F4xx/RTC_FATTIME/mcuconf.h | 278 -- testhal/STM32F4xx/RTC_FATTIME/readme.txt | 27 - testhal/STM32F4xx/SDC/.cproject | 51 - testhal/STM32F4xx/SDC/.project | 43 - testhal/STM32F4xx/SDC/Makefile | 230 -- testhal/STM32F4xx/SDC/chconf.h | 534 ---- testhal/STM32F4xx/SDC/csd.txt | 7 - testhal/STM32F4xx/SDC/ffconf.h | 193 -- testhal/STM32F4xx/SDC/halconf.h | 319 -- testhal/STM32F4xx/SDC/main.c | 382 --- testhal/STM32F4xx/SDC/mcuconf.h | 278 -- testhal/STM32F4xx/SDC/readme.txt | 26 - testhal/STM32F4xx/SPI/.cproject | 51 - testhal/STM32F4xx/SPI/.project | 38 - testhal/STM32F4xx/SPI/Makefile | 222 -- testhal/STM32F4xx/SPI/chconf.h | 531 ---- testhal/STM32F4xx/SPI/halconf.h | 312 -- testhal/STM32F4xx/SPI/main.c | 138 - testhal/STM32F4xx/SPI/mcuconf.h | 278 -- testhal/STM32F4xx/SPI/readme.txt | 30 - testhal/STM32F4xx/UART/.cproject | 56 - testhal/STM32F4xx/UART/.project | 38 - testhal/STM32F4xx/UART/Makefile | 222 -- testhal/STM32F4xx/UART/chconf.h | 531 ---- testhal/STM32F4xx/UART/halconf.h | 312 -- testhal/STM32F4xx/UART/main.c | 163 - testhal/STM32F4xx/UART/mcuconf.h | 278 -- testhal/STM32F4xx/UART/readme.txt | 31 - testhal/STM32F4xx/USB_CDC/.cproject | 51 - testhal/STM32F4xx/USB_CDC/.project | 43 - testhal/STM32F4xx/USB_CDC/Makefile | 223 -- testhal/STM32F4xx/USB_CDC/chconf.h | 531 ---- testhal/STM32F4xx/USB_CDC/halconf.h | 312 -- testhal/STM32F4xx/USB_CDC/main.c | 522 ---- testhal/STM32F4xx/USB_CDC/mcuconf.h | 278 -- testhal/STM32F4xx/USB_CDC/readme.txt | 26 - testhal/STM32L1xx/ADC/.cproject | 51 - testhal/STM32L1xx/ADC/.project | 38 - testhal/STM32L1xx/ADC/Makefile | 207 -- testhal/STM32L1xx/ADC/chconf.h | 531 ---- testhal/STM32L1xx/ADC/halconf.h | 312 -- testhal/STM32L1xx/ADC/main.c | 163 - testhal/STM32L1xx/ADC/mcuconf.h | 171 -- testhal/STM32L1xx/ADC/readme.txt | 31 - testhal/STM32L1xx/EXT/.cproject | 51 - testhal/STM32L1xx/EXT/.project | 38 - testhal/STM32L1xx/EXT/Makefile | 207 -- testhal/STM32L1xx/EXT/chconf.h | 531 ---- testhal/STM32L1xx/EXT/halconf.h | 312 -- testhal/STM32L1xx/EXT/main.c | 99 - testhal/STM32L1xx/EXT/mcuconf.h | 171 -- testhal/STM32L1xx/EXT/readme.txt | 30 - testhal/STM32L1xx/IRQ_STORM/.cproject | 51 - testhal/STM32L1xx/IRQ_STORM/.project | 38 - testhal/STM32L1xx/IRQ_STORM/Makefile | 207 -- testhal/STM32L1xx/IRQ_STORM/chconf.h | 531 ---- testhal/STM32L1xx/IRQ_STORM/halconf.h | 312 -- testhal/STM32L1xx/IRQ_STORM/main.c | 328 -- testhal/STM32L1xx/IRQ_STORM/mcuconf.h | 171 -- testhal/STM32L1xx/IRQ_STORM/readme.txt | 31 - testhal/STM32L1xx/PWM-ICU/.cproject | 51 - testhal/STM32L1xx/PWM-ICU/.project | 38 - testhal/STM32L1xx/PWM-ICU/Makefile | 207 -- testhal/STM32L1xx/PWM-ICU/chconf.h | 531 ---- testhal/STM32L1xx/PWM-ICU/halconf.h | 312 -- testhal/STM32L1xx/PWM-ICU/main.c | 138 - testhal/STM32L1xx/PWM-ICU/mcuconf.h | 171 -- testhal/STM32L1xx/PWM-ICU/readme.txt | 31 - testhal/STM32L1xx/SPI/.cproject | 51 - testhal/STM32L1xx/SPI/.project | 38 - testhal/STM32L1xx/SPI/Makefile | 207 -- testhal/STM32L1xx/SPI/chconf.h | 531 ---- testhal/STM32L1xx/SPI/halconf.h | 312 -- testhal/STM32L1xx/SPI/main.c | 137 - testhal/STM32L1xx/SPI/mcuconf.h | 171 -- testhal/STM32L1xx/SPI/readme.txt | 31 - testhal/STM32L1xx/UART/.cproject | 51 - testhal/STM32L1xx/UART/.project | 38 - testhal/STM32L1xx/UART/Makefile | 207 -- testhal/STM32L1xx/UART/chconf.h | 531 ---- testhal/STM32L1xx/UART/halconf.h | 312 -- testhal/STM32L1xx/UART/main.c | 144 - testhal/STM32L1xx/UART/mcuconf.h | 171 -- testhal/STM32L1xx/UART/readme.txt | 32 - testhal/STM8S/SPI/ChibiOS-RT.stw | 16 - testhal/STM8S/SPI/cosmic/cosmic.stp | 1947 ------------ testhal/STM8S/SPI/cosmic/vectors.c | 103 - testhal/STM8S/SPI/demo/chconf.h | 531 ---- testhal/STM8S/SPI/demo/halconf.h | 312 -- testhal/STM8S/SPI/demo/main.c | 87 - testhal/STM8S/SPI/demo/mcuconf.h | 47 - testhal/STM8S/SPI/raisonance/raisonance.stp | 1963 ------------ testhal/common/testbuild/.cproject | 51 - testhal/common/testbuild/.project | 33 - testhal/common/testbuild/Makefile | 221 -- testhal/common/testbuild/board.h | 40 - testhal/common/testbuild/chconf.h | 531 ---- testhal/common/testbuild/main.c | 29 - todo.txt | 91 - .../FMPP Builder (Linux).launch | 10 - .../FMPP Builder (Windows).launch | 10 - tools/gencfg/.project | 39 - tools/gencfg/config.fmpp | 10 - tools/gencfg/fmpp.sh | 7 - tools/gencfg/lib/libcode.ftl | 316 -- tools/gencfg/lib/liblicense.ftl | 58 - tools/gencfg/lib/libstm32f4xx.ftl | 144 - tools/gencfg/lib/libutils.ftl | 109 - .../processors/boards/stm32f4xx/config.fmpp | 5 - .../boards/stm32f4xx/templates/board.c.ftl | 139 - .../boards/stm32f4xx/templates/board.h.ftl | 327 -- .../boards/stm32f4xx/templates/board.mk.ftl | 28 - .../processors/hal/stm32f4xx/config.fmpp | 5 - .../hal/stm32f4xx/templates/hal_cfg.c.ftl | 66 - .../hal/stm32f4xx/templates/hal_cfg.h.ftl | 72 - tools/gencfg/processors/processors.xml | 14 - tools/gencfg/readme.txt | 14 - tools/gencfg/run.bat | 1 - tools/gencfg/schema/boards/abstract_board.xsd | 68 - .../gencfg/schema/boards/stm32f4xx_board.xsd | 89 - tools/gencfg/schema/common/doc.xsd | 108 - .../schema/common/stm32/stm32_gpiov2_port.xsd | 214 -- tools/gencfg/schema/hal/abstract_adc_cfg.xsd | 51 - tools/gencfg/schema/hal/abstract_cfg.xsd | 344 --- .../gencfg/schema/hal/abstract_driver_cfg.xsd | 12 - .../hal/stm32f4xx/stm32f4xx_adc_cfg.xsd | 432 --- .../schema/hal/stm32f4xx/stm32f4xx_cfg.xsd | 29 - tools/gencfg/xml/stm32f0board.xml | 665 ---- tools/gencfg/xml/stm32f4board.xml | 1190 -------- tools/gencfg/xml/stm32f4xx_cfg.xml | 52 - 745 files changed, 164123 deletions(-) delete mode 100644 .project delete mode 100644 docs/Doxyfile_chm delete mode 100644 docs/Doxyfile_html delete mode 100644 docs/html/logo_small.png delete mode 100644 docs/index.html delete mode 100644 docs/readme.txt delete mode 100644 docs/reports/AT91SAM7X-48-ARM.txt delete mode 100644 docs/reports/AT91SAM7X-48-THUMB.txt delete mode 100644 docs/reports/ATmega128-16.txt delete mode 100644 docs/reports/LPC1114-48-GCC.txt delete mode 100644 docs/reports/LPC1114-48-RVCT.txt delete mode 100644 docs/reports/LPC1343-72-GCC.txt delete mode 100644 docs/reports/LPC1343-72-IAR.txt delete mode 100644 docs/reports/LPC1343-72-RVCT.txt delete mode 100644 docs/reports/LPC2148-48-ARM.txt delete mode 100644 docs/reports/LPC2148-48-THUMB.txt delete mode 100644 docs/reports/MSP430F1611-0.75.txt delete mode 100644 docs/reports/MSP430F1611-8.txt delete mode 100644 docs/reports/SPC560B50-64.txt delete mode 100644 docs/reports/SPC560P50-64.txt delete mode 100644 docs/reports/SPC563M64-80.txt delete mode 100644 docs/reports/SPC564A64-150.txt delete mode 100644 docs/reports/SPC56EL60-120.txt delete mode 100644 docs/reports/STM32F051-48-GCC.txt delete mode 100644 docs/reports/STM32F100-24-GCC.txt delete mode 100644 docs/reports/STM32F100-24-IAR.txt delete mode 100644 docs/reports/STM32F100-24-RVCT.txt delete mode 100644 docs/reports/STM32F103-48-GCC.txt delete mode 100644 docs/reports/STM32F103-72-GCC-compact.txt delete mode 100644 docs/reports/STM32F103-72-GCC.txt delete mode 100644 docs/reports/STM32F103-72-IAR-compact.txt delete mode 100644 docs/reports/STM32F103-72-IAR.txt delete mode 100644 docs/reports/STM32F103-72-RVCT-compact.txt delete mode 100644 docs/reports/STM32F103-72-RVCT.txt delete mode 100644 docs/reports/STM32F107-72-GCC.txt delete mode 100644 docs/reports/STM32F303-72-GCC.txt delete mode 100644 docs/reports/STM32F373-72-GCC.txt delete mode 100644 docs/reports/STM32F407-168-GCC-FPU.txt delete mode 100644 docs/reports/STM32F407-168-GCC.txt delete mode 100644 docs/reports/STM32F407-168-IAR.txt delete mode 100644 docs/reports/STM32F407-168-RVCT.txt delete mode 100644 docs/reports/STM32L152-32-GCC.txt delete mode 100644 docs/reports/STM32L152-32-IAR.txt delete mode 100644 docs/reports/STM32L152-32-RVCT.txt delete mode 100644 docs/reports/STM8L152-16-Cosmic.txt delete mode 100644 docs/reports/STM8L152-16-Raisonance.txt delete mode 100644 docs/reports/STM8S105-16-Cosmic.txt delete mode 100644 docs/reports/STM8S105-16-Raisonance.txt delete mode 100644 docs/reports/STM8S208-16-Raisonance.txt delete mode 100644 docs/reports/build.txt delete mode 100644 docs/reports/coverage.txt delete mode 100644 docs/reports/kernel.txt delete mode 100644 docs/rsc/custom.css delete mode 100644 docs/rsc/footer_chm.html delete mode 100644 docs/rsc/footer_html.html delete mode 100644 docs/rsc/header_chm.html delete mode 100644 docs/rsc/header_html.html delete mode 100644 docs/rsc/layout.xml delete mode 100644 docs/rsc/logo.png delete mode 100644 docs/rsc/workspace.eps delete mode 100644 docs/rsc/workspace.png delete mode 100644 docs/rsc/workspace.svg delete mode 100644 docs/src/concepts.dox delete mode 100644 docs/src/main.dox delete mode 100644 documentation.html delete mode 100644 ext/ext.dox delete mode 100644 ext/fatfs-0.9-patched.zip delete mode 100644 ext/lwip-1.4.1_patched.zip delete mode 100644 ext/readme.txt delete mode 100644 ext/uip-1.0.patches.zip delete mode 100644 ext/uip-1.0.tar.gz delete mode 100644 license.txt delete mode 100644 readme.txt delete mode 100644 testhal/LPC11xx/EXT/Makefile delete mode 100644 testhal/LPC11xx/EXT/chconf.h delete mode 100644 testhal/LPC11xx/EXT/halconf.h delete mode 100644 testhal/LPC11xx/EXT/main.c delete mode 100644 testhal/LPC11xx/EXT/mcuconf.h delete mode 100644 testhal/LPC11xx/IRQ_STORM/Makefile delete mode 100644 testhal/LPC11xx/IRQ_STORM/chconf.h delete mode 100644 testhal/LPC11xx/IRQ_STORM/halconf.h delete mode 100644 testhal/LPC11xx/IRQ_STORM/main.c delete mode 100644 testhal/LPC11xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/LPC11xx/IRQ_STORM/readme.txt delete mode 100644 testhal/LPC11xx/PWM/Makefile delete mode 100644 testhal/LPC11xx/PWM/chconf.h delete mode 100644 testhal/LPC11xx/PWM/halconf.h delete mode 100644 testhal/LPC11xx/PWM/main.c delete mode 100644 testhal/LPC11xx/PWM/mcuconf.h delete mode 100644 testhal/LPC122x/EXT/Makefile delete mode 100644 testhal/LPC122x/EXT/chconf.h delete mode 100644 testhal/LPC122x/EXT/halconf.h delete mode 100644 testhal/LPC122x/EXT/main.c delete mode 100644 testhal/LPC122x/EXT/mcuconf.h delete mode 100644 testhal/LPC122x/IRQ_STORM/Makefile delete mode 100644 testhal/LPC122x/IRQ_STORM/chconf.h delete mode 100644 testhal/LPC122x/IRQ_STORM/halconf.h delete mode 100644 testhal/LPC122x/IRQ_STORM/main.c delete mode 100644 testhal/LPC122x/IRQ_STORM/mcuconf.h delete mode 100644 testhal/LPC122x/IRQ_STORM/readme.txt delete mode 100644 testhal/LPC122x/PWM/Makefile delete mode 100644 testhal/LPC122x/PWM/chconf.h delete mode 100644 testhal/LPC122x/PWM/halconf.h delete mode 100644 testhal/LPC122x/PWM/main.c delete mode 100644 testhal/LPC122x/PWM/mcuconf.h delete mode 100644 testhal/LPC122x/RTC/Makefile delete mode 100644 testhal/LPC122x/RTC/chconf.h delete mode 100644 testhal/LPC122x/RTC/halconf.h delete mode 100644 testhal/LPC122x/RTC/main.c delete mode 100644 testhal/LPC122x/RTC/mcuconf.h delete mode 100644 testhal/LPC13xx/IRQ_STORM/Makefile delete mode 100644 testhal/LPC13xx/IRQ_STORM/chconf.h delete mode 100644 testhal/LPC13xx/IRQ_STORM/halconf.h delete mode 100644 testhal/LPC13xx/IRQ_STORM/main.c delete mode 100644 testhal/LPC13xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/LPC13xx/IRQ_STORM/readme.txt delete mode 100644 testhal/SPC560BCxx/CAN/Makefile delete mode 100644 testhal/SPC560BCxx/CAN/chconf.h delete mode 100644 testhal/SPC560BCxx/CAN/halconf.h delete mode 100644 testhal/SPC560BCxx/CAN/main.c delete mode 100644 testhal/SPC560BCxx/CAN/mcuconf.h delete mode 100644 testhal/SPC560BCxx/CAN/readme.txt delete mode 100644 testhal/SPC560BCxx/ICU-PWM/Makefile delete mode 100644 testhal/SPC560BCxx/ICU-PWM/chconf.h delete mode 100644 testhal/SPC560BCxx/ICU-PWM/halconf.h delete mode 100644 testhal/SPC560BCxx/ICU-PWM/main.c delete mode 100644 testhal/SPC560BCxx/ICU-PWM/mcuconf.h delete mode 100644 testhal/SPC560BCxx/ICU-PWM/readme.txt delete mode 100644 testhal/SPC560Dxx/SPI/.cproject delete mode 100644 testhal/SPC560Dxx/SPI/.project delete mode 100644 testhal/SPC560Dxx/SPI/Makefile delete mode 100644 testhal/SPC560Dxx/SPI/UDE/debug .wsx delete mode 100644 testhal/SPC560Dxx/SPI/UDE/stm_xpc560b_spc560d40_minimodule_debug_jtag.cfg delete mode 100644 testhal/SPC560Dxx/SPI/chconf.h delete mode 100644 testhal/SPC560Dxx/SPI/halconf.h delete mode 100644 testhal/SPC560Dxx/SPI/main.c delete mode 100644 testhal/SPC560Dxx/SPI/mcuconf.h delete mode 100644 testhal/SPC560Dxx/SPI/readme.txt delete mode 100644 testhal/SPC560Pxx/CAN/.cproject delete mode 100644 testhal/SPC560Pxx/CAN/.project delete mode 100644 testhal/SPC560Pxx/CAN/Makefile delete mode 100644 testhal/SPC560Pxx/CAN/chconf.h delete mode 100644 testhal/SPC560Pxx/CAN/halconf.h delete mode 100644 testhal/SPC560Pxx/CAN/main.c delete mode 100644 testhal/SPC560Pxx/CAN/mcuconf.h delete mode 100644 testhal/SPC560Pxx/CAN/readme.txt delete mode 100644 testhal/SPC560Pxx/PWM-ICU/.cproject delete mode 100644 testhal/SPC560Pxx/PWM-ICU/.project delete mode 100644 testhal/SPC560Pxx/PWM-ICU/Makefile delete mode 100644 testhal/SPC560Pxx/PWM-ICU/chconf.h delete mode 100644 testhal/SPC560Pxx/PWM-ICU/halconf.h delete mode 100644 testhal/SPC560Pxx/PWM-ICU/main.c delete mode 100644 testhal/SPC560Pxx/PWM-ICU/mcuconf.h delete mode 100644 testhal/SPC560Pxx/PWM-ICU/readme.txt delete mode 100644 testhal/SPC560Pxx/SPI/.cproject delete mode 100644 testhal/SPC560Pxx/SPI/.project delete mode 100644 testhal/SPC560Pxx/SPI/Makefile delete mode 100644 testhal/SPC560Pxx/SPI/chconf.h delete mode 100644 testhal/SPC560Pxx/SPI/halconf.h delete mode 100644 testhal/SPC560Pxx/SPI/main.c delete mode 100644 testhal/SPC560Pxx/SPI/mcuconf.h delete mode 100644 testhal/SPC560Pxx/SPI/readme.txt delete mode 100644 testhal/SPC563Mxx/ADC/.cproject delete mode 100644 testhal/SPC563Mxx/ADC/.project delete mode 100644 testhal/SPC563Mxx/ADC/Makefile delete mode 100644 testhal/SPC563Mxx/ADC/adc_cfg.c delete mode 100644 testhal/SPC563Mxx/ADC/adc_cfg.h delete mode 100644 testhal/SPC563Mxx/ADC/chconf.h delete mode 100644 testhal/SPC563Mxx/ADC/halconf.h delete mode 100644 testhal/SPC563Mxx/ADC/main.c delete mode 100644 testhal/SPC563Mxx/ADC/mcuconf.h delete mode 100644 testhal/SPC563Mxx/ADC/readme.txt delete mode 100644 testhal/SPC563Mxx/ICU-PWM/.cproject delete mode 100644 testhal/SPC563Mxx/ICU-PWM/.project delete mode 100644 testhal/SPC563Mxx/ICU-PWM/Makefile delete mode 100644 testhal/SPC563Mxx/ICU-PWM/chconf.h delete mode 100644 testhal/SPC563Mxx/ICU-PWM/halconf.h delete mode 100644 testhal/SPC563Mxx/ICU-PWM/main.c delete mode 100644 testhal/SPC563Mxx/ICU-PWM/mcuconf.h delete mode 100644 testhal/SPC563Mxx/ICU-PWM/readme.txt delete mode 100644 testhal/SPC563Mxx/SPI/.cproject delete mode 100644 testhal/SPC563Mxx/SPI/.project delete mode 100644 testhal/SPC563Mxx/SPI/Makefile delete mode 100644 testhal/SPC563Mxx/SPI/chconf.h delete mode 100644 testhal/SPC563Mxx/SPI/halconf.h delete mode 100644 testhal/SPC563Mxx/SPI/main.c delete mode 100644 testhal/SPC563Mxx/SPI/mcuconf.h delete mode 100644 testhal/SPC563Mxx/SPI/readme.txt delete mode 100644 testhal/SPC564Axx/ICU-PWM/Makefile delete mode 100644 testhal/SPC564Axx/ICU-PWM/chconf.h delete mode 100644 testhal/SPC564Axx/ICU-PWM/halconf.h delete mode 100644 testhal/SPC564Axx/ICU-PWM/main.c delete mode 100644 testhal/SPC564Axx/ICU-PWM/mcuconf.h delete mode 100644 testhal/SPC564Axx/ICU-PWM/readme.txt delete mode 100644 testhal/SPC564Axx/SPI/.cproject delete mode 100644 testhal/SPC564Axx/SPI/.project delete mode 100644 testhal/SPC564Axx/SPI/Makefile delete mode 100644 testhal/SPC564Axx/SPI/chconf.h delete mode 100644 testhal/SPC564Axx/SPI/halconf.h delete mode 100644 testhal/SPC564Axx/SPI/main.c delete mode 100644 testhal/SPC564Axx/SPI/mcuconf.h delete mode 100644 testhal/SPC564Axx/SPI/readme.txt delete mode 100644 testhal/SPC56ELxx/CAN/.cproject delete mode 100644 testhal/SPC56ELxx/CAN/.project delete mode 100644 testhal/SPC56ELxx/CAN/Makefile delete mode 100644 testhal/SPC56ELxx/CAN/chconf.h delete mode 100644 testhal/SPC56ELxx/CAN/halconf.h delete mode 100644 testhal/SPC56ELxx/CAN/main.c delete mode 100644 testhal/SPC56ELxx/CAN/mcuconf.h delete mode 100644 testhal/SPC56ELxx/CAN/readme.txt delete mode 100644 testhal/SPC56ELxx/PWM-ICU/.cproject delete mode 100644 testhal/SPC56ELxx/PWM-ICU/.project delete mode 100644 testhal/SPC56ELxx/PWM-ICU/Makefile delete mode 100644 testhal/SPC56ELxx/PWM-ICU/chconf.h delete mode 100644 testhal/SPC56ELxx/PWM-ICU/halconf.h delete mode 100644 testhal/SPC56ELxx/PWM-ICU/main.c delete mode 100644 testhal/SPC56ELxx/PWM-ICU/mcuconf.h delete mode 100644 testhal/SPC56ELxx/PWM-ICU/readme.txt delete mode 100644 testhal/SPC56ELxx/SPI/.cproject delete mode 100644 testhal/SPC56ELxx/SPI/.project delete mode 100644 testhal/SPC56ELxx/SPI/Makefile delete mode 100644 testhal/SPC56ELxx/SPI/chconf.h delete mode 100644 testhal/SPC56ELxx/SPI/halconf.h delete mode 100644 testhal/SPC56ELxx/SPI/main.c delete mode 100644 testhal/SPC56ELxx/SPI/mcuconf.h delete mode 100644 testhal/SPC56ELxx/SPI/readme.txt delete mode 100644 testhal/STM32F0xx/ADC/.cproject delete mode 100644 testhal/STM32F0xx/ADC/.project delete mode 100644 testhal/STM32F0xx/ADC/Makefile delete mode 100644 testhal/STM32F0xx/ADC/chconf.h delete mode 100644 testhal/STM32F0xx/ADC/halconf.h delete mode 100644 testhal/STM32F0xx/ADC/main.c delete mode 100644 testhal/STM32F0xx/ADC/mcuconf.h delete mode 100644 testhal/STM32F0xx/ADC/readme.txt delete mode 100644 testhal/STM32F0xx/EXT/.cproject delete mode 100644 testhal/STM32F0xx/EXT/.project delete mode 100644 testhal/STM32F0xx/EXT/Makefile delete mode 100644 testhal/STM32F0xx/EXT/chconf.h delete mode 100644 testhal/STM32F0xx/EXT/halconf.h delete mode 100644 testhal/STM32F0xx/EXT/main.c delete mode 100644 testhal/STM32F0xx/EXT/mcuconf.h delete mode 100644 testhal/STM32F0xx/EXT/readme.txt delete mode 100644 testhal/STM32F0xx/IRQ_STORM/.cproject delete mode 100644 testhal/STM32F0xx/IRQ_STORM/.project delete mode 100644 testhal/STM32F0xx/IRQ_STORM/Makefile delete mode 100644 testhal/STM32F0xx/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32F0xx/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32F0xx/IRQ_STORM/main.c delete mode 100644 testhal/STM32F0xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32F0xx/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32F0xx/PWM-ICU/.cproject delete mode 100644 testhal/STM32F0xx/PWM-ICU/.project delete mode 100644 testhal/STM32F0xx/PWM-ICU/Makefile delete mode 100644 testhal/STM32F0xx/PWM-ICU/chconf.h delete mode 100644 testhal/STM32F0xx/PWM-ICU/halconf.h delete mode 100644 testhal/STM32F0xx/PWM-ICU/main.c delete mode 100644 testhal/STM32F0xx/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32F0xx/PWM-ICU/readme.txt delete mode 100644 testhal/STM32F0xx/SPI/.cproject delete mode 100644 testhal/STM32F0xx/SPI/.project delete mode 100644 testhal/STM32F0xx/SPI/Makefile delete mode 100644 testhal/STM32F0xx/SPI/chconf.h delete mode 100644 testhal/STM32F0xx/SPI/halconf.h delete mode 100644 testhal/STM32F0xx/SPI/main.c delete mode 100644 testhal/STM32F0xx/SPI/mcuconf.h delete mode 100644 testhal/STM32F0xx/SPI/readme.txt delete mode 100644 testhal/STM32F0xx/UART/.cproject delete mode 100644 testhal/STM32F0xx/UART/.project delete mode 100644 testhal/STM32F0xx/UART/Makefile delete mode 100644 testhal/STM32F0xx/UART/chconf.h delete mode 100644 testhal/STM32F0xx/UART/halconf.h delete mode 100644 testhal/STM32F0xx/UART/main.c delete mode 100644 testhal/STM32F0xx/UART/mcuconf.h delete mode 100644 testhal/STM32F0xx/UART/readme.txt delete mode 100644 testhal/STM32F1xx/ADC/Makefile delete mode 100644 testhal/STM32F1xx/ADC/chconf.h delete mode 100644 testhal/STM32F1xx/ADC/halconf.h delete mode 100644 testhal/STM32F1xx/ADC/main.c delete mode 100644 testhal/STM32F1xx/ADC/mcuconf.h delete mode 100644 testhal/STM32F1xx/ADC/readme.txt delete mode 100644 testhal/STM32F1xx/CAN/Makefile delete mode 100644 testhal/STM32F1xx/CAN/chconf.h delete mode 100644 testhal/STM32F1xx/CAN/halconf.h delete mode 100644 testhal/STM32F1xx/CAN/main.c delete mode 100644 testhal/STM32F1xx/CAN/mcuconf.h delete mode 100644 testhal/STM32F1xx/CAN/readme.txt delete mode 100644 testhal/STM32F1xx/EXT/Makefile delete mode 100644 testhal/STM32F1xx/EXT/chconf.h delete mode 100644 testhal/STM32F1xx/EXT/halconf.h delete mode 100644 testhal/STM32F1xx/EXT/main.c delete mode 100644 testhal/STM32F1xx/EXT/mcuconf.h delete mode 100644 testhal/STM32F1xx/EXT/readme.txt delete mode 100644 testhal/STM32F1xx/GPT/Makefile delete mode 100644 testhal/STM32F1xx/GPT/chconf.h delete mode 100644 testhal/STM32F1xx/GPT/halconf.h delete mode 100644 testhal/STM32F1xx/GPT/main.c delete mode 100644 testhal/STM32F1xx/GPT/mcuconf.h delete mode 100644 testhal/STM32F1xx/GPT/readme.txt delete mode 100644 testhal/STM32F1xx/I2C/Makefile delete mode 100644 testhal/STM32F1xx/I2C/chconf.h delete mode 100644 testhal/STM32F1xx/I2C/fake.c delete mode 100644 testhal/STM32F1xx/I2C/fake.h delete mode 100644 testhal/STM32F1xx/I2C/halconf.h delete mode 100644 testhal/STM32F1xx/I2C/i2c_pns.c delete mode 100644 testhal/STM32F1xx/I2C/i2c_pns.h delete mode 100644 testhal/STM32F1xx/I2C/lis3.c delete mode 100644 testhal/STM32F1xx/I2C/lis3.h delete mode 100644 testhal/STM32F1xx/I2C/main.c delete mode 100644 testhal/STM32F1xx/I2C/mcuconf.h delete mode 100644 testhal/STM32F1xx/I2C/tmp75.c delete mode 100644 testhal/STM32F1xx/I2C/tmp75.h delete mode 100644 testhal/STM32F1xx/IRQ_STORM/Makefile delete mode 100644 testhal/STM32F1xx/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32F1xx/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32F1xx/IRQ_STORM/main.c delete mode 100644 testhal/STM32F1xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32F1xx/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32F1xx/PWM-ICU/Makefile delete mode 100644 testhal/STM32F1xx/PWM-ICU/chconf.h delete mode 100644 testhal/STM32F1xx/PWM-ICU/halconf.h delete mode 100644 testhal/STM32F1xx/PWM-ICU/main.c delete mode 100644 testhal/STM32F1xx/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32F1xx/PWM-ICU/readme.txt delete mode 100644 testhal/STM32F1xx/RTC/Makefile delete mode 100644 testhal/STM32F1xx/RTC/chconf.h delete mode 100644 testhal/STM32F1xx/RTC/halconf.h delete mode 100644 testhal/STM32F1xx/RTC/main.c delete mode 100644 testhal/STM32F1xx/RTC/mcuconf.h delete mode 100644 testhal/STM32F1xx/RTC_FATTIME/Makefile delete mode 100644 testhal/STM32F1xx/RTC_FATTIME/chconf.h delete mode 100644 testhal/STM32F1xx/RTC_FATTIME/ffconf.h delete mode 100644 testhal/STM32F1xx/RTC_FATTIME/halconf.h delete mode 100644 testhal/STM32F1xx/RTC_FATTIME/main.c delete mode 100644 testhal/STM32F1xx/RTC_FATTIME/mcuconf.h delete mode 100644 testhal/STM32F1xx/RTC_FATTIME/readme.txt delete mode 100644 testhal/STM32F1xx/SDC/Makefile delete mode 100644 testhal/STM32F1xx/SDC/chconf.h delete mode 100644 testhal/STM32F1xx/SDC/halconf.h delete mode 100644 testhal/STM32F1xx/SDC/main.c delete mode 100644 testhal/STM32F1xx/SDC/mcuconf.h delete mode 100644 testhal/STM32F1xx/SDC/readme.txt delete mode 100644 testhal/STM32F1xx/SPI/Makefile delete mode 100644 testhal/STM32F1xx/SPI/chconf.h delete mode 100644 testhal/STM32F1xx/SPI/halconf.h delete mode 100644 testhal/STM32F1xx/SPI/main.c delete mode 100644 testhal/STM32F1xx/SPI/mcuconf.h delete mode 100644 testhal/STM32F1xx/SPI/readme.txt delete mode 100644 testhal/STM32F1xx/UART/Makefile delete mode 100644 testhal/STM32F1xx/UART/chconf.h delete mode 100644 testhal/STM32F1xx/UART/halconf.h delete mode 100644 testhal/STM32F1xx/UART/main.c delete mode 100644 testhal/STM32F1xx/UART/mcuconf.h delete mode 100644 testhal/STM32F1xx/UART/readme.txt delete mode 100644 testhal/STM32F1xx/USB_CDC/Makefile delete mode 100644 testhal/STM32F1xx/USB_CDC/chconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC/halconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC/main.c delete mode 100644 testhal/STM32F1xx/USB_CDC/mcuconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC/readme.txt delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/.cproject delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/.project delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/Makefile delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/chconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/halconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/main.c delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/mcuconf.h delete mode 100644 testhal/STM32F1xx/USB_CDC_F107/readme.txt delete mode 100644 testhal/STM32F1xx/USB_MSC/Makefile delete mode 100644 testhal/STM32F1xx/USB_MSC/chconf.h delete mode 100644 testhal/STM32F1xx/USB_MSC/halconf.h delete mode 100644 testhal/STM32F1xx/USB_MSC/main.c delete mode 100644 testhal/STM32F1xx/USB_MSC/mcuconf.h delete mode 100644 testhal/STM32F30x/ADC/.cproject delete mode 100644 testhal/STM32F30x/ADC/.project delete mode 100644 testhal/STM32F30x/ADC/Makefile delete mode 100644 testhal/STM32F30x/ADC/chconf.h delete mode 100644 testhal/STM32F30x/ADC/halconf.h delete mode 100644 testhal/STM32F30x/ADC/main.c delete mode 100644 testhal/STM32F30x/ADC/mcuconf.h delete mode 100644 testhal/STM32F30x/ADC/readme.txt delete mode 100644 testhal/STM32F30x/ADC_DUAL/.cproject delete mode 100644 testhal/STM32F30x/ADC_DUAL/.project delete mode 100644 testhal/STM32F30x/ADC_DUAL/Makefile delete mode 100644 testhal/STM32F30x/ADC_DUAL/chconf.h delete mode 100644 testhal/STM32F30x/ADC_DUAL/halconf.h delete mode 100644 testhal/STM32F30x/ADC_DUAL/main.c delete mode 100644 testhal/STM32F30x/ADC_DUAL/mcuconf.h delete mode 100644 testhal/STM32F30x/ADC_DUAL/readme.txt delete mode 100644 testhal/STM32F30x/CAN/.cproject delete mode 100644 testhal/STM32F30x/CAN/.project delete mode 100644 testhal/STM32F30x/CAN/Makefile delete mode 100644 testhal/STM32F30x/CAN/chconf.h delete mode 100644 testhal/STM32F30x/CAN/halconf.h delete mode 100644 testhal/STM32F30x/CAN/main.c delete mode 100644 testhal/STM32F30x/CAN/mcuconf.h delete mode 100644 testhal/STM32F30x/CAN/readme.txt delete mode 100644 testhal/STM32F30x/EXT/.cproject delete mode 100644 testhal/STM32F30x/EXT/.project delete mode 100644 testhal/STM32F30x/EXT/Makefile delete mode 100644 testhal/STM32F30x/EXT/chconf.h delete mode 100644 testhal/STM32F30x/EXT/halconf.h delete mode 100644 testhal/STM32F30x/EXT/main.c delete mode 100644 testhal/STM32F30x/EXT/mcuconf.h delete mode 100644 testhal/STM32F30x/EXT/readme.txt delete mode 100644 testhal/STM32F30x/IRQ_STORM/.cproject delete mode 100644 testhal/STM32F30x/IRQ_STORM/.project delete mode 100644 testhal/STM32F30x/IRQ_STORM/Makefile delete mode 100644 testhal/STM32F30x/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32F30x/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32F30x/IRQ_STORM/main.c delete mode 100644 testhal/STM32F30x/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32F30x/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32F30x/PWM-ICU/.cproject delete mode 100644 testhal/STM32F30x/PWM-ICU/.project delete mode 100644 testhal/STM32F30x/PWM-ICU/Makefile delete mode 100644 testhal/STM32F30x/PWM-ICU/chconf.h delete mode 100644 testhal/STM32F30x/PWM-ICU/halconf.h delete mode 100644 testhal/STM32F30x/PWM-ICU/main.c delete mode 100644 testhal/STM32F30x/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32F30x/PWM-ICU/readme.txt delete mode 100644 testhal/STM32F30x/SPI/.cproject delete mode 100644 testhal/STM32F30x/SPI/.project delete mode 100644 testhal/STM32F30x/SPI/Makefile delete mode 100644 testhal/STM32F30x/SPI/chconf.h delete mode 100644 testhal/STM32F30x/SPI/halconf.h delete mode 100644 testhal/STM32F30x/SPI/main.c delete mode 100644 testhal/STM32F30x/SPI/mcuconf.h delete mode 100644 testhal/STM32F30x/SPI/readme.txt delete mode 100644 testhal/STM32F30x/UART/.cproject delete mode 100644 testhal/STM32F30x/UART/.project delete mode 100644 testhal/STM32F30x/UART/Makefile delete mode 100644 testhal/STM32F30x/UART/chconf.h delete mode 100644 testhal/STM32F30x/UART/halconf.h delete mode 100644 testhal/STM32F30x/UART/main.c delete mode 100644 testhal/STM32F30x/UART/mcuconf.h delete mode 100644 testhal/STM32F30x/UART/readme.txt delete mode 100644 testhal/STM32F30x/USB_CDC/.cproject delete mode 100644 testhal/STM32F30x/USB_CDC/.project delete mode 100644 testhal/STM32F30x/USB_CDC/Makefile delete mode 100644 testhal/STM32F30x/USB_CDC/chconf.h delete mode 100644 testhal/STM32F30x/USB_CDC/halconf.h delete mode 100644 testhal/STM32F30x/USB_CDC/main.c delete mode 100644 testhal/STM32F30x/USB_CDC/mcuconf.h delete mode 100644 testhal/STM32F30x/USB_CDC/readme.txt delete mode 100644 testhal/STM32F37x/ADC/.cproject delete mode 100644 testhal/STM32F37x/ADC/.project delete mode 100644 testhal/STM32F37x/ADC/Makefile delete mode 100644 testhal/STM32F37x/ADC/chconf.h delete mode 100644 testhal/STM32F37x/ADC/halconf.h delete mode 100644 testhal/STM32F37x/ADC/main.c delete mode 100644 testhal/STM32F37x/ADC/mcuconf.h delete mode 100644 testhal/STM32F37x/ADC/readme.txt delete mode 100644 testhal/STM32F37x/CAN/.cproject delete mode 100644 testhal/STM32F37x/CAN/.project delete mode 100644 testhal/STM32F37x/CAN/Makefile delete mode 100644 testhal/STM32F37x/CAN/chconf.h delete mode 100644 testhal/STM32F37x/CAN/halconf.h delete mode 100644 testhal/STM32F37x/CAN/main.c delete mode 100644 testhal/STM32F37x/CAN/mcuconf.h delete mode 100644 testhal/STM32F37x/CAN/readme.txt delete mode 100644 testhal/STM32F37x/EXT/.cproject delete mode 100644 testhal/STM32F37x/EXT/.project delete mode 100644 testhal/STM32F37x/EXT/Makefile delete mode 100644 testhal/STM32F37x/EXT/chconf.h delete mode 100644 testhal/STM32F37x/EXT/halconf.h delete mode 100644 testhal/STM32F37x/EXT/main.c delete mode 100644 testhal/STM32F37x/EXT/mcuconf.h delete mode 100644 testhal/STM32F37x/EXT/readme.txt delete mode 100644 testhal/STM32F37x/I2C/.cproject delete mode 100644 testhal/STM32F37x/I2C/.project delete mode 100644 testhal/STM32F37x/I2C/Makefile delete mode 100644 testhal/STM32F37x/I2C/chconf.h delete mode 100644 testhal/STM32F37x/I2C/halconf.h delete mode 100644 testhal/STM32F37x/I2C/main.c delete mode 100644 testhal/STM32F37x/I2C/mcuconf.h delete mode 100644 testhal/STM32F37x/I2C/readme.txt delete mode 100644 testhal/STM32F37x/IRQ_STORM/.cproject delete mode 100644 testhal/STM32F37x/IRQ_STORM/.project delete mode 100644 testhal/STM32F37x/IRQ_STORM/Makefile delete mode 100644 testhal/STM32F37x/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32F37x/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32F37x/IRQ_STORM/main.c delete mode 100644 testhal/STM32F37x/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32F37x/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32F37x/PWM-ICU/.cproject delete mode 100644 testhal/STM32F37x/PWM-ICU/.project delete mode 100644 testhal/STM32F37x/PWM-ICU/Makefile delete mode 100644 testhal/STM32F37x/PWM-ICU/chconf.h delete mode 100644 testhal/STM32F37x/PWM-ICU/halconf.h delete mode 100644 testhal/STM32F37x/PWM-ICU/main.c delete mode 100644 testhal/STM32F37x/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32F37x/PWM-ICU/readme.txt delete mode 100644 testhal/STM32F37x/SDADC/.cproject delete mode 100644 testhal/STM32F37x/SDADC/.project delete mode 100644 testhal/STM32F37x/SDADC/Makefile delete mode 100644 testhal/STM32F37x/SDADC/chconf.h delete mode 100644 testhal/STM32F37x/SDADC/halconf.h delete mode 100644 testhal/STM32F37x/SDADC/main.c delete mode 100644 testhal/STM32F37x/SDADC/mcuconf.h delete mode 100644 testhal/STM32F37x/SDADC/readme.txt delete mode 100644 testhal/STM32F37x/SPI/.cproject delete mode 100644 testhal/STM32F37x/SPI/.project delete mode 100644 testhal/STM32F37x/SPI/Makefile delete mode 100644 testhal/STM32F37x/SPI/chconf.h delete mode 100644 testhal/STM32F37x/SPI/halconf.h delete mode 100644 testhal/STM32F37x/SPI/main.c delete mode 100644 testhal/STM32F37x/SPI/mcuconf.h delete mode 100644 testhal/STM32F37x/SPI/readme.txt delete mode 100644 testhal/STM32F37x/UART/.cproject delete mode 100644 testhal/STM32F37x/UART/.project delete mode 100644 testhal/STM32F37x/UART/Makefile delete mode 100644 testhal/STM32F37x/UART/chconf.h delete mode 100644 testhal/STM32F37x/UART/halconf.h delete mode 100644 testhal/STM32F37x/UART/main.c delete mode 100644 testhal/STM32F37x/UART/mcuconf.h delete mode 100644 testhal/STM32F37x/UART/readme.txt delete mode 100644 testhal/STM32F37x/USB_CDC/.cproject delete mode 100644 testhal/STM32F37x/USB_CDC/.project delete mode 100644 testhal/STM32F37x/USB_CDC/Makefile delete mode 100644 testhal/STM32F37x/USB_CDC/chconf.h delete mode 100644 testhal/STM32F37x/USB_CDC/halconf.h delete mode 100644 testhal/STM32F37x/USB_CDC/main.c delete mode 100644 testhal/STM32F37x/USB_CDC/mcuconf.h delete mode 100644 testhal/STM32F37x/USB_CDC/readme.txt delete mode 100644 testhal/STM32F4xx/ADC/.cproject delete mode 100644 testhal/STM32F4xx/ADC/.project delete mode 100644 testhal/STM32F4xx/ADC/Makefile delete mode 100644 testhal/STM32F4xx/ADC/chconf.h delete mode 100644 testhal/STM32F4xx/ADC/halconf.h delete mode 100644 testhal/STM32F4xx/ADC/main.c delete mode 100644 testhal/STM32F4xx/ADC/mcuconf.h delete mode 100644 testhal/STM32F4xx/ADC/readme.txt delete mode 100644 testhal/STM32F4xx/CAN/.cproject delete mode 100644 testhal/STM32F4xx/CAN/.project delete mode 100644 testhal/STM32F4xx/CAN/Makefile delete mode 100644 testhal/STM32F4xx/CAN/chconf.h delete mode 100644 testhal/STM32F4xx/CAN/halconf.h delete mode 100644 testhal/STM32F4xx/CAN/main.c delete mode 100644 testhal/STM32F4xx/CAN/mcuconf.h delete mode 100644 testhal/STM32F4xx/CAN/readme.txt delete mode 100644 testhal/STM32F4xx/DMA_STORM/.cproject delete mode 100644 testhal/STM32F4xx/DMA_STORM/.project delete mode 100644 testhal/STM32F4xx/DMA_STORM/Makefile delete mode 100644 testhal/STM32F4xx/DMA_STORM/chconf.h delete mode 100644 testhal/STM32F4xx/DMA_STORM/halconf.h delete mode 100644 testhal/STM32F4xx/DMA_STORM/main.c delete mode 100644 testhal/STM32F4xx/DMA_STORM/mcuconf.h delete mode 100644 testhal/STM32F4xx/EXT/.cproject delete mode 100644 testhal/STM32F4xx/EXT/.project delete mode 100644 testhal/STM32F4xx/EXT/Makefile delete mode 100644 testhal/STM32F4xx/EXT/chconf.h delete mode 100644 testhal/STM32F4xx/EXT/halconf.h delete mode 100644 testhal/STM32F4xx/EXT/main.c delete mode 100644 testhal/STM32F4xx/EXT/mcuconf.h delete mode 100644 testhal/STM32F4xx/EXT/readme.txt delete mode 100644 testhal/STM32F4xx/GPT/.cproject delete mode 100644 testhal/STM32F4xx/GPT/.project delete mode 100644 testhal/STM32F4xx/GPT/Makefile delete mode 100644 testhal/STM32F4xx/GPT/chconf.h delete mode 100644 testhal/STM32F4xx/GPT/halconf.h delete mode 100644 testhal/STM32F4xx/GPT/main.c delete mode 100644 testhal/STM32F4xx/GPT/mcuconf.h delete mode 100644 testhal/STM32F4xx/GPT/readme.txt delete mode 100644 testhal/STM32F4xx/I2C/.cproject delete mode 100644 testhal/STM32F4xx/I2C/.project delete mode 100644 testhal/STM32F4xx/I2C/Makefile delete mode 100644 testhal/STM32F4xx/I2C/chconf.h delete mode 100644 testhal/STM32F4xx/I2C/halconf.h delete mode 100644 testhal/STM32F4xx/I2C/main.c delete mode 100644 testhal/STM32F4xx/I2C/mcuconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM/.cproject delete mode 100644 testhal/STM32F4xx/IRQ_STORM/.project delete mode 100644 testhal/STM32F4xx/IRQ_STORM/Makefile delete mode 100644 testhal/STM32F4xx/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp delete mode 100644 testhal/STM32F4xx/IRQ_STORM/iar/ch.eww delete mode 100644 testhal/STM32F4xx/IRQ_STORM/iar/ch.icf delete mode 100644 testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj delete mode 100644 testhal/STM32F4xx/IRQ_STORM/main.c delete mode 100644 testhal/STM32F4xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/.cproject delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/.project delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/Makefile delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/main.c delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h delete mode 100644 testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt delete mode 100644 testhal/STM32F4xx/PWM-ICU/.cproject delete mode 100644 testhal/STM32F4xx/PWM-ICU/.project delete mode 100644 testhal/STM32F4xx/PWM-ICU/Makefile delete mode 100644 testhal/STM32F4xx/PWM-ICU/chconf.h delete mode 100644 testhal/STM32F4xx/PWM-ICU/halconf.h delete mode 100644 testhal/STM32F4xx/PWM-ICU/main.c delete mode 100644 testhal/STM32F4xx/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32F4xx/PWM-ICU/readme.txt delete mode 100644 testhal/STM32F4xx/RTC/.cproject delete mode 100644 testhal/STM32F4xx/RTC/.project delete mode 100644 testhal/STM32F4xx/RTC/Makefile delete mode 100644 testhal/STM32F4xx/RTC/chconf.h delete mode 100644 testhal/STM32F4xx/RTC/halconf.h delete mode 100644 testhal/STM32F4xx/RTC/main.c delete mode 100644 testhal/STM32F4xx/RTC/mcuconf.h delete mode 100644 testhal/STM32F4xx/RTC_FATTIME/Makefile delete mode 100644 testhal/STM32F4xx/RTC_FATTIME/chconf.h delete mode 100644 testhal/STM32F4xx/RTC_FATTIME/ffconf.h delete mode 100644 testhal/STM32F4xx/RTC_FATTIME/halconf.h delete mode 100644 testhal/STM32F4xx/RTC_FATTIME/main.c delete mode 100644 testhal/STM32F4xx/RTC_FATTIME/mcuconf.h delete mode 100644 testhal/STM32F4xx/RTC_FATTIME/readme.txt delete mode 100644 testhal/STM32F4xx/SDC/.cproject delete mode 100644 testhal/STM32F4xx/SDC/.project delete mode 100644 testhal/STM32F4xx/SDC/Makefile delete mode 100644 testhal/STM32F4xx/SDC/chconf.h delete mode 100644 testhal/STM32F4xx/SDC/csd.txt delete mode 100644 testhal/STM32F4xx/SDC/ffconf.h delete mode 100644 testhal/STM32F4xx/SDC/halconf.h delete mode 100644 testhal/STM32F4xx/SDC/main.c delete mode 100644 testhal/STM32F4xx/SDC/mcuconf.h delete mode 100644 testhal/STM32F4xx/SDC/readme.txt delete mode 100644 testhal/STM32F4xx/SPI/.cproject delete mode 100644 testhal/STM32F4xx/SPI/.project delete mode 100644 testhal/STM32F4xx/SPI/Makefile delete mode 100644 testhal/STM32F4xx/SPI/chconf.h delete mode 100644 testhal/STM32F4xx/SPI/halconf.h delete mode 100644 testhal/STM32F4xx/SPI/main.c delete mode 100644 testhal/STM32F4xx/SPI/mcuconf.h delete mode 100644 testhal/STM32F4xx/SPI/readme.txt delete mode 100644 testhal/STM32F4xx/UART/.cproject delete mode 100644 testhal/STM32F4xx/UART/.project delete mode 100644 testhal/STM32F4xx/UART/Makefile delete mode 100644 testhal/STM32F4xx/UART/chconf.h delete mode 100644 testhal/STM32F4xx/UART/halconf.h delete mode 100644 testhal/STM32F4xx/UART/main.c delete mode 100644 testhal/STM32F4xx/UART/mcuconf.h delete mode 100644 testhal/STM32F4xx/UART/readme.txt delete mode 100644 testhal/STM32F4xx/USB_CDC/.cproject delete mode 100644 testhal/STM32F4xx/USB_CDC/.project delete mode 100644 testhal/STM32F4xx/USB_CDC/Makefile delete mode 100644 testhal/STM32F4xx/USB_CDC/chconf.h delete mode 100644 testhal/STM32F4xx/USB_CDC/halconf.h delete mode 100644 testhal/STM32F4xx/USB_CDC/main.c delete mode 100644 testhal/STM32F4xx/USB_CDC/mcuconf.h delete mode 100644 testhal/STM32F4xx/USB_CDC/readme.txt delete mode 100644 testhal/STM32L1xx/ADC/.cproject delete mode 100644 testhal/STM32L1xx/ADC/.project delete mode 100644 testhal/STM32L1xx/ADC/Makefile delete mode 100644 testhal/STM32L1xx/ADC/chconf.h delete mode 100644 testhal/STM32L1xx/ADC/halconf.h delete mode 100644 testhal/STM32L1xx/ADC/main.c delete mode 100644 testhal/STM32L1xx/ADC/mcuconf.h delete mode 100644 testhal/STM32L1xx/ADC/readme.txt delete mode 100644 testhal/STM32L1xx/EXT/.cproject delete mode 100644 testhal/STM32L1xx/EXT/.project delete mode 100644 testhal/STM32L1xx/EXT/Makefile delete mode 100644 testhal/STM32L1xx/EXT/chconf.h delete mode 100644 testhal/STM32L1xx/EXT/halconf.h delete mode 100644 testhal/STM32L1xx/EXT/main.c delete mode 100644 testhal/STM32L1xx/EXT/mcuconf.h delete mode 100644 testhal/STM32L1xx/EXT/readme.txt delete mode 100644 testhal/STM32L1xx/IRQ_STORM/.cproject delete mode 100644 testhal/STM32L1xx/IRQ_STORM/.project delete mode 100644 testhal/STM32L1xx/IRQ_STORM/Makefile delete mode 100644 testhal/STM32L1xx/IRQ_STORM/chconf.h delete mode 100644 testhal/STM32L1xx/IRQ_STORM/halconf.h delete mode 100644 testhal/STM32L1xx/IRQ_STORM/main.c delete mode 100644 testhal/STM32L1xx/IRQ_STORM/mcuconf.h delete mode 100644 testhal/STM32L1xx/IRQ_STORM/readme.txt delete mode 100644 testhal/STM32L1xx/PWM-ICU/.cproject delete mode 100644 testhal/STM32L1xx/PWM-ICU/.project delete mode 100644 testhal/STM32L1xx/PWM-ICU/Makefile delete mode 100644 testhal/STM32L1xx/PWM-ICU/chconf.h delete mode 100644 testhal/STM32L1xx/PWM-ICU/halconf.h delete mode 100644 testhal/STM32L1xx/PWM-ICU/main.c delete mode 100644 testhal/STM32L1xx/PWM-ICU/mcuconf.h delete mode 100644 testhal/STM32L1xx/PWM-ICU/readme.txt delete mode 100644 testhal/STM32L1xx/SPI/.cproject delete mode 100644 testhal/STM32L1xx/SPI/.project delete mode 100644 testhal/STM32L1xx/SPI/Makefile delete mode 100644 testhal/STM32L1xx/SPI/chconf.h delete mode 100644 testhal/STM32L1xx/SPI/halconf.h delete mode 100644 testhal/STM32L1xx/SPI/main.c delete mode 100644 testhal/STM32L1xx/SPI/mcuconf.h delete mode 100644 testhal/STM32L1xx/SPI/readme.txt delete mode 100644 testhal/STM32L1xx/UART/.cproject delete mode 100644 testhal/STM32L1xx/UART/.project delete mode 100644 testhal/STM32L1xx/UART/Makefile delete mode 100644 testhal/STM32L1xx/UART/chconf.h delete mode 100644 testhal/STM32L1xx/UART/halconf.h delete mode 100644 testhal/STM32L1xx/UART/main.c delete mode 100644 testhal/STM32L1xx/UART/mcuconf.h delete mode 100644 testhal/STM32L1xx/UART/readme.txt delete mode 100644 testhal/STM8S/SPI/ChibiOS-RT.stw delete mode 100644 testhal/STM8S/SPI/cosmic/cosmic.stp delete mode 100644 testhal/STM8S/SPI/cosmic/vectors.c delete mode 100644 testhal/STM8S/SPI/demo/chconf.h delete mode 100644 testhal/STM8S/SPI/demo/halconf.h delete mode 100644 testhal/STM8S/SPI/demo/main.c delete mode 100644 testhal/STM8S/SPI/demo/mcuconf.h delete mode 100644 testhal/STM8S/SPI/raisonance/raisonance.stp delete mode 100644 testhal/common/testbuild/.cproject delete mode 100644 testhal/common/testbuild/.project delete mode 100644 testhal/common/testbuild/Makefile delete mode 100644 testhal/common/testbuild/board.h delete mode 100644 testhal/common/testbuild/chconf.h delete mode 100644 testhal/common/testbuild/main.c delete mode 100644 todo.txt delete mode 100644 tools/gencfg/.externalToolBuilders/FMPP Builder (Linux).launch delete mode 100644 tools/gencfg/.externalToolBuilders/FMPP Builder (Windows).launch delete mode 100644 tools/gencfg/.project delete mode 100644 tools/gencfg/config.fmpp delete mode 100644 tools/gencfg/fmpp.sh delete mode 100644 tools/gencfg/lib/libcode.ftl delete mode 100644 tools/gencfg/lib/liblicense.ftl delete mode 100644 tools/gencfg/lib/libstm32f4xx.ftl delete mode 100644 tools/gencfg/lib/libutils.ftl delete mode 100644 tools/gencfg/processors/boards/stm32f4xx/config.fmpp delete mode 100644 tools/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl delete mode 100644 tools/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl delete mode 100644 tools/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl delete mode 100644 tools/gencfg/processors/hal/stm32f4xx/config.fmpp delete mode 100644 tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.c.ftl delete mode 100644 tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.h.ftl delete mode 100644 tools/gencfg/processors/processors.xml delete mode 100644 tools/gencfg/readme.txt delete mode 100644 tools/gencfg/run.bat delete mode 100644 tools/gencfg/schema/boards/abstract_board.xsd delete mode 100644 tools/gencfg/schema/boards/stm32f4xx_board.xsd delete mode 100644 tools/gencfg/schema/common/doc.xsd delete mode 100644 tools/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd delete mode 100644 tools/gencfg/schema/hal/abstract_adc_cfg.xsd delete mode 100644 tools/gencfg/schema/hal/abstract_cfg.xsd delete mode 100644 tools/gencfg/schema/hal/abstract_driver_cfg.xsd delete mode 100644 tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_adc_cfg.xsd delete mode 100644 tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd delete mode 100644 tools/gencfg/xml/stm32f0board.xml delete mode 100644 tools/gencfg/xml/stm32f4board.xml delete mode 100644 tools/gencfg/xml/stm32f4xx_cfg.xml diff --git a/.project b/.project deleted file mode 100644 index 4c9adf2ba..000000000 --- a/.project +++ /dev/null @@ -1,11 +0,0 @@ - - - ChibiOS-RT (whole tree) - - - - - - - - diff --git a/docs/Doxyfile_chm b/docs/Doxyfile_chm deleted file mode 100644 index 8b2f242f9..000000000 --- a/docs/Doxyfile_chm +++ /dev/null @@ -1,1787 +0,0 @@ -# Doxyfile 1.7.4 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" "). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = ChibiOS/RT - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 2.7.0 - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = . - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = YES - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = "C:/Documents and Settings/Administrator/" - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = NO - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 2 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = "iclass=@par Function Class:\n This is an \ - I-Class API, this function can be \ - invoked from within a system lock zone by both \ - threads and interrupt handlers." \ - "sclass=@par Function Class:\n This is an \ - S-Class API, this function can be \ - invoked from within a system lock zone by threads \ - only." \ - "api=@par Function Class:\n Normal API, this \ - function can be invoked by regular system threads \ - but not from within a lock zone." \ - "notapi=@par Function Class:\n Not an API, this \ - function is for internal use only." \ - "isr=@par Function Class:\n Interrupt handler, \ - this function should not be directly invoked." \ - "init=@par Function Class:\n Initializer, this \ - function just initializes an object and can be \ - invoked before the kernel is initialized." \ - "special=@par Function Class:\n Special function, \ - this function has special requirements see the \ - notes." - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this -# tag. The format is ext=language, where ext is a file extension, and language -# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = NO - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = YES - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = YES - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = NO - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = NO - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. -# This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. The create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = ./rsc/layout.xml - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = ../docs/src \ - ../os/kernel \ - ../os/ports \ - ../os/hal \ - ../os/various \ - ../test \ - ../ext/ext.dox - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.ddf \ - *.s - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = ../os/ports/common/ARMCMx/CMSIS \ - ../os/ports/GCC/SIMIA32 \ - ../os/hal/platforms \ - ../os/hal/templates/meta \ - ../os/various\devices_lib \ - ../os/various\fatfs_bindings \ - ../os/various\lwip_bindings \ - ../test/coverage - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = ./rsc - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. -# If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. -# Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. -# The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = NO - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. -# Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = NO - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is adviced to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = ./rsc/header_chm.html - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = ./rsc/footer_chm.html - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the stylesheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = YES - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = ../ChibiOS_RT.chm - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = "\"C:/Program Files/HTML Help Workshop/hhc.exe\"" - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 4 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the -# mathjax.org site, so you can quickly see the result without installing -# MathJax, but it is strongly recommended to install a local copy of MathJax -# before deployment. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = NO - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = YES - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = __DOXYGEN__ - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = NO - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = NO - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will write a font called Helvetica to the output -# directory and reference it in all dot files that doxygen generates. -# When you want a differently looking font you can specify the font name -# using DOT_FONTNAME. You need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 8 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = YES - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = NO - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = YES - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = NO - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 20 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 3 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = YES - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = YES - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/docs/Doxyfile_html b/docs/Doxyfile_html deleted file mode 100644 index d18b5eb97..000000000 --- a/docs/Doxyfile_html +++ /dev/null @@ -1,1787 +0,0 @@ -# Doxyfile 1.7.4 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" "). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = ChibiOS/RT - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 2.7.0 - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = . - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = YES - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = "C:/Documents and Settings/Administrator/" - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = NO - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 2 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = "iclass=@par Function Class:\n This is an \ - I-Class API, this function can be \ - invoked from within a system lock zone by both \ - threads and interrupt handlers." \ - "sclass=@par Function Class:\n This is an \ - S-Class API, this function can be \ - invoked from within a system lock zone by threads \ - only." \ - "api=@par Function Class:\n Normal API, this \ - function can be invoked by regular system threads \ - but not from within a lock zone." \ - "notapi=@par Function Class:\n Not an API, this \ - function is for internal use only." \ - "isr=@par Function Class:\n Interrupt handler, \ - this function should not be directly invoked." \ - "init=@par Function Class:\n Initializer, this \ - function just initializes an object and can be \ - invoked before the kernel is initialized." \ - "special=@par Function Class:\n Special function, \ - this function has special requirements see the \ - notes." - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this -# tag. The format is ext=language, where ext is a file extension, and language -# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = NO - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = YES - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = YES - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = NO - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = NO - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. -# This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. The create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = ./rsc/layout.xml - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = YES - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = ../docs/src \ - ../os/kernel \ - ../os/ports \ - ../os/hal \ - ../os/various \ - ../test \ - ../ext/ext.dox - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.ddf \ - *.s - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = ../os/ports/common/ARMCMx/CMSIS \ - ../os/ports/GCC/SIMIA32 \ - ../os/hal/platforms \ - ../os/hal/templates/meta \ - ../os/various\devices_lib \ - ../os/various\fatfs_bindings \ - ../os/various\lwip_bindings \ - ../test/coverage - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = ./rsc - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. -# If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. -# Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. -# The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = NO - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. -# Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = NO - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is adviced to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = ./rsc/header_html.html - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = ./rsc/footer_html.html - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the stylesheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = ../ChibiOS_RT.chm - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = "\"C:/Program Files/HTML Help Workshop/hhc.exe\"" - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 4 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. - -GENERATE_TREEVIEW = YES - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the -# mathjax.org site, so you can quickly see the result without installing -# MathJax, but it is strongly recommended to install a local copy of MathJax -# before deployment. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = NO - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = YES - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = YES - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = __DOXYGEN__ - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = NO - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = NO - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will write a font called Helvetica to the output -# directory and reference it in all dot files that doxygen generates. -# When you want a differently looking font you can specify the font name -# using DOT_FONTNAME. You need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 8 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = YES - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = NO - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = YES - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = NO - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 20 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 3 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = YES - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = YES - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/docs/html/logo_small.png b/docs/html/logo_small.png deleted file mode 100644 index c53451bbac96dd9568ca295eb43478cdb1c9aeec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7697 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 LNkvXXu0mjfy>y+q diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index bf4fe4e3f..000000000 --- a/docs/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/readme.txt b/docs/readme.txt deleted file mode 100644 index 9924d779f..000000000 --- a/docs/readme.txt +++ /dev/null @@ -1,11 +0,0 @@ -*** Documentation build procedure *** - -The following software must be installed: -- Doxygen 1.7.4 or later. -- Graphviz 2.26.3 or later. The ./bin directory must be specified in the path - in order to make Graphviz accessible by Doxygen. - -Build procedure: -- Run Doxywizard. -- Load ./docs/Doxyfile_html or ./docs/Doxyfile_chm from Doxywizard. -- Start. diff --git a/docs/reports/AT91SAM7X-48-ARM.txt b/docs/reports/AT91SAM7X-48-ARM.txt deleted file mode 100644 index 3198727f3..000000000 --- a/docs/reports/AT91SAM7X-48-ARM.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -Settings: MCK=48.054857, MC_FMR = AT91C_MC_FWS_1FWS (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 12:28:19 -*** Compiler: GCC 4.6.2 -*** Architecture: ARM7 -*** Core Variant: ARM7TDMI -*** Port Info: Pure ARM mode -*** Platform: AT91SAM7x -*** Test Board: Olimex SAM7-EX256 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 116919 msgs/S, 233838 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 89887 msgs/S, 179774 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 89887 msgs/S, 179774 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 380288 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 64709 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 93398 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 26941 reschedules/S, 161646 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 203272 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 272700 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 263496 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 449056 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 322048 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 364 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/AT91SAM7X-48-THUMB.txt b/docs/reports/AT91SAM7X-48-THUMB.txt deleted file mode 100644 index 21a3632e5..000000000 --- a/docs/reports/AT91SAM7X-48-THUMB.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -Settings: MCK=48.054857, MC_FMR = AT91C_MC_FWS_1FWS (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 13:03:08 -*** Compiler: GCC 4.6.2 -*** Architecture: ARM7 -*** Core Variant: ARM7TDMI -*** Port Info: Pure THUMB mode -*** Platform: AT91SAM7x -*** Test Board: Olimex SAM7-EX256 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 107489 msgs/S, 214978 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 88253 msgs/S, 176506 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 88253 msgs/S, 176506 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 402392 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 67753 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 101772 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 28388 reschedules/S, 170328 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 199720 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 289356 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 323198 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 364448 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 256824 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 364 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/ATmega128-16.txt b/docs/reports/ATmega128-16.txt deleted file mode 100644 index a171ab108..000000000 --- a/docs/reports/ATmega128-16.txt +++ /dev/null @@ -1,149 +0,0 @@ -*************************************************************************** -Options: -O2 -Settings: F_CPU=16000000 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 21:11:04 -*** Compiler: GCC 4.3.0 -*** Architecture: AVR -*** Core Variant: MegaAVR -*** Port Info: None -*** Platform: ATmega128 -*** Test Board: Olimex AVR-MT-128 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 31561 msgs/S, 63122 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 24980 msgs/S, 49960 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 24980 msgs/S, 49960 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 88896 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 19766 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 25179 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 7891 reschedules/S, 47346 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 60760 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 91888 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 85722 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 227568 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 116724 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 234 bytes ---- Thread: 31 bytes ---- Timer : 10 bytes ---- Semaph: 5 bytes ---- EventS: 2 bytes ---- EventL: 5 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 18 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1114-48-GCC.txt b/docs/reports/LPC1114-48-GCC.txt deleted file mode 100644 index 4e0118f00..000000000 --- a/docs/reports/LPC1114-48-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -Settings: CLK=48, (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:34:26 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv6-M -*** Core Variant: Cortex-M0 -*** Port Info: Preemption through NMI -*** Platform: LPC11xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1114 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 127622 msgs/S, 255244 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 101340 msgs/S, 202680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 101340 msgs/S, 202680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 384536 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 79026 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 111784 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 30914 reschedules/S, 185484 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 245084 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 377384 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 351018 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 591196 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 354276 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1114-48-RVCT.txt b/docs/reports/LPC1114-48-RVCT.txt deleted file mode 100644 index 06c95d3e3..000000000 --- a/docs/reports/LPC1114-48-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: CLK=48, (2 wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:37:26 -*** Compiler: RVCT -*** Architecture: ARMv6-M -*** Core Variant: Cortex-M0 -*** Port Info: Preemption through NMI -*** Platform: LPC11xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1114 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 122129 msgs/S, 244258 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 102916 msgs/S, 205832 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 103361 msgs/S, 206722 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 380136 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 79326 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 113161 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 33700 reschedules/S, 202200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 232092 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 341100 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 307102 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 618184 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 382800 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1343-72-GCC.txt b/docs/reports/LPC1343-72-GCC.txt deleted file mode 100644 index 4e8c8d7fc..000000000 --- a/docs/reports/LPC1343-72-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -Settings: CLK=72, (3 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:42:36 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: LPC13xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1343 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 268027 msgs/S, 536054 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 217012 msgs/S, 434024 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 217012 msgs/S, 434024 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 974024 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 161791 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 237078 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 67574 reschedules/S, 405444 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 512180 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 623284 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 665126 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 860284 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 635676 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1343-72-IAR.txt b/docs/reports/LPC1343-72-IAR.txt deleted file mode 100644 index f106ef9d3..000000000 --- a/docs/reports/LPC1343-72-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: CLK=72, (3 wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 20:09:51 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: LPC13xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1343 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 252028 msgs/S, 504056 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 220329 msgs/S, 440658 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 219661 msgs/S, 439322 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 856376 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 159269 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 223772 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 72334 reschedules/S, 434004 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 469472 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 646692 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 665016 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 1026020 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 661984 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC1343-72-RVCT.txt b/docs/reports/LPC1343-72-RVCT.txt deleted file mode 100644 index f135a267a..000000000 --- a/docs/reports/LPC1343-72-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: CLK=72, (3 wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:48:24 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: LPC13xx -*** Test Board: Embedded Artists LPCXpresso Base Board + LPC1343 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 250294 msgs/S, 500588 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 219004 msgs/S, 438008 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 217021 msgs/S, 434042 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 885512 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 164008 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 233236 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 71977 reschedules/S, 431862 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 498840 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 613984 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 647154 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 984024 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 653036 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC2148-48-ARM.txt b/docs/reports/LPC2148-48-ARM.txt deleted file mode 100644 index 0d0e430df..000000000 --- a/docs/reports/LPC2148-48-ARM.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -falign-functions=16 -Settings: CCLK=48, MAMCR=2, MAMTIM=3 (3 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 16:47:23 -*** Compiler: GCC 4.6.2 -*** Architecture: ARM7 -*** Core Variant: ARM7TDMI -*** Port Info: Pure ARM mode -*** Platform: LPC214x -*** Test Board: Olimex LPC-P2148 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 148529 msgs/S, 297058 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 113332 msgs/S, 226664 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 113332 msgs/S, 226664 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 493680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 86173 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 122631 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 34987 reschedules/S, 209922 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 268312 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 388444 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 325360 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 607348 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 380356 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 364 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/LPC2148-48-THUMB.txt b/docs/reports/LPC2148-48-THUMB.txt deleted file mode 100644 index c70f4276f..000000000 --- a/docs/reports/LPC2148-48-THUMB.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -mabi=apcs-gnu -falign-functions=16 -Settings: CCLK=48, MAMCR=2, MAMTIM=3 (3 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 16:28:18 -*** Compiler: GCC 4.6.2 -*** Architecture: ARM7 -*** Core Variant: ARM7TDMI -*** Port Info: Pure THUMB mode -*** Platform: LPC214x -*** Test Board: Olimex LPC-P2148 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 107903 msgs/S, 215806 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 89018 msgs/S, 178036 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 89018 msgs/S, 178036 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 410760 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 69081 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 105994 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 29094 reschedules/S, 174564 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 210820 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 292036 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 326310 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 350856 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 244212 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 364 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/MSP430F1611-0.75.txt b/docs/reports/MSP430F1611-0.75.txt deleted file mode 100644 index 802d60e69..000000000 --- a/docs/reports/MSP430F1611-0.75.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -Settings: MCLK=DCOCLK 750kHz -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 22 2012 - 20:51:54 -*** Compiler: GCC 3.2.3 -*** Architecture: MSP430 -*** Core Variant: MSP430 -*** Port Info: None -*** Platform: MSP430x16x -*** Test Board: Olimex MSP430-P1611 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 1880 msgs/S, 3760 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 1549 msgs/S, 3098 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 1549 msgs/S, 3098 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 5456 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 1065 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 1434 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 489 reschedules/S, 2934 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 3520 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 6340 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 5626 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 13908 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 7520 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 224 bytes ---- Thread: 38 bytes ---- Timer : 10 bytes ---- Semaph: 6 bytes ---- EventS: 2 bytes ---- EventL: 6 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 20 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/MSP430F1611-8.txt b/docs/reports/MSP430F1611-8.txt deleted file mode 100644 index fd2ac8942..000000000 --- a/docs/reports/MSP430F1611-8.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -Settings: MCLK=XT2CLK 8MHz -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: Apr 25 2012 - 11:28:57 -*** Compiler: GCC 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -*** Architecture: MSP430 -*** Core Variant: MSP430 -*** Port Info: None -*** Platform: MSP430 -*** Test Board: Olimex MSP430-P1611 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 22756 msgs/S, 45512 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 17949 msgs/S, 35898 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 17949 msgs/S, 35898 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 67552 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 12780 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 18071 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 5449 reschedules/S, 32694 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 42200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 73280 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 69456 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 140132 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 76804 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 222 bytes ---- Thread: 38 bytes ---- Timer : 10 bytes ---- Semaph: 6 bytes ---- EventS: 2 bytes ---- EventL: 6 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 20 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/SPC560B50-64.txt b/docs/reports/SPC560B50-64.txt deleted file mode 100644 index d2c22581f..000000000 --- a/docs/reports/SPC560B50-64.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=64 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.2unstable -*** Compiled: Apr 26 2013 - 13:25:43 -*** Compiler: GCC 4.6.3 build on 2013-01-07 -*** Architecture: Power Architecture -*** Core Variant: e200z0 -*** Port Info: VLE mode -*** Platform: SPC560B/Cxx Car Body and Convenience -*** Test Board: Generic SPC560B/Cxx - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 200700 msgs/S, 401400 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 167515 msgs/S, 335030 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 167518 msgs/S, 335036 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 590288 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 132691 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 189383 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 52143 reschedules/S, 312858 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 392160 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 619272 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 792852 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 850984 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 649608 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 1052 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 16 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 36 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/SPC560P50-64.txt b/docs/reports/SPC560P50-64.txt deleted file mode 100644 index 34fdae5d9..000000000 --- a/docs/reports/SPC560P50-64.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=64 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.2unstable -*** Compiled: Apr 26 2013 - 13:30:12 -*** Compiler: GCC 4.6.3 build on 2013-01-07 -*** Architecture: Power Architecture -*** Core Variant: e200z0 -*** Port Info: VLE mode -*** Platform: SPC560Pxx Chassis and Safety -*** Test Board: Generic SPC560Pxx - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 200703 msgs/S, 401406 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 167519 msgs/S, 335038 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 167519 msgs/S, 335038 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 590288 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 132689 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 189383 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 52143 reschedules/S, 312858 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 392160 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 619280 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 792852 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 850964 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 649584 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 1052 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 16 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 36 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/SPC563M64-80.txt b/docs/reports/SPC563M64-80.txt deleted file mode 100644 index 6d17cd808..000000000 --- a/docs/reports/SPC563M64-80.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=80 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.2unstable -*** Compiled: Apr 26 2013 - 13:36:25 -*** Compiler: GCC 4.6.3 build on 2013-01-07 -*** Architecture: Power Architecture -*** Core Variant: e200z3 -*** Port Info: VLE mode -*** Platform: SPC563Mxx Powertrain -*** Test Board: Generic SPC563Mxx - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 267100 msgs/S, 534200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 214686 msgs/S, 429372 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 214686 msgs/S, 429372 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 880072 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 172117 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 251932 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 73531 reschedules/S, 441186 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 556476 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 803124 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 897800 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 948060 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 808692 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 1052 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 16 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 36 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/SPC564A64-150.txt b/docs/reports/SPC564A64-150.txt deleted file mode 100644 index ad2d80d84..000000000 --- a/docs/reports/SPC564A64-150.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=150 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.2unstable -*** Compiled: Apr 29 2013 - 11:08:09 -*** Compiler: GCC 4.6.3 build on 2013-01-07 -*** Architecture: Power Architecture -*** Core Variant: e200z4 -*** Port Info: VLE mode -*** Platform: SPC564Axx Powertrain -*** Test Board: Generic SPC564Axx - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 543008 msgs/S, 1086016 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 448711 msgs/S, 897422 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 448712 msgs/S, 897424 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 1547056 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 358539 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 518581 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 137368 reschedules/S, 824208 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 915500 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1624592 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 1897166 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 2688244 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1855960 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 1052 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 16 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 36 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/SPC56EL60-120.txt b/docs/reports/SPC56EL60-120.txt deleted file mode 100644 index 50a7ad9fe..000000000 --- a/docs/reports/SPC56EL60-120.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=120 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.2unstable -*** Compiled: Apr 29 2013 - 11:20:37 -*** Compiler: GCC 4.6.3 build on 2013-01-07 -*** Architecture: Power Architecture -*** Core Variant: e200z4 -*** Port Info: VLE mode -*** Platform: SPC56ELxx Chassis and Safety -*** Test Board: Generic SPC56ELxx - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 379277 msgs/S, 758554 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 312927 msgs/S, 625854 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 312931 msgs/S, 625862 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 1099584 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 250737 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 369918 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 94594 reschedules/S, 567564 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 633460 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1107176 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 1309908 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 1762548 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1239856 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 1052 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 16 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 36 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F051-48-GCC.txt b/docs/reports/STM32F051-48-GCC.txt deleted file mode 100644 index 1d2b671f5..000000000 --- a/docs/reports/STM32F051-48-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=48, ACR=0x11 (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: May 19 2012 - 17:24:06 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv6-M -*** Core Variant: Cortex-M0 -*** Port Info: Preemption through NMI -*** Platform: STM32F0 Entry Level -*** Test Board: ST STM32L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 151223 msgs/S, 302446 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 119158 msgs/S, 238316 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 119158 msgs/S, 238316 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 456240 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 92602 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 132740 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 36254 reschedules/S, 217524 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 273820 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 427652 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 417370 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 682712 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 422920 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 404 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F100-24-GCC.txt b/docs/reports/STM32F100-24-GCC.txt deleted file mode 100644 index 7d22dd1ad..000000000 --- a/docs/reports/STM32F100-24-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=24, ACR=0x10 (no wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 14:51:29 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Value Line Medium Density -*** Test Board: ST STM32VL-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 107466 msgs/S, 214932 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 88361 msgs/S, 176722 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 88361 msgs/S, 176722 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 364984 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 64312 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 91069 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 27423 reschedules/S, 164538 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 194360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 262192 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 305910 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 381748 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 268084 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F100-24-IAR.txt b/docs/reports/STM32F100-24-IAR.txt deleted file mode 100644 index 5c5d3512b..000000000 --- a/docs/reports/STM32F100-24-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=24, ACR=0x10 (no wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 14:57:36 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Value Line Medium Density -*** Test Board: ST STM32VL-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 99411 msgs/S, 198822 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 86444 msgs/S, 172888 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 86444 msgs/S, 172888 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 336632 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 62625 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 88700 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 28919 reschedules/S, 173514 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 183540 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 252964 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 309832 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 472444 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 271112 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F100-24-RVCT.txt b/docs/reports/STM32F100-24-RVCT.txt deleted file mode 100644 index b747c1afe..000000000 --- a/docs/reports/STM32F100-24-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=24, ACR=0x10 (no wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 15:04:43 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Value Line Medium Density -*** Test Board: ST STM32VL-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 101100 msgs/S, 202200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 86761 msgs/S, 173522 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 86761 msgs/S, 173522 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 340272 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 63800 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 91072 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 29203 reschedules/S, 175218 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 203920 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 242700 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 311922 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 454500 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 274248 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-48-GCC.txt b/docs/reports/STM32F103-48-GCC.txt deleted file mode 100644 index a9e91a259..000000000 --- a/docs/reports/STM32F103-48-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=48, ACR=0x11 (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 11:54:27 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 197697 msgs/S, 395394 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 162180 msgs/S, 324360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 162180 msgs/S, 324360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 683520 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 118726 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 170879 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 49070 reschedules/S, 294420 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 347320 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 466776 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 490722 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 640048 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 461148 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-GCC-compact.txt b/docs/reports/STM32F103-72-GCC-compact.txt deleted file mode 100644 index 7cd8594e8..000000000 --- a/docs/reports/STM32F103-72-GCC-compact.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 11:58:05 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Compact kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 275197 msgs/S, 550394 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 221680 msgs/S, 443360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 221680 msgs/S, 443360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 952928 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 163998 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 240229 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 66137 reschedules/S, 396822 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 471772 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 623236 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 641326 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 842560 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 632848 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-GCC.txt b/docs/reports/STM32F103-72-GCC.txt deleted file mode 100644 index d9345d56d..000000000 --- a/docs/reports/STM32F103-72-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: Apr 25 2012 - 12:56:39 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 268998 msgs/S, 537996 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 213760 msgs/S, 427520 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 213760 msgs/S, 427520 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 975576 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 158908 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 236273 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 64647 reschedules/S, 387882 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 478040 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 623212 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 647076 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 787132 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 596056 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 404 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-IAR-compact.txt b/docs/reports/STM32F103-72-IAR-compact.txt deleted file mode 100644 index cf318340a..000000000 --- a/docs/reports/STM32F103-72-IAR-compact.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 12:04:29 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Compact kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 250283 msgs/S, 500566 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 216355 msgs/S, 432710 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 215059 msgs/S, 430118 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 850064 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 154479 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 228038 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 70146 reschedules/S, 420876 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 474140 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 664692 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 707650 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 1122300 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 650024 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-IAR.txt b/docs/reports/STM32F103-72-IAR.txt deleted file mode 100644 index 13b904158..000000000 --- a/docs/reports/STM32F103-72-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 12:19:46 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 241831 msgs/S, 483662 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 211248 msgs/S, 422496 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 210000 msgs/S, 420000 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 841272 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 149324 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 217650 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 69192 reschedules/S, 415152 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 467900 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 661520 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 690526 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 1071880 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 632748 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-RVCT-compact.txt b/docs/reports/STM32F103-72-RVCT-compact.txt deleted file mode 100644 index 21982a672..000000000 --- a/docs/reports/STM32F103-72-RVCT-compact.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 12:14:42 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Compact kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 245998 msgs/S, 491996 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 210638 msgs/S, 421276 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 210638 msgs/S, 421276 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 852568 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 157180 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 231712 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 67698 reschedules/S, 406188 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 504052 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 608404 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 598586 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 957740 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 669744 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F103-72-RVCT.txt b/docs/reports/STM32F103-72-RVCT.txt deleted file mode 100644 index 8b1192283..000000000 --- a/docs/reports/STM32F103-72-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 12:17:39 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Performance Line Medium Density -*** Test Board: Olimex STM32-P103 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 244331 msgs/S, 488662 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 212523 msgs/S, 425046 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 212523 msgs/S, 425046 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 860304 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 153165 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 224497 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 68542 reschedules/S, 411252 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 493700 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 574396 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 598628 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 855192 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 617932 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F107-72-GCC.txt b/docs/reports/STM32F107-72-GCC.txt deleted file mode 100644 index a8290110c..000000000 --- a/docs/reports/STM32F107-72-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 11:49:01 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32F1 Connectivity Line -*** Test Board: Olimex STM32-P107 - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 266998 msgs/S, 533996 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 213748 msgs/S, 427496 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 213748 msgs/S, 427496 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 962456 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 159254 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 236261 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 64820 reschedules/S, 388920 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 474856 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 608060 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 644192 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 787148 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 596068 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F303-72-GCC.txt b/docs/reports/STM32F303-72-GCC.txt deleted file mode 100644 index 5bff12cf5..000000000 --- a/docs/reports/STM32F303-72-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.1unstable -*** Compiled: Dec 5 2012 - 09:02:24 -*** Compiler: GCC 4.6.2 20120613 (release) [ARM/embedded-4_6-branch revision 188521] -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4 -*** Port Info: Advanced kernel mode -*** Platform: STM32F30x Analog & DSP -*** Test Board: STMicroelectronics STM32F3-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 269999 msgs/S, 539998 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 214388 msgs/S, 428776 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 214388 msgs/S, 428776 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 975520 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 156477 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 235488 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 65113 reschedules/S, 390678 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 478800 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 621156 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 655900 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 787080 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 601008 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 404 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 16 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 36 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F373-72-GCC.txt b/docs/reports/STM32F373-72-GCC.txt deleted file mode 100644 index fb4cb2f73..000000000 --- a/docs/reports/STM32F373-72-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=72, ACR=0x12 (2 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.2unstable -*** Compiled: Mar 3 2013 - 09:55:54 -*** Compiler: GCC 4.7.3 20121207 (release) [ARM/embedded-4_7-branch revision 194305] -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4 -*** Port Info: Advanced kernel mode -*** Platform: STM32F37x Analog & DSP -*** Test Board: STMicroelectronics STM32373C-EVAL - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 263081 msgs/S, 526162 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 212496 msgs/S, 424992 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 212496 msgs/S, 424992 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 931272 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 157855 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 233196 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 64413 reschedules/S, 386478 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 475640 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 629324 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 655914 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 778572 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 576896 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 404 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 16 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 36 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F407-168-GCC-FPU.txt b/docs/reports/STM32F407-168-GCC-FPU.txt deleted file mode 100644 index 9b37d76f0..000000000 --- a/docs/reports/STM32F407-168-GCC-FPU.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=168, ACR=0x705 (5 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: Apr 1 2012 - 14:19:33 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4F -*** Port Info: Advanced kernel mode -*** Platform: STM32F4 High Performance & DSP -*** Test Board: ST STM32F4-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 576749 msgs/S, 1153498 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 493633 msgs/S, 987266 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 493631 msgs/S, 987262 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 1672112 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 382319 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 510144 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 156526 reschedules/S, 939156 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 1063936 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1804680 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 2124518 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 2685364 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1885792 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 644 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F407-168-GCC.txt b/docs/reports/STM32F407-168-GCC.txt deleted file mode 100644 index e28a0a1f9..000000000 --- a/docs/reports/STM32F407-168-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=168, ACR=0x705 (5 wait states) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.5.0 -*** Compiled: Apr 9 2012 - 15:07:48 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4 -*** Port Info: Advanced kernel mode -*** Platform: STM32F4 High Performance & DSP -*** Test Board: ST STM32F4-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 752723 msgs/S, 1505446 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 617124 msgs/S, 1234248 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 617119 msgs/S, 1234238 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 2528968 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 448823 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 635833 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 193383 reschedules/S, 1160298 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 1356420 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1804932 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 2124810 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 2685732 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1886044 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 372 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F407-168-IAR.txt b/docs/reports/STM32F407-168-IAR.txt deleted file mode 100644 index c05a4d60e..000000000 --- a/docs/reports/STM32F407-168-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=168, ACR=0x705 (5 wait states) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 15 2012 - 20:30:59 -*** Compiler: IAR -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4 -*** Port Info: Advanced kernel mode -*** Platform: STM32F4 High Performance & DSP -*** Test Board: ST STM32F4-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 682340 msgs/S, 1364680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 593133 msgs/S, 1186266 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 593132 msgs/S, 1186264 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 2315264 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 424953 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 603812 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 203217 reschedules/S, 1219302 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 1370264 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1669144 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 2098174 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 3010820 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1780940 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32F407-168-RVCT.txt b/docs/reports/STM32F407-168-RVCT.txt deleted file mode 100644 index 60ed4ab1c..000000000 --- a/docs/reports/STM32F407-168-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=32, ACR=0x11 (1 wait state) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 15 2012 - 20:25:03 -*** Compiler: RVCT -*** Architecture: ARMv7-ME -*** Core Variant: Cortex-M4 -*** Port Info: Advanced kernel mode -*** Platform: STM32F4 High Performance & DSP -*** Test Board: ST STM32F4-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 711269 msgs/S, 1422538 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 610399 msgs/S, 1220798 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 610399 msgs/S, 1220798 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 2393744 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 448826 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 640691 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 205457 reschedules/S, 1232742 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 1434680 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 1724960 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 2223332 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 3197328 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 1951860 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32L152-32-GCC.txt b/docs/reports/STM32L152-32-GCC.txt deleted file mode 100644 index 5218cd1ef..000000000 --- a/docs/reports/STM32L152-32-GCC.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: -O2 -fomit-frame-pointer -falign-functions=16 -Settings: SYSCLK=32, ACR=0x11 (1 wait state) -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 13:25:45 -*** Compiler: GCC 4.6.2 -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32L1 Ultra Low Power Medium Density -*** Test Board: ST STM32L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 131606 msgs/S, 263212 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 107961 msgs/S, 215922 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 107961 msgs/S, 215922 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 454200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 79829 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 114163 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 33107 reschedules/S, 198642 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 229120 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 329000 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 364000 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 468364 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 309232 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32L152-32-IAR.txt b/docs/reports/STM32L152-32-IAR.txt deleted file mode 100644 index ce8093bf4..000000000 --- a/docs/reports/STM32L152-32-IAR.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -Ohs -Settings: SYSCLK=32, ACR=0x11 (1 wait state) -Compiler: IAR C/C++ Compiler for ARM 6.30.3.3241 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 13:30:39 -*** Compiler: IAR -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32L1 Ultra Low Power Medium Density -*** Test Board: ST STM32L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 121100 msgs/S, 242200 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 106517 msgs/S, 213034 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 106517 msgs/S, 213034 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 418376 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 77689 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 110214 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 35153 reschedules/S, 210918 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 221188 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 312040 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 383674 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 522068 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 320060 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM32L152-32-RVCT.txt b/docs/reports/STM32L152-32-RVCT.txt deleted file mode 100644 index 38e3f6ed7..000000000 --- a/docs/reports/STM32L152-32-RVCT.txt +++ /dev/null @@ -1,165 +0,0 @@ -*************************************************************************** -Options: -O3 -Otime --apcs=interwork -Settings: SYSCLK=32, ACR=0x11 (1 wait state) -Compiler: RealView C/C++ Compiler V4.1.0.791 [Evaluation]. -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 21 2012 - 13:38:29 -*** Compiler: RVCT -*** Architecture: ARMv7-M -*** Core Variant: Cortex-M3 -*** Port Info: Advanced kernel mode -*** Platform: STM32L1 Ultra Low Power Medium Density -*** Test Board: ST STM32L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 122507 msgs/S, 245014 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 106169 msgs/S, 212338 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 106525 msgs/S, 213050 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 427528 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 78454 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 112558 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 35469 reschedules/S, 212814 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 241292 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 307556 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 359934 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 530856 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 321748 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 376 bytes ---- Thread: 72 bytes ---- Timer : 20 bytes ---- Semaph: 12 bytes ---- EventS: 4 bytes ---- EventL: 12 bytes ---- Mutex : 16 bytes ---- CondV.: 8 bytes ---- Queue : 32 bytes ---- MailB.: 40 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM8L152-16-Cosmic.txt b/docs/reports/STM8L152-16-Cosmic.txt deleted file mode 100644 index a2d306326..000000000 --- a/docs/reports/STM8L152-16-Cosmic.txt +++ /dev/null @@ -1,7 +0,0 @@ -*************************************************************************** -Options: Optimized for speed -Settings: CPUCLK=16MHz (HSI) -Compiler: Cosmic STM8 compiler 4.3.6. -*************************************************************************** - -FAILED (compiler regression) \ No newline at end of file diff --git a/docs/reports/STM8L152-16-Raisonance.txt b/docs/reports/STM8L152-16-Raisonance.txt deleted file mode 100644 index 508866149..000000000 --- a/docs/reports/STM8L152-16-Raisonance.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: Optimized for speed -Settings: CPUCLK=16MHz (HSI) -Compiler: Raisonance RKit-STM8_2.32.10.0307 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 23 2012 - 19:04:23 -*** Compiler: Raisonance -*** Architecture: STM8 -*** Port Info: None -*** Platform: STM8L -*** Test Board: ST STM8L-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 30270 msgs/S, 60540 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 23197 msgs/S, 46394 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 23197 msgs/S, 46394 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 107360 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 17468 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 27274 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 6268 reschedules/S, 37608 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 53228 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 76448 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 57698 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 125104 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 123176 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 218 bytes ---- Thread: 34 bytes ---- Timer : 10 bytes ---- Semaph: 5 bytes ---- EventS: 2 bytes ---- EventL: 5 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 18 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM8S105-16-Cosmic.txt b/docs/reports/STM8S105-16-Cosmic.txt deleted file mode 100644 index a2d306326..000000000 --- a/docs/reports/STM8S105-16-Cosmic.txt +++ /dev/null @@ -1,7 +0,0 @@ -*************************************************************************** -Options: Optimized for speed -Settings: CPUCLK=16MHz (HSI) -Compiler: Cosmic STM8 compiler 4.3.6. -*************************************************************************** - -FAILED (compiler regression) \ No newline at end of file diff --git a/docs/reports/STM8S105-16-Raisonance.txt b/docs/reports/STM8S105-16-Raisonance.txt deleted file mode 100644 index ab926e136..000000000 --- a/docs/reports/STM8S105-16-Raisonance.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: Optimized for speed -Settings: CPUCLK=16MHz (HSE) -Compiler: Raisonance RKit-STM8_2.32.10.0307 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 23 2012 - 19:17:23 -*** Compiler: Raisonance -*** Architecture: STM8 -*** Port Info: None -*** Platform: STM8S -*** Test Board: ST STM8S-Discovery - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 30272 msgs/S, 60544 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 23199 msgs/S, 46398 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 23199 msgs/S, 46398 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 107368 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 17469 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 27276 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 6269 reschedules/S, 37614 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 53236 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 76456 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 57702 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 125116 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 123188 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 218 bytes ---- Thread: 34 bytes ---- Timer : 10 bytes ---- Semaph: 5 bytes ---- EventS: 2 bytes ---- EventL: 5 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 18 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/STM8S208-16-Raisonance.txt b/docs/reports/STM8S208-16-Raisonance.txt deleted file mode 100644 index f57609eac..000000000 --- a/docs/reports/STM8S208-16-Raisonance.txt +++ /dev/null @@ -1,164 +0,0 @@ -*************************************************************************** -Options: Optimized for speed (3) -Settings: CPUCLK=16MHz (HSI) -Compiler: Raisonance RKit-STM8_2.32.10.0307 -*************************************************************************** - -*** ChibiOS/RT test suite -*** -*** Kernel: 2.4.0 -*** Compiled: Jan 25 2012 - 19:04:12 -*** Compiler: Raisonance -*** Architecture: STM8 -*** Port Info: None -*** Platform: STM8S -*** Test Board: Raisonance REva V3 + STM8S208RB - ----------------------------------------------------------------------------- ---- Test Case 1.1 (Threads, enqueuing test #1) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.2 (Threads, enqueuing test #2) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.3 (Threads, priority change) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 1.4 (Threads, delays) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.1 (Semaphores, enqueuing) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.2 (Semaphores, timeout) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.3 (Semaphores, atomic signal-wait) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 2.4 (Binary Semaphores, functionality) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.1 (Mutexes, priority enqueuing test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.2 (Mutexes, priority inheritance, simple case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.3 (Mutexes, priority inheritance, complex case) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.4 (Mutexes, priority return) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.5 (Mutexes, status) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.6 (CondVar, signal test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.7 (CondVar, broadcast test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 3.8 (CondVar, boost test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 4.1 (Messages, loop) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 5.1 (Mailboxes, queuing and timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.1 (Events, registration and dispatch) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.2 (Events, wait and broadcast) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 6.3 (Events, timeouts) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 7.1 (Heap, allocation and fragmentation test) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 8.1 (Memory Pools, queue/dequeue) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.1 (Dynamic APIs, threads creation from heap) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.2 (Dynamic APIs, threads creation from memory pool) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 9.3 (Dynamic APIs, registry and references) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.1 (Queues, input queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 10.2 (Queues, output queues) ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.1 (Benchmark, messages #1) ---- Score : 30272 msgs/S, 60544 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.2 (Benchmark, messages #2) ---- Score : 23199 msgs/S, 46398 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.3 (Benchmark, messages #3) ---- Score : 23199 msgs/S, 46398 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.4 (Benchmark, context switch) ---- Score : 107368 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.5 (Benchmark, threads, full cycle) ---- Score : 17469 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.6 (Benchmark, threads, create only) ---- Score : 27276 threads/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.7 (Benchmark, mass reschedule, 5 threads) ---- Score : 6269 reschedules/S, 37614 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.8 (Benchmark, round robin context switching) ---- Score : 53236 ctxswc/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.9 (Benchmark, I/O Queues throughput) ---- Score : 76456 bytes/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.10 (Benchmark, virtual timers set/reset) ---- Score : 57702 timers/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.11 (Benchmark, semaphores wait/signal) ---- Score : 125116 wait+signal/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.12 (Benchmark, mutexes lock/unlock) ---- Score : 123188 lock+unlock/S ---- Result: SUCCESS ----------------------------------------------------------------------------- ---- Test Case 11.13 (Benchmark, RAM footprint) ---- System: 218 bytes ---- Thread: 34 bytes ---- Timer : 10 bytes ---- Semaph: 5 bytes ---- EventS: 2 bytes ---- EventL: 5 bytes ---- Mutex : 8 bytes ---- CondV.: 4 bytes ---- Queue : 16 bytes ---- MailB.: 18 bytes ---- Result: SUCCESS ----------------------------------------------------------------------------- - -Final result: SUCCESS diff --git a/docs/reports/build.txt b/docs/reports/build.txt deleted file mode 100644 index e05b19da9..000000000 --- a/docs/reports/build.txt +++ /dev/null @@ -1,45 +0,0 @@ -Default maximum settings - * Building...OK - * Testing...OK -CH_OPTIMIZE_SPEED=FALSE - * Building...OK - * Testing...OK -CH_TIME_QUANTUM=0 - * Building...OK - * Testing...OK -CH_USE_REGISTRY=FALSE - * Building...OK - * Testing...OK -CH_USE_SEMAPHORES_PRIORITY=TRUE - * Building...OK - * Testing...OK -CH_USE_CONDVARS_TIMEOUT=FALSE - * Building...OK - * Testing...OK -CH_USE_EVENTS_TIMEOUT=FALSE - * Building...OK - * Testing...OK -CH_USE_MESSAGES_PRIORITY=TRUE - * Building...OK - * Testing...OK -CH_USE_DYNAMIC=FALSE - * Building...OK - * Testing...OK -CH_DBG_SYSTEM_STATE_CHECK=TRUE - * Building...OK - * Testing...OK -CH_DBG_ENABLE_CHECKS=TRUE - * Building...OK - * Testing...OK -CH_DBG_ENABLE_ASSERTS=TRUE - * Building...OK - * Testing...OK -CH_DBG_ENABLE_TRACE=TRUE - * Building...OK - * Testing...OK -CH_DBG_FILL_THREADS=TRUE - * Building...OK - * Testing...OK -CH_DBG_THREADS_PROFILING=FALSE - * Building...OK - * Testing...OK diff --git a/docs/reports/coverage.txt b/docs/reports/coverage.txt deleted file mode 100644 index a1ec85669..000000000 --- a/docs/reports/coverage.txt +++ /dev/null @@ -1,75 +0,0 @@ -mkdir gcov -gcov -u ..\..\os\kernel\src\chsys.c ..\..\os\kernel\src\chdebug.c ..\..\os\kernel\src\chlists.c ..\..\os\kernel\src\chvt.c ..\..\os\kernel\src\chschd.c ..\..\os\kernel\src\chthreads.c ..\..\os\kernel\src\chdynamic.c ..\..\os\kernel\src\chregistry.c ..\..\os\kernel\src\chsem.c ..\..\os\kernel\src\chmtx.c ..\..\os\kernel\src\chcond.c ..\..\os\kernel\src\chevents.c ..\..\os\kernel\src\chmsg.c ..\..\os\kernel\src\chmboxes.c ..\..\os\kernel\src\chqueues.c ..\..\os\kernel\src\chmemcore.c ..\..\os\kernel\src\chheap.c ..\..\os\kernel\src\chmempools.c -File `../../os/kernel/src/chsys.c' -Lines executed:100.00% of 21 -../../os/kernel/src/chsys.c:creating `chsys.c.gcov' - -File `../../os/kernel/src/chdebug.c' -Lines executed:100.00% of 10 -../../os/kernel/src/chdebug.c:creating `chdebug.c.gcov' - -File `../../os/kernel/src/chlists.c' -Lines executed:100.00% of 31 -../../os/kernel/src/chlists.c:creating `chlists.c.gcov' - -File `../../os/kernel/src/chvt.c' -Lines executed:100.00% of 29 -../../os/kernel/src/chvt.c:creating `chvt.c.gcov' - -File `../../os/kernel/src/chschd.c' -Lines executed:100.00% of 65 -../../os/kernel/src/chschd.c:creating `chschd.c.gcov' - -File `../../os/kernel/src/chthreads.c' -Lines executed:100.00% of 89 -../../os/kernel/src/chthreads.c:creating `chthreads.c.gcov' - -File `../../os/kernel/src/chdynamic.c' -Lines executed:100.00% of 50 -../../os/kernel/src/chdynamic.c:creating `chdynamic.c.gcov' - -File `../../os/kernel/src/chregistry.c' -Lines executed:100.00% of 18 -../../os/kernel/src/chregistry.c:creating `chregistry.c.gcov' - -File `../../os/kernel/src/chsem.c' -Lines executed:100.00% of 88 -../../os/kernel/src/chsem.c:creating `chsem.c.gcov' - -File `../../os/kernel/src/chmtx.c' -Lines executed:100.00% of 112 -../../os/kernel/src/chmtx.c:creating `chmtx.c.gcov' - -File `../../os/kernel/src/chcond.c' -Lines executed:100.00% of 59 -../../os/kernel/src/chcond.c:creating `chcond.c.gcov' - -File `../../os/kernel/src/chevents.c' -Lines executed:100.00% of 111 -../../os/kernel/src/chevents.c:creating `chevents.c.gcov' - -File `../../os/kernel/src/chmsg.c' -Lines executed:100.00% of 27 -../../os/kernel/src/chmsg.c:creating `chmsg.c.gcov' - -File `../../os/kernel/src/chmboxes.c' -Lines executed:100.00% of 94 -../../os/kernel/src/chmboxes.c:creating `chmboxes.c.gcov' - -File `../../os/kernel/src/chqueues.c' -Lines executed:96.72% of 122 -../../os/kernel/src/chqueues.c:creating `chqueues.c.gcov' - -File `../../os/kernel/src/chmemcore.c' -Lines executed:100.00% of 20 -../../os/kernel/src/chmemcore.c:creating `chmemcore.c.gcov' - -File `../../os/kernel/src/chheap.c' -Lines executed:100.00% of 79 -../../os/kernel/src/chheap.c:creating `chheap.c.gcov' - -File `../../os/kernel/src/chmempools.c' -Lines executed:100.00% of 28 -../../os/kernel/src/chmempools.c:creating `chmempools.c.gcov' - -mv -f *.gcov ./gcov diff --git a/docs/reports/kernel.txt b/docs/reports/kernel.txt deleted file mode 100644 index 42b5bfe35..000000000 --- a/docs/reports/kernel.txt +++ /dev/null @@ -1,216 +0,0 @@ -Platform : PowerPC -OS Setup : Full kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -O2 -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 12136 - -Platform : PowerPC -OS Setup : Full kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -O2 -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 11660 - -Platform : PowerPC -OS Setup : Minimal kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -O2 -Kernel Size = 2196 - -Platform : PowerPC -OS Setup : Full kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -Os -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 10664 - -Platform : PowerPC -OS Setup : Full kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -Os -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 10124 - -Platform : PowerPC -OS Setup : Minimal kernel -Compiler : powerpc-eabi-gcc (Sourcery G++ Lite 4.4-79) 4.4.1 -Options : -Os -Kernel Size = 2220 - -Platform : ARM Cortex-M3 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 6312 - -Platform : ARM Cortex-M3 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 5892 - -Platform : ARM Cortex-M3 -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -Kernel Size = 1496 - -Platform : ARM Cortex-M3 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 5672 - -Platform : ARM Cortex-M3 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 5344 - -Platform : ARM Cortex-M3 -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -Kernel Size = 1332 - -Platform : ARM Cortex-M0 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 5628 - -Platform : ARM Cortex-M0 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 5408 - -Platform : ARM Cortex-M0 -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -Kernel Size = 1356 - -Platform : ARM Cortex-M0 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 5120 - -Platform : ARM Cortex-M0 -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 4968 - -Platform : ARM Cortex-M0 -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -Kernel Size = 1220 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 9424 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 8876 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -Kernel Size = 1932 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 8616 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 8240 - -Platform : ARM7TDMI (ARM mode) -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -Kernel Size = 1676 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=TRUE -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 6184 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DCH_OPTIMIZE_SPEED=FALSE -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 5948 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -O2 -mthumb -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 1384 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=TRUE -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 5700 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Full kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DCH_OPTIMIZE_SPEED=FALSE -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 5512 - -Platform : ARM7TDMI (THUMB mode) -OS Setup : Minimal kernel -Compiler : arm-none-eabi-gcc (GCC) 4.6.2 -Options : -Os -mthumb -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING -Kernel Size = 1256 - -Platform : MSP430 -OS Setup : Full kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -O2 -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 6592 - -Platform : MSP430 -OS Setup : Full kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -O2 -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 6164 - -Platform : MSP430 -OS Setup : Minimal kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -O2 -Kernel Size = 1164 - -Platform : MSP430 -OS Setup : Full kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -Os -DCH_OPTIMIZE_SPEED=TRUE -Kernel Size = 5888 - -Platform : MSP430 -OS Setup : Full kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -Os -DCH_OPTIMIZE_SPEED=FALSE -Kernel Size = 5584 - -Platform : MSP430 -OS Setup : Minimal kernel -Compiler : msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) -Options : -Os -Kernel Size = 988 - diff --git a/docs/rsc/custom.css b/docs/rsc/custom.css deleted file mode 100644 index 4ac73ab1a..000000000 --- a/docs/rsc/custom.css +++ /dev/null @@ -1,800 +0,0 @@ -/* The standard CSS for doxygen */ - -body, table, div, p, dl { - font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; - font-size: 12px; -} - -/* @group Heading Levels */ - -h1 { - font-size: 150%; -} - -h2 { - font-size: 120%; -} - -h3 { - font-size: 100%; -} - -dt { - font-weight: bold; -} - -div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; -} - -p.startli, p.startdd, p.starttd { - margin-top: 2px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - padding: 2px; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a { - color: #3D578C; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #4665A2; -} - -a:hover { - text-decoration: underline; -} - -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #ffffff; - border: 1px double #869DCA; -} - -.contents a.qindexHL:visited { - color: #ffffff; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code { - color: #4665A2; -} - -a.codeRef { - color: #4665A2; -} - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -.fragment { - font-family: monospace, fixed; - font-size: 105%; -} - -pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; -} - -div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - background: white; - color: black; - margin: 0; -} - -div.contents { - margin-top: 10px; - margin-left: 10px; - margin-right: 10px; -} - -td.indexkey { - background-color: #EBEFF6; - font-weight: bold; - border: 1px solid #C4CFE5; - margin: 2px 0px 2px 0; - padding: 2px 10px; -} - -td.indexvalue { - background-color: #EBEFF6; - border: 1px solid #C4CFE5; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #EEF1F7; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -address.footer { - text-align: right; - padding-right: 12px; -} - -img.footer { - border: 0px; - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -span.vhdldigit { - color: #ff00ff -} - -span.vhdlchar { - color: #000000 -} - -span.vhdlkeyword { - color: #700070 -} - -span.vhdllogic { - color: #ff0000 -} - -/* @end */ - -/* -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -*/ - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #A3B4D7; -} - -th.dirtab { - background: #EBEFF6; - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid #4A6AAA; -} - -hr.footer { - height: 1px; -} - -/* @group Member Descriptions */ - -table.memberdecls { - border-spacing: 0px; - padding: 0px; -} - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F9FAFC; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #C4CFE5; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memTemplParams { - color: #4665A2; - white-space: nowrap; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtemplate { - font-size: 80%; - color: #4665A2; - font-weight: normal; - margin-left: 9px; -} - -.memnav { - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.memitem { - padding: 0; - margin-bottom: 10px; -} - -.memname { - white-space: nowrap; - font-weight: bold; - margin-left: 6px; -} - -.memproto { - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 0px 6px 0px; - color: #253555; - font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - /* opera specific markup */ - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 8px; - border-top-left-radius: 8px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 8px; - -moz-border-radius-topleft: 8px; - /* webkit specific markup */ - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 8px; - -webkit-border-top-left-radius: 8px; - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; - -} - -.memdoc { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 2px 5px; - background-color: #FBFCFD; - border-top-width: 0; - /* opera specific markup */ - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 8px; - -moz-border-radius-bottomright: 8px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #602020; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} - -.params, .retval, .exception, .tparams { - border-spacing: 6px 2px; -} - -.params .paramname, .retval .paramname { - font-weight: bold; - vertical-align: top; -} - -.params .paramtype { - font-style: italic; - vertical-align: top; -} - -.params .paramdir { - font-family: "courier new",courier,monospace; - vertical-align: top; -} - - - - -/* @end */ - -/* @group Directory (tree) */ - -/* for the tree view */ - -.ftvtree { - font-family: sans-serif; - margin: 0px; -} - -/* these are for tree view when used as main index */ - -.directory { - font-size: 9pt; - font-weight: bold; - margin: 5px; -} - -.directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -/* -The following two styles can be used to replace the root node title -with an image of your choice. Simply uncomment the next two styles, -specify the name of your image and be sure to set 'height' to the -proper pixel height of your image. -*/ - -/* -.directory h3.swap { - height: 61px; - background-repeat: no-repeat; - background-image: url("yourimage.gif"); -} -.directory h3.swap span { - display: none; -} -*/ - -.directory > h3 { - margin-top: 0; -} - -.directory p { - margin: 0px; - white-space: nowrap; -} - -.directory div { - display: none; - margin: 0px; -} - -.directory img { - vertical-align: -30%; -} - -/* these are for tree view when not used as main index */ - -.directory-alt { - font-size: 100%; - font-weight: bold; -} - -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -.directory-alt > h3 { - margin-top: 0; -} - -.directory-alt p { - margin: 0px; - white-space: nowrap; -} - -.directory-alt div { - display: none; - margin: 0px; -} - -.directory-alt img { - vertical-align: -30%; -} - -/* @end */ - -div.dynheader { - margin-top: 8px; -} - -address { - font-style: normal; - color: #2A3D61; -} - -table.doxtable { - border-collapse:collapse; -} - -table.doxtable td, table.doxtable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; -} - -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; -} - -.navpath ul -{ - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - height:30px; - line-height:30px; - color:#8AA0CC; - border:solid 1px #C2CDE4; - overflow:hidden; - margin:0px; - padding:0px; -} - -.navpath li -{ - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#364D7C; -} - -.navpath li.navelem a -{ - height:32px; - display:block; - text-decoration: none; - outline: none; -} - -.navpath li.navelem a:hover -{ - color:#6884BD; -} - -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color:#364D7C; - font-size: 8pt; -} - - -div.summary -{ - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} - -div.summary a -{ - white-space: nowrap; -} - -div.ingroups -{ - font-size: 8pt; - padding-left: 5px; - width: 50%; - text-align: left; -} - -div.ingroups a -{ - white-space: nowrap; -} - -div.header -{ - background-image:url('nav_h.png'); - background-repeat:repeat-x; - background-color: #F9FAFC; - margin: 0px; - border-bottom: 1px solid #C4CFE5; -} - -div.headertitle -{ - padding: 5px 5px 5px 10px; -} - -dl -{ - padding: 0 0 0 10px; -} - -dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug -{ - border-left:4px solid; - padding: 0 0 0 6px; -} - -dl.note -{ - border-color: #D0D000; -} - -dl.warning, dl.attention -{ - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant -{ - border-color: #00D000; -} - -dl.deprecated -{ - border-color: #505050; -} - -dl.todo -{ - border-color: #00C0E0; -} - -dl.test -{ - border-color: #3030E0; -} - -dl.bug -{ - border-color: #C08050; -} - -#projectlogo -{ - text-align: center; - vertical-align: bottom; - border-collapse: separate; -} - -#projectlogo img -{ - border: 0px none; -} - -#projectname -{ - font: 300% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectbrief -{ - font: 120% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectnumber -{ - font: 50% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#titlearea -{ - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid #5373B4; -} - diff --git a/docs/rsc/footer_chm.html b/docs/rsc/footer_chm.html deleted file mode 100644 index 6f8038e4f..000000000 --- a/docs/rsc/footer_chm.html +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/docs/rsc/footer_html.html b/docs/rsc/footer_html.html deleted file mode 100644 index d6f2fa429..000000000 --- a/docs/rsc/footer_html.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/docs/rsc/header_chm.html b/docs/rsc/header_chm.html deleted file mode 100644 index 4d3d6a90f..000000000 --- a/docs/rsc/header_chm.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -$title - - - - -
-
- - - - - - -
-
ChibiOS/RT 2.5.2
-
-
diff --git a/docs/rsc/header_html.html b/docs/rsc/header_html.html deleted file mode 100644 index 0b9cb62bf..000000000 --- a/docs/rsc/header_html.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - -$title - - - - - - - - - -
-
- - - - - - - -
-
ChibiOS/RT
2.5.2
-
- - -
-
diff --git a/docs/rsc/layout.xml b/docs/rsc/layout.xml deleted file mode 100644 index 9ec514ba8..000000000 --- a/docs/rsc/layout.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/rsc/logo.png b/docs/rsc/logo.png deleted file mode 100644 index 7948daefba4efcb498af91a331000ae5ac87c406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16818 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 -] def -FontName currentdict end definefont pop -%%Page: 1 1 -%%BeginPageSetup -%%PageBoundingBox: 0 0 196 229 -%%EndPageSetup -q -1 g -84.574 223.767 111.258 -223.258 re f -0 g -0.8 w -0 J -0 j -[] 0.0 d -4 M q 1 0 0 -1 0 228.91925 cm -84.574 5.152 111.258 223.258 re S Q -BT -9.6 0 0 9.6 0.084375 2.047373 Tm -/f-0-0 1 Tf -[<010203>-1<04050607>-1<08090a0b07>-1<0509>]TJ -0 22.916667 Td -[<010203>-1<04050607>-1<08090a0c>1<02>-1<06>]TJ -ET -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.16 205.164 m 195.816 205.164 l S Q -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.602 56.379 m 195.859 56.379 l S Q -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.602 116.379 m 195.859 116.379 l S Q -BT -9.6 0 0 9.6 98.925002 8.414549 Tm -/f-0-0 1 Tf -[<0d0e>-1<03>-1<0907>-1<0f0a10>-1<0c>1<03>-1<11>-1<080c>1<11>-1<03>-1<09>]TJ -0.68164 11.25 Td -[<1213>-1<0c>1<080c140a100c03>-1<11080c1103>-1<09>]TJ -0.343913 7.916667 Td -[<0d0e>-1<03>-1<0907>-1<0f0a10>-1<0c>1<07>-1<0804>]TJ --11.375163 -8.809407 Td -[<10>-1<0c>1<07>-1<08040a>1<15>-1<02>-1<1213>-1<0c>1<09>-1<03>]TJ -ET -0.558281 w -[] 0.0 d -q 1 0 0 -1 0 228.91925 cm -76.48 227.523 m 83.652 227.523 l S Q -81.422 1.396 m 80.305 0.279 l 84.211 1.396 l 80.305 2.513 l 81.422 -1.396 l h -81.422 1.396 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.422 -227.523 m -80.305 -228.641 l -84.211 -227.523 l -80.305 --226.406 l -81.422 -227.523 l h --81.422 -227.523 m S Q -0.558281 w -q 1 0 0 -1 0 228.91925 cm -76.48 115.523 m 83.652 115.523 l S Q -81.422 113.396 m 80.305 112.279 l 84.211 113.396 l 80.305 114.513 l -81.422 113.396 l h -81.422 113.396 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.422 -115.523 m -80.305 -116.641 l -84.211 -115.523 l -80.305 --114.406 l -81.422 -115.523 l h --81.422 -115.523 m S Q -0.558281 w -q 1 0 0 -1 0 228.91925 cm -76.332 6.035 m 83.504 6.035 l S Q -81.27 222.884 m 80.152 221.767 l 84.063 222.884 l 80.152 224.001 l -81.27 222.884 l h -81.27 222.884 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.27 -6.035 m -80.152 -7.152 l -84.063 -6.035 l -80.152 -4.918 l --81.27 -6.035 l h --81.27 -6.035 m S Q -0.8 w -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.145 181.18 m 195.801 181.18 l S Q -BT -9.6 0 0 9.6 88.22969 31.844237 Tm -/f-0-0 1 Tf -[<0d0e>-1<03>-1<0907>-1<0f0a1602>-1<080717>-1<0a>1<10>-1<0c0203>-1<07>-1<18 -09>]TJ -ET -0.558281 w -[] 0.0 d -q 1 0 0 -1 0 228.91925 cm -76.332 206.035 m 83.504 206.035 l S Q -81.27 22.884 m 80.152 21.767 l 84.063 22.884 l 80.152 24.001 l 81.27 -22.884 l h -81.27 22.884 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.27 -206.035 m -80.152 -207.152 l -84.063 -206.035 l -80.152 --204.918 l -81.27 -206.035 l h --81.27 -206.035 m S Q -BT -9.6 0 0 9.6 -0.310938 25.150499 Tm -/f-0-0 1 Tf -[<080e0d>-1<0e0f>-1<1610>-1<19>-1<1a>]TJ -0.0843099 2.006672 Td -[<10>-1<0c>1<07>-1<08040a>1<16>-1<121b>-1<12>-1<0c>]TJ -ET -0.558281 w -q 1 0 0 -1 0 228.91925 cm -76.332 182.035 m 83.504 182.035 l S Q -81.27 46.884 m 80.152 45.767 l 84.063 46.884 l 80.152 48.001 l 81.27 -46.884 l h -81.27 46.884 m f* -0.279141 w -q -1 0 0 1 0 228.91925 cm --81.27 -182.035 m -80.152 -183.152 l -84.063 -182.035 l -80.152 --180.918 l -81.27 -182.035 l h --81.27 -182.035 m S Q -0.8 w -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.543 97.18 m 195.801 97.18 l S Q -[ 0.8 0.8] 0 d -q 1 0 0 -1 0 228.91925 cm -84.543 77.18 m 195.801 77.18 l S Q -BT -9.6 0 0 9.6 102.637498 156.583295 Tm -/f-0-0 1 Tf -[<09140c080c140a>1<10>-1<0c0311>-1<080c>1<11>-1<03>-1<09>]TJ --1.601887 -1.938639 Td -[<1c1d0d1e>-1<1f20>-1<21221c1f20>-1<23>-1<1e10>-1<0d>-1<24>-1<25>]TJ -10.675781 0 Td -<26>Tj -ET -Q -showpage -%%Trailer -count op_count sub {pop} repeat -countdictstack dict_count sub {end} repeat -cairo_eps_state restore -%%EOF diff --git a/docs/rsc/workspace.png b/docs/rsc/workspace.png deleted file mode 100644 index 689178c0b6ea28cca19c76df0ae5410ce0c75b3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20994 zcmd74cR1F4|37|;r0kTWZ0$%TN>*kiNkc*dMakZKW+kMZEu(~rva<=5nH93hUKx?` zeZ21D^Zny@9G~NN{CZHPX z{B@Q>q2i&V#oxW$>V5=&p|O%Xb&(GLai+WJhkssge)5VHe!rRgk4kQLm_2^D)ml;0 z`huB(wVkfzEsC9;o$wvgyH@(T=C_2+EDgiPB{?Y+Udkzj6Bq5nM}OIAUR3@kJ~>ez zwuwqHlwWgDk>(~VYg|j9`oUCP|1ov-hL(*g&d$lHJLWb%2rYeg@V@7(SG>_DSvQ?? zWL0-OkURfx-GSe~4Nla(coVjuv!&Ux`uoe5SF`5BkKOXI>nUAd-_)eEy0Tnn{3Ahi z@KahGsv1_JGNo%T5slGn|$sZPJHrY zlW|){pmxaP$6inOUA~{9onyV{;-yQSiH}A{jYUO8m-@e~{P_I&^TTJ)=3>H%M9dVw zR8=u*XPSDS+kFpz+VoeBw?*%l?)rEY{*nFr_eUotuBY5KHZF}MrHC`e;#YwH&nScZoYG3$^_J#E&WMP*`QqN%AFotCyyS6A15x^KON-8jR60|$2R z*~53}(8dS}8@X%OxO;kgyGKVE@M7;C>{5&Ds*X7R=IvY0ygaG!@Nk9UimIxzz-{8^ z&YxeSt*sp*rlh3QQ{=U-wz;{ytH_H_NJyyZOGU-WhK2@SQPE9mk&+$}5nK$6jCHlO z?kdlP`NYMyWMpJ?{aI)iD=I1)Y)snnDmE5NLX8Kp9;)w;SUt+{M>uXf7nl0w%f5gA z+EWUv!o<6Kd%ebgb&cw~ao z(he=n7pyAk>kCkBEY1vZ$hb=4S5r-YN!Z)l%kr}LxrkI&R=#=vUfJ1Ml3zeTT~pJ~ z$A@-iq?tK@T}TeEOv}vuVDml=^ET(%#>*UH#vHa|t={`CzbpLub%WhR$MQZm9v=rM z1%>hP@lQ4*8vOi+4jzp0^jxErs<$??x~1hsb@(xP1%>h;E&=SU(e2y3{I5z&6&^i$ z^lE0tT6p5Y*29CBw6wG~v9ZZtcU{=Au(){M#6*ad^=g4@1dh*}9bW60cN!WRnlAi~ za!WWHArW$J_oi>#Hg8rmGBRpUi;3Yg`I)A;zZ2Vi^6J%yy?gg&*v+oE5; zR`&PzZ@0X0gV$!b!QW{jH8oXGNJ#bP&!0MZKVGZ-o<5-U$xl*BN_&5p?uzhvO4q=E zPnftFKTg1*Lx%=iQU!FbUd^@{8X6jGe$PYc>d15A5V=9QdGjWPGB7Yu`{PFm9x&^` z1|A-s)C0jd`6txXSqoMc_x1JnQ&F6yc_g`+#l*xkGflZ7rJQ!A1^W7~o6pV66yLC6 z!^5a3X39~AX~F!ZX%*{{CPubhXBDno*@_P_Ir{VPO+!QdzKRe%6FO#Q-?wk~4t#$} zEh8iIcVXeg>C+odojPT*xaPCn1UDW(d)`!EpBgJ%`sItI1NlMcI;QP@FJ8P5ds-zj z5x`Kpsi7^yME>^e-CI6aS67phASW-cxcH;KzFyBaDKIdQe;EsJl6v2VnJ1{z^&ewm zVq*Iha|Z{9((>}&*7UpNIlq7ZZa&qcn3a`9aX%@w#)G0jvuDp9d{W)H(Vtn4vwN{) z=X7)!u3o(wVk^pHT5!L-_r&GPTMipm_cc|8A7gWLbTnD~5EmDx@O1}2Zpg_~r~IAS z->+2nPPJYXqu}_5wORa64FrJYZrGzj8WIsTpGV`W`WvnIqD zS1}>|Zu3USd!y9ZX1`ABf-yq-_MWt*s){p zB<1DhLl52B@Z4=>X+hMytC0Ph=_yOgLsJXRp;As_SM!};a&Fs}7#DYs@_}dWM*zR=npt*W5V z-`^jXlA=oPn#Av(p&^6>fdEx00e_tvwKcM>yhDeM;)6%|A) zoSvMF#`8TwS&_1zjBezOJZi!3;N%prboA)ahsnwNr|c!qU%VK1Q2)!rw{M3>^65Ez z{QU5?C$C+Lv{z7&{juZK@0utp-+T(W6F54BMMYGnPoHjg z2@CDryCESVfxr2a06+f?6BEW;w{B4id&`4Sq}QP)D<~@q2njJ>&9OcaCGEnyZy!B{ z3^e#j~+Y5CoRpL=Qz7D+aW$9gB@l697_AgkB5s(N{W8}$zB=%_WXdw?`p1# z7cUl8S2N-Aw`ZVuqJepnrfFhQm*-^nDdE+tHB(blA_ot81O+kOljAEcE`AsmMvqRV zsikGCcl`KqR7Ki|<915Vg|D8| z(rO*BeBt)GwN>j)Qj!<_aImV?IkgChS$XmJs!*@iqN47IjGF3dpPZbWiYB~;(i)H#k2~`0*|Wih#2>zlzr$F=r&7Qc$4Lcz-RhtE-Fshl+{{>-OyrYHQE!-o3l<%NJVx@*r=t z9q}!T|6Z*1srjuxKmO}OM#jpwTY1dJYE_?3IXX&+nRV>XkVa)kVd05ZR6Tqil`H+l zP8PZw`ubj|QRHO(%C#%U1E`-nN1^=f_T~BD@^5awK8Sf?>!*8Ti7z$sBw~k9Kv*_y zy4RR=IiO#FUnkFT^MUL6rG`;1U#cEzp@k|3a~FO8&VVxn#6h-|W(}36msdz+Bood- z$V&|zMvFfKs++cKDZ%ei(=xCmjtu>Ho#nbLLEzY)#HRUETZDDo!^5|`{u>jYw3nn5 zj{f{eMM0f7sj3R7Rl4x!cT9Zz+AUkQe72ujgHnWrkZpc<^`QOajSvX}9{Rs-2EZr; z?vs|5CO0(c`2PJ2xLG{LHC1yB->+xftlYTtw>LP;eu^L9XKHD|iXwaF48u;4;@@8{h}6;1 z$?8XueH0QBgZh)2_Gfzf8S5#K|qvF@ZyG@mCxoKd~WE8e#zosnKGw%I+ zHLKs%@t;143IlT7;vZZ2h^B1RnJ-mVUe3l^_jjuIPRj>fp@Ac!qH*|8qyYqS9Q1sf zl%y>*KhYpLB-wW1u-ngveDYbHCdS4rn>UvUjf{+xw6}+AGchwOtEw_CEiHBZ{_WfU z?YaD^Q|p6yWN0b(?%lib^~oN;!sew|RL`1Z}~+-?P9@IY|6S70EcL3McLGCAx_OiXVQ6N~V9 zu}0ScsMno5dD0!X4?V4@cdD>=sI)4B@B_aT zm6fdpdQ?P9oSB))T8xX2R~%mXs9WO0w}1bG<4;x}qT;N+Sy}!kfFq0dGq<$#eEgUV zfIH^hyP&MBqr3O+E&lO??d#XCbnDljP*hy&o^XKL$;k<;WqvE&b`L#^jDV^_MNQ4R z<<+4UMh1p+nwk~yzx(_7PGt5Ad0u zzJBLeiGy0pPqP7@BZk%6b#iSPX=!OWq@9oAgIX*v+5l`7S5~ga!6AL5HPbBk!2<^C z(Uy=l+ukpM97oN0@gk&>fM02h9CKTd1kCrsrvf~n#u6+>-H@CHA zzv4DOewB13->xfHuAsTdqiCw@=sduum>F(VN&XCu6qk_j>T0enet*C-Gc}bJm8NUT z-rU0Cgq+-(?^RXV(;q*6WaZ{&Vq;??5Ef+W#6(A)wy~9#7H3aS&pCBqc?J1Yl2&21qaU7~W7xm{;X^#Avy31tL^xA-9eTiqNt{?-w zkxz)o{x@5dia$jEpZ}q;Pmr1{m`jH7PfzeJT#!=@cR_nXo<8-)o_uUB_#67{8LfwG zA?=^lmLtpq*DqeA;a?M6uK#{Cy{tJjl=JqTJE>B$ujRC~7Ujh~7Ah($M7T=@Ud zjwkl-*|Q#)!RSH<;OJ;eYH!5I#tq&_o&Sm`1#)`7yPE4+^Sjq=^&ii3*U^@PeZPMf zSS^^PInA41)X-Ql=`T>*|K_C~I|@XU>tdp+L(V=J3PO+i$mRlTp9d)}s z%VMVS@^$r_HwB+(xGp>9*o?4eIxkG$YRz{!-rv_(>rO>oQCfO$X?gih{;rd-Pl#htq|R3A^{j^C*4?2N)`y4{)YVm&u{#WWWORV&Z&$a-(NRI#A# z#~x`UYu4%g3+9$O9U2-c>NsOo5|8v|>?6!qLdGYs^4I34(@<(H^!UY8Ic6-~-s~x=R9QfFsp&{SGV zONPm|1hpt80Re&inja`=#Vm9*5G`;&C#R-7f`ge+^9z6fnZmmB9X!a2X3lZMXj5`> zGD>u5>tIihCty=II?HZhVfIrW)6zWe-`{{53n7CVFN#ueW27nN1+YKhZFhIK2PB}S z#gX^?ZK#7iKp+%%aA^I%lik3|<;C9gXwGOl8;(jy;1qM3nwpa501iHX;ey3@`>~KT zthv|pv?Zkw9qypR^i9C|8`FK2C=x|Dom~?X%*x8j_KuEvb*~iZ7#N&++~m|JW|KS} zCRWC!Yzz!`R(}0@-quzu)07Y^ynv|#4olzo_*s+`B0!ifqa6+Xsge2p%v+8RN3agN zST?+8?_Pc|)zn#;F4fIwj}5rpI>d@TQ!zw?CRG41_T{Hm3OXh?rQyzxfHPTglh*a>^DjUA(9;H@NF;I4{(p z5J|A8Cy|k76%_LG^ZUlegdTO|yEtKQdY(~JQ&(13ziXUd$_Slr7~PZNmJJZ(QQlkh zPh3us)t%!g|nsEj{}ut)`ELHRm)mXnA;|#F{674ye~L@d^tw z0U+K!67}fO#x-l!;F`LFzUpJUu;eFBoS@pYX_HpF68 zIuK{HJD2vG9cE-?1Ui*;m{v%Rl=*F9i(iB`B8!HM$1%GQhLWCYSi_AfaL>mlBUJ6| z*|U8imjE$9qs+enh_}ax2batLn;X+McCuPbg3wUTWkju7lUJZ6Ry(8Ea0aasb%m%8 z^T%Gt$MYRH@Sbtv@7RavmFFKbGJM{>6V6{4Jv(qU=N=9@2Pdbc$*I$)9mkx;AP@r8hJ=Q0 z;Fr5`Bf8?&Tb#OH+-v)}(XEu|oSe|M#}K*hKdJfshoBCijT5^!>7jf<88uEf#RD;L zOLA-zH|@)3xF@HZbe-R=(&>1#;R^d|>CXuWW@#Tk3LH6dg!~0hxq*Qp4v#PlOvoi+ z?e{I$yjyO1W=0Sq#u^WIR18_L$DP}@ZR6+vT3H$6y1W?j>J>jkuMp^EjZIA(S?eH1 zRn*r%vbMI~y>q7zM6RJWvx5GwE2#99#l-})mbG%Qun^?ikbd`aeO(C=NBYorAr zi;#y06c|sQ1=p$U=!nFd5B8J=C@9QSiFcm!W#XzREOZAY*x&RTmnQe*ubL>C*C)Ja zLx3%b`e1EiLt22@>bkp%R#BmhhBF~|xvK}GvXr#WpZ5e99~>MskG=glX`n>?>eXNK zVnzY7yt23h_LAIqFWw!qrt3m+<_M2|`_?F6=+dQ2_9)$WUBJSBt!W@fyf_NU$?XG+ zVc(kT>VT)0w9}Vu{tIb*+5N9&`SFP==hjfK(AmWQ23m{;rK!mR$j^=c3P6`=X=z!C zzr1VLuJ+FkY^aB$vuuvDQ&UB#od@+w{WPxEgdd}hIag8b>NX0XnUI42^9eck|AJaZ z8lre(&iPH`|6^KRsBw!XDjGdSm3e6%SS-(Jp4~yh2!zpos>i#+7Okul_&mEGom3~^c`H`l*V}vT&a>fk zICjFz1T^4WQBcE7uUcD+LckS4`Awa7B1Q6p4}{sGZ{O&lytZfT*s(*1Nm&xgQp?Yu ze9-yPI?$79>+3y3LRiBiA^_Strq`|P!hxjQut5$l_bENSF4OEfxdc#Om9Q@XZCSaw zC5?@nWq(-pLCbW1|Ng)kRn@ZTox67RqSX)@jLt&K$VnqjR8;FhmgJNaT{AQ0=sPn{ zpvV=1Swoekv_vjG7G$COU{J*={DN>({7tfEs^>R>O&e12_aSx1C|$s!bWBX97o_mH z3Drd@CyflWmJN-7U*N@PYdSrYhGx_!esRdjXvC|z@7ZGXoyJENnc-EomoMb-suIWUkRBrN;|@04|dXJ!A< zqa1|pgS_EoKcHR$`u3LdxH`dhg-@Kvf|d|fAh*Hl&Nm3uBpyWbE81uasjut zOWLz&XBZb{n6zn~v9h*Szi(PanH@pO$ zN3}QwWAgJODX>X4vL0cy8bKR{^!()ELsFwq~0vYnBblG0D>V{K{q z3TOMAgTt}ek>+3@#%*61<%)dho{2y%dvVyuU33_cJ`aF`UE z4qQp2$u#|Cl&&(F0WIa+wQJRkNi)LGrSL*N&`|r+7f7FOY0;E)S)7R&UJnTbY9Mej z1A2M5l+!bn<2J+pQ3ng$+(Jx%{1kI`qTEkTPP#`%a>E@F5UX87Z?rxQV$3~XUnrM7 zdCzjqI;EXgm**$v=6tfVkI^!4@II2h+q9q5HyK~T7 z3I-B-h2Ci*aeB9qP+7LsZxJAC3Mmca9eLjvr(0To&l*DF{{l<#gIQ-j`;RNQ(Z;WAt?VgAyTh!-zm{f^W%Q^?{D090C;(N zdb(XV8;28C!tO`E(b7@EjM7yN3=CR8T7-47+{*&C^un7^fb(=R620&KrxDfOcfazS zGF6>UMTW+~NhABCwtRk~)2(+) zD4a-Wg;VH=HvmxdhOpod(Eo_^3D8_HpC+__KY()Z`+}7m)dj<|&Pn&_-wyB4AKr>Hg)t zx`6yIV58(O4(~HvhCQOFbO^ri-sUKL9B&|d2p+&<_W^NwzCPUt4c5)%YL)U{XezL* z(DJ;JlJ?OuZU5Ukwvmku2X$AI>g3Ff0zj*2$7g?h+}`gm4-<>*Z1_Wuf zPdEvvAZepoo&P%vkTnbY;34FJ)YPeMBk$h6Eymr=s+*-QfiuY?$RZ1 z9E(gHpd1hnfgL;6!l4sl+J4ksJyyxz_`=nzfe;)eo#q%I)p+Br>>huM>NEpUf|VFz6Q%5xM;*aF<*R3mj6?TLGM)26cCJ z@jjctis0XORd0i0AOQSb78{IKfKM0$LA2eFTq4vXc@-6UXX&WiE4#$R*wKLR0h(vJ zC@ImRr`0B1K5*N}C@p%W62eR|o$>t<{p8I%3`>yZ=gBAN8j{x^2*IN%CPb*@2z{MWa`8wz2rKnQRP}aI^D?s(f`u-m|eN@ zvVuj~Y#&y%si}#aBiP4Jo<3EiwIfuXXq4GY;uf~HUx4^lGp0Lt*-nTH$U#E`pQVI; z>0Ml&@9ggH_wMSt0S@+GIw9_^BJ^WW77MtDL`rRI+a~+NUWeES!ooi3=|@n(eL+Xu z{mk(j6nA(S(DGoX`$C(ex*eLkPeOuI-iLuIxSZ`yGYa1%GzJT{wV(Iy+(`>jFU#eh z*tLA;^=L0};@69tb=T*BX{A#<86=kA3n?m=UV3q)O;U257Y_s)fJadW}V#e@$oPi3V~l? zi4YrzNVO>Hlhe~1Upn-<=sFoGDZoAw|7`B!B1QbZ2b@PXpsy4Iv*_ySd4Bn#1U;Bf zN{XwjtjzDhgFc@RjO*8XBqr{Gm_+0}BrB-U#M-kuAVuOA6mH$xfify`qmY8B@*QEEy5*mB?+ue9{F(F#47 z`|UF_08b)Ej*!BtuCDHZWC8vdHJpA3JNA=ZR3xGSeHJF-jjGTi{I>#mWFp(b%zmb= z1zmjsV-?5$9Et&UuCS?z9UYHE2Vj|_J^tIWswZUMd*=H0b&d5j4sNeuLxuzd(6b&< z&7yS&U-=dv78Z5^mMWAiN&AP=t4mfPV+aNe0sBX3W}|dKAlZ@80qsrc0mljCWa3d6 ztR7D-UqO3j4(`zDt<)*;A+ZD8#Ndy?XK_-OskRfb@C% zK?MaO+rWGS#XYTDt-e4}*!)Bs4D_F+uU{j!c$Dmp0EueG)Q8x8#I-2tH(;YU)`SCz#mc3}- z{8rZszSh>V6s)cs2N|^(s^2l%mdPx$G)WyP=}_Mj$wh)4r31^35x`XQ61UW?>}YOF zB&(e|RRnR+9PTfr5a9jclP5DB!*{=UhC0L!+_82~czIy$niByFq14kR)f)|O-GWHL zj8Y1IL(JE^f3|UQ>OuPdJN@lIUE+mZz+QT(5UCHA(C^9zuT{QUj9^J#EJ=UOYr;BGKOLjih+<>CKtVc%sMtrED1 z$E|E^i1`E{T9=|NKH8DD4IHJ!k5#}N;x4W_E?yU^2}nlqi-Y=I-Q85649VJ=Oe8Y~ zsQ|bRlx=VLe~}eEo2p2uZQ0q`gk3>}AU?|jj)QB^yb%RRA%Ls-x?34gLoNLF)I+$p z2hkZIITp9Ja^la`*41^_XPUIpnwgow+$aVsg(2UPes>GfZXT)nn{^Ei z`d!O&B+zKEDPr>jT>Zl$Ms%8r<4~X+xG0CFzBV>U?*04kK`r|0oL}+jq+6Mc^b0otBnTneqlTZ= zUcP)OA}VS;d+*z8A4bE{Pn*TV)d75n6vx0JLizIL3lLQ)aw`JU3ptz^)v<-wu!mPuG9?bJ zGM$IURLtYH?Wj4q<9~;j zK38S-2|;2~OVDeZP(t+ZN01p_WaD%dDA;ZPQE$N3ogEi6p@?a~}5*GM2Fbtu_ z^9cxe0S6W%ZWO`u-T>{58aAVt!mVqz=(>-*qx2fulERE(uR4vvj6;wQHe;)98bG7J7J94YN`A21)14ik2ghVu9CUlQKLGQobA z56GNdo@+DH%(mQ79VOG5@R;Vnwa@Me2|H0|S+;Ch$IQ%3G!~$@GP_O}U*fHww1bU} z?Ik%naJ@3<8X`swyYad=u*Z<@N|2s}tC0$|A3vnrZdFN$iz|eqjAW%}R1^jhDPr)4k5pU*cOM|ag62A!m;IhEnOyUAR4FM`LXle_rAWH zF!lZ8#Kpu2UI7Q$+}2T575ML0X($4q-4en<&9!sx3&kPOFP5bBf zf^~L({IU5cp#kvXxDgBn4jo_$9D2%j3zVGn2~ST?il|gzz4J$MesFDgS?IDxLf>23 z*nnU2;nsLzxANxhJ&TXu0k$lZk)Iu8fI5YnRNK&CoErYD6zjyfF%1FJ zpk*a)D}Q)M6a(=tb8~Z+tvlqkwYL#A4gW;<_H8}KSnYtg4c$oZf;dU$wD%nV#k*7P9B2NJG^9z$GSyeo1k+wuA$;2y_5)`&!{;bw)Z z&IK!r#6hZ(V#;K zDJxTL3NP(o(BIi7HnOASBP1S#tR8&ig2C+;1&q~K*u|$ zt^M!$zJUApK`E8ProX^616UAB2t@V}6wCFs*n@52#AKvUHf`Pve`F-$tL}^7r<*9S z@~NSAo`AY7DJh9ik*|Pqkon8cd3jS%n+tTVAO->Lto4bwu<*OaXl~?SAkwY#G=?N0aV!CjaO>!x z_M?4=i~+HG0@ugp)ycM83m==L{4;=8YHMp{LESM~5E2#^06Hy?Bz9zEq=_kYiF0xsB^qJ{*p#xX zYrdur))Zhx0HP51Adr%Rsi`m#C{e5l5Cfeig(Bk^G*z@7q7A@*1L!@Q+z!fD`0E!J z5?W@PYbhU)9snJnreFzt0fCEP{DTB?NLcSi+m^?Ga6oxf6r2U5YWtbyA$Jotw27TP|9Q^J zS%frckYq%-)*MqZ@VsAr_yDxF*?wi|7`VYyaK6@+D}2X~hvm8QzX#$nT~s!@6C4s1 zrH1wVk1NvSGz`du-h&lG(gJn9}!X`QkWCp4u=phKd2o2Rkdz?rawIicC*o$}js3-t!JRcOl zzxGpBXh2&Y9K21`NDu*ZuMgPbN=;}f7}6nfGHw#6y{x&p$jt1lu8Bz?^i*(h?{87K z^w`Z;hyfs@FxZ;D4{Y$^qepAjty@Q-u%gm!2Nw7bL7ISjYrph2RnzOLj?TjuFX-UG z+`fBP0O?9_aFW?;uEzDZvY`}?wPkh>4${H=Mks;2IhL0CdE}EP_kcpdSyyJ&W~BB( zjzelo)BLd6MQv?*8=KjL=#|<)U9EDo$)tg3gL&8gHUy^f2AUkRqooku7|J(K^2+6Y zM7o|U`^s$I|3>Bner9fEb$9kRL~xSc5;JL?DQdlKV)ARaH;2q6L7iGn%|P4+THC9# zPbg7@k-#)1@pX7$)sa&46d>+@UGu`9>0dJcq6~~dtRQf)eH!RK74a!J+!TuA+^9eN zP3DFi@c{7In3!%~Q(DRma7@tKa)RuIujcTgTH@4GLb(~4=;+)F3Rc&d_P6PtSYF>V zWzTQdidROGTWNIsc=XW07922=(E#fv1eXHkm*(+KRirC;p)2|$zZHv}!c9^{G)MHv zk%I_m;&iN`z^m~?zH{rHJ9lcEn!cbR)j@lH7YV_7X|jYFJ6ena(6Nw*rRx1RQJ@U% z3R5c|ZrAbSV3-dP1O|)?yj%-I8U!j9(*RI3!tbx(vx}p(2xF`PElkbLE4VD`-6pY zaB$q{F7`&za~X5e^X=S-!lR$%wki#s&I5&77c5by72H$=!~!zB9{xSWouqAd@1`S@ zAP7fv_4E`o&Od>AfvQYHLsJOoj=%yqCN%{$sR&LyOkbR*5;P)cjLS`9(CF`Bh6b%( z#I*frJ9sW4t2&FGYw152HSR@%lpgOZPvA9XTDC(KCN+Qr5eo|o+1D-I_9rY8o;gat z-)!!JvovBFB-@7c8F~f6wIuFJl4VFte*oJf^K+Dy33Hd$Pj`qpf`#SVv?1i>OMe7f z^^5PVhlS6+P#*?XidmOHl%?pnIC5%=(JH7!Z9YPJ@FEveO;qCOQFG;uDT@!)o{E^w z4gYCK!HmdjG&sLx6mRZh5)zi*h)Rg0im$eYhDHJz2_hlwUBoMVJ%Uf6h{xWvClld7 zZW-4z$nZzwvLgl#SF!Tjw}5X54k%H;)Rl!YGTl~JNH{HZ7S(1KiBM!`WxYW88$zp_ zL5G6Lp8#VleeoF1kK^LZ9+K)oODakcKYTbAB1UGGDw2spI#~|^Y}CM-L~-7~e*Z4W z4^+etnz^x32J=CLG(JO{JA*wzDN#XXq;ZGG{6p_5Y^WI|3Le7cWMxH}3PH#hGgjsf zNKhz{j3rcGDaR*x(-Sb(RWd(*ylb<4O~~s{9F+|?^W%2VC6RK-3?;=2k+GJxHmebo z$moOw+UTK`1(?CFu*+n)#=v0b{5@?Wqqh|#+vp1=h{in(7AwM&3-d+UsZf>Vw zMvH(i_yH0U5)|GhMlw?c5VIc9HHZ^Le!%&GuSM&=>cqt94nIs!PmdzHtQslfR&C?q zp1|g0#`!yVZ90upx>_Z&koDJHa?W13z=n*LJw{^V;!2%v!Fc!r2_aj476~Ma-~n`T ztJP@P3k83#3LD-rGU7+a*Jj_~O-vaOQq&-INLJ|5smkiaz=3vQ!A!aO*`5`;h;vd7 z_M&@u_&%K~0?t72lBjXvUj&<*@9>>zlf^7EPDT1p)B08AD{SN^~<`a=t zFx1>K2p@mQ?~W_9qV#2pLP{aYaHx86P!Eaw`tTu(FlO>%{DOkMV8AB(z;loh%Zc10 z?|)s;zH+4-6R_mFV1d=?li3Gtw;PDSnyj7YGiwS|2lD^8v zQwZ|N!MFzUZYgk+LH3!HI?@mj`^0#22~b;>2~2YGIjko-xE2=|!FmRioJ>?@Whs!H zv-(kYQLO37`9_cgr5CZ1ATTIdJR)Th*$rI~ECOIxcJWBsyWNmJctws z26J*%C;p-NOwP}v+42DzlPm$wnYpsqK8<7&h`9FI-Xl7i_e_*D7X$-&9FVLoH=BnK zWwv36mpI302cCW+c)8TYT^RU5d|&g*72Sq6>Le3MAi$97~|#&r>tUYiBB6phUrvk3sU8)MOl8 zp&+?dbY-Gul=v`Gv+}|DC!wfC&*QeEvOsQVZ0jjx3L2@C`|yGDQn`3ynWqN(@mnBj z6v%TS@)jPl?x=i_RMWGrLgL1~P!K+m7l7&{38@AFA0gYd1T7#8KZvVmy^mOujEsR| zSHC)50+vNNV1hNQ(b*P-iWu|imFI|Z!6}eH9GdwrR*b^J!bsB+r&=IQT1JKkz#o{x zG<9F&l62PZ#BX1}n$Hejf+-%0&jhp46XQe;jg1xWJRXWtH()!FnHT3Lm{nD)#A$5+b4WLD zZ`T=@=u9F>8l*CjDtx>x5(Ai|Ta$i;`+EJKhwFouKMjw@aB7JC2Wkf6)f1eXS4=FU zv1Fn74wKPK^g(^JSGXl)n#2ML44?>e`K=3(j6rE; z3m=Z8D&c;#-`)*&J}~#z>=kMgHiKvbaPagxdq6n*JhNUx)q~{3vVHr~DcU0fKk`x#9ikt95d+fxPQ+c@DheKtnq}igPhzVlngjm7>+FMJg9cq( zUcL?~doLI#uB*#-6jgD#&k}Z*@8;M|1VK911r~q>_=P}JWS~qbrJx)k?xqH?dXZBS zOMj`matbZhe&q1189y+oHyMZu)rFGZJ^}WK1dx$ccZ$h2jM`IC)0*EgJN&DPXeU^G zBHE$5!1n2`E;YDyE4{_Hxv}vUTlc|LPT2bANuc*gNzyJUwD;_9Tqbp`8Is&;apBF4 zog1-WBsvI)S+eE2vj;?&H53F}v_6Y~eb5UC#Ad$r(v`k+-dTDz{dM0e=AM}Nn|rS< zFWVr>;)C@Mv4O$Wenj%{;g9S*^EgSpOm$n8>MM;~Kdr~A6Y4<*_VH`Jmw$QyMdo&PzQ|I71psTi6R7hIWX2aF z$M~UeS>D25tIZwR<)SWmZcC~{RKq=Mb(1wM7!)2F^`8w$TN4m8^wv~l^UI$0?VN^U z;%qjR8`VGF`EG5cEq0(X&Hg8caP`{vWqa9^pRp&MSKL%&nW&Myc{ppqd6hSuhv&qt zm5ZBX-j_Di{BW&4#;+z*a}59e*N}M4Z1Q)vLx%-Fzva>GXeHi_MrD9gtXy1-$kX0V z*MiHHDyo5d??(ssJJ|#00th7hquXW*$?at8RM%@lnt+98puL0(6QhxI5TY+kHQCoc zbbCtu$sqrC1FOuuTy$6^fd2jL`0|7eK%DDRH5ua1R|c`IDMZi>6YUSMC{z>@)hXZEsLG#gBcp<}UNOPSjmL3Sa(*sq%}%2QvR~ZKb7?lM z^Vsa4Gq_uTU7*mM%Ls#^=_nv_fP89&QF=Wp`a<*T87&PBB@AKLG>*XOr~o;&_YRW2 z+40!{c}UuF4Ln|KonKRvMpjOaT>SZNoN|1F!$hq5wB&)wwBt3rVquJks-ic*>Z8Gt z#IVShnnVZ3wQW0Fo2k1OWc=t5_Ublv>yLQ(yP){^>|uq=JI-=PDtjMzR9Nz(rYj=U z_jOd!@gvM?GG2B@+>x%dm|m1zW^kSTx0Zk3z9j9RiD%(1vqGZtrr**75lPMACKswg zVPoUdJ=fY*uqkLUl-N4DRLutz#{b?||;LNXo9L5&30G`Cig&#g{=L@2@ zOIXvntuBj~H?_AvfUzXasjh61A9;3^N){sH%|lzie)~pp^O!&&{C{*ACmgDdbZY9J zP4`W6S0gX|-8D;(@%W8^!W2q+disa9vF)?p5e1=e?HYvFPckr&05tOIZyqAkhmbPJ znK~WsslZhLfl5uLFk6*P)(jr4vctqH_fzql>0fr8-Lb*a zJ%b)LdLkTXMDFlkdca{Go{nb;C?i}DksJ&7$GCF>h{70rd>Omul|~W<T;Y>R0g;d@;9!EWLj2Lr7}AM4=5x-0PJ04#JxIZ0&GpGhM{%NxP~5svJCN7zL- z8ciG*M)3_lW|dH$b`c7sM@csZMp>;TxbWxHuUzp5px1EjH27F_^H4XwrKGDpEHbkC z-U{S{06-Aqj?Y_dbGe|^mg6CyIo+F^v&8}rT1(*g%O*AIK~D(Jz>Lt(AI_MY1UD!F z@K(Qejmfu!Dp1J_P>NJtR8O=sw?h{q@+F^^{xNqHcsRcsMEVJY*P7I!S;sZ9S}D)` zBxsry_*s7%i}CZHR#V%BFU&A9Gc%m8=(p5D3(oDxvDt^%On$jE6ymdx8}WrCsH_;1 zgB}V52@XMWDL_$!Qymypa{M=zd208jM`w1%0=iq3F2$YS69F0ZDkiVlC}3ke9|>;) zQ#m%axUis(zR1dof#3`Hs*B*|f|+`io2i;Dv+%5oSl0^jbE4xtefA6qXhaNiXE#G- zMI+O12HbxQHDlDx-0;l z7gYvL9hhHYPS*+q%wk~$Fs6?dc;dFu|NP3!J%)zA*ZFi|yp*8Tch?Jo;0Z1vh0>CC ziyka;T)X|+?oE~(bfh1k!|Rvb-<-FyR5HlfkB#YqVSO&CaX)|RPh+*XuRmtsaOADLY_x(to?CDekhogBqo2;)+5p&dx+( zLGzW}&yEOTaBP;tL_z$BQ5NPw>E>BcN;q3)OYWQ7_IG4}h2;!s&tH7#hENo)Rk$s; z_)>W2?~oxKX9-|JOvL_-s`eI4*J6x6?@x?&AcgQp=MTMPz|B8uH@@9HNZ*UOz91(v zx(}OHS6^Rz|7;M)!Je4ubVS^;oEHv3SD~UvL@X@RG$jP&#+ zU^TgSET<$_m!P8CkECRp<9kYWKRvCvpB=Bc4*b6y!Ylr?Z$^d~HZLeG074r{vSLh$ z3X+hIQmjMQL^*CBOnEdh+yM_z9D?Hy9y~~q(3k@s3PKmUfrfzi!(h`F$l*{S{h)?c z+&o0)sy=;y)OQaSo<4*gQYFspWOH4bQhvZK#R-#K4imMgsU*UUKZ7>P$Iripk}+};#=&4WzG^4Sc8n9-4$_om{4Zk!wU zMPg5slQHi6kUrN^K;h%PlJ*z{Lk8Jud!=b+EG%U>@!t(ZIJ!ng=EXA2XqROGg^teVc;%8C zA|H-f<8ox)&t&qY_V)HB(}pks7-;2#W3r2GxHlSkpHD1Bivs-ozC8_e74Yf9Ph&E4 zg4P%o1hC$XZNWe5#n`yIN{`wezvi}VgW8ByA(EHD$F0ByUx1L0x!?;;Fc!j0vW#HR zP!x`GTCMVE_CE$HJfC=xL>^&y66S)Mg?mPlNo}a@nr~n=_}~XP1K6N5;YUM`I0J7( zMIiL_N zLD<(N0XU>1TAawtD|qsUyUoJTarDPp(~ZYJVuFo~nu9Z8hEZNluGsB7S9iC=0N-#$ zjSFfp;(`+sY8pvT$#*3gKt_m#LxVC31+5a}lUmx^{(gg?)qql(uGKX)!O|;#_0O(+ z$M@pkVKAdsi-LP)PZRFaqto$H1MToZ#T5ddAYBc zX?x3<6=$H255v~tN;B~IddSKSo$c4J|B0J!kX#O~mQ1Hmo}Au6zG(}>2(%P?2M0be zv1dO)c7HZWYW&p6lQ-O=BpnVVYwUv%jW45n`4ZohR0KGP5WEhFN#Ra`k7J5qLVX6!nc0h$ zu^6+;U_E4#1z+88jrH;C>wGj4;g0x9AmaO2UGtXnXlS^&{kSc|`NSte4`&4*HA5kP z`F!q46a*Mf!lZQY%|t@g_4NEpv?(BdfZV)nVK{b+Fj6j=V6b zYRtLpmXr*aUg%>p`1bvK97K^+7OnTqkI(InLoZ}gSN{7eyXpfQ0zwi%i?<969x3q0 zz?EfVwaD1Ek+mvHCJF~iUV*FI4u&y(CQ?HuHu~Q~`%{4-_X-m^ww59+<*$y|VIVfeRd&b1uh;z4mA! z;za@(u+vBlZ9}4sl~o;+tPYNj=TUvhc;v;so68fAa59qMEKr}2cE$sEx<5G!-(E_( z4I%1DXy|E`XZvGd_ewyO)nD$G-U}7y72JcMKs%$zj{2d7wd#tC%3+9 zRijuENYlM}^BpK0YdT!!ui``LLqwdH@-Hp - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - Workspace base Workspace top - - - Thread Structure intctx Structure Thread Stack Stack Pointer - - - - Thread Local Storage - chThdLS() Stack Limit - - - extctx Structure INT_REQUIRED_STACK - diff --git a/docs/src/concepts.dox b/docs/src/concepts.dox deleted file mode 100644 index f46f8b06b..000000000 --- a/docs/src/concepts.dox +++ /dev/null @@ -1,410 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @page concepts Kernel Concepts - * @brief ChibiOS/RT Kernel Concepts - * - @ref naming - * - @ref api_suffixes - * - @ref interrupt_classes - * - @ref system_states - * - @ref scheduling - * - @ref thread_states - * - @ref priority - * - @ref warea - * . - * @section naming Naming Conventions - * ChibiOS/RT APIs are all named following this convention: - * @a ch\\\(). - * The possible groups are: @a Sys, @a Sch, @a Time, @a VT, @a Thd, @a Sem, - * @a Mtx, @a Cond, @a Evt, @a Msg, @a Reg, @a SequentialStream, @a IO, @a IQ, - * @a OQ, @a Dbg, @a Core, @a Heap, @a Pool. - * - * @section api_suffixes API Name Suffixes - * The suffix can be one of the following: - * - None, APIs without any suffix can be invoked only from the user - * code in the Normal state unless differently specified. See - * @ref system_states. - * - @anchor I-Class "I", I-Class APIs are invokable only from the - * I-Locked or S-Locked states. See @ref system_states. - * - @anchor S-Class "S", S-Class APIs are invokable only from the - * S-Locked state. See @ref system_states. - * . - * Examples: @p chThdCreateStatic(), @p chSemSignalI(), @p chIQGetTimeout(). - * - * @section interrupt_classes Interrupt Classes - * In ChibiOS/RT there are three logical interrupt classes: - * - Regular Interrupts. Maskable interrupt sources that cannot - * preempt (small parts of) the kernel code and are thus able to invoke - * operating system APIs from within their handlers. The interrupt handlers - * belonging to this class must be written following some rules. See the - * system APIs group and the web article - * - * How to write interrupt handlers. - * - Fast Interrupts. Maskable interrupt sources with the ability - * to preempt the kernel code and thus have a lower latency and are less - * subject to jitter, see the web article - * - * Response Time and Jitter. - * Such sources are not supported on all the architectures.
- * Fast interrupts are not allowed to invoke any operating system API from - * within their handlers. Fast interrupt sources may, however, pend a lower - * priority regular interrupt where access to the operating system is - * possible. - * - Non Maskable Interrupts. Non maskable interrupt sources are - * totally out of the operating system control and have the lowest latency. - * Such sources are not supported on all the architectures. - * . - * The mapping of the above logical classes into physical interrupts priorities - * is, of course, port dependent. See the documentation of the various ports - * for details. - * - * @section system_states System States - * When using ChibiOS/RT the system can be in one of the following logical - * operating states: - * - Init. When the system is in this state all the maskable - * interrupt sources are disabled. In this state it is not possible to use - * any system API except @p chSysInit(). This state is entered after a - * physical reset. - * - Normal. All the interrupt sources are enabled and the system APIs - * are accessible, threads are running. - * - Suspended. In this state the fast interrupt sources are enabled but - * the regular interrupt sources are not. In this state it is not possible - * to use any system API except @p chSysDisable() or @p chSysEnable() in - * order to change state. - * - Disabled. When the system is in this state both the maskable - * regular and fast interrupt sources are disabled. In this state it is not - * possible to use any system API except @p chSysSuspend() or - * @p chSysEnable() in order to change state. - * - Sleep. Architecture-dependent low power mode, the idle thread - * goes in this state and waits for interrupts, after servicing the interrupt - * the Normal state is restored and the scheduler has a chance to reschedule. - * - S-Locked. Kernel locked and regular interrupt sources disabled. - * Fast interrupt sources are enabled. @ref S-Class and @ref I-Class APIs are - * invokable in this state. - * - I-Locked. Kernel locked and regular interrupt sources disabled. - * @ref I-Class APIs are invokable from this state. - * - Serving Regular Interrupt. No system APIs are accessible but it is - * possible to switch to the I-Locked state using @p chSysLockFromIsr() and - * then invoke any @ref I-Class API. Interrupt handlers can be preemptable on - * some architectures thus is important to switch to I-Locked state before - * invoking system APIs. - * - Serving Fast Interrupt. System APIs are not accessible. - * - Serving Non-Maskable Interrupt. System APIs are not accessible. - * - Halted. All interrupt sources are disabled and system stopped into - * an infinite loop. This state can be reached if the debug mode is activated - * and an error is detected or after explicitly invoking - * @p chSysHalt(). - * . - * Note that the above states are just Logical States that may have no - * real associated machine state on some architectures. The following diagram - * shows the possible transitions between the states: - * - * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - init [label="Init", style="bold"]; - norm [label="Normal", shape=doublecircle]; - susp [label="Suspended"]; - disab [label="Disabled"]; - slock [label="S-Locked"]; - ilock [label="I-Locked"]; - slock [label="S-Locked"]; - sleep [label="Sleep"]; - sri [label="SRI"]; - init -> norm [label="chSysInit()"]; - norm -> slock [label="chSysLock()", constraint=false]; - slock -> norm [label="chSysUnlock()"]; - norm -> susp [label="chSysSuspend()"]; - susp -> disab [label="chSysDisable()"]; - norm -> disab [label="chSysDisable()"]; - susp -> norm [label="chSysEnable()"]; - disab -> norm [label="chSysEnable()"]; - disab -> susp [label="chSysSuspend()"]; - slock -> ilock [label="Context Switch", dir="both"]; - norm -> sri [label="Regular IRQ", style="dotted"]; - sri -> norm [label="Regular IRQ return", fontname=Helvetica, fontsize=8]; - sri -> ilock [label="chSysLockFromIsr()", constraint=false]; - ilock -> sri [label="chSysUnlockFromIsr()", fontsize=8]; - norm -> sleep [label="Idle Thread"]; - sleep -> sri [label="Regular IRQ", style="dotted"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - init [label="Init", style="bold"]; - norm [label="Normal", shape=doublecircle]; - susp [label="Suspended"]; - disab [label="Disabled"]; - slock [label="S-Locked"]; - ilock [label="I-Locked"]; - slock [label="S-Locked"]; - sleep [label="Sleep"]; - sri [label="SRI"]; - init -> norm [label="chSysInit()"]; - norm -> slock [label="chSysLock()", constraint=false]; - slock -> norm [label="chSysUnlock()"]; - norm -> susp [label="chSysSuspend()"]; - susp -> disab [label="chSysDisable()"]; - norm -> disab [label="chSysDisable()"]; - susp -> norm [label="chSysEnable()"]; - disab -> norm [label="chSysEnable()"]; - disab -> susp [label="chSysSuspend()"]; - slock -> ilock [label="Context Switch", dir="both"]; - norm -> sri [label="Regular IRQ", style="dotted"]; - sri -> norm [label="Regular IRQ return", fontname=Helvetica, fontsize=8]; - sri -> ilock [label="chSysLockFromIsr()", constraint=false]; - ilock -> sri [label="chSysUnlockFromIsr()", fontsize=8]; - norm -> sleep [label="Idle Thread"]; - sleep -> sri [label="Regular IRQ", style="dotted"]; - } - * @enddot - * @endif - * Note, the SFI, Halted and SNMI states were not shown - * because those are reachable from most states: - * - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - any1 [label="Any State\nexcept *"]; - sfi [label="SFI"]; - any1 -> sfi [style="dotted", label="Fast IRQ"]; - sfi -> any1 [label="Fast IRQ return"]; - } - * @enddot - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - edge [fontname=Helvetica, fontsize=8]; - any2 [label="Any State"]; - halt [label="Halted"]; - SNMI [label="SNMI"]; - any2 -> halt [label="chSysHalt()"]; - any2 -> SNMI [label="Synchronous NMI"]; - any2 -> SNMI [label="Asynchronous NMI", style="dotted"]; - SNMI -> any2 [label="NMI return"]; - halt -> SNMI [label="Asynchronous NMI", style="dotted"]; - SNMI -> halt [label="NMI return"]; - } - * @enddot - * @attention * except: Init, Halt, SNMI, Disabled. - * - * @section scheduling Scheduling - * The strategy is very simple the currently ready thread with the highest - * priority is executed. If more than one thread with equal priority are - * eligible for execution then they are executed in a round-robin way, the - * CPU time slice constant is configurable. The ready list is a double linked - * list of threads ordered by priority.

- * @if LATEX_PDF - * @dot - digraph example { - size="5, 7"; - rankdir="LR"; - - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - edge [fontname=Helvetica, fontsize=8]; - - subgraph cluster_running { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - currp [label="'currp'\npointer", style="bold"]; - T4 [label="Tuser(4)\nprio=100"]; - label = "Currently Running Thread"; - penwidth = 0; - } - - subgraph cluster_rlist { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - rh [label="ready list\nheader\nprio=0", style="bold"]; - Ti [label="Tidle\nprio=1"]; - Tm [label="Tmain\nprio=64"]; - T1 [label="Tuser(1)\nprio=32"]; - T2 [label="Tuser(2)\nprio=32"]; - T3 [label="Tuser(3)\nprio=80"]; - label = "Threads Ready for Execution"; - penwidth = 0; - } - - currp -> T4 - rh -> Ti -> T1 -> T2 -> Tm -> T3 -> rh [label="p_next"]; - rh -> T3 -> Tm -> T2 -> T1 -> Ti -> rh [label="p_prev"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - edge [fontname=Helvetica, fontsize=8]; - - subgraph cluster_running { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - currp [label="'currp'\npointer", style="bold"]; - T4 [label="Tuser(4)\nprio=100"]; - label = "Currently Running Thread"; - penwidth = 0; - } - - subgraph cluster_rlist { - node [shape=square, fontname=Helvetica, fontsize=8, - fixedsize="true", width="0.6", height="0.5"]; - rh [label="ready list\nheader\nprio=0", style="bold"]; - Ti [label="Tidle\nprio=1"]; - Tm [label="Tmain\nprio=64"]; - T1 [label="Tuser(1)\nprio=32"]; - T2 [label="Tuser(2)\nprio=32"]; - T3 [label="Tuser(3)\nprio=80"]; - label = "Threads Ready for Execution"; - penwidth = 0; - } - - currp -> T4 - rh -> Ti -> T1 -> T2 -> Tm -> T3 -> rh [label="p_next"]; - rh -> T3 -> Tm -> T2 -> T1 -> Ti -> rh [label="p_prev"]; - } - * @enddot - * @endif - *
- * Note that the currently running thread is not in the ready list, the list - * only contains the threads ready to be executed but still actually waiting. - * - * @section thread_states Thread States - * The image shows how threads can change their state in ChibiOS/RT.
- * @if LATEX_PDF - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - size="5, 7"; - - edge [fontname=Helvetica, fontsize=8]; - start [label="Start", style="bold"]; - - run [label="Running"]; - ready [label="Ready"]; - suspend [label="Suspended"]; - sleep [label="Sleeping"]; - stop [label="Stop", style="bold"]; - - start -> suspend [label="\n chThdCreateI()", constraint=false, dir=back]; - start -> run [label="chThdCreate()"]; - start -> ready [label="chThdCreate()"]; - run -> ready [label="Reschedule", dir="both"]; - suspend -> run [label="chThdResume()"]; - suspend -> ready [label="chThdResume()"]; - run -> sleep [label="chSchGoSleepS()"]; - sleep -> run [label="chSchWakepuS()"]; - sleep -> ready [label="chSchWakepuS()"]; - run -> stop [label="chThdExit()"]; - } - * @enddot - * @else - * @dot - digraph example { - rankdir="LR"; - node [shape=circle, fontname=Helvetica, fontsize=8, fixedsize="true", width="0.75", height="0.75"]; - - edge [fontname=Helvetica, fontsize=8]; - start [label="Start", style="bold"]; - - run [label="Running"]; - ready [label="Ready"]; - suspend [label="Suspended"]; - sleep [label="Sleeping"]; - stop [label="Stop", style="bold"]; - - start -> suspend [label="\n chThdCreateI()", constraint=false, dir=back]; - start -> run [label="chThdCreate()"]; - start -> ready [label="chThdCreate()"]; - run -> ready [label="Reschedule", dir="both"]; - suspend -> run [label="chThdResume()"]; - suspend -> ready [label="chThdResume()"]; - run -> sleep [label="chSchGoSleepS()"]; - sleep -> run [label="chSchWakepuS()"]; - sleep -> ready [label="chSchWakepuS()"]; - run -> stop [label="chThdExit()"]; - } - * @enddot - * @endif - * - * @section priority Priority Levels - * Priorities in ChibiOS/RT are a contiguous numerical range but the initial - * and final values are not enforced.
- * The following table describes the various priority boundaries (from lowest - * to highest): - * - @p IDLEPRIO, this is the lowest priority level and is reserved for the - * idle thread, no other threads should share this priority level. This is - * the lowest numerical value of the priorities space. - * - @p LOWPRIO, the lowest priority level that can be assigned to an user - * thread. - * - @p NORMALPRIO, this is the central priority level for user threads. It is - * advisable to assign priorities to threads as values relative to - * @p NORMALPRIO, as example NORMALPRIO-1 or NORMALPRIO+4, this ensures the - * portability of code should the numerical range change in future - * implementations. - * - @p HIGHPRIO, the highest priority level that can be assigned to an user - * thread. - * - @p ABSPRO, absolute maximum software priority level, it can be higher than - * @p HIGHPRIO but the numerical values above @p HIGHPRIO up to @p ABSPRIO - * (inclusive) are reserved. This is the highest numerical value of the - * priorities space. - * . - * @section warea Thread Working Area - * Each thread has its own stack, a Thread structure and some preemption - * areas. All the structures are allocated into a "Thread Working Area", - * a thread private heap, usually statically declared in your code. - * Threads do not use any memory outside the allocated working area - * except when accessing static shared data.

- * @if LATEX_PDF - * @image latex workspace.eps - * @else - * @image html workspace.png - * @endif - *
- * Note that the preemption area is only present when the thread is not - * running (switched out), the context switching is done by pushing the - * registers on the stack of the switched-out thread and popping the registers - * of the switched-in thread from its stack. - * The preemption area can be divided in up to three structures: - * - External Context. - * - Interrupt Stack. - * - Internal Context. - * . - * See the port documentation for details, the area may change on - * the various ports and some structures may not be present (or be zero-sized). - */ diff --git a/docs/src/main.dox b/docs/src/main.dox deleted file mode 100644 index 535689d22..000000000 --- a/docs/src/main.dox +++ /dev/null @@ -1,65 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @mainpage ChibiOS/RT - * @author Giovanni Di Sirio (gdisirio@users.sourceforge.net). - * - *

Chibi ?

- * I didn't want a serious name for this project. It is the Japanese word for - * small as in small child. So ChibiOS/RT - * @htmlonly (ちびOS/RT) @endhtmlonly - * means small Real Time Operating System. - * Source Wikipedia. - * - *

Features

- * - Free software, GPL3 licensed. Stable releases include a exception clause - * to the GPL. - * - Designed for realtime applications. - * - Easily portable. - * - Preemptive scheduling. - * - 128 priority levels. Multiple threads at the same priority level allowed. - * - Round robin scheduling for threads at the same priority level. - * - Offers threads, virtual timers, semaphores, mutexes, condvars, - * event flags, messages, mailboxes, I/O queues. - * - No static setup at compile time, there is no need to configure a maximum - * number of all the above objects. - * - PC simulator target included, the development can be done on a PC - * under Linux or Windows.
- * Timers, I/O channels and other HW resources are simulated in a guest OS - * process and the application code does not need to be aware of it. - * - No *need* for a memory allocator, all the kernel structures are static - * and declaratively allocated. - * - Optional, thread safe, Heap Allocator subsystem. - * - Optional, thread safe, Memory Pools Allocator subsystem. - * - Blocking and non blocking I/O channels with timeout and events generation - * capability. - * - Minimal system requirements: about 6KiB ROM with all options enabled and - * speed optimizations on. The size can shrink under 2KiB by disabling the - * the unused subsystems and optimizing for size. - * - Almost totally written in C with little ASM code required for ports. - * - Optional Hardware Abstraction Layer (HAL) with support for many device - * driver models and device driver implementations. - * . - *

Related pages

- * - @subpage concepts - * - @subpage testsuite - * . - */ diff --git a/documentation.html b/documentation.html deleted file mode 100644 index d9a44933d..000000000 --- a/documentation.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/ext/ext.dox b/ext/ext.dox deleted file mode 100644 index 4f217a9d6..000000000 --- a/ext/ext.dox +++ /dev/null @@ -1,39 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @defgroup external External Components - * ChibiOS/RT supports several external libraries through support interfaces - * and/or demos. Credit should be given to the original authors for making - * available such useful code.
- * The current list of supported component is: - * - uIP, by Adam Dunkels at the Swedish Institute of Computer Science, - * link. - * - lwIP, many authors, - * link. - * - FatFs, by "ChaN", - * link. - * . - * External components and libraries are not directly supported and are used - * "as is" or with minor integration patching. - */ diff --git a/ext/fatfs-0.9-patched.zip b/ext/fatfs-0.9-patched.zip deleted file mode 100644 index 1c4fe889df4daadafc39ec2389f24d897f7c5b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681290 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

XpT(%n)j9;H0KzAadOAia&bE(ll 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

&r5BIvj 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ûIen{a%ccaM5R2{BC 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 lYZCY+MslhVR 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

M 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

fJbMC5 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

61TS-@^Ev?F>~?2lERI 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

Ip{bXpxERFFd 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 UnoxuVVHf;6vl!;T3rr&6zw8QyZ~y=R diff --git a/ext/lwip-1.4.1_patched.zip b/ext/lwip-1.4.1_patched.zip deleted file mode 100644 index d236a40af7c30f2d68903c6a40d4e11680decfc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622298 zcmV)4K+3;RO9KQH000000Oew2}*r75~mth;k0KA$Ghc zHt;{BN!kXok))LM_$aoVh}xEszB2yUWaIys9iLO=3$kcV_O~effBC|8R5n z#~=Nua{BxG;N$tpS@lOh3WA>ne?Fh*Q5wvnmtgc9&Yz+z_}enegK$D0=g)B#OyhYJ z)Pivm%#%DwqgnDba^L(F)S1(SFhW%|NA%EyoO=OCPq^^@#1JIs>N zmng44|0uwJUY_F-9!R4g46=B(m`1@%8ZH*JF$s1c3PwqqMx#8KzFge;v($eS*wr*^ z&EAI9F!ad+vmFHSXtt=22Ehrffj*4!?CHnz)8F2Ix*C2szaCzkUft>jHES5Pd9-cF zcu{{I1Pt#in&%krkip~fDfmgd+vqi`7M4c8);ij=ynKY!@sD9Vr*&Qwpqs|CIFIK~!8pvr z0D~k+7X3Z=`!ZTaK_w5fFTqdx{o}quGL9xdJA!X`b8~NAl||d#XPl(qDou+3Je&corqg9BW~a zvj{j=0ciMO`g)+d*gkGGNePoMN0x2CR*EIQKX`353X_Io)_Xj}_o|02a+2BgW7? zOrNlD5B}y>_!o->wvm1e2`vddvjuJ@RwCaqPRzLe27{o^?b$5G1Hir}Yb zF*okyXc~nnU|WP~2rMR;<<2@}r%}TN<{Ie}DK2}O2ea@sSY|w)L9u4DbxdeoVm%hC zbv+Klmt(Bv(B5PMGMP`}C%w`Hdy2&+v-lr8IUj9|MNX3u{soR4;`T9&84f3rlN-mA zNt6P&1o)KcG!Z6R!&qoFj~0SFKPE~33yWjT<6j7^PUewNNCumxJzS3Em*RFkh4I`w z)kb^UE{vZ?Ota2Dp56iwKy>-};&ymA3mPk-45?R-QM2ZJq&+; zd2-E@1=(^zo6YM8=MEd`3BpC)a=Ujp$t(w^0txw=%UuFlqY-HL`AtK<%)Ip3km>yJ z{k0E#b0Y%;R~tPO2L!WzUdC0W_#GghT@`NH;}RP;Fj&xQcks**fV_n1xKhQ-Ux}$r z!sRr7#RbRTak5MYv?9S=9wL}b!zX4KvoQUF6@s?ViWVW0y&z-};7e^9zT$#Drb##+ zg;{<$!>}>^R+j;%S)vCxO2!e5hoehgJecTH{R32IUbCZ_+3*03Mtm2LES9-qLnQ+- z0N%a7x%+%_cQ!n^yuA55eE7rg=6ZPdhvD`4!^Qhw{i<25yWQ;pHFodrX*i2g`gWPm zLJ>5IOe|S~9=q*rbPR%K38?5SA(0`=qLiT)OyHYL3m_(2`ytE2JPLmNtKbrn+4(hK zGr)Cg&CYJ%?(=^xaQsnl8D-&9WTA@z-yt2lJo%HOPNy$BE#JBuGf9(~P}_95$b*+S ze+~$uc*GFSA}rw*KQbDBRhn~RT7UZ$GmMh9iC!D)W*v1J-QX?e9Rj3E^(_+)0GZ>(Xc%?&-_6hn?xQEZOW0HXeh8M7MZ+{&fDptJAanp3fNxQhnuipz&D=~9TU)l1 zj%2a6m(5;pz~2l-4p2;+CdmTAK%Pa@i5tC(3AT;yaN12Uzzn_iaU)pHGq9dv@)es9 z{{!e9XERzmt%HU6yVGV+VJ7nuX3B@g5r(J&9FsJBA~7=*o>QQqKMIO- zG)ga-HKFxs8<>{l=HV0gN|NP|uk&yQoCXX~*GN{N`M-wKcpN+rLH<(6$XV_|(QNI8 z;vL5Q8^*bco*<%Cjj*@|%yFYX2ySn0gAY*-$iGyo5Qat0O#`fbPJ4q{9^)svXmL0{ z5K^09+khDuhrcJ86MxAgLG}ucJ##11s3ECL9SuMb|Lw|I;Wq3A(;x9ZVZ&(Hz&X|Jp zdQ4K*PM*_b`SeV$-p5ZLKiyVTvodSyG-b1|gbiF`z>?5x+og7M<1VqB@PFQ=eS8x< zignTh{tYl}fW8;pUtir00I}4|{g|lev!PDKT(5=sd8+Ubn zbvwL<&i}KZNYgVVI7Q`+H;wj5Ucx`aD-wQAA?eEM31u+=?2 z#!#fklBFn9^_EHA4=UBn$HNy=b{}7v3XZ_mS+&n1CR!P7+!Gs?aQ~jMY50v8GE|}$ z|16t3fL`0WP8(Z&oe&T#$EYTY-NLD`-a|mdIbj~_%`aih!kAbYNNb$pooPZu)`8L7 zPO5#A#u`BFMt8u_%tDf{MX+Jafy#<)#emuKGRLatmCtuoZ_4jkd8gL~(!amB9)3Q# zco?=|r@NS|Rm#jjdNG|E!Q)NT*rnO6EveaUimqoxTfC_%fzfZ3H$$E(F$+m^O%frX@DlAGqBNRnSxNy z$Hkle_9yWKpG*p`zI8zCz*kkKotF4~xQM?!(lB8eC!DWoT>##J9oKD;`n&T2-2Eyj$n9QA#d6lrd5a6`EEn=jOT|54F*cm$&n(Bz#V+&@7;F?R=`kf9V-VI?c?bK$ zbj=%4 zF`grL+=S#}knxKT*H`D)50Fti#VH&8@3Dpm|L6_)OG1{Roac~C4-uI!VU^EjeCkF3 z6K~6F9tol4{SsEToRbw{4ErC;I_1EEabO*!&XHgO{&#YEdVc#bg#Tbjw(QC{%ZFsb zt_CkKWj>X2*loO(cM({fK)zxOqU~?Vby!S8pkKXS|GtU51+|V_$0P~hW(gZ1(H3)% zOHi&_xxq<*UEixlkH1i#=a9H8@z_e0g+5x+1k8XgEMuKFRcD8wu|}NRM@Ni%_ZNRU zAJXOIiy)T&u|dqsi+86^Ve=+y@4O7p2fLMz_VH130P01iQ(OyXkLSO~4H({?pZ;E4 zGuDzmbryDYVB;0qb>0&wL_+60@LKyh_UeXoA*|2Cr)k7|SuAAXmna~G5oLW$@hf*Ch~rl-M-S2o9XWaZqCTadrsZ3VZV z?mx2c3LCQGwIY}Zt%afMXL8`={d`Iz7@(AU5v2pN6dlMOXys5*^-P#BiBg-Zh>#2d zPJ$9JH-kARxr8PK#3VtEjlVkqj;5+(XXRknqG>go&EW1{r1_K6-_qbyo)kO8XYw3o zdP)ewm?z~NwpMg>Arb56(hEM*xGX#vE3z8)*fRwP%&m_WIp`E7B1|FaG7|rEIcT=Y z%#H35e+L>f%nJs!FvwpQ5lBY4;WtVoh#m-T#$%x%)@H%CE*cL<2&n@0S1?af(g(hg zg*96({$daq=H;=jawD@6v|;F`d_$)EL-`F{e;6W z+N&2`>^p#V0Y4j1TR&a9;f>=?P?2XS;z}``!8Xe~zqWLO<9SKU8Ig0bjdePQ*ILk&ksFCgbkS(Nn*5w zh42lwQWIuRrgU;}OXjb|Ff;<3LAt&f-v99)LeGF-<%3(&@oZp-mFfW#hk# z#ScP3Emh#W;~Z?OyHty zJ8zD;I?Xp;z(}k69j5@&dmL04<|ze%jyR~0oP>gyeE(E$D8!ppS7Ue^yJC2o;&$J! zC>(6jI4Q)7LP3ZcF7ouPT<5o0o-Ri@KM9x8Tbu=x6&nlyg_QJ|&00DIDM%cGD66#I zl;3y>wj`n)c z@AGKgrx|N3qQGdv!93YaV;&oweplAuMZ7U&7f>KRT|Qi#p4>mc!gF&AI;%s}Xybtw zFEubarLPX^-eym%1hSb!L{H=ggf0A?GE2ReVnBFd%r$(%nAA*oY*yDzeVQhZ*iXotDe%D_ z=4hF60BM$v4#!|ZWFgZ{lYJ3YX|XIsgVu{HZuWK>D;-9)`%OMzlF~ z{ca%?KDfVu%?Uj9{3vsSFn6LGUu_-V_+9KIv?&Y^k5$}( z);4>Sp^^1x&wmYYmw6&A<&;8AB36adc+75VM{^i-b2zOU+2m_RdUJ#@%6K7HC#UWc z54>a01sl4C-3d;XQThnyc!9ND%sF4`DMGj@uN@QErE}yH$6ni`VeO_kOS7}%#>Hmg zP9t-?)Gb}vsY#WH=MtP`H8m62fNceFrRz_Wnip)MenBfz8y|~-oF)h0UuYM`$y4E4 zwXr=rPLF&ufL0=cgbBY8MVRMcu*ov3ih_4{a>eHrVJ)wu;yfjKY}UI29l7L{A_;WA zo_D{9B7_zM4}YLz1@#urKUS*(_HjHEEiF&vHI`DrDGv!Q^AS`#e#Dq23jVlP|FAQP zYs(ff?0c%+*jVCbyIb}5w6Q-2C0-Fl=PudA#ER)zSC;dt9x1Po=jIF`LJF3rI7WKT z?uvvHNBD}(fXM{Y8U5dcFJlLSR!2$T!LI_ z*aotBYAB$+ptK`=O9W9>4YJ{D1y^t-jcV1Rxrt>JZ$~JCc5euQ`n`^hxYs!cGRK)nTyPJdh7Rq*qx%^eq}KbEQJ&Jq{Y@^gn;= zdL`_Ma+F7nCaelV{vGCvpB^Asv0xlcAwtll6Yr7<2I0F5KvY(UvEVB3lMQyvH)u4u z{)T#yt!f%M2a3@+Us42llw8MZYT-uhtl5M6NIxIgLm`ypXmg%hLoHR~WOI|sF;x`| zEcr398bf+{ND$K!DphNl!$;;BqWOCIvQj~Q9Xk7kiszxz7mA~p#rT^6+3+{vm*g?H z!S3DX$(QL8rb{5h;a(!QIp5A14>sXNry&VVpAp)F!{tY!IlCDlFemf3toY|96wH`E zU@|O*tR9Gov5=T6S*E`~zhhIbBl(tQu>L2(QUwz!jbj`g4qe!;Q+$DqwYV~339bhh zBA_4WNTC=5&3OYTm_1EMEyoXv_X>Y2l{VHzJ{zKTsjwlv2OBZBwcYr^ggW!cIC-ve z+PM@WG|PVp?I~LcSYN5}JHpw+ESA(c$q^xgW66mb4OBN|5yj{cp5ysmGfUY9k7sRG zDb4Am7?Uwd?=rlQi|G{^T5?OH74IL>&!;q;k?2(bc{5u&Trth~ax7^{lsqCiV@6;D zq5xMVnE}r_F;o}IE)Cf|k#3Dx?w+)U5>DL}pR)&RyF5i&_k9$u*KrRV%Wfz885k}< z=r37BE9MgkN#DyEJ>%L8R}z=Q8bp$bFFg*|BspyuP`9 zN3lxAGqUO!sh0!Nn*US*kv|G#yWI~ex5(9rNUSlkle@BoBs)W+bs%=RiR}Q(!ZK(s z|5J9^M!CK~L)qsTdzhfmg->gaM##&>00E^$1snI?wIBW_noNRsVfq-Q&IEAi5)ONe z6Gf$;Hk!yKmKjf25iisnc-CyO`YU@<_d;yk z9|2nl%O8+E9JP+yGkZ+FX=uPKTs*_d;MG-N<=VId=mU1W&`ZPokbcE$!~7RClpEMR z1C_`;MZd2NNHZHJ1XMj8$=t_Qvn6)7D+pQNXneTQX}_%h$0Q$nA);5G5X(&CC|+^2 zI^z#*Ka>}@Ru6q4+--zk%htK)P<$4=~EvHoC!wL~*e51dVx1P5fi*$q*sKn*2^ky8qKDLDDW2TNli#1SLH^=B$DbFe){Z1k zyid}U;X&Sh!>c8K(N3{#6bX-WoT%MjISHQM|zu z%$wkCL&>qPRMm{*4csj`utB35nf7%cHHsW&5$i!Nk^;l2Z@`;tdmII)^028wjQ!-c zBFB=Yw`QwxxF*EJS^HJ|V!^|@UKt{!n=HfWil{i$)i+F)V?|NniVOg4Aa4eGP4#USP z6cJ=PKQ^x0unTjr*4&Me$&&F^tSs+tZXRwKU;J%pK*8H*EcmoVw=XU=bOgJg@|#sT z^*v3)R}X?#f48ggGK42A_<$FqJg+*DakHFgu3+?y*${48oqS>MtQsi!7PV%gIv{F6vzotRmmmbXfQq&%F@#JhY>7pWZM%JxH2$gajMdGe?3^hjR& zaCHl`K9NJd<6=xmJ)DM46_foY09Gp+aXe1#1-WFljFUR7S(tMn{;(sBtYeo#xm(-$ zp0VMZYi&K!k~msq+5C|+`#(F=lrKcz%f6Y9S40UWT8>K`lJc>^IC8*fxITm)TXDt% z`NLYLY`B6706e4ba7tJzioTI?CC-h3+uG3uDIZSme+$i~-7W6qek$o)gl-EC^EVuKc_^`>vJ-i8}d)1!j2T#Vg>A~s8}bDMA{<=N@52nUMkpBH>b(2#74Pb zJ@Z#V_tA6`HT79tpUSb1>BCA+0hpqb0&{hxcD3AYEed5qgoQ$#bO=W7V<(X_+p^0c>rjN z54^W1*7%7X!JBoS>>Rg+dyQv8YSP4WOhOx!Z8z{N143^~V3A27W zsGg2y519s(q5X4gea|`e=rV$ku-;>GZPkAtrLc#ptB1uIf|1Fs=VAbaLn5_9F8ord z8swYA93YU5(s+?4oKwqHd@Qs(J*^}uZw-)HkNBl!oC-jmP;HKdAojv_Mv=za&M9F# z)JaGXqG;8sx~t=yLc6hIDnXP?p|)8Snn!%|{^a50@(rZ#5GOUU?9l)PuS4oHD1+Za!ZJQaN||tpqc;?KG43Tp{Fo<0afVk2ywl73GXQ;k^FUx0C1^W%^`Nkjfyu@V&QC7yPR{;V ze5KYbwFp)*ihBu{wq?#|Of4Y-PQ42ZjloMrR~o0BO@L>r(*;j|_xD;|c| zh4?px3U2Z^XgCR38H3?gOCFCs=h9a-MAMrzJyWukT7IXO zNJ=LbKasap( zRTYVB5rI#KpDuAH$3RUnV-s!$&0g&>&TAx%Fv}06xN>3dnc0jHZw3A5bRC<_0CJBMoROJsp-+a0}V~3C+n%;Il2>ieHm+7sk zv(r8NibN_C5@Fr4PVgk>$?5MA$t14J1oorD_o!!a2j@shxI`ja-)YF4B(m06y~mcq z!1n$$Xi`oYKuc!8AE`aV4+NnGMMsp3(lptVwI67VAsZN&Wj9FHmscbpWCnXG4G3)1 zmrBAdzWi0Vk+gR-(C-#YT$V9A?%~`U!No^8j5XRy8|LAP;ljNm0_t1-4QY7fP=6~m zZbi^=Q0;d}u52d?3O7AGFTb!bI-g)t#6%E9qhL(x}UN)Zdd@dSkJEj|WO^DhE9`R?w4U*7bM?>(mGQNz#|cUD#B ziNUAxuF-D3Z@TA|>DuHjI3-C0pK+;_yR!rNl?owi|e|m~Y(d6(?+T_oV>eKpYaPC1NE}#YX#Bs<9pFWgaCq z)Pj?BHO@{^4EE?J<6kn>jsnh`5Q5~Wg0Twn^(5i>Y3@02jsf#`sLv=0aLiPIJlewr zDX4kBBn7ROIK#z5F&uJl zbITu$fi<|WzQzL59C5bJZy_a94O`d+rqOGmsHla2%ZCOh_tz3B2RFNk_tIJulvif)y1fj zR;y{_Yo{UKVolE-;)jSY9D<)FT3pf?BmE@!LR2JTd!JHPcgn$yL#fckuL{WSkPZu8 z&~?99v(ca`OQ(ho`L=&NWzN$jd~V3`Y&A<14$#bx&0D(auIsm<`d0K66CGw1KOt2} z>QzzY?COM4b+T%~XD4+w7yyoza;s9Kf%k+^AC3Zx<|8A3RgyFYs|=@Aeu@$+t)F1} zN&=(Fj(vZ3@`21p_d}#bBTsfn2`CLPO2fiaeRdz4?_qM2i)DXU} z97Bq$oA?I3)3!8m=FPMnkHGmi5EG>@XoN1*GS|*qX7WM#U25X2=q0uk3YD zXz7sIs|IWvLBZEFrQ5sn_ZQNk=;rPWu!ka393B@U@?iXWoD{gQe3kH%kXCGQCUX{ zdZxLg3@07sl@dI8#4*F{Un! zT>m@5t;E>1l03FPyb-0`z~GsNFU_KmU?xNL?vcx6w_G8vXnUfYb+d4zE~+eDZi262 zO7~U_f4)En$eG5vc0)!)DD;cc4n-Q~lBZnGo9(xjhgB8wp^5gPDQ-Y_!!@2Ttvkiwb|bluCwvN z!X!Nq5%vM??}`ed%xIU6T`rfcx8kQ?nXgGsBUi?p(4C925PzkV8$x^WI-7L8lp87y zZ%@vK{J;-zqPlEO&v-uZpUe{h#>UYE^RAsjls1E$1Eo(iRj0aX6E%;*7 zOjw>7P?_0*wzvYS7EOUPl4JQLGu>7%?RKI@2fNKVTy8Gia%&eL$4#-blv|2hM!As{ zSJyB9(Lle`17(|o*?w6OCcUINYu^4zB=SpP`VzJvfAXVNk@66c8^ts{VKIj!m~8GE zSzHZ{i{Ml*H?ig7D>Jc)@$=oq11g+eLJq#dSurje{Z7-{;!Jw|*_r{;^#fwL%|a_= zpwUC+lEIuVA(6~}-ejj?Y6wwfj8!2$sC+@;d>azGo)fnI4!02VAZzUJstPNM0*!s0WD5P7)m{1RYCX7?8nwm5G$)=vMJ|27RI&bQ8-J;L#LGg|X|#R}f8=KK z6QcUNLK$7DA&K24L++Tq8EW-WPF>;;AU4eK*NO-Xq=B2p8l~)89thpCnRYIVW55?s zqdnbDjiUu8sLdTcQi^|y(j)KSSX!&kgyO{gesyo=pPS#_So{7FWZ$!;99+Z^WRyIz zjB^NON;GUAf~|nj{R7}O?1M>;h8I0Ti*+%sN^rmtYP$YpVzL~hf#jmxa& zOwHH9v)Vy>@ARt#YnQrw%sG{(e0stXRG>OENd$4BmgtJcTr%mFndsWI2zxA0Z;Pyj zAZK~8WLn)`CxxF(vIJ&w1$UvSkJ7NfG zW@>Y7=^;CUj9WIP@oA=s*xL2{iXzr21jTt+X#eR!X)~>_(6kgB2%+=UuY&VRY|;2+ z*zd&pCA-S^Llsokn#?&k4-||8Q$j(1@u~q(egc17%*)_K*ite5(c~iLwN#eJEoZ5DZF(JdGK{IBL9nX7#F=q$a;Bl0btWG}0pCfB+j z8oux%@B}sQ!m{$OVm)S26D7>a3Wk&T-GWV*8XlPOnF~g6-?c(jBu@uGU{i5lw>m9F zVLzW|loOI=6v~)A2S5BOX#EV08Oo*oZPq1MvfQ}e$Ej24T)_9-l?gIPC4D_$66M+^ zBfZvesje13fI^r_|N4xCV;~%FsEzhzYj?J$i9UxWBcce(kG4RD$Zmuu?Xd;I^uVy@FBW86V5l#{|n56VvO*euqYjj$9 zEPc+Dkg?Q2y7fHz2GVL9Pv!ctpSRlCwLGgD)6SVp8S*M%I8$@(t$zHL&gd<^8x}qw zund1<$5={t=k)Ltxkg{2S5Urj=7CctT;1mfrbrGeXPgDJS)j;DZt;Al{;lqVwL>9TKa`{XplHr>r z(Q(eEajJ#dXamW$c<8*09-Q0bRKitRxYO7`?5!c|HYk3v7?(?A2K`#QhTR7Aa(uxlEE-g*&Kk3C#`{nyX$1b#xJ5Z-FzhtT!5OB@i|VJeMclb(x_yHh@YN0u=*=C6NAj_!FRMT zT3#zUi1@Y^ERXSN{VrC_IQrcTy`2#+YgV03A1`R|gR&0PDqe<=8Stlhsa)DRB@huZ zn^=OoP3)?O|I1OlP?`#nSSz42ANM|`U^vsll7uk~LxX4twAd8*P5HDEva}w2WrkQX zQQS$=C!)rh;83$s?5JhO{HpQ`wh=B&L9iv<${Za~Y>ojqS{s{VIM^D1ZM&6e&5r>Z zS}fOOKO9=+koB2LwKzj#(+uySpJ9UECZp$-&RwSXxeL`R7Ir(fwXY`#;ThF7>@atOOX|B~(@oQB5%s+vS zRBE+VTB&3!yi8uWpsCb!Aoy6E^@w!5hbY7!CanNtkV%3rxE7>Q@n+rrUa9))ZtrDW zez`Bc-dtUjrP2uhrtEJtRri9B9x0gcxs?6$5+togf+Bn)h6mJF%Q$!hrn9R0d(?%K z172lQ)DlVih`jVy(gL)qdP-~-?W`Q3Q5Va*Pal{Pc|>go$zLpJJJxiT#t}H{AEVq@ z>`41(P388MlwmM+5f`WtC&@UXLqwYkBUY%A8eV2%?!(pDoj-Argar+#T9m+C?U_E8 z>#;0qlN9#pnqsSOK0SDoxA$96d^h~M(~LHj3c+JDh{$oRRhRIuK57!TI5m}hE@a*$ z>EtPY_MmC)=R4jJ^|5(UXk2qJ6XCA#^=1Hys?$getchcG36WHX0&EDPhws~WFB_P z;Z=$N6UrKK7P+asT`$17&9uMHOq?Qzwh%NDkpp*OUC9{RcSE8Qsm!svLwuu6z{bUN z3I{4z@$&VCogfWZkzvW)dYQ}hQTN)|L?F@13#0E2hE^%Nh8dJ#uk;qz zn&g$|ka(Dy4zyNgG}d;{QZs`-!u{qf409YdCR%Z-S{kwq{0ixv%>lJKHe!`mIhp_$ z@z0y1z43ycgLGQ_=WZWJtQMe$3wwH1x*AzSz2M##l}^oHSo= z8h0R((>#a@a)pkoq}f|v2fJ7~mHPF2*2HnBHY&lzye`Mqy|EH}fHk@(I2QxX%*FQj z$`dsBq5_?^b8-$DQ3n)e4JDfjst-@D|5zkydz&-*hubGo&6XV7$cmltB7O?yX?r=7 z?Pw@)EE=DUg|7Xeb=@0v{x43YSc3u!E(8+rn{lSe(I!X4Euy>esur}X>W$S`u&-f4^8jCHa=5j4&bk)qV4!_Z)*CySc=B?+tS#G;L_&)XU3 zcU-pM7oHmM37;VML?_=1EnO>BVy z_k_2U=BAVT&A-y8;I|~G&8s`fO&1F*I{jotQ$~JbX>*KVXa|cd4glALh?~+>>(p8y-LT=eN$NYxxK6{=YBf)ECj5dssN60LiwvQzd zPhO2}91H`lc47ENnniO-yHWCbn@LDac%x~zh1w|E;is5{##QG{XtXuAyzxpLP72{* zN=vOys*{v5YS{+(#T&QovHRei)0~AHXW(}Yp^F{V%$B%9 zxZBgT)*7N&R%uv0D>AksC4P|>V)VvyG+j{MzGmOENN1e~sOd$abhW3D43(7PUoWhA zJN1o699Ky{rKjUFPLpW(#p#ul&@?#fs!pSdqQPKEnUm%uvvL0txuhxbpSA>FcV$xUkn9=$YFK6tkF)NjLT)Ai>`ykF#3s_pbM5>F$a^ zQ8$#2n|_~uq@et9`0nDvhx0rBKygz81-}X9eB_YGKzcZ+k#0g*X>D~uMeFeqLuPRO zX{!F-G)Y+^ zMt~peu?PCl&2K;5>a*v6ctAb}OZIbD)m)=~C4=Leq_S8Mz;OL9%Z0a7%{|=RZA1?w z=mYmI7p3737iVVvG%`|8UP#8^U{n&^!TsHoZ8)sA*hhSOjnxc_HP!XB@F)4q)>`5d zgJj_xhcsK51HdbjNg?~G9%$#1qLj+l(>7q%SJ`lmBnGB-5<{mYVJ)_^D&m&cLeSQh z9UYDAO_8cNOu}YNP%SYV<{*xLdKkXDyHqWtVo;Q| zYg>l|Yj3=3bNWha}G@ zDV@muB1V~tC|&Jupk6oOFk&3WKgfx@#C_5(4uvK%hx9AiNLSP*=Rx4dxDZqYSAZMt z8iU9`3e@TH;@zp4g&SKuj%qT6%8M>Njr9vFuS(Q%@Ehp5jC7Z%w*@_Xldb$+XpQAA zzuGm`wQ24Yxl{atj;QeGaFIpJaWaGyN#&qe&vivmc|Hm%xI_Ri90{ftH%T!?a}F&e zwruKH9Dkb*kkX$?w|2=BekG5puQ`hxz?>3$Fr|>5>8q)LJFZ$3?~#e`lq(3u|6oob zYO_{wfz0^EXvy_rJ6)n+%aM7S$@nzpc6^h)8aTGeboPeYk--n>_ zRqPocN#;%~C>G1$PJ$OHQ^?`0$$Dy;4rc+8vSB5-xJ!2NqPS6*rR}2E&DA(05sZK1 z(=*BAR6=8sOCG_uT>V4jyi>7^?!srjeDCkh&+*UA)$oS06Nf0}`~bct1}L@)*tuA4 zS`w$pU!thk5fR9yB^5K19*sK@J+WbNIak7J29xy_H)g94C6C%N>NCwfP))@(ECIgB zqlAphX=K6$$Sz@;6}iZcOkH#fau-wVg}(JxrHYLDYg0=_n6o)yQH5fcZe#{BUakZB zhhsNL)YIWI*A@>A#hI|+gKrT3&8~QR&^+2%quDLC+ZU-);#`aE>d^9jm_HQN^j}&DLH=of^Na z9RP+|Q>=#y63nEEpf&qB$1Vg$d||vBNva>H?Q@Y**+%SgX=pq!n&fBa5?JUd@-l4| z3fbyMR$-DNpyhLTkD3j#?AbyJCI>u~E`@$=hBuiv&C$vNTwJ>g?>3HMVF^}hw!u3; zG4>TTt$&TYIU4;9bL`3u9*|$N)oyhfykSzB)=OmN<0{ly$LX?#L4EmjuJ(Benz6R{${?HK!p910-@|w z$l|1=9Xee#JYzuTpA}=2AhpxlVp{~e++>^UnH+e4v>Q#@clm>iZN{CedA20@ha5C7 z>Fm_lGNfXH>4E8|D3@XWO&Xc#y+ciwz1aEY7t%u1w-L{siX%j z9arartIYv}vKpUBY-I>AfOh9NB!tX7b95oY#C+~5eN?KYz_qp@*UZeo*Ex1pOcR(7 zk0A9{wjID%3cV_0qAjCO#cUK*jQGusSBqnLFgAMIV01#h)T(xd&Gm}L2eeOG7V+}r z;r-1Wy4F41!2VHDQCKy7>9%(N`Q(-hC*H%rhHeda6vja+G9X?qSZc?-Ou38akN@pY zJ}~=8B=Q!dflaJz6Pt42iR+K14o<(moNlIc=JDq4>?|@n;3U8;<#A;Se1-{D#(bat zbNtT~y!Ks`LL|2~6l2$olR|P4$D?sGiTA^IcQ+?zrziIhxa`K^aRCM0qy0vfKi#%$Go;4I2t{fdJ>{Dro5waBxL@9b@rKZnb? zY4uzIM6Nv=qdI+cV0wbN?hs^UZ_u8f{{EizQ1Yd-SYhj98!2glOA*yar2v(T)m3uR z?X|Up-u?N5q0Ts^Cxkjk*%j7qo>&ElFrqhCb7%gN(W810SUK-viO+{AMa|AbG^1pf zd=`k>a((h!6|YK8QFPaIS`-g;#m+D$>dS?#A&!|{jJIbi?XTjlNo_KH=$ygSI<1P4 ziA5YFk?q2y^xCxZ`Bslz!iIIPwT=s-^-`5O-z9rl1;=cj47U2{t~R}ld3NRPkIrLkt~Z6T3KvlzSG zqwazHq#MF+a#FtKDgr!4C}Ys(KMt)K#V&21OW~jxcJD_QIOJ|pNTnw7YW8{|*mle* zq14WpU4s(EMsan{Q_7vlhiH!%gKPfkTir1S=e@f@p8p~LBv^U6q0r|(_% z9S_HUipmX*s-!!GE*kyR9}6{JY9VeLHP>thZ*HaJHeYOYeydH=+!DSE053q$zbxNW3faox+|*t{V+Ag(|BIDA!M+P7c!@YYED;3pmfhKK zQiQJ#Ev+Y2!pqO zX}mq4`4)7xM58puiB-NSAgp>Gl>YZM5Nq`sy}m6fh)?~tDI^&bGV3J{;K0RY!sg<7 zS{@MW^0|vFtC%iAu9IH1UJBwZ5k0*YF~>I#uAO^Ou}+q%=x@%ASZr5Q!-%X(y`dxt zlcZAgoE(4*+Rz|BbAeR~@xc5y(03aY2mR(xRF_@?2-$u7#w5J)73UsV20o@3s=KHZ z&ad!p(}xT>f8=Ar@%~~3zR=O9pfOpqX$&LD%h*&YxJmZ3O0|^7t{^*8K|4uKAL(OXeuV?UOo zacqi)FLN$yV^wE9LoD_=CK1AAMpta8uT})oK9%M6cmsK|IfqP2q8FwRM34|kNM;PY zBRUxTMe~wJx$b=JXj6eSqO@|_Q~ZkAw5+s9_$HHDFW4`54^AbcE*iVuCO5YaaL2(j z^#{ZieK2*FMbXA7<;w#Tcrht_Xna!rr(;@W; zG8z1=Z}A-~Mt7B(!cF(5Z2*VJT|EDt)Uo!I zCu>2qHJuTRS01>#1U7M8`d_BW>okg*M?bjWdj|@VaQTXklNzM$X;d3cSzQ-P2kcAE z+C{001diImur?X%yP^j++rG>Ospnq=pU`9i(4?BC!tB76PLZp|Vq%31W{qwWB@R}s z#b9;n^+mwGRY_dp&yvLq;+Kz8xc=0k6A4?V308AZl8G@q(1`UPt?)P22o}ri8F#Tz z-kpz=^JYEi73B(^ilK7tb>p!=J`Hb->BU}H%r8jD(hspH6})g@nl$rD-f5(fzE-^n zdu0zzOw^_{6}9l6b7Y3wV^)_J>zyYu6B(FDCZ@}as~C3MYE?IFCEpap%$hVw&UFc= zI6FFmyRC4|`?eq)VWNd0_R(HvWa2 zq2W-hgxGN~j9;ppi)~4e%-d2ByVT-U(W}!z0rHjZ<6`Z$LJ>abb*Q5*b5#b^H7pPp zz0K)a>uW`zYW^WS+gDdN*QH`-h?%ZQi3tA=D#ZNH&QG~dSX}59%GDrYvY#103Gd+> z0#~H~A2*xdF>|Lwz3Ro@N{hxToZhk+KN9vbbM{4ma&rN$LLFHbm{SZ*@a z`Z;yTm2xS)5(z1$$&)LcEd{|%;s|z)2s?EWKGQG(MyPD4H&ikSB*l^)wnT_ISWCWk zEg7}{L;;Ugdl4REr@@GV;PpL0M#XGx+LLJ*YdbER{kWP2Zut#|r$iL2;rz0);WC03 z8Px2TXnbuWd-{FdZVAUgvk3AuWz3eqs40?87=Y>YiF;Tj8+I%3CT*a$|18YNl9fEY z#%orHBB@(DVsQUmIuzZG0q>HjuVSlivj0h&CyiC!^dp(j#4oB(bGYDJaP><&t*1EsVP=fn!4iVYP_W z*xY+{%8wlsxU22P8WcNY$3%hS1xXYZ`*P}JqK@;onPmSRQ1NuBCn5=$gfQ|Z`zZN! zpig0hQb4&_4(FISIuJvnTBTeHiEa1qhQ|L|JKUMXJzPnh6|`)&spSf^hpgsOkxb~A zd&^u-9gk8UC1Pq!6fZTtC5xYPevj|A8w4k;?-xODcD~OH)IRPUQEM7$^f5GD2wdO8 zj1%_9Mh~tSt<7}@u{A({{3|a1dh^>tRMioHTBmX@#*Gh(F%tmAQwEE$Fi#T-ij=(c zV#r%i(Et*D$@LV?bVF5rJ5b9Cm;y?cCX*2 zPy;VA_5=j?u5L>EjBw5GDG~I2cB;HZ~Ex*LqB9qA}Ht4GJd7$E6<6 zFM%-`8lFRn{WTe-IN&6&lU0>M{WD1WbpZOq{`HxlDpOLS4Kb`9sFz*v&~GlrrpljT z10~SZ77%2iK3nfk%gbB~=5~3W-WfFdYq;wIDG&IEi<aV2 z%YjHS6*OcHDyYLrAHZP*zsoBYs!~=)uV(Xcqoch(X(|&yz$IJLpwLr<6cSN`Noywi zxjf^d*pJ23u-)Nh>&2R1oSkMp1UaZ|4?(t-;CF@~S6SI-Qx`j}KAxZ4N(A!7^#iEp zr`rd@izba`Vm&0+1Wq8n8+O8>QT!^4s?8Q~AI_?#1d)in+C75gpoLQLE#P`v*W2Ir zaKiz%C=P@|h}n|#_{#PRF$svhlbh;j`$LnquhjV;-a4*2G} zXt0TTp3o(P#F510YNM1d`e6df7R6W=HX%G3`=BXV=?<}B zI{iqEw+r`!$`Y+|$8FXrho4#`+zfhhdHU&+vI5TEzei@k^%>>s5)Nrn(zZu9-%^rC zp1Gl?C%DrDnFnffEzW4g(^#z3yk!O24p$hB$$9G?b%QtO9RA>H8c%@pwwzPAT1tkn z{S5@l88;OG3$fl-e}d=8$|_!~GxD)V1<J))YDOt9Lhl zU~dtDZNC9t_}{Ww+kXA&Y~^bbHQcZ#pI5%E(Vj(6s4+quzz2^e@_~v&YjIv z@`ok$Lz0b$oPJ|vhyUiNR)z=nGUa1ThGm$^U?$}Uer);ujT6MF;6(L5S>pc;wYigU z#V#(dDxy2gmv8Y4zWi@?thmZXchf5Q4T^FlDzjsSo=wti3BB&#UF0Y*axGoiFTzPtOJ zv+q4~GYO>X@==n^-1j~2vk%&qthij{_ezl$^PrTlL0be&#v8`~Z2q=jw)I`#>Hz+( z8b;jc^t3oGd?QScF>zNz>KeL|n(vRxXhC*Z4r|ZPKSqkTrgMcuC8lkL_Zij+F**R7 zp&>7sANd&T%dn!2ALi*-*+IYW+~}ci_1{DsF0ShgpU)>H;VPk}#VFz?; zHCY>NC8t-{58|Wj%S=>O4w1`{9sh(;XdZz-WMm3!>T{g;9sSY9u5C z>eI1pWgVLV?4R=4K7h5Sx3kI8n*#1)(;mfyZ@a)A29Q?isll^)Xsh!*lj~@}53-ou zR^fDVOdxM}Ehj39H!Z$UyNg`fhrIy?y@8dpRmS^N*;*EcQq7FbwKUsLT1!L10yXe8 zP~&)5+m{9c-*D7hh2b>E_Cr2h`$ayP7Jti5U_+0%!ndPprem({cQ5-+JUg?*{c1)}jE2_;lwxk@Hkzw;iLE;N zjEziDp@KHNx4oOSP9BdxMC}~LB2mw0rR|mQ?to< zpULPp`~Ur&t?Nt8;*kyYWQovGOKGk_cSNv`&7I8{aZdGVoVef)vfrAk=s+%z#G20+ zm#kC;i+GqXWI)D|P~ZU`w$2M~UooBc`|{K%53%236qx(t(iQD*JtKfGu@(`ng#WmJ zj?)OT&i)HDm&!fi}IgHD`HIq_HOvT5iz=U~sesposO2)ZZQLxT!3{Epc z8Sh9fXQf>f4U%qYlr#qMUbv>%B_ySe30lTpp!S>KVq1X=WhG{l5iOSPBA~w24mO1x zV;Nwl6;wqO){DzC#7P`^Mk|F0&s%m>7pvWTT}%FJ!$z%fz|51yXz^XY1LfD!4H$zA zf~(TXR6Tx#7SJXoCtSK4IwNhFXF-iGIJqjN62E%D@7me?Gq;_Vr!9nIt4t zx#P?->`M8iP6U@HN;3&36j>hiVb+e})*W@iThM2d<}B_+Zo0IhGM+w+dO? zS;6H4Qw}{N2g{gjFS`iEaiA^hd-{^?Ka6kY4T>94+fQ-uKU0^xS?e@hYgcnv_ktdq zTJz6?1L9vv{}SiLK%rUN9d(79Eme+RfE=miRckFuDM>EBrzqy>l!vB9$CyixHPhcr*M+iDB<;?} z&9(8oF)R1X>lu_`;dXr;msVXs11O~R2%vqxXDB~DI-nA~(+jTFf4$}g} zZ>0rFrO)RqT%O$MAb%F?B!o%^uLnZ48h95{%O9;8(rVV`hm^`_l`3{1kC_`Sd1O8L zG?;eMbFh>BvVbkN&B{@!lAuZy+LXz8 zRjp)Ea%47kpAN=E4ckpE<4dhu(d)VX*M}nzrHdKde3c<%MBKeLh+O_fRH-81*yIUk z(F%~7SUtEne0v02KT;AdE{$_^e!?#3;kK!3jqR+`?gG8UAkHAS+8FR5fjmAw{gv>i z6Tv;Mx#m}!|2$=oyXiHm15v!B=-A(IxOfovcyvgu$S|fMZ7kAA>jukpzmBuK4!Lw4 zLMhISdH{=&F_RGbqs^qYOO;IOv?bAC)2S}hFjutfQy?*VaB(J~qu`9ZJh8Og4|Rl~ z0AWN+E>djZRe#Y{YHKJOYu1>iI1urp!>=s#P#*fgwn1vv`%q z@|)cod>OdDcK#MAT7a5+qqmy`v_vMxy8gdySSQ{1{t7(4o80 zt`)3yh?RxoRkF+8pPe6BW(8)Y(r2p|e~5u80&pD=9!m2B&Yb4&7tUyEPmO5P3WwJNwWG zBu*3RYYd1*)LVgH(xUsiFaQW*XYbJ8bfj*;OQnI7i z5MfI+D@<>#E)Z?WkCsI&AT_3hd8DuRAl&fAP;_x@>t-jnH_b{7!})$PpWWxevk4k- z6?l0!{zMQ|0}>#C_sN4ygUno99KHXJb@|ahL2+dgX(5+rvha&RV?0G3j|b034M3^! zS1Y4ka^m&iaV9qv6_+^O&LwsRmuj2HQ3s6Z&4t{8Y?$TB7%5-FR6T0kP&X26ywXg0 zRVOl@VwQ|+sZA2^+hvV^Q^<}-YEg~Ypo(*I+*OK$gxUMMvob)I4g;LiC%xOkxXPKr z3uo;Bu;QoqAr!CFw0pA$YWFpg)k$Z#^}d;}gwdKmG~!t(N!F$Sa$?qG$F-@QjYF^3LqnZ+Jg z^F4xOjur6b_$`yV=o4g{LhOwN4rvC+$6zZFy?Fq~SXQ{b83U4vlr5cjU6#={z%O0e z>KHgf6t`uRulhDL@CfN2qp4Lz&Ddl*@XN~+wB49ZvWSc0QxuA;rk#*qJA+Wgg8E|H zDZp^t*wc!_D)T`F%^7rMAf$@#?{N6rp5lnOidJv+1G`3#`pE6ECNW#>Rkv z8N;rXgqiyH?&wm=3w-<_HQw6sjgAQ(9>@@2{~spWLSm!D!tyNi7Bq^tJgT88OdYd9 z;<(lZi4c1Dz<#9R8XT~nEc%aI@$r_$b$GQ5KS5YTMcQaX9H8kdtaZ{rQCYKun2FCU z8DK(S@ZW}5Z;8Wi$0bY&CI#HsMZv!b{A>iMrT^x#^qHz;M)OUyNGK_adFke^v0q9R zyt+|&F?v%E371z@Zl(^1wgY^Gd`o4lhLNQ<OvxRwT^9XnVUuVL9DZ`iqPLv<wVb`|8QJ(_+?HTeUVWiL|%Wz5utMksrm|unuu#L!68>sfYI-XTqS&O3c-Y z6UUktX7>%TKVB9@+c49$P}4}m#SfSd@2a_TvG-K&qV2hR-WkTh{3eSXV{Q`}f)Wuu zH#eR0xQ>Vy zYI2uRUH_paaRHXb+M@O(Yomhu+$KFw4Rvi9xao#(Vu43km~IkUN5QO~&ZfrIV1car z=dlYGz25RD6xU|c2M75VU^jPqTA3T4(@4dtZhB&rzz9;b`l{9Pt_#I4Z1eOoA={yx z>IDh~oEXxij47r>(~^nZQ6^8d*;zBX6_2#l1=c4DJz4XnI_vI!S!`xKA~Ub-nED(O zOL|=ME78I^J)D*(lA!|(SX@ZmVCuVzZ=YRgV=TgQKXj`4=OW%LBk#Oy0`gFRft}wcZZ*|?#xON0C zHrWVL_5c^oR#j8Eqj)xui`y1jVqB7uOY~onB6uW$aD7>TR=j;3)xu3#F7Bp-D9p92 zLDe-mB{Rdu?AP@WQ@QvZ3L1Q=s}uh#99`?ScMhEz^asw?pV3odMt>(s6h+JyG_+}{ z&>$J&;x}Y-aY@|XI1G!xC%c*K1KJ}4?Y;RnI0fG#`;kg~iEApgQC z;MO-Rzz4#8w)a77#M{p2oh*80B;Hu(TP@W(`K+k>7Mn~~kpS=5Rib4tWKXLQWvYR` z-LBm%4?>|SLDt9OUa`q`1UA(Y-mzGJ9b%oS7%w4Pv?5>At92QESd18ssS=5Bk#(H@ zze4${o>}1~k*cKlvi3YFUW3CtFLuWVdcU8f^D>*2Xgwef_E(|=L44sT9S`3QF%P`_ zsC$J4lW%A@vvcg9gNmFgLwHAzgmsz~^KSgQ8$la%SAzXOHIe0KKu;x`<*PDJrB4P# zOV9Tzi(tA&5d#?F4Isyf%R<*IwnBk%HO|$e4ZH$wC~M-srM5!S2`o*R#oRJfQDUW- zM#G{oR-RPzWB=D;0GhKKk=zE-V$*hmjUgSHZK=WY*u~I+xE4R;YA(7uRnOg6Nti}h z9=EF0MIJ0aA5~c&PY~vsbONG9aK4!_u@P`TwD_v%{#8aDmER;>BRpaS5wl4cFQUZS>Hg%dtvMoUJXlp62D%bJG*zwA? zW_n}6q@BQ)b^Km%-aHSJkua@%DyJg5DyB#e!F|RvRV|f=xWBO!vox!%F$CDa^=%N2 zdUiXkEY3s*ZMH0Z)qgSg5zy;o5gIaf)&}ebWcByO%`pG`qOw?$dYz%(}wsqSu{7tf-6xZ6H?2Dt4a&hxY5W_UFWN->;al}R*nKItG!r$mCoOJxDTYBa&1w3x01 zfuuj+gZ|bPyPJ6rG+RbJZ!M)tNiC|bndFOW_jIwycAB>Kn8!3ddjNd7-`nhM#EnjG zX#XY9?gjes-SpwpCz*CrOX9!OplX58D3Wby?SPLJV~Fl^DbQ?zyB5g%eA^Dy zAIqKULSM09*Ru`GW1rN|Xhdm&?Rruid->B zJIE&;nT$XmSxm{e&eArc+#n*Oq+ZxQy1g1HMW%3(@QvmgkbdWe34#B)W9b+c=hvJH|hr{rQ#jrQ~m?pe5(^G7QkeV&Q zZ#MrsZIy*%NUb)&X3ash>qxB?fyObdZ9Pc*I1gd~lI9JPm`_w5RlTW2j&SH}`80j| zE{3TA?w&ptWaLC70wweLRE+p4oH_|N!*jai{jEBWMRyeF^t{bW9!W*!rWobtC8*(( zCDqiaX&H%9u`mkMHRn_jfcunzrYOX$C<$$-=Ia=ffHrO1>`+^FU#CfAAI;rqv2N%- znMY^d-AO@DAnEK+U4Kk2Rw#4H z+9aKA_E#>@C#6j8KB=Rg$&Ik(ls&A@zid3gk<7$Ibj+}~h zF72gN{&)9ww~`Al`|F;yw6aY|6WzAbH#RX?IIc}%hd)LpZwp@4^Vo*;fer6X+|%g? zmRu1EEVYH}O57Bm)x>>U-01Ctc)}w;qXeXRgeo+$6*6_50Xln_%7&zM?^j#IMZu-b z^z8$$DcbjS{S41@zvlp;MZB_pF*h5ntlT(0kIGEKEhT~y2@DFH4pT{$eP=$ z^Yx}NC~q7eY`b~(J$jVcJZsWkgww&u!TiF>mMX(I*k3K%(RMkRZvXitSN`R3ul&X{ zz(ceVz8yV+D}?+Z9_>(iZr5RbB^wZn5n^0!AJx>4$3?5fxb4`{l*5{Gs@s<7IV`7< zamei_>yq!(c@VM$FtU-4lf%*>rDqq)@3VDLBG;&~iag|`MWz4Z4C)haxYRa7@xorrrYm-)5fX5 ztP4M`r)0UStx6hSo+IzvF(LV;o8o5`D46Wb7=2rM^nHSq3r3SPGkCBZd|o*b9$!1D z54E_iht#(%6r{2)mF-91w@!U32#9-ALVYd%1|_h_tCeI=bNW-EDQlUKxBBmrsJW)N zlK_DoqN(E#^Ql^z4kQc0A|0Q%t^QoyN}b3*l(p?UWHp8#P&(r5!<+~it141vl*fBk zmk|V&;_A?VoXkakdG_WE$8#D5z8C)H%dr-h z*90L2wI49P`6uT+ko1E{Izg4btVd2=!xKlXQWYVc=`xPNBalpwp+jk*f8IZmV;L0H zgX7cV%Yg)^wk;SzZ4q6Q;dIJ{o7Du0L!Z(hP)`A&>qa|BeLa@bua>Z~HpVbQIZ9!O zKHr_C9MTSRq8sy1`!>##=XP1i89Qyf_v-yF^~$RczkKYNyCzMF-3Ss~6o9$8v|iyV z2WVz9yqq7sm5ky?J;kPyCX?K3@RU@bt?@dhHcHg+nGBNV%LrbUm0Fs8zQj;hs?e(d zk8vv}i1|!A`zwxRg(S=a#uPWyyg5A?SbTF)#lU*i zw?fle+;eKRXw37ctf4Dc;tC{9K^P!njrsc>9b&YF3CBPy>TlJ)Y!>n1()?Wf%ueY* zzsP44EjEKBYj2yR7e`o7^y9cO0~G@60ah`3-oBJB+a33@f@E8WKAftm-f09SEEJt| zQ#Zb4Q-i@v`9V~GxB8s}kM#1=u7OmvJN}#I==0=EEkE_wm|F^ zT%Z>}D6T=sv%%o%e*93$|8#VJLZUxb3z-T^7D8c?Bz$sce`@}#BJ*CQ5=HAqNZO0n7y9;{FIHW^;vMj=x6*h<%G zh@nNl>vO&#);+0~PeF~Nd;yQf>hM!K`;;6f+qAL&PsB3re(Xsb(n%6@fGM^^&csA&mM-g!g}+yYwolF zHcToZlvu3cwtKQIe$QeC62mtLTsKO<7da5ZgZS6&i%u9>x}tl_ZGgIv*YiaiUcKsf z&6R3=l`GWFdpA9KE7E7J1;f8P?xBy1E))&}G-ssm0N-g)!^&zjPjO_gf`kKCkPsaa zEvx|PjQI-b9Jd!053${78nP;_&HTrtS*o6!bp9+Ccje;1Kdfr!pZgve7zcfk6qQW0#e zvVoaz)NSSh9BZN>{_$Mtc#J#FTG%5NwVl!I)N+>!BPH9cZpK`laVd0O0rGFAnw=Be zfeE#5N8v30Lc0a45!InBW!idqIDL{AR8m`pf77vy9Gc*4S={%eZ4>#jOBK?!CQpuO zg=%H3?1%P2mMp~J%4eH>bf`$fX-W;tXGiyHD>kQ1)lSPcxc!pD@wJ)@YyF`1&L;Ho zbq>Pl^UThz%BSUN*A1o2wTKA^OInD42M)!2%@jm4Rd+p#fsp|o1B=wdfg;yKOuqbm zZ%JR&dz><`VoMyun%Jn!fl@)o@SZM1wbN-JCquk>W!YRZIyokLJ2$0IFq1nkFojCI}E=)f=^A z>JxB*%%k@u3(Xc(?;vqAJLxL!JXZ`5!?t+Oqti1fHyLbCr7YkF#^5MHop6DY$rO8ba*4d5CKCn+nXF*PoS7QR`W z*qC~cQ|sNTCshDp1xPR+RUI;yY8dLLi~OIsk(nJ)Sa7<7s>@X$x`XWM26y4FlJy# z5pPc#eo<*_N|ZI{h=;YP{24VvxQm_}|GBtg4%%ZLHxZ*V`d-W;zHUqG%MZm2(G&7J zvON$ck!@{mqS^ygnD?c53(Q<#_U&l?MWHpyAKSg%jxKaMt`;I%t;af0M!S4bCb;Gdqh;AK2`30l!qxCaZoON6UXJMc6t6`vPeuy1~(4I_#|I-!Te5y_&14Nzp zY80A$74p?029EO>g&M$U9caS#*@46!lig5+-N6Yc^$`xTP12In9k!~=E7N#G%a<+9 z;Cx>~m|+pbIO0gI{T9mDY^tPw<{Q(eLc~6}pp*`=#|HcY=hbrwQWHlTl9G*7n}Qv~ zK6SKz_DxVoF<5+NnR6}b6_-0MT_{VR!B&C0PHg_64krvR-P!s22u`b_@S{Gpd)OUJ z`ToInfB&V&MsZIS6sWjS*v%;f0*GP)t@iWVyPIm<18eN`Y>_CxRvw;I2A=Y8zb;m6 z9c^eg8Et=-vAozZrh`8{7Ky{l-Inwdhq{2u{Qt#I@bVc)iW)W{f zKY9cKg0Gk;=EiGnlsSs`x$?m#sTYjU0AY}bfsucBr{wPzL|K~j^8WC3=%XDBdNf19 zQGG2*#Xic;GuzUrGM_AeT0=ulu!qHYf78SombeJ zw6EP2ePT^&_RK=!*rZEXUyA3KVH3jaO7(LZOQklrMY}y8%WvQrP?Tjc179^se;BNS zWzDgvm&>$dd>P+VXR?k(8&0OM+mHsoX%fvv57BM>JnxB~MLY|$ciB_(>4QYdJi9zP zup3D}8fK+r&5jcjf=!`uQeu?sekAJ@#KuKE;(GV~p9|u~D2eo;ff|djDEb>6TS3(C z9&QW?KdpxPvdPeoMj&<5{BL>HNc&Br!8dm$vsL+Laeq6C*ziz6EK>$c<>;Gk)0~wU ziRtWKgg+LcpCME;H-n0r@1jI1b|Hd+Qu!%B1(VrqJxK-A!EbM&vS^YW5o>8>pI{;S z+fQJQ{TO^gtYY6upVincvrbBJ6aG2Q>j73(SFJDs*tBl+RjptoYVdSe-MWlQ8^wH| z+Jsu=!+(2>6O7D$VJ6K3bAY$rTT*;fVG{;|t3XWkdtq2=mmoD)}DEU#UiV_xb zZqYYa)c&Ge=gA}RT~+J%=x}atcDA6r#^+zC%n)n0wL2JZuHFmA7F#jcmTCifs-($K zr?(xg<>X$ke|2;TmkY)95ne9zEvtxSF<_OI<@Vg;WDm^RnvZybLji_vfFny!cDh^} zi_6HTseYclHKg3nlI{KN808twU9|OmFTz$lnsvR3R|*UX`LA@BsY^+`-2;m%u|FBk z(MuDa?!%3LqD@RWN#jfA+F)MX`3KX!K7D0|ekaq8PqCL%F=SNI+T0A+Z44x1Mj?~t zC{=4=Lp-OpTc#FkZRm)teT8`!LbkPDb8X04H|F(2ft{P&Aa!7+0KU;=p0xBKytDwh z?*x%I9Zft;Kr?P|c*tuXrt_tgcNS@c4s0#;U|CGf?b+(v{j7xY1Sj01|k2{Y2%YisW ze|z*M9`v9oUBk^iqq0#<9=`Ah@|IQUc$zFWtt{^jy#39WDC4KL$x|dT$34TkSmAiA zkyfqCzhI4(u;eq0SB4csvBlIJ@RhwV)KE>Hr-#4lQfiWY(Iy}mUx}?bsd2SDIvz7! zDLU)gYw_*w?;R*Ytfj{~9K4LX;rx}^x(9L$;uwbY>eX ziLqzn{3g5nTHWTKJ4q5+oZ1gE6o3HdZcnDOFFFSad7A~h%UI+fc)w1i640d?GCKdo zK>n9{l)ecYI9+HzpJ53ty(@woUxV(#F~PfJ2VGzj^q}yfs`AgfdW&NiLc;h`GOuNx znsmU8GlJn&`OTen29ZZY_Da|?Yo-PxBjcg%v~pT=z%y|gruzS(yI9-_zsNz;JnT2Nkv}n2+P%eimJdjS_K>aDi9q=p%7OO7 z=_D(*`AkszZMs%F+Xo;48U@4pA*S=v6=T#F0-+56_P+_9%HF=gNxU>2@S1TuGQFST zO0TOTdiyiEXC!88XC=j}7HACXuU{ubWm^nyyn4r!R9e z-_6>gT5=$ds&04{jLreefy=m}_6PzP-}C1Me9+313;8JrIPtNrxWV}iWzW{ETxOlT zbWQN}HY)?zHyn@})--<&17R*pt(vp6nv~x7B2Uy^!!r#TiY;hcS%EDg3_P0*Lksx3 z2@EM34?#|W8m>?l@PJTH!x?(Jmwiol1H=z(#cQmp84}C~o=oP<#z>i3JwxnJaqWTp z?gSZi&2Hi`HS#+E5RO4X5oLLPsaN-2Za2LxWe9B-cDnX6TvfA`A`V4wzp=`y6Rh)w zU`AO_Z#LF01#YsUJ=#iDjvuJUYuXD&XSD@id;;Bjp^e!9k^o5w0Vh9Bi!g4!e5!J! zN|U3wy4zb>`(b1;GExag{~+DD23Nx(hQ2N2yA!Yq$0S^$EPx^8(GkTB(3R1pe7Nte zG(JeZD{*}$j;WOFeC8mNDyoPz>&hQ779PLq=kv=W9ZaQ_oGL|3y&ld$bG#g;wP>VU zf9r*l?P=H?hZWw|I+zZA=lH{4)fT|ctSxJNwUtOP>nX$~31X?iJ!~L|OL1)hOInvc zYQVN7o~S9)@f6W^GnW$+ncqg+{dD}htK`!AY1`S`JdmTk_Ol`7EA@V1^UQ#0Dk(WI zxLK%8I~5}|&e&Rcy{2g`9K=d>9VxIpm14QM2a$L_>r>Z3=tG%7C}vCrUR#`F`V)Qu zR;9jtrBYSKng#)bF9}|a$J5!GSMZ8ZTSnksPsIsE;L`f~I) zzuht(ol(n|Xn$kFkm>Zu%g`Bpo*=i#bmA96o9c2E{l6)2nQ@?`*nKgKZy$hl+j%rV2|Wn-OVbr73hiv|ibph<-LxoZU{3`N z46w~)D#A`~j09$Q%F(xCftd(k7t2!4EZ}tY`P_D&omO9`RUbm7)QACnrybYa9wVBi z&&^q3SPtQ*mZ)Tiq!W45YqZ)Gj%EO;$aQ~7v)xb-J1$FS<>@b)aDNXIJ`;SVSs0(% zL|&0( z(gR&taAzhT%jhX2TOKmq1~jbP5>|%Pa#(+erTVWuky(ug5)=CUS7>4;x!pgh*O`?} zWbc*>wt8F1B0Le$uJBbNd}}XQ>gWzBCh|LUI~AbQicv4Wl_FzhRU($+Awe8&IU&vt z;Gda!4OBCyQyikcqMMx3<{u`M8ODBOll?wBelH^L;pydp`)cXEwjiFNDm>;Qz^VyL zOBxDE97A^jMC2#7gaGNu*J#}&3S?}a1E(!nsV-ep^$40OnT+Knm<7L>;gb;JPgYC; zeN2M?xuwY0dd8%s6>2rj10>TaQS&SiZ!df;59`DPGkRQ*@9MsLPatTtEX^vYnduVt=2rtJ-rv-(67ch4%Fvx zMVm8zi5`jxWKFp3uf!S?$wLAxjH&kIeKA}o9WC*ev#ik?OV}})Mx6zoFV&K0-gODA z6^o&D2zk!LR@AZE#{gjZ6vXHgWJ%)Yy<0Af19>oSRy3%g(#(kp;8BQByA zAr?W5xGO1=QCF1bdLiJhUdXftI383B`0VR=4%2gK=u8oPNORbLHCgyTv)>YE&01o; zEJLhohzqB}2<;Ub*;xfalzC;PO4OL1c}tHNSsNc}hl=SAyMaM4aUG6q$dUB|^*5yw z#U+u#C|N(Q@@{Bc+gvmZT;#?8lD^f4J_qRga>c+DswvJYY0+B7ChIIx2K+5-GRE@9 z#P5^ii_4?a_?%M7aCRbI>nGTCaxsf&a$9)y{OI*>&_(!o`1)EOGzfzg2MkH=} z5k0)_t?i5B=>b_dsg&Tk-M-HFo#C_^W)g8#z$#XRQX{ti}~)@vQ?XN2AS zS}Jw5LT=bMfKGbBWX*w?n5B>OA_3U~W5chEcEHqJHZ2rH%}qpR8?ESVF_du+u)x<% z>~SsBXzZQ>a@(78*a6E(H8X##kZO+ZsG;cyA=z$h@P48O9Vc&wvM38?Jl$^-o$;XeX@TE78x8=_PI@+W)WZgo7#) zlH~Axr5a4E?^k~n@nASnNn<~L#rfky`+ja|w^u$-wR5|@w?XY!*8$_F69Ike)Xc%d zv~OBhf+LsCy!PEgC5jB)eCe?ITezg<9i+lb&~8W&)!&M&Ey_k=@fvj;&`uDD8^e6L zcTmT{h|xU?djDg!kzE}B;RqB!PkBCaAD4>Es!^eLzF6sd^8;Es z(N%R_YCaFFzvx(NnS%H|#GLf`5jWYsmRu3Qh4o-nN-`sMUT*grkpwjd8dr)&Nl)5w zNfckZ*^lB{eN-D;%kY`hD84ovQv))*8al-tt-!CRVV9Ugs0!XoZe$ezGmQa_VpWNv z($`G$F<_knqlH4(%X>ntNd!h63dVEofvk=p_^FsTk0+;aHHMu@iB#}s4Kil!(~#aj z>p#U3sJaX1MkIz$c^Fi0rIma}x&`l8z^$AOD?f|DrtX&&_M`Kt-64PvbjL;&RWmk0i2ShS>~&c)g5oG zpdM_oYKpd$CaV7S@Xed^Um&d_CMdiDpjO1AFh~a| zM-Et1#2T(SeiTMfXRNZAV**0(Z6bZdq+To}qt91cCNsD%kJaJycwnT&{5kW#KsXb0 zdKpHHeYA5V_Vk+xZwTE8YTTOxD&BjZzw01qZ1O(!i3Yby4NY(u+a_Dl^;v|zM4 zEFmb&=^GQe^msf3Z4SR5wQB$4o9x+`Yvl(E0Ts^0YBo zheD-Vs25CIGO`k@>t@MX>@N4$G;hHU#Q$3Dc^F^x)Z;Y9K)ZYW+xC6_e(yZx8*22m zb)fcMaD@sP)RU=FLUfmwNTPQJF*P(0Mf7*H8pILWXb4fsSh@dUYyfi77#q}5#?=-h zCbk8S(h}E}*e(qZ5rKDXz3R9u$>S#1^-BwU(0~?vrD6xO7xU2^+U`?umyNOZ#afSJ zXr_6SK4k$6|4|sz;PCYKKCnaq!lXQj-D)Ian6dOgh-qSF#NKek1F^B%h+RmL(P=4O zbW~BY$fxYAoRwGQm;tyhM^U(1`&kkt*Xz}i9qM6q(z;6zc0wkGUdyIpSJi(BZ|vST zt|0Xr3Ca+Yjb*l`4jSCn#CRA}-*rU35?EGxH)f?qBc1&!@plQBqGo5KK~rfw*0k4q zc0%umGf+#s@Y}o)@p}${F#L0s!Vu1t;`sd6IjsmtPd&!4Ml$Qvd%8lMUtWRpq~VU1*m=5z-oFQM9v@9iX0LVlmeuU~8HjY__S8f^7AC)Fospl7ER4t-Rd zDKzlblRKPJ>|^;uk9Ba(Gf1}3_z0q^jUCsTJiExf-BtLW*G*35Y#nG z$}r5zB%*Ca4C47j>r?=MC44W5x1jy0?UCKFgn=)d0>78~ERX1e=CO1Vc4bX4;xz`* zinmK!qk0m?Xm^IDk34a9vk5QAZr;CEac%W9U%e9hV5h|>0;-?g%rH@PdZ`KFo0e{V zyEakG+TiORJ~KMEJ!TtJ6~g*W`DTcAKkUCp(^iO?=L9>+E9Q z6;L(xTBR3e!B}QNr7Mj_gE1@Zb!|{fwgV4u3)DzH(?HJtP437u_AH1J5|8x*`f=c5 z5EtzW5PWkGEE(1srNYpmgTUKCSKsLw$QpwKGYn!kYF}kAysBEtJiU4)-ADm8srJJ$r001Ny_`M8*y?PukF;EB z*!ny`wuWpAeiMN?nu*+1okyh(goW=bUaj>m{BJv1 z+x(+$mk~l**g@3bal@a?H1>2@7yMNIgNR6~D_cx}GKvf%nkv3mUbIL~JVr$`%W=Up z!!ngU-z}7-@B}G^L<9=e?A~2`0~jrMxJtxHyogM-5)(1HhrJ)%c!` zT%`_NjqI=_0Bz(!@#|7E?uL~1ye(=MD_>0ERW>caf( zZH25V6SPDO&H=&!cId`;`c zT)DMhfd%9FDk&g@#{;=U_7Y)JeFp^*TM~lyEi*HvazjIIYad{>6Jo{)`6}G_&3`|s z!e_@r8<2zL7rde3Cfy6<>Eavw3ZsMPLB`#>fPvs}kNejC#}Q*eroTN+nFo`F^$0(p z4g7kh{ZiwjM1x>}c}zw~zn!ECBvt8;#1daezc?Du%D2_^jDg|phybIGjkQ;7%5ZZg z|0Y71ja!wK;@0=-MLbT zOa<$TwtT|+lN%MxP_?HU&i8ygid<#2sz%#;s&+hl%rsX8eWvkVBG5;`=#ColcAX-J z@O$yfFjq7QCYoPkY2i@JvM+(%-b8H=DxyVXugGTZ zH&j(*7hg6?yfK%%VS>A@Lwi<+R2N71$2IcDVp^FT7bs*qD}JdW#yZI=d}JFB z`_cTX>zWHTmcS=CVEI61U|Np*OaY-dPN)h{;vgmh!RiiBi-%L=`!UgzzI0j0n1-w{ z)TLsmvG}mc6s|})6Io4i8G!1=aD!jyH|TxPKlcOBiAa#5H66TcMJ^-F>d#nG4P%bH z2I+>4XtT7e4lTFQU>sl!hjwfBm+g&&y45174^q*uVGJiBVvTDyV};1ZdEJqnt+@b2 zdpll?+=yq&N4OW-wwL7dWzY9rqi>)=8lzlYw0yT=jamKDrW*eK9x~%0JJ6$iB zoghCU?t99&#!;?%<`_e6Gfmt#$WYNwcr;ZigY8{Qssx9R(1u~E&lHV-dgL-pnDYY) zwZ1a+-lb$w>DbCuEiiI_u8Z?kA%Nxxtg$6{>x~wgo#`02n;ppp2N}s2Cep`z(7zs1 z3{Ldym%jI>os0bDEtULfZKjW_@(3?3kODJA<0mzCo|cUSh-nR0ni z%%Gy@>|+iIW#GRrv9LTPf|>jhF`>@g#$%LR%jp6_=8=pO=8I@C+kD4&6nAqpVi#UY*zjGww1vx@smFxS#Nb7;E`ZpGQ z^3D*Yfa^|@nDiobi8~y(;+OWcT4i*!^&pb!Y7p(rf=JV)adykiA5r&&6%eqpWc|q^ zi_yYUQyWU}awR_&8;nPSv8zYBqvoY=TsqUJ8?tK8da(w+mvtxv2{AW1i`PlQ5a%4H<-JTfpq=#gbSmz|Bj=DG2Al5vu<(+riM@gxD zB;lfR*9k(l;dBg`jS1e~QuTpmNQCjlS$S9&zI{`h4MXxORLuinjK8xh_ec$|#46Fj zspE&wjs*)BDj1{YL0xKrZ9Z(6#F}=@R+*D+R2OBCfcym#?1%AFHNxno+7_*X+a_+k zIK=>j_lalF&xXTD*-LrGOnr2y5~uow-5@3KA9IDGGPoRm^4?0;gKt~}+U8PwbMbk% zzsv^=MJ=!mN6_e=dvfq}UNYK?*&4;A2340Do^f=D7xo`W@FUOfBl-B)%wC6SiK=Q+ zcGopg(&H#%P_@phI8q@b1vqIYB;+y`VcTG>I8w#_@SbA5;%2lf8&T^N`*N^wzQ$U3 zpHT+Ur37X+jl?7L-%>pyta)LqP4CwirCa`5BV;i@iN{_7%fvroBg{FH;1~`aOGZW_ zw*BoxlEjTX@hv-jAf3v<<>PR$>b7X3ZX~{wwPw3n2B5IBea-VpSnep)%WxK^6|-eT z>RZ~&E=7&TzSU0a=M+1<(1Y3T@j)(ifh1ben?VsZ9xqPI$QoMc(Z^)v&=&tHUMwPz|LLvE&2lyaA@1 zvmmSY0*88<#^C{-{XPeu$azAjnPEpVMaV)_vU&syChrWPH)f;O4OLM} zlyG93`#YD}ny8dR26ZFIFTlUZJBYG2SK`v`I&NLGuN5=O^Ni+t)yO1mB}t-^{+!*M zzj`-(xqk!dwHx^GnU$ZZJ@sbb1y$nk8AR4x#0xQe=xK|_NlKOEzy-;a)~h&~yF>6z zGC8lwT6nB_8u;ZT>lt&NxV;L?i7d~)6Ys%W_1~od_yqGsegMzkvy_{Irfa=ZSl5%geuw$BYmT2|wX<>?uv;6U$w9|ve8QOK2Y zMwhk;_`-YTxzT}6Pm(dJ+#b1}BPwl^xt+{-Al!l_XXrdgD(zt%7JL2=jufh;)e%I8(Ey<5}w98G%;q529UX-EA_@^p0Ely0F{5X7 z?T|P#@s+@vQ3&p5Vd{;MWHjyg^Cl4HxKGL6AVR62DN}Wlxg+bIoL4UGxS%$Pmb*vEnMu3NkQzBzo{FT zh@N)h4^#AxIJ*{1sRicu3n9|!N5xwz^Y1(5Q_!~H)aTuaW$pj?9YTTbtl>g)Z%D^O z{dLZecM~3xaqteW4RG`Nc(}QIB95)ahFKhjufbn6rQxUrVS@xDx9*4YIMA#aapiA} zRfTdLlZRRYM(P7O{r_U)K7d}XJQZt{(pbC_8yG)f%99xZEh3Wt8_;&LZJH=ywXi%H zJpT4xdp5EgxL?6lpU8xIJlWU~-w+&UqOiu4R;fOE{(bNW`Ogji-%e=ZInZeN@`ray z;U<}n)b$F@bOy zt|{ih?>;@wi?UNDL>c0??zn_jb$mEGRifzcSAo+l6HXnX8G+R*@J<0bbVu1grJ@9=01lUW`Ws_CStb4FLkICb4Lxnxm`p27DC7 z9XAoA;R3S~s<7ozD~|C6sc7saaSx7Wqs^g(wz%|*9JRAQR;dH{kl0$gEe#(SPNG?7 zFp`z#&Thc%0A7Bt(%aVIzM9(K)7vShw=9!MP@p#3Y%IM;D1EW#2<~J2kGYNKxs7B? z{D%Olt~h69QCPC&i-El*nrG0dg=beNdHHmcsZX{Vru@014J!gf>{{Ge_D5r8>rBH)z zaR9WVVdfbyf`2Zl3;EREB;*&50+bBlwURV4JiljlVVn^fpD5<+N!0+B4gBZn8-5|! z0a5ZZ-^#F5$?lVP9WXh|NsdR!@XqgA*!Q4(fX{lNtF@B*iy}CWk>)~MS=BEzJ0emq zezmhQ&fuKzqun056F-89IVRl2aY49i4R_NJq#EF!io5GWljX|bp>vx4lN(02Z zLTW>0D?OGi^?D-ArkNH@V}x4+Z>;Kc-BGmy*hMAyzon~l5;@g>BYJl2ZG9QqMMZ@G zQvtl=?7iZE=jZHh20qyj3%Eo2sO>kgfWjme!1a)({>3G23%vw(1AU>NJ87)=ti25+ zHsYNVXIkjqIbgdA&IiTgLnnf-9M*bNNl7H2$Ur54z1&+ix;grVUDZd{S?yx%{WyQr z8a<+%&YITX3#1i7Nft4~@wLo%=5PzL+;}{i-v1iZb=NO0t!c|Ti>~I+2y%e86Wx-F zuJl-6`~DXzCqc{*s(zioO!CH*49z1oyMDh1&3x!SNCWo)8?^+kER=#f`s>__&I1aQ zu$NSLVj%AB)vd4$v{i0d)ncQ1{hWB}_;aMS1X3t>A}hc^u7`Mo+Qc!?%}JL2@E>6& zm`l|(KjX-C?d-2O-zMz-k{4-PlbD5CR-9#E`qQ-pwVURcqLy}HYNb9Ovk_@B3QAKp zcz-?C1xKa&X06%`4P4=OaJVK2RxJNbBj4%eoe(fRZ+%Ikz+Ep?#?w))$f}&#A3#>j zD_xcOKjTgU`9fOl9K*Q5^hf%KX~I(EM+3NW2pu=MV6Z$&+Y=e75BT0n2soLQy?Z|8D@<41zfornGT3ssU6 zjq|VacB*ZgGWeoCvd8dzBHB(kZ~(**X96fVYSy2V-^A($Hl0n#Bq_B1e64m{Z&_P* zCb>s*NtR)CwUuGB;BR8==?@Qsi1+Fb;iXY-hKq7u`h@E&*r6J~#;NS!F$tPG>h;!_ z$MsV&m6Q*re#vB+tS(hc-w;Dp<&{|{LK`>{*lTV}%t+TuZgz5)(maX8_3q=MicDEa z#S-6qQok*HEZ1K#>C~BBu_SdIdMob(DEVUdv@nQlPircQ%wlGT#+%^UCM!D{Q^Kt> zw&)pv-oo5%Ad9JB$tZM~DCEh?&H@qVuY zPJgAKy0kRdPm&*dJW$qH*VbW&czMo~r);hupGC5EW&;fk0NqM8t*e_I#)dbzy33+B z+MC(2HUd>fp!sA`Wv_k;^$k3w=w>(KX*Sf!tjw97&Y)2BR2tgVlCa(Wl6y_@f`)~8 ztPo)t4$pib)NkR{3a$VLuu=VATocSvy0)P|MvK}kuOU(hTkjwAx*n~Mn~PIZ6DO@j zWisiYxy719p z>&4c*+PY{*9MN+#Qa{B%08B}HNo`gsU8|lx*)ESfyc@6&cAxoT9=fxXC}8dt0RW51 zUhVD0@m0*0a<^bV{5B#|AROFpPT!iEav4a-W_OMaX~GR727?&QR|aO=gtdVCRNbivR3S@3AKc<={(a#`jnv0bP?|3;k_=V z&psP3Xi!D#(s&>hrG+S#_Bq2Z2iUW(vB132854%}MiA*_m?F5WixgwxEh)D+dKi|Q zB97Cqvd7#u7D~Mvi))}k7oO1c=YU2jU@D(iDUT6rGX+&`0}RGu&1*r5XL z|2p#dyCmOyCb+o7M#DqEP$@%~E)C`%b8>UO!mtU`q29<6`3i2=(DTUi_i96?( zy*O*g5S_Rkmu+G@Ojjm2ESyz#Hacj#1olf4$fR!egG^cW4(vx+yD*Ax>jY-v8g~qr z&nZ%r53!5Ttfx1$4EdYc$DoC^;&@BdFa_V6?2Eyg{Hd5?G%w5@Kh=DxygKP@y%i_x ziTcVI2;ux{bxAMS>ISKJGE49lVL(@X7lE04>s?S3B&*$a6FyI)JBtRsOI%$&$ls{aM2?^iap;gDZ*Ks)~H&R-pA-)wl z3m$+>2vBXzGY@WmJQ9g!S7@fFKltrd+}UX^7wR7OgWc-w#;xy7Hkj<19qXSG@PFbv zd19eSvs?ro)O7x*+TKKH&5_~Z4Ao+fDcfk#V&oA@Z39d9C}BEs)y?-8*BeH}LHPW|&YS34|cdnNubr_R34nMD3$KqS}zPwbN?FH=Q5Mph9 zk4nW-3gTxjDK>;zm5pU;U`uf%c!t*TFWAT0sj-I zAYRXF*?~-u%mpD<(0bW?oi(GRGb*FYG{+?7qpkDNSEfVQL`I$FGK9w=N*I+LRZXU3 zmP}oDEYv9|;oA3Y7G&&dOq}={7350iyG^_7fmiijZ>V8% zBKl@;I?0BA7h=qRmzuZ8T$+?k&IjmlP``grf9F?c|d#X1S`8 za@MKAJrN(8&unT6IX`B7?Df1q;>S$*Waj(3ff(L3wUW_4-f3%K8OUFz8_2(|trv!> zeiV?W^ytj5boz@wzhkRFX%s@7-5%hWKf9oM`zHJK`kNZS_2z^j1X*T;H^e#hn$+a% z)TZfPR;0KJGPjL=yUl+`KGhd~`qpAZD3XmE6boi!M~L!re4Sh=2{2Zh#uyf^zHC*8 z(xl@fG9sBHwsNHkRsZ7es|4T@%A&?o%Cx)DhtA+N=r#6BSR~l*=WqI+bgP`M`a8We zI5;K`7l+j6@$yCYrQ4K*4^Yuyj(ZcmgRGbx2T!pu@lK-F&z>J~J{i9Bmgn2W(c{$nIbeIOIV&&32#znXDzx4F*_3gnYuM0;8m0MqzZO)2=zKR{+--4GF zG76ZtSc;8)M>|Zs$lo%?^$j4-kEP9hA@>uCW|fsAvnq$D%jyP@ju8fr)#2?&{d8-y>|^yqF#doJE1MzuM%{w z^?orlHjj;3KT8e37BnnFPc_r|Tf4hhyy%Y*_o*4m2ln<<<;l=wO)XyE!dqk; zdX*h9yX<(9iv%hePce_BX4vjzqcc0;#OL?^+AeqH9U9K~BN0W`G5r`q67o;E&DrT& zNsFerq>L8czQISxD-+?pmZ>@K=vtY>t(vnkkk!jSOfUlQ1xnvgB?H*q-iwVZADo`w zg;L^92040#HB5x0?Ha$N+cq4ZT6BJX8;3_5wON&=iO_h7UV^yob3!aN!L+-?nBIT1 z-$N%CkFT%JOxFbwi$;iMSPP;YWS5&Je^*9RhHFS=2?87B>&W`AM}8&fh& z>yfipX32vk(v>7s9?T|-tnf7CWAC%)iB@gjXp<|J&%B#pFs&QYs*>@0-+Lo2WON=q zL8cOyt4?>}K{L{m?K#V$rf6}|@+hj>v-}BTeLdU0kMH9Nu2!{I{(IQsl2574Z1P{{ zmhfaRRZ41tm9ApFq?vX7iK64o$a22ulfY37hx_>Vf46z8 z?B2sMODCUq9aDZ=DHrim?5Zqll9f-#*17gv7Svf7Y)D1OIVUeu#+h1B7WRy+*ofqC z4`E}nAV1dES)lo{Oj@F_NJcX{1wen|5io@{@;td z0y=2d=iSAsJM|=gZHPR*xq6&7oDfEhxEQf5u3^>j#fg1xTgKG{1W=5xa-}Q>Zj3k< z0VLw=b6<0=ec+bnMkWsQR>GIfy|vPQHd=@px4ll-EMgK3dlhA3uq&dewQh3tCkIDW zYw-|tSBnz6fZn=;r4%kkhI(h_QdXSp`)$^Un~8WICl{Wh5*RFi<~5H$>-emKU8SQ` zl|zL*i1lF2J&|+J{U7_r-7fK}(o0}uvV`kDkR{C7Xbh%$bj*7q7HZwbs19j_W6FnY zH@1?JT321(pa*~IsZV7K6U7uNL<##I$*SBMc_3pYfKQ)o>7S5g)GWM2X#rnv=LxJ5 z;>uQ=tERHuH_C8xy49o_sEE7pInprDJSG5UR_MA5#_cq@3{qDUcPAZpY4VVB1EKnU zbU{arR&ctIl;reuH@ZpVi)Pz^={ST+$e!MNb~H~D1nSJe$ z$~3RBz)}+tk9Y>7=RG^@-fryR_~QIja-h^Z=2>!$Pk}9XXnoe^k=jyGO%a~4+3f)t zN|%Ub{GhXS+Cl0-1{>loKtng=*`Wh5>5B*_xC0$=&K8yPnD7U=nUEc)S?`hwALLCK z4%m-Uzn1WBk%lBExJI!2a&Yh(hrrA}?HB&D8IEtd8iWW91O>{p} zZ(W1}E5@uKZwVB|*xk9#GMQ>^k*0+8UkC#PWld_{g$VI=3HK?Sz8-$dtmC|JiEL|? zxD;m$XOpa*Y`1G1k8!pdjD#V~SA3qT#6jMnvsSDZiaUr8)`y%q#v;~LhKGMzyOjQ< z0sc?c8grtBYP>2>vWuJEkmU(?mQY=3AhmsE5F|;%KNIb!a7p=w1AWg0AF%x0bxOxn zf&TlxkpkZ4QP--hmL&JEv2fsvgM;^OSwwdZl+cLcpIJ~Kw*YH2jI`e<5J7R+oP0>n z1*U37IptkD)}3Bqe$ImKBz)gh?>bo!u*o>( zX-Q-#(M=llbSg)Usu8IDVg`*(*T$T1 zRt92CggON5r@5gV>)jfQFLQHgGoO(i9B&94LdHNHiq$M5ri9^v*RaVu|DqY1cb5g| zU;O)XKA5s@j4JhLqqqZ>MLFmcUjb5SA4}bNxxITgX3F!CWZMTu`;GP|B1iGRma=N- za5|E@q@6CSDlF!h4S%|$WY4?ws)oqE@cNG4q0HXwg)(0uNua?I?9Xy4dzH_RIIGpJ!ui*f$L4WrNaJI3zFI}k6dHvQ-1q&BB$vo070%clS#kEBjl|NBsn zD5y+Np9e5^!pa_v9=E|0F)oZ-_g*!UY8YuhiiR#tr4tVYLhVXO3lWjRLJWC8+4Fc> z>AYcfsCQk&!5??L#mr~#jqe?lS~Z1msM01hQ2j?FY*#jc$>w%BDYSzrzx38>2xxX7 zd*NRwg&Tn%6<%Zf!AycK^}bMA%NSKv7P+>=Bps$=v-sgHAWP7K_$2pggfWiK-`xu) zX-8m+Bxa>>;&+pX5RCcr*gm<#bwfKE#pUiF6ptG84I^Bty)Q4-Q3S5 z^KpgG3~pVnmv|l-JdYDSMU8JFQAeS>L<)jW*a-*uc}{ow-RTh``}y;7mOr9bOw4*c zpYl9#1H=r72Zm_*9I?28$zd>J0nJG0&jmMEf)~?=}1}b(`=niLOA4P}SIK z2Rf=p9UsJChN2i^6aIOrA4L)qFZoHVrCcFTo_}DH^Y84e_W=WS(5^FKg{W& z(dR_)3=jUo`(gO-pp!Hg+3kIW<0`xCzzEH%B^$H*-wi5y?DRUDlRe|H*sVb`lVZ}yPL9jwWdek$(Q#d(bGT8z z=YfT9RDK-oEJ({qQWUcKW#gU_z{U@v^!7qJyX?pWh!tZ#QWv9)rOHp#nOl0B*g_Fp zNYR37ss>eeqlnRDt&CpjcQ(_Y3HoKo+3qB}b>}fQBT=OWcJ;X^jVGkht*&UW0OTFr z3a5mHr|Tsc=DVu7MSORaB0{`KILhpD<`C4S8_MV(G>PPBZF3LaP8~%pA?Y$*9r8uB zw&248Nuw)LR>%)vsNfJ=rVsAg?r%~Kt}z<> zCt0q1A(Md>oJZW%f#^r%Kwm#(=hW-siodkI@jD1e{EW=}rJyM*oZm-uC3GYmP{YlkKet zx4B|>rbI{DgoPtgDe7o+JYU^A;%vpNwmm7xbNms*XDL$%8e+5SYIt=Vwf2pgWA_>* z&|Xu4++aiieEW-rRQ|tOz6>Os4vR)4qs&L(BjH`ap$Vyr-CeqFmu)9V?BUQ2Op*)g z#{p2E?`v`$NHef-cij~s`Euj`02oI~_0 zI)@pP?$O{-QtVL~$2gvO zo~4g&S(VXIN{wl^3u&!%2w>mQJ7p1-k634F+1g#ONlLNE#FsJP0g{hR&wy)<#38`b zO%(h@GGrkhc?ilCs^2pMmq=vp!ib&!`*ClI}+c1 z5O?NS7hmL@*R_O0!M>5Z&&VmDs;#VgHkNSX5CAkZXqbbAFUtY~8(L3_DzNdjxZM|0 zWn<_HZVORI5U~}S>$9ykOmg#C=!TS2vo9hL>LK85`89TDtA`|rDp)-@un1fGy2t8> z`w6jqFmz9ofDj@WArjEEi%{`Z*Qk0StYq^I0ZJI#-Yn3;h3ZKjW(G%|Fjq`$ut{H_ z{`UtYJP-ET+rb6}3Df_3kDHSae^7Tjxle%8X!%oda}9Q|&m#b3Fnpf26HzF4Rx|tG z2-qBTb|1dZ@`vHyPzkqoPeQ&i2um7VfDYbH%Hv^)@S_Ws(9Rc@<<5Oo`k6%$|4}3I z3`t|Sj|fOmk2j;U5(B3~;D4+t1?(0-kR zedx(FVAyE4BxqV9!I31|<=|>aQS@>%;wCfDXJwIe8_7{^OW9Q~(T9vB8!TXY;DxMd z&oCWZdga3Q!h7M1Sa13Us*qqQx+7*Y3mPvqT0%pN`AUxA0xoPy znKD#U)I(y=nR0p)pq%7InhAx(}OeLH0A4f(Xvs`;ps0WqXek}w^X zR#6LTV_z9EL@LQEOK;+%8Fe~u440UT@D}8#!66k?7!*o>}`HKr+vW6#XO^H!(TB2F&s52c&t1RC#t&GX%&xzj{dj&gifdYQgaly1|^r>-^?v zKz5kUCy=H}YhvuKLI}pMN?3m%r%rb!OFqTJc6N5Q!T;7A0B~wtE&QL%{?CB=Z}$Ib z&eXw#;eUty|I&QA7XN1XPnNWB0KoqU_Wy*LIM};7TN%^4db;{)Y}TzX!us87oWLa( z++5>S1ER!?lMo*grFPj9rKHoThSyzgT)Bq>6E*F(H~8PU+Fa_ZG5E(9&{FIk2-dNX=mI`ftk(R>KyVnc7TMyHKMZ7L0NtJ7%NyND6%xxjVAE6Y{gHZ4_^#+B5)Ut*yo@z%lZL07DznSm)I_p8 zPnEYOh~B#5!zZyKe7_r}O`^Hda~!oGRwWI0FlDYP^)9k6p8ZQ6fvs6+EHFisUyCOW zpEOA`+zJM3tyCKId9Vaj{RY*$!t+1fCZZ8ZOj>u4g`n0zgLe8ZZY~NVTF!hzZl@q2J9&9N#y?Mq((P{}? zh=TO$kDl9N+sYG5ww`r%HeK{~kT-Z=X)5b`HLq2;1K#jo*5>e)Q3ibWc5SqWfxaZh z(@e#r`xc1lT+)PSPxfuc&rn(Wc0nKW1q=q@-}cem6ii>>HyG$Qz?)So6IoZUrnFa( z&vEd_9=nH*nc`YA%R>ywH+tN_@79^V52Y$KQ}_{2+alHGVDlL!KqbDdk;+r`i=X9y z!E|NEygK&>tVY*+*rHyTBLoKLb_Jf?`&e@85M$Ia(~Nko1_izEID0WiAwdDV)1ZG1 zx)I!v)0;a3P*CWL6i=*OD#1|1CCb1d|Ee4@B!pakg3advLg* zRskz^l`E0CsYaH_#O+ZFb~`1(@m!KZdnJfrTogaRw;fymD7gQ^CQSUge_DZ02DvB= zUoUCPS4e!^XiTb==V4$kC_G^rAk5~fUk>l>565(cNBG#FqLO549ek1W%1a5RgfrAK`!lGfgfKI6?D3Fc`JB5wjXn3DJNnNb%NMT-MMxQF&Gqy2?aAr#RoJ|X|M36DWMK>r^JgO!VCq& zA)tvvVe?JXSO88A3yETTI@C`Y!gpTk`dAx^N@Iw#Z1(-{1orr9t+#b4{ikV)GvNsD z1BcFe$JB`kmbkn%66iAGAhj`2k{ra33v7aIQ}`>k1C;);C497mCiVcL%q$6xQo}jX zG)qAf+MY!B@VoBz)e$$Q1)f)z0spSGF0gv~acN7PWuMte(thadTzIl3HKejcbvjmp zNe==8ks3K3EABw|ro4vf{S;Z5-hX_!xydAbigZYpS>Zr_NIN&ch{Oo0xUd#qM^Gt}N?K(odztzHI{a%!>wT?h3kTtV=`W@g!D= z6T-CDu;AxtXVcAk2bub% zVkB3<=uq)luSkpKN9!qvFbX^E2-QI2<2k|YS=DvxSg;1~^Y2LM%-S&8X>qzO;9NnP0DYBm?%}VvL;OdpOZ)0VPm0K$MUEg7P zNEAsZvbxK6DU;c$xiT$!zM6X7YRPh@zjoR!*VcgPF-;F^nEbq5!+Z);^=VI34y#?f zL3;YOjSe?7*Pb0va|8dtu0kMM?xcS==lojo^iE1=0*4Yiyl9b@Er2%uTR^ zAw>tbsu*8GT6@5}^f&1_5SEOQ+MsDf5p^6W&HT&3L1fvTF-CD&rR{aV7~|Cxk8pM zKE?uQRG$~>J`tKCem#1xW*bjfb}4*(pFx8rkkY04@`J3mk-z?!UfD+PW(*ZIpvYin zZjmKM+NRMciEUpt0f5u}iTAIb@A*ly!!Ajr+)cUN5An9!_i-{0^@f$6?NZdwKQHXrF$* zzRtc+H!$$;{r*>+a-|5lR_219tZEmJ%FzpOx$(POKFQEtdaQeI` zS+N^|S_nnLs2%JG<{D%?W??^S&-Z`+c)I(x@f}5G_G$g(a{M>Cth z9pP^Up(}U!%7e|SXd&JW{^QM)m1ZS_4wE-kQp+R_D;!C1w5;+d|5_**9cpb6?>$_0 z()hkpaUsO^$DOe(vs;s@W3o{oo_!J}6BXkElnMOwU5pUFz9^>fI@|~b=3gyC0N`}< zl1m}gHjV8FzzQGF4&`-AH4<0J#W-8(Ur&>=|C)Izp|#; zxDMAVJ((5B?X7TZjODpa^z?i@(*zl*T8A7m-oo=q07pGW_)qnYL^liBYQ3jFvj7QH}Mf`t8LJc_mSpY&z3v5WJYZW)LJIn?zVb zj=+CknrL&|xUQXKp6sv##Vgh?c=H=eBx13($Xk^m)0m+R8|}2MG37Vq{>W{fCGz5M z8=9dLH=KK*<4VM)^P)ihqnd;X` zlG+fUCEK#bKuj*gMw%f4MsSOHAOPSvE>{kbwrU+YLRnt1+j>~1_KQ?_v>+#ufAp4? zf7>&jwss1I1mSz=p`3h>pbx}Gk*XPjQs;YY0py900}F4!`Pp7EXNcOL(LF-}Vhcc_ z$AgdIqxZ%erum_0Bu}h1=ZZv6+pbjh8}{Bj7u0jPz&T%B)Cp&@=HwMon z#~yi;vhqFBlfE;nnIu~wo-1qk*qeKdKl>3ssz|c!%8+#?KqF$XIwMUHVRHSGMB0R? zk9c=;_|P$(K~H8`+z?G;<4{X5d~-sz$aTp~H0$b!J$#^fVc_fHC&yyV*hQ~8<~ayN z3swtZd1hoM#2@++HOS`@7ut2*0O7J>LC+I-tpGWkoItt1pCJa1IItpDG$m zF(TG2W+uf-)&qg+gs*2~Y#ePS@O5MF^?MZ2N4Kml1AIxDk{~4@VY7YlX?==mX7S-H zy@}ki1i=$Z*BBkqTUXc`Ws%+mCh zMz#k-%Q0^wNL0!9#|U&j;Nz)fRYN;z>+cnOEs$q2AwQ;A<|h-LnTsXmJ>@c1BbyVS zfTk3}|5N85L>K|Y$rKF)&g{0QJ;h(mZY#LSt&D#JTihYxz(?0C;WN}DyBWG@2e)N5 z!sf&qri7YsoE`V^`A7u1sUGhsev||oBy?~Lo8H*IOlW46XF1n|cLGptQ@?H%Z`ux; zr#?$eKoK{kAj+wt!(=LgmmUxu07VBaA;oG*ZC5t~<1qzN7AkW{5Os$SA;%NdT-wFh zP$}EOakdZx9Aci2p^`L1_JQvG)ZWoq)sl5i^zb6HwcHPmOhV#t4lpCK15L#~fmWtB zd^ESk=^AXZZ94?xTn;UVXNyDTA5G1&a6^xIsc#kZwG zmB6e(-(jFPpcUZjf4}-Xi%HlYXkupEzpSdMh-bbRQ<$U2ZI#vlOJnQIBTvpjg|M3; zC&C+C!xg;_^+1&clDE-zw9?Ehird2C_fCppUq1`8ib$)1LK56cB?Jmt2@o>uBMu0{^7@G#Ry3p?R&phl3{Sn^vVj;tP^Pq5Y0OjFbR29fcn8b6);^Y zevvx#glwYSGDa#L3$w-?FSvn@yeX+P-idju7XqvMB5R4+$Y~ z68`F5&D^y6@hd{TZCaYFJWZcO3_tK9)I8?22F5n`H#vNOZo&z$L5T$y6F=&QTeNY- zhfcT)UuQIAm2z$_nO6oFR>n+xEM?ccgn--^H#^A=ISHMC@5!)$&@5hO!q)k*4%i`w`jGRvbT9L1)pvtd=j5A#fhwAUsmXs>Qp zj+%z}`lKPGg8o!>96_2pmpYF!%(%I!L1Wu$=lKN~#cbm7;(Hu0u?TI*UK}YJl2s0{ zz4Ir8^D|y59Qh<5l=J(zuBe&@a26a-PFPVQBu3p*^Y_Ej2!gHC{c~<@8qsu6VLtYs zRcuRL3)^!*$b_r1=|u=Mn-r-x6LXCfMsIUYLbh5mNI*I^(1C^{AfRJ;!VEk6c%I%i z$*&RtkkSgTN;GQX$N!>oE=VC(?fhLxh^g+0Ymg6fV-=u8hb4<{vVj z0dg`YFP)vAsa#S*2`^!${=9?u4@9hVDcavOmzr|(uyOqh7SWg2|(-yA(XDOq5h9^3@ z`w#}i%3P*~*I|x;aQ2iY)~Z)v*bCi1zs0+Bq3Jl;i|QMhnfT3Q-f&W5m0jklOb$Na z9|ZTa9!beF;Daw3x99t2?C4~7>?jt(f1w0maX4uJ%~J)3kGS^=C8T04o`l@K!0{eG<~W>r8R>OihkLErfNnm$R)@+{aXRH#@K zOVPEl7*UQBOmxBHsAO5_H*G;u=_jZeS316Z831}l6tdJZH{}q%J=P-bJoh6?2tU+} z1X8UD9jzAUb%N_Ic96ujVoLOUA*JP}C3_l`&HADZjQ)~Vl?`Mz1EHXre3@_qgjGYqvNDDDD!YmjGC`p zi9x8OIkwwL&cNa%vc@E0gHv*%8R>k8|43`$9*axZOH&_MG{Q#7eGH!P@8Rq_bHHQ@ zMXcX5B{AXlS_JzP0#d4*hgCTsk=`>tpfNu!Ey1SnYQsztc>(LJKEO~U!lwqEX;@@* z06gR<6iJnn|mYB3nq3QKqt0<}l8rjcnY`O+1Yf2n-FGy*S1qb*ks<)jn=&ysLh;cxvF>li^B801Jh#gAjgcN zDWVpS5@W>oeGcpX7xA!W6!a>6D^MGFY5?ltg}B^#x`WudqpV$+_5Ke}#io8l*C(h- zWBibej;k_BT5d)?fG9M6pN2d!Ns0L!*&+h zKlU4m;1HvePQ*Q_PTKDk5tR?iIPhn?8q^;>fYOqf_ze6@CJ4L(q>5^LxgeW{oU%!R zg2rmm&3#-3R^45S+6j3yWHn3m>(&E~)dos7)=_!Fjt?t#QbM5JA~+*nWD{T?`GUOB zOSEr9w7x#RzJ2Pt1ri@On~#_7QUmEOiuc1S`T$vb(`?a7OG6gfmf&-*=99b-nCzOl zevcY)v;Ez_XZFyj0%=WW)z?gX2UBtj$C8W>Sl*z$2=b(#@DH7PQiRI14T>smatoV( zDN%U27w3lAjk1H0diLB%zN5ZBbsbkJN-1jn)A&Jhtw9%0##eM2d)sq!<}?vM!s`Y5 zxTZW|*oL$I?7;STDI)a^1ax&Ct|m@^;yh2wKBf~&V5N*d&1s12{$67o^IcardO6rA zo4t6A*UB14AnmFzUzcE_AvHs@UrSUsw_N+sq4YbaJxO9tTKTA*5k=$LQ0x70d4wWE zkpPbwqiDhbE{6dbUFwiu%#_JEmi@Vs`xdVtXi;urlnB@f&%hg(H;WiRb;#?#d9X9S z@WY2e=l{egwo2IW3u#vnJ93q8ZcuJ>q>!V^x8~CVz2R&w7%Y(sTfuP1D&to3gjzYv zOU{i&Dfk%~jtyS;{T=xmJNL6qy-s%R!C|W*`=b-WMxbRiwf%3^hCj_(*K!)OHQL_k33 zUqsd{$FT}mozh9gM!y<=t_(=9!Cu#>-{(2kAS5p(#$Mt!P?Hob8`|5re#{T)87)ag zVq8|utbrrmo?|JHJRb=S@!FCF9|P!-(#5W8I8V!tV_}6}NlVIeZ+uv8i)dj7R<2R4 z75ysMn&9g6SfXV5oAJZ*1LDw>Acr zf_lTri5+eB0$%-$(zA5P3w;9qm11g3^1pt`z>`y0G_Bqa-jvK>w zjf!^E^c3npP4MbZm+E`OYB!pQ-Lys%m3XO2XV5M?4*r8gSx@8RBO>S%OA_xmRvlN+ zV8NmqQTD;MerbNg+82qv_$KchGkm!Pxx=xBsCydKpDwNk$-l2{4heqKNUi2US27y6 zgLiwnN0o7Oo{WZzLQ}8XDsF4*Du0XpM*l3#kgzs3$Dxzk`F3nSLT^-6ku|R@R4b~Fd_{KvgO0UK8CAf2WRvSN-gSXVg0zQRceug3?aKF}~ zlfz~5eyE`9l5h6QK9r;gO+`b4Z3B>PHAA2RRk{0|xWuYkYo!0VU)Z$v7!AYyu^>8a z`5m@>q_w^>V`%Pt09Gx1$d20I~Og9gOJ`wvts_y_flMDb@{-=f#?e* zo952x!nt#~#+-vFo58W(7 zk}SGbN<)~2Zy>d&DC_zerD)vjJ>Y*)xfwPSC+~iqKIWFE*M0xdWhWlup_8gnd|s%( z^3cDBvJs}IEQtVIWzset0%lrS_)uc#C)zcl;=~(gu0XcCh|we#=#+yUzIbn+Tg;fC zu)z#5D6;qF1bc9aVso9M`5ufvR>0)T86wO1CM(rBAVBudO>wE{`uh3(;NL=VU0U8x zeS7yWY@hetXab-ft*!2soNtyUFFkG^H`7ZeAL}p3JIMV_xKpcYbnM7pUpxA-}v^t_v~W#OYCM>dEaUBV_zQ}a^y>(6DK)|Htx_7#&lf7c5LX;!s@p{F?d z8&LMZ-Ta#yAf>B&TYE=b0<@bdyyUXYvM?7m%!nX5I_ehup^?q7kuYwbK|~<6p)Nh{ z5o*UT40L!V_OQJg5$)3u8)q0{Cn1}5C#1vT106yDz19Wgo=ayKkFf5TzWlWlFLPbs z;1W~=eA$U2X+9zi@$xPeqCux#Hr>tn#N}f+b-i`0#&zup{<*XE$_VADpa5ydeh>}S z?Ka9`_&5n#9y=~HM%pxTj0j3xa+BA9tRx?bn#hzGR$LctteB16=WqGN!=LZ&@%0(H z@kYY(z>|R9``aHBfX?3dj9V>8aIWp8yl)xeK8ir77Gk;#E1o0LS2-agK0NE(5u_^t z-!!X>B-hp7!`P{M?B7utb~GrRd;DrH!W;(Mom<`o62hSh{UgViU{-}x>)>lSGV@K< zQ@@~NmOMAdFWW&=iz2f%a=NwmZ#><55-xqrmF_{>+@e;j^DS ziB0h%dUm4d;khp${D2>%HBir6uL$3&Eyy6AGnAw9&f&fudieagwZWTaPK9HhMkG)^^@)*t`l~t631vIo$RD8plMI~BzJE;zhM;D-mPq4hTt!=o zg;AzO!2(?AGdYpn1B$txx!Bt}@+4)0bwb%sF*c!b@#Rt_lt>y$MJK=Jeil(uX$=pi zyeY(wH}Uz#{2kL|N(^S%mFD_9><|w%scp`YOBQ-o94*J9Ci0JB$NV%dwjUC)?3Mo? zHE@kNHIfo&nscQrY@Qvh>_4fHb|3_JP7@Fym!%sP~p{b}W2vmAl zIx;q*HM@FN%4MpY1yIoxoaeHi-2fU|JV7a1x4qhL(EHzXbDVXkmfPiYFhdG7FZ0rV zSajq{>bUZT(X6Fp=M>{h=sU5p1uG@+ND6uD&AV0MXq*mK8nA>Wz^=oa0HrnwVq9GH z#S_qp`aHW!%@k^k?p3c8&r0PM;Yvt1Q1U-B!kbl30yY&18;G%2$B*Y(1{Hkd`RZ0y z7yLIus$6P+_7kcyLvtC)LfkdX`tLPYGuHc650Wt|2M?+HC8T2Lw-n9vnjhacn}D6$ z6y>>*rPKbNj_+=zOB<8gcx>v3z%#TpQaDedm}Il}rAVtFA|sJNasVVYB4Q>$+;3UO zCp}UsOPWCg$Yi=oSde9456_`mZ{%Py^*8rJb|HE>{8i-2o3pCuiJt?8$&ZyH_}-xj zX%D9TBkvxTGNXmHua{nAJuob#+_KrmNm%W>2qGx0 zwidzNezf+7_mC$Bo*em+KBkEPotMT^qoPS7FUSiNGx?$uD#2W!_myB2SC~K&aB`IB*{*7 zd>eM3UG?;^3|)-E3CE{@i36Gg##vQY?PmxcXO#ARm^z&&T#m%^cXS5m3VzaVPUcEa zSc$k0;rIJ+@M3=?BfSJ}*yhDk7*#IDZL9+S8o?oF#zCumuUTf}oRS~Z4EtudR@ln( z!lMc z`StoiNPob4Z_z{wI;!fP0HnC+%%TFOoe-1>x|<*wen*5x7gMW{&V;pC4{*_qLffIf z&XO_1(#VS_1H-O#shGxK4u1*55zN>pm~Ul#$8OE*ARHi#Q&JTG|CY|`W@pcg&7Klr z@@31(p1&QfH=TR)`usptOzYy}$(h3G@s^k+Es7y!@|L|HMzH5}vuDVhl9kzkf90GU zialK&Tg$$ZF=zcf51zieKRQ0Y55CEZ&BNm>O$r-e1H;6dEvxVJ7nd6w>s~*ab{_3= ztjFldoxvMJKQu$~jP;96bmtXlEWZ`haWfXlD~$|f+>4E{cv-?Bm>v&~X~26^S6sC2 z!($rSTHM7NLSy#!bEh=GGWnSBf9T<~X$<2FF0_ zI`5}hjbGyL^Bq=4&8LtPwjs#iRyv8=C_$r`n_xy&hEi@~9h<1*)B9E{L!5 z^luy+=#tZGDg4E14@I<%=9$Y_`5(&chnCIdX{qj`qdXTUUaUF9Up=0@kSbzs!2$#R z^V8=GeA_@XiJ$j9iDu8=p5=$fWg#XI&?6xt-^O3e(tjt;8!Jr!^kl0H?wXZ4%9}4j zi!-mVvS=GfCrho{9TwinXG`5JxeiswJSa->A`s3PZ}dQHGg$G~9Y5l%<|xUQByODoc~JB>;oPKEZ(bxK;^a zuwWa84c~SCXmI>1+7RX%gR<7a;V!km3lTj`cY-7PTorMuUGP{qtmoIoRnt})1Eo9e z($1>gRqec5V@1P6@z%#AekaG z0Kh6b007#5R1CH@_Id_pCbrK1RWrn>UpgMJBLCc$$)8I@b45rjcyZ=XWSKNMI~pJ^ z$bN<)v;wfS9!W9=x81tMM#HRMn`Dvd=Y1Y?iFtN+<=D=IXj32!FK{YYlPwZsEF0Kt zm$YkgT?eHugp28D9wr&LuITQGMTRU|QZz%(oVcJivl!a65vnVAkrYpem`*F!S(XW_ zQwekymNIuV1>lX|4)48JC2cOwI}_&a$VfCgN@Y;&*Q~8;COeWD2heFj=ISGr8Ou^P zE?Br1h#8W!5Ns*~G?mNLX2aEsWTn(k&BQ8tz-=4GxPj`HN;r~=TK`R{J`zOZG(S$t zmM-uG`|Tw>)=jCd7_cBzfbxpPs`KvT{Q zeCIKoRitBt-9Dj8Z&k220i~Nr`rHhPbk%!k)`u59QFhBk1Y zQpg`q;O*h5n+K~_ZO(Ko>WN)1LejWbdm`%^FEB1|0YS-0{$uO<44Urt&Kzlx-^o;x z%FEWGbo4c4N!m^eAs&DDbm-hq40l@>k{dRNE$S*T`#aYMRcTV28QPh?gX{`c3GL4( z8ZTaEQM__Z@w$Z}<)QOFOPOAQFGv*2wLZ#L$I}o-M}=YJ-&WOlc`M4ca;vI&)AH!` z<)>gGrHhes5zIy?jW!n%N9zjUWpQR!-d96!7+A+-9#~mSJE< z+yOFVVn)|$NJ8-5w+kMmV&DU^uZliKy~K&W&4ck9H#mwL^K~a`81+I+I|^t1Y3ccG zy zA)#W=*y9&^aOKbi1t^F%r!zS%{1?jQIRpwlF|GxvBF?pAq27OKXB29iI>T=!@IfJX{shmW+oL935#{FEqu zhK{`Ja?F@a6ynF}?#IYw`9|{I(^|=|P#4Nk5o$ng#l4EU)-EPh2g)v|h~K#r!?Skx z0K*R7c0CgNdsLgl(*IyG6Ga2ir%cW%byR#I4N;X@Ghzw@TeG(?>t*9h-j^V*sNW66KVx9N$lIZtM_}pdA#j zp7069hFp^uPHhaU&G1)w_KDhXUNz>~;+APGDu z_HWXKEUf|r`P*Br7yhnNe&s0LI1*vC`*>bn#6ndy)nF%~GTIY#0eO`V4O>j|*64wdP-H3c!WwdQmHQA4edxIImjyJ`Qbwn`<3#_&u*s(w-Oz*9?U zz*qv{h5&X5j>o9+?Z>y?*F3JV@+>2!#+ez)H((~to0G3A>mCL5-Ffw}{Z1`QuL9B; zN=!U1YD%S>U>Q8>NDhrZgnOGag9KNwNpM00q(qfu5e^*TSlL1NFB?e3LGz{6LHnf6MU&#o6-up!#k4{U6iR4TKy{dbMP#; zTYH|%kweli6<9)hYHKi$#U}4J$pe~!G})H0#x=faX0b`?)NWIRsQ%5P+|S=8_I56M zB@n6muE{u-5x+>jz&(Uw34- zBt0^>)r0e!?KgqHywbQ5XJ-b~_0BT2xBn9I=I*^Www=DMSW*|p5BRBB@-LD3?3?Hw zUy>}6s^Q6lv`t0acH}V=#&!(t2xstxBm0(ZTgB)-TZ=6VvrC6O>#DJpTDb%^E1ui{-Q+emuE+o*`~LjgOuMadG5C4Jk#iPc zyN)G#J714G)ZjU23bvOwdKNKz$p*!JHRUK0UYgN)6WG+J^F-o2m~ssZXP`bTmA)|9 zKgyRCZzsE$YJL_>r=t26_1#)jc%3fswqv}(SW*sU`QX`39;H|JOwnU*wD0-#PqzjhpEdSc7@a`#^U=-5w*7t zB?D7CmD=Oz_`S0UbjURvo{U;IU*tOKH|_cCH>c-8Oz{B^&z~U?&!6j8c2!_pBW&&< zs@3&DTSJ7l&`1{VL|U!evpLW|+}#-68+tl-e+Wfi0?bj%kVU|XVH_L!hW0o_g7J!4 zZEuST^L<<;WE>uRS>rpvA*ps3=?XjMg=)3=sV6o3uDZRj6>>my$5SV2uWnmWu zT5(5X(Xn-SRS@AGf3n}v*bCOel0!$qdFjOWWel3~vCN!HogV7(rg&-)727i>Iu zRQcIVcs9b`2zDvS#w#h$`%yL#rTTbc)KUV*`Pts}+nT=^*MEY6RHk#(p=sY|#Oae> zihInt{@P%|+yuf9I7F2^S85q}ZyE5X&#@rtNMJ*WrDL8JlBeQS1xQOvM8siMpl8Z( zSIVDL9=B6QJF4BgNLDKswF)9EF(^49hv>nc4#1?JzqItQ{;fYr}r z|JFkh@Ix^H5{?%R50Ms^Z|Sr~JsEmNjD30bzUtC!+l2Y=0U&Y=_bB)H)Y-aD=hQB? zG@4jll*q>Zm=FT`(_(c&?|slG-I2_p(-Qq-(adYE$@I z$P`G=AG^z^P_A+*Rmte^to>z{tZJr&;)XL%46$e%O|AsR7YswmQ0V;oCZT3pI^*Ww z6L-9`R5D=(MNCYkbYN5KFG97cUuU~qT4~YaZ$qV$`OhB9#%iIpNvM>#*=;);+B zgqp}*U}i`Lay|-$UtX1Fe9{dca@^IAH~=GxuRq$*R=R*qKDDTAj#W>&E`tnpRN6;l znR?eG?G%z{P$dJAg0t<~wlaTUB~ZA!a)3|Y6)Uk!(xn2Gbit01JV~DtOP>QTR{RspWm_71&L<6#h@`1<}&Y~WYGBC5P{QmxF& zF)`V8dCi0qskoT@tQnr?M zgigGKU|pT@<_Z<8rx!jIuBNtWYAZ-!@tlPYOQn@Mn9Fj_ippvrQC9}V1JF7= z2uij%>%uWDfj7`XKiZySE5QsJXnn?-(KzCx_;pzhmU}=WSQ8@c(!$^vBgF`x82m^queE|~OQ;7Q4oBh_)q%12K z>#IRCfIPc6{mH`8psau?5agq6GO^>c^DtVQ8;!Hf$oDJDtdPWsfrQCCz3PZ0$bCeg z%_bL!<6TW~rn6-X5HCjhck&0pJ#97VJ_v8Bx9l#&hO&iYu~+j_y#`eRA9EZXOy#%a zY3xEsUZu&#SU{{Hyafe1jN$$=;2pr1xpW9C%FuSQ;$l_Zn(%SKZH@u0%je$?-u(B5 zMX?7r6yc-%t^W&mTACZMYPtS$@qVdA#1vqnFM?8pg*&^Iz)whgakM|EPp#h5L$&Kud6`Wli9bF%yEaT7| z$f7qu50Z`JSiOn;oxshJ{YgiFd4&nH0?7a*K$c%j&MIohl7s0UIhit3tkL8)maM51 z`6(#!=UW3>L;K|4fl0lf)7>K=Ds)yxqMfGSz0B2Y^A1Puc>G3c^p8ULw(rwFFE`(> z^?$JlZZ|A9V`*ep9GvSo89M3s=XuWOSB2vdQ~;WB{w6AiLM4X#=LnL3?76Tz*cTOu zmni3cnO<0K4DCBZ;wMM1kw-+UOM*gArK`Irqi;L2fCFAp=4)=IHw#j7`U3qDwP%F+ zrzZOF9wB+*L=77u$}AgrBum)kK}{4B(SKE6MS^;4Ituf$gGQGP_mElhLrT?mP~^23 zz>ryK;l>{dJd9WScK2}gc-%j4e|;TXT`X(Y3n!Sc5`kEK^FPryd?o|UB;;hQD{CBt z6(Za0fOf`~1z93aSe=?1kTgWoRjrhU0%Mf*oLTszwK9esfuI&HwNSFS580-BHT&cf z(I~t$Hz{?w&z20#CZO*`RyIKYpw8zJ zjUDu7=PfK`3`M9Mro=crlqYF!7-9aHs177 zMps~mKU=T?VaplH(7;vw+gRmeEM0cUjFqF?{m3$$TiYpLjts~sEDf=n?J}7A%2rhW zdw?)V+dK<5iv9P&eLug0$|j3!bmvsax;lkB=kK8l(0QVb?LU}uNub%f*m0)U)*3V` zjl&)%1YfJXFPe+bSNW>jbB_MSL2~K6im8$+h>8OyJ$@>RvZ_DMKCBfxZ5S=LkW=0w z1leScG#1Ax{?wB34HgUCpi7hCO3d!{1NYvlu1E4r9mu@GhEvcV~rv z6sA*CU1n@6~YPd7tLte}1YB0(qZl`FR&A9JrtWkooVyYhW7lM!pN z_*`^^*yC5bmNY2FWkfhsc^wq64=Wvdoo7U?VJ!VKnrKgMaTeumv)Ei**( zY%F-vNb7Hyz|E&FIC^ofV5`p{+dQ-&uT&HZ4~$RC2nqd#I5EW%7C@@DJ9k)3n3f)& zziigrS3@?&!;OGX5*D&Q3^UUcml0pY-2i~dLta%iJ(`m9XfQzvsCfkb2SNlnAvc-q zxKm0m=tlt*O8wAr4x>yt6B{jCQ+wj1-J_D9=;LF>i~IP(X(_f#;ih*VT+V0XWkhYe zoHcWs055aFJ`^ljpHVYbYR>;)@M4^R*c>%vg4#LblT-D?xH&5*Z2EK5^44tvuq1{bNvPG4WS< zm{yTV7JQI4H(x31M-yp=qGs+c9|4lm#TBY(a5qbE$SBhAI9_pSwp%*}6;@4Vm#35x z-)@x|5>>S=8rGwuwvo2vFliwkf*}R;m!q=9_kBjb#Bz%%u?MQRZt3^()uA;O^sATr zRnnbqRKEWc$FC~TjUTUS7dX*R0MM`3xg&z8nM*S<|K+FxFGa~UWA2ZO`_^FkAF%Zd zx}LpX@Y5{qaYvTq=4JE0=W)^I-4ldJg0~wxFt1qWm{( znvwR?giNGC7*G0XfiF2tJ>eu~^tFqH%Mf-xAEtpJ?J?5pM`a*TLxXTyiP}IZA3)9G zh3Wv{=~*9>=E)-kfaLX*lR4cho&=ncjD<*#V@R0B*D!Eu++7lJUKB}oiJI#t4H>K7 z)~e8MN6wowsa=9FsXz&##Q+tkJTLS262~2iJ$2b`#GCpk%S`pP^Rzg^UVhSDSTtxD zZ(^ZxF(q98^+uZ%EX~kK12;IU2a!8fm@d9vPJzH`f#M>%Fl3_$WCEL(s+P^a1&dDa zrdU0D?)~!}H>@-&5uF`m>40SJDCKbj+U;vH^L19!R+YJgSEzS)R6yq>W@=|4L#LRb zF-H5~5sLZEwUP3B49NX4$usb-K5$ZFPVBLpt6vV{3xw`$t1vW$Nf)2y;270hh>D3XZ!6dd&x;&1leS|cyh+)0C zZ;24)P?ZRiB|0uGRalVlW*oBQd4H&`8aH?`XtV+Ja}63=KG_4%FX8g0Hnx9Y<(ezGCXK&%WGye7h2jw3hJY|6Y48CaoY(QYh`=xQnKQAzBmx1oJL%HKevUrT!b%0 z{%Lr$$S=o52bPSn?NAniw^_E@F+Iq6Fc3QX+%E81efwFrU4j%S05&a5`*pkZ9cKFy zik)@)8nWDJP7lAAUUwKxk{4*4ryyYj`>sBBp@5xzK991yu{~w0)BStf%gy)say)-| zcn|&B^!gUnR5wHSnwzWBdnAF+EW3hH5*F&EV#pdQ#eQ3Ag#)?k>*wp^_I-W+HC2@r z)s=QyrWXLVLX0;<<5KlV!41Vd!s_R$e|dg=y*`bdWntx)wM&dQMRV6jX{11zUu#g| zX;5MBrUL>k4?vv~>~n!x;^Yfz;?1Gb_V5_=)$RGq<4exR*WQ(fuaP)TT;^$Pb@mHV zs!(dBp8hS%Xh#)iRuEuQ`GlSAwbN}ekxHO9Y)#24}I zJ@#kVNAqNCt+m7`yxpHog8hkd5Hq9ikA7zy%7JW}f!sqRRH&Rnbjq^z_d9$lo=s~# zoQ~O9$(0pG&ZBraf}!T=r?2aQ_1(!u*JGNQ8#<((E8L>% z;aJ|B0%6f!tjs3@4SRCjZzeBuqLQm@NAYl!`z7TfkltNP-@>79Gec1Ta`>yB6UQoh z*E`~lk0+Db5T7&s5((##`fPx+-{~^TA9Fji7LI0z3(VB!%8r;s0lElcFeU3eEdpk4 zX#+6ovNfZQGboIhj~mN-XybEk4s5$oiZbmnRWHeWh2P*o%H4?_^`VFPxHW_%6HP~v zpFt);k`+SUYG|R7o%RIW`^UStm#f0pC%6A>{WmZ`C0YS$ zkRD$6*D12Y|C~U$U{9=|hkwi3g5H#%OQ5@l!7nGz0BmPb5=oSH4K`G=Y8XEvT8FaQ z@12Qmt#)cjie_%Ai`=aG_T|KIATgPb9shP~GCE!*^o*C!mg*%Lqrx8;XYM7sf-z&M z&W-OskA+my0l@hWm~;0JWc5$&`=7uZMG*mE8Ic^d&Dcf$KR&Z+Z!uB%BL2brTas=3 zB;-_@w1|S{iR}~p#-y1U%*o)rIfoJ(jz|!y8!EIf4L;si6SQhsX>>EX(`-{{Rn$!1 z582N6A_WSg@vS6n(R{3lwwgmQwaQB~iJOYm8LW?w6yBP*g;d!Sf@MU9F_Fqu{2Was ziEh@~QzXY;nJJY8O*6iRLF^0xe{~jJ6L=`JOsQgf9`k^vy%m6~!*fpg(N3$@Nf;^l z*lWCKUCJ#igq9F)#LvT%YoMoF^*h^jXI9flHCh9vR#0@HwmKa3mu6t+yNX)X&jQA zGy;?B;S#d=dtzBcS}BI)Hrl=MIJT{M%CLj+9%fhqlPGREw|2W-%&N#pgu90Q>;n?-X<*Nnr6irA@byNs$0N#(l$H~fDOHL<& zDaIm&14ob<1-?6C2w+}3%vPoZV%v% z%JsJ$3sUCw&EeeCaeHgB@`j#+L4JS$qORbDXud zl9tykWzc4`pMt9`^GT$0n8r^Q;C)E0)ypIb97O##V*#%#J zeo$yi(kPw3$UNb;-mQWD_ z3MBnJ>X(QiB~+Vh2cui5{D6X>&_6DyQQe4NQRGiu!;?OSJe{m-sugpBIRE(&`Z1q@f^zcQqeN=o(1*-KR~MC;SAuc=;kIS>a$}rr3dT@04q*0Ag+-Zm@ib#6zRETXNqKs3_M&b6trC_Cy zUvQWZl&C~V1_tmZ-5R~DfM#`anzCn)yMcSXKtarBkb#DD^>>#RU(W0JRbAJDD?f883&2KsH0p}xrH|!#g z{FJRX%^)IRdg~@o(=^te(wk|;wQX?|wGHp}_K4?8bgE>}^GBn~P{FBC7L0aIwrX(| znD`?Bx}owX^~9WWbb{W5?xfDx;qTFu753_|`mm=J>(;`Sn^U-62l~*uKQv*& z%NWPgx-;T+k?fKrFbi(mIA36-`)-;w;8xs1n|^6~5hDa$!l`oeHJ1_-8UX>#^H+;E z%cw)&5=oN-hvS;ug0Kh3z$^oAa>te*e?;+i_9&-JN!zIsd+x$_Z(k+ydoJm*EWpEn zBoS(Vx7_dZc*~D2k8^`(G#5dm%Li9&D)ngXW5aGMWgB|IF>Fd*tfeXUEHlr}`8tZ{ z!M*4-CjLvc38B9rONo9QuD4dT@JZJ#U=FVT?s!~>TZqr~wfi8l7y}CPqozESyjaGa zVx7Xk;a6Vn*M7f;Zci;DI-A55j+1#F@`G^`selvP-kHs1P;@_J-}9bWS94z7n<(bv z@la>UBV#|mHCt!jm*IdnZ&Ye;PV`T{ns0iTt&lTq z7~$X3r8uE%>Z0>Zt-V`&xhovUHrwXTxS&lBN=#j)?%$iPTb{AiFvITqG66=kAbN=) z=bR71%z}HzkRkQxo_;u>xZ5uatv#^cI0#8haJEb4aKZghr3P7V zgkZvmm4?&Dlq`JbLobG?1Cs^BEc~1(@{?Wj9K`Jb>N{}YD>QSd{(M5H?Nak@Sw;KgPJwax z?W{A{w&?Cbav1JDk^Vc0QvpI$e=&V(&4W6Aqt++dv6v@U!JpPuY)J8t*fY+=c8kL;@;n0 zrqS!RUDTW@+@C&_Z@XI2?|b#Vlf8orZ+}`4cze;Dsfm0(+lT>^*RM{tc5bVP#mk6x zY}w)WJwtkd#ff^6Jr}i27yv!`{HUMuPsB9NvY^L-BdyU-L;4QlY&!pDqFTC0CkJP$FUh#|U+*e4_`;eO= zUpK+w%_3T2AjugmL+|BVSo{9DkKHG_TK}I-REYwvZtT~-PEjFd_?{V&(?46xuFwHT z+da6?bjTsY-)|qz+!)feWIhh8*e~kChd*bR0&RS}sHZ~=Q)ixAc7RjGLgSEsf`c}P z7oXkv4GG=xeHZXzYU@aY_Dz(!v3mpQ`K`dWy{H%WNqpU_!;0(x(U&9=f~wT$KHGVL z-~&alWkqoiC)^n^oyl4$<^fzqlm7G_H2S&nvR~@Cemc8}$Lqq3ev^t?(2D{~R2c2b5HKNpV11S8vmwJkY_!PI_2|9J zP~3N9?ZuwbqOzf@GiZh7I!q;TfX1Qkdxo6x2k0Mf&!G?0hz%MEE7kDi8Sxi@U~6Ik z!rW{IZ<~eNMJc}`#LOb?h7sw}v4p@T8SlqSiFpOGv?r43Htzvqx#;d=CM2%Cqyn$r z0R($%?7>@R)gtXrZ{MxR2^&4d*xzpH@9$81zpdNtyp$nw5x#T6mb{_90&Nq;t$_ri z6O4*8M^<$FXzS+XAz?;)2fJU5G3@efO}%oiEnWe23Q^wBTfqvJ6>*p+9}zC3s{36P zE5gz^&E8eRWqS49L=cvMKlxbK38m$jI8xpDb%#xDoecw+#A5ZE`xnx!%LZZfIt>10 z1vNkfDYiNC0dgXmK`-d2`5kJ-UPPJ@?F}Fld`*VfchsM@hebPV8s*Jof#k_BY8g0_J`lKv^mZ>j`lJv@Jd0TmubJz;yh(H>dbwFXZoJ2(wCDi1=eb@+r zGXY3G;&njuJKySv(%)E1<8QLbgbRxHxwZ8``mXMuH^9yP9{_wngTHP7Sk}8iDpi1G z57+bjRZ4wC0^S!>a)18MNVtIHjWQP7$KXMJ1yqLz1{==<=wp~BfmZQsST=}kOUsRE zMSfDYxaeOPw=GA=G?E6%gCsBgzDNK1hEkc|t^Zp@3EZF7=bQ`T)Rqv6fTtlck5Aay zUH7i&HoF(wh35mBKllTWpif(fhSCFxB`4OH{J_uL04}+XjSKK8yavxgW=MoN3sn>+ zd5_7+$k7>!VIxzY@MRp5(t4N$H?;%;S)!Ux+2g?XIH~b7@=l}5C0J)sb_z87mywXV zC6LeiV9s+XR<0uC$MBj&=BMpFVCS#uDxNJWCcOUeUZzqn@) znTWe6n3|ZAaQ0B*#;WI;FC!#{m4#qzJcSuR`=(QJi9H9MckRJ2JipI?6VU zC@w|!Od6oX^qy8WD>;j{CEm^4*7A(PlKGHxVH`oo{x4%iOuPEzO%07{cI_Hl1Hd@& z?<%bgG!Rjh=GGEWO1g_Uen7v7>F<3+ClG`R@RGN!hKZ|;kG`S1Dgc1o;i&PfK*Ldv z%V(`Z_-mcNe@$cc8&-bqDzz#GST-6}88G`l-0j zWSlTn6?b`naGQVCfZ(*0sYr5FM03Xdi8JoJ=#wmX99q;5ZM37H)2x>`4MGSyYnnED zm$<7OMq75}RGkdK_TQlFqe4|kj(M?h?-Pnw-rV;v-I8g(moDyWc!?WeC^(5q!_;ky z{TmcUNL;-h#`f}Cf|dE$ZV{#58k(Op3l7F2<VaIH(uU!%J;LT^VgY1S32!&*0Cd= z*2ue5M5xm4GF;mpheh4AUF5lKtaP%DN~#`6IEzUMB{>dN2^=aQII5vk+)a>F=&Ek> zcdM&H`&1gM!2M-Po3B#IJWo@gl93(@WJUcmgZ|k&F;paTLKtLliy;jX~ zNw=DVNvITq)s(Su@28(Nn-wZ00m~wqBEC|$RA#N3K+|%Sl$vU%yaK57xpFgi<0aNk zssuy^5zS^TjgijRAqlh%CbSA)U()gdDPcoXR?_c0r%$EZ653Y1ezS7a3vP39)7IRb zXg;%*qcQ-n{=_EpCYBofLYb;8T{Y3)DRxm1-L@K-HPQ}OHDr-ETZ_S;v|TA=O2gG4 zZu7Xdv2JNw;fjpxW*)sE4@>=uh-ry4jj*IqX`5w2=PqUcK#HW_=e5!(hSizEwa9;X zrF&;`A?rL_46u0hKr>dh#!_2bPPQhwT}#WxTthF*W@lNlAw>@YEDxUsu~0C;;-_*- zd|*1te#bSjE2Ed6Mj3NG>~%27b5)mquwvY*#AIw;wqLkO>fnN2NuZX4vGbyX72^gO zw=4qMVjP#o<%Mdt%k@NxVW%s^k!gLL;UIg1Igt($M~|oa-RyEeNhl;hx<2x6;lOCVd`H5EXDV)g>1}R;` zrv$X7W418yIC6TY*C_a4$#p z*NNlxSC?~~knj8#hH!#b4B#5y=V>&JBxp8aRpVa3J+HY;$3c&+f$iLy1h%R2{Mvw5 zm~ofz5OG=hMdWdjWh$P-8YL{3)~{~hN30ZG^o@@dP2bM<+&Rwa-j!idOOc^IBhDI`ti&?T z{MK?WMc;mU{Q`ZBPww@*jf~&sEr%^4qU0oPfAQ24D@Lc&9guW-efFY3UC#%n@)X(4 zvr@ixWHZdSRt)9jt!LNB!d^W4E|kKRumL=u_~83#XAjk>yl4a=Kl-5dxX{RP#+@&q z{~am%zdbkC4Rsc&7Z=s)O-W#fdlgAMEjbdiyQ_TEBA3tqnGCqF$8>)mo$V*LDOSep zLQYU!1=knLQxZDOls+`kH8oE83;?00e~_q>7P=fAaDC>-S{?r`Rs63^6wAu>VCA@^ zRpoh~ZCRK*+Uer|bHT^W1^oSB3-PcwN(CF5-SYE7YQMO2O9TTva0~fp@B|fUdi?H)CRsYsjeWJf8GlPR zzzCZyQ)&*Dyulm7+>pm#J|n7vp60?xGbv2@l~CVns#4EGTVl}0gy!u6v=AsWz6Brd z659%CD>t*7kx#>N&1~}XyTpS_H70<6L&i!PbrUKj?c4S_eDJ=LD!j!AsXTKjzuM)j zZTi*NT{uyNlIr5?>y=Mlzj*TJN+;V2CtJ%VTk08V7>@TIUCO8~Wc>cxD=A7p9$qyW zKtj=sw(lz%2hH1vbS?t*Om-fp7Zs!|rpU!`47Jj%7l`1Lkc z5~|X~q~5->TBRllpT0?Oy10ZKB=r+2F)1yQWk^+Ns&LVOQ-2q`%q#!O{hN6eB?NUg zfz?+$I;Aw*K3r8y(p2?<1FTlfWS84Zf?s_370rskw)7!wnl0Shgr1JXV+7omy4$yg z$lFKM=eZGRcX;*fky3wtW|H4e68KYIhf~D^T&3bWn^R=dhCHN;;i!K^frRB}cU$0% z5#yJPTw?&~Y*I97!0|1u`m^EX0rv3nhST$5_sb*BC;6oyz7<u zCFovegRN9yN8QhkluHk+*c}HteUzhv=e}>yEShP^63$b55a!DPp?KV9izmT%lB#8R zrEe`(5J09M)O{*GywlbwhUsvSl}6pY-U`?h+RM3K$w}q7d5o8;4Nhjq0JQ5ZW|7j^-hNqm4PFD0()>4aW1uLpWt1h%9ZHxJ zLZeA~j&v-Sw1J@Knj&@ys?eeoLd^rw47y1fpW?Ql-%O3xa-Dn^B&Zh8iOM`yrjBtV z$kV(DzH-|RD{fmeHf-8T)p1`Pm75sRpBP0iHBwUm8u;Vf0@3)gXBYpqHW4FwMV}P* zT{}AFp;o#rHtYstdK^eb2!34(y=RGhFzlHhOF>ur3_hk=7{+%*8Iu%Pk#M@{C?w*< zf;ir@%eW7Bd$&+#DeGz~sTBjS3NmbVv-T zU?)8iPErzWfbYbV56HM^i8sM(sI<#zdq>kqD>`&IBJl#FUgl+RdA&nqrZ+>$$6OxR z(5~m(+(4J-#RFxU5y8sfB!Sq*SCVrzKzT@kO9&&k(G&;w5M zb&3j4Sa>?8q4o@_cQAmkW}P&T9tV_=V*@$UXAb3_trv@X(~46PO9Ux2sq<&`9>$S7 z9kyo)+qds=Pe8=Uv$M z{FP4_vbsO5ia()-mQ{1>t4$t1!iv;t11M~?7{9#6PK(~FQ8PCOB&9HB8pVv5&6OSv zdot-J8qHrO;W}ndZJhY$>{+wftSD4*M5)kkszq9A@oK~^Sn@Vd4$dyF z^f-Khd6%sDdNlL9jidD{DLoClqbgKc{Z}s$vw-az3M?3Tmu_Tgh{`DxNg|j(5UG?4 z`6!0xR{PUn=IF9y85T9zMDdS;XP7e=E1vo}?Q$iSfaTt1P%VEA<&&*&ngOZTTnc`7 z`}`a1NSt}$y4^yr60+sF`2%yC6KDLmCso@{BESGJS9{GPr_XR>1J zEb_bfdY5DEJ^DZU-kRT}h>P;oNb>1ueB~_Byn(6sI7rChMaXwFqRk4;b;wut%dqEB zl5*o6?_fe-^DaWGr}~M|h&TM`70D!8U~Mi#V%aW_R5K7}67H<0(EAgPa@%<@qr#zk zi+ZA*cvfsJLvb&pV1qY5%a_fdEKYBk4t@bi_T@{=H1V7Pp=bUQ1ivFX7V_8yoC4zW!PcR!?zamGCmyXee(ppE>Gzput-8{`}?{ER%C3~%;z#1!^(Uu|leMCJf z2lWvzVbUgKn83<=V;=`{@A1}6B<05#l<_hjC(M?%=ZY6>NSyol(N}dIMy_$bpEN=Y)P)h>@6aWAK2mlwDkwFj2 z_GeKk000`a000&M003-vX>c!da$_%HaA_}LaA{v{b7wAN?OlCy^E3?qf1e`20qy9< z>v7!1fYKEx>{-X!@pjymtWCE-+ms|_40!nL{3Q7$j*~VU4{vw$U{9OavMkGzEXnq( z`}=#re(=FOUPSa|6#ck~R(TvQg6_p27_9OrUE#+vnQgcP{(E(A?^UkVOV;;kd~=%z zt!X=WFi+BD)(P(7{5D8Z z{x{j=gmyfSry&98FwiiKf_0QG<2;XM!8%QTif8ze--bE{QRq1p_EH(8DzLnOOryUDmq7J$mP|KGa1WDP;8DF-F(3)v zr@=A=1AwQw4z43&2;h|j(Q1~Y849KZ zdYORdq|bS#5SgLnpHO&?*V4-@ndf&HTEi{bI+_x@plVD^loFGygk7?X@Cp6m%}dxr~T95!>{qOA9SzApA0X9@4oAf@cQMKgYNk${{K4Ye|2%$ zAB_UM96Y%=8=wjS1f0w6`FPMDb%Mcp@9gSyaQ<;8`0#2RoDavr+2F}wjH2UVhrsKq zwi*C_#DJdkFMFThQTM~a*ja~Ves6#;46XlF|H%cK|GGm|=nc>K}chJhXON|p45C^ZRPgkP>k%`~| z`Emd9^6Fwd7@oI-PljKD7{IlQ>ZeT8;W_@{u^wK24Zy%oNRD28`AHwoF9C#LQ4hzL zT_VY7d^zZiZBfDj-MJhW`Wu}0KRz3L+&}O2>FtmpeK{EQ+Zd(62n7T`Y5vPD+P)f7 z`zS}9!&jF(J3NlT;G>{>`UT*e>cSVG$UyM0B6yFyY?~@#}*uo@R$x^qx^9FT|_qVgrf! z{NgTNznZM`!`tWS@jN*Da&R#@?~g&g^WfEeNSD>inDd)>F$?e-0)XVxJighaG_8|V zYX^b^K-uAKRTJSlo-DH)G~>OB*LYffxS3Tw&8JmQ)9|he?lM}|z^H67zNsueTV*cr zcS&Hb(3AJ@a2CzuRRo3~PtJ$uAD#_+pMh5uy#0yJ0}iiX>N)v_JynX zfTmGQx;k7et}(-c`DQgGWSQGhP(#aj?wux4MpNYFD9m5xIl4xrDDMQxYH<%MU>>Dp zdBI4?S)XTUn}6g9)h9>?@1@c7r{#6>vzq@OWKk3_Uk9oS^lP%7ULR7)Hladt0a_Xz zWjlckpG~?VZremO%{65=S(A^(36l zXh8Pq-}c_Gc3(%ivVGFM{J6!SsRoxj3B0ju18c5{ zK@(mi<~qMRJ8K6oy%c2k*@Q?q0R`e&>m`@4ZA>~l+@s;-viHS@S073LR(Ze#3V#aY z#W6n{eLVtJy-y||_s1;(Ws7tQ#TjLVlYJVz60`ue-C7^KmnZpT5v_p1dqDvb=#$02 zM1)sBA3cDt3Bad{Ng;$wIAd(71YWQ`$vk&=n=CZvQGXJU?T!a0)5U)bPWZtDe4R{N z7l1@;-w7;=oj^T(VtUp3Q4?7Z)qQ11)O_nlK;UT()jb)0W{U;V+&qn<){hFHAR++u zlc%b`nvPXXZeD*I><1KeB|tVjVtKAjLVvQ99zN+mVO54MaqAj9SCs~KBdZ6+B5M&i zcyA3Hemr)bl3o1!-z{0e|_cY0qX|gz0 z%@Zl89W!*r4w{*er}yh5%gb}2L-4DIOi^+&ix!Y9gz*+yh#sn+SI#_wsZ}wLXkHxe z>G@0<&665OhqM1%XL06|-V9>H+b9qwI6SU;wF%rE3Kugk+_oO(J^suN# z*p$*Ug?`nl5z!h}pNiH%jS8)Sr(3j!uQWPp3KLU9fjm%M6a_#Px0Pl1R+g$#KIlc8 zhFg^OCR4U;n87^)oA&S!^>nrF2n(EX>v>HbS?=G47~e1;nt)EcB7eR^KaDUuZUSIc zs7+sW?FO2$2Ko`xg}ZZ?CaW95={W!wh9X`d6i!&spp`1}K2#kV1#RW*Z@&f4ZP(CL zM&{#VH7Toj7D<)k{%FJicc+N5+G7n8SZR4ILgi5k%U4#ro6;iLQBiApWfhcuVkc=9 zK}i(Uld{Fis)+tE^G~BXf#cze!TCo+Dy~{)R?TuXo2i-GS-OvZ@ekk>l;3R>!bj9n zjq$+UL@a7qEXwQPAP5(C;eDokUh_E3MBH@Xgvxj=dVSAADPFBNET4Tm@LmwX7ljE+ zw*5A(ZEnMKzs(r7!E=L)PbO#m^Oihl7kb_Mq~H5&boFF1JjW{M;%lq2)yfE9g)*`* zI_;0f-P6;{l1%aeS)~18$rB!!BIRaLmY3}YRhGtSGQIsF+bn|<)!BphsDfu(R*obv z5w_KK#=2l<{5c!LvoA_4yxXdHCKg3QYvMtc#8clS01FeS;u5!^O)%~~*d`#7W6iAA zqe5XZ4#X%)XKe`?WBGc)ESjJ!6JcrJLwCH7WEn$lDa6_g=Blj7Hon{k-KF z4>DDaW;7UPNvUT>wbpuCMtk^~V9l6ZtrqbQk+F}J>jluWj&e#)Z=>lCT!5#3c#Rcs zhRG30i<^w%B?UtQzd0Bak_&UQfW|-$<&!Smdj7RGh zMMx(l2Nlpn`GuNh&oQx#tRUy$sQXcWf-Z^}p>k?0eRBFD*9t|az-vOR#`4%-q}!fg znArpgDS~qZp}~G<3J$Jv3H59cpTb+v`Uc@Oj_2^G&%-RwmnrqRJe)9R{^Rm|&tp$K zQ{wvqA-Sfq`^)eLtkX7Y79i{OLd8bGdceCgG_Y?Hs0XbVM)3`Nrd&hGpDbF^OWhmsu3A)WDdIuA zi4aHI|XS& zcs^Fw5DP!huriiBxZu8dLZ!#xG7-a81WUOC7R0h@Hod5h9Ecq(L>XOld;NlN8c5U& z*%2GI@Bx^E&1C07hNBxZFm(om5FV$Z#o!bk9o(_ZTExga=xF~C6dESaf;ztp(;ql2 zEtWyX$Wt#w%qjfsy3wj+$MxJIzROlKpyigLh3dEmd3AnzHvFE8ZA5lxl+{i8I#cF0%#=BkQ0O?GQM4<}`DfB##$y8SbabPP zJG&dNOrzCiX~dPxl4LQHZ^uQ)>1n@rHbLggm?G+n=qHTCL)VNAroF>zI?kq4`YI7! zEej!;9QaQ>YqEl2Gu|TY;%mS!VDnEv8NkP1rI%P~YOBUMh~~9E84Z_8d8ObBT{`G7=WyJ^qH*Fn1gyTLn#mE0xxk zF*EZ-QR0Nf#rA222{gQ9?J13q(|dxIqJEe~3J#vpexjhE)>mL7!D zX|&F3`k>zK>V=eQ)Q`s95SU&^bU;H-5?{-6c*DH+6}XMLRF^VoJhm$=xJ^iA(oGe-DCte9^@>tnf&qLubH8Gi!cVIZRqr9lWGX7f$(hF**^<1L!BhTvN`ET|@7j0TVdj@Oc+be(+A>fDv}2?byk*{kS>z?YsA`tjU6Lz} zmvCL>A;gTui#z?2Xs(StWtWwu)^00pvLN5x>X7R^W`QOZC%OmQ)@i^U|L(N#P>hYd zN3Y^e`yXC?{85W^>yy#P@)K6u^CeV|h?tz@L&Enccrp8S^?ZlXokiE18xhL*o3?a8 ze$plbz#Z=}6ukfN7E$t3o7mJ5#%FyT`QMqnXHNRg+S`=wCOq^X;wLz6S zceb=sGPKngQUNP6R57%n?QcrsiWF_{*m(w`l1SDHu|r=p_F9MDqr*%DMv17IS1y$d z5vt8})zc#P)?2 z!bS|2>)3AEE~*|Sx>Nky>9gvl*P(*qSImYYvYeTvaCj)Y>n>tWBKX!`2Xthi=n3JdbeV(BKK_tyEE#&L#t{+0s0AH9oIT$$ z$XV{xVpT05l`SFUyy$&M>R!0qc3DO>!$?nWTWToBUtjbmA72iyE?R{)h&H6(+-!ar z$F%NNHR;h2aY-3DWWQtT;4c$_U*gZ<>X0*TZ5p&+&CemWHhO`T=_8TmV$>V;MZ)-S zmG#Hp%v(al!toPNK`kfowA6iiRPMe_{R{AyyKlSe7khMfi)fu;O{&*hP zp$cBzWASY@%ytQG>0lII!|}#rEgOptv_ACn`?68-dAxqUfTC6k zSmYburrr1aelWV_1f7_68|xLv`=;iXQ9-YLkL)boDt-%t_`a}GJXFDKuoNk;ivcZl zkjEn(sTp;{TP=U++q}M&PWfwQ31MhQMYc}ZX{gL$-bp*hdYG7&b=$G73?29|g0 z@+%wS$8PAaUWQkwV2}v)76m(?yl75RDy}}vVC7v4%+zkJ{XKUf=TRWYJLb3Pk^ZtR zawDEaN*muAhw<~Xm0)cj?@q;|M>1pF&`Eh3TIE9``M5re^8z(^+W)9~bv7og&k4Iv zJ{*2E84bSa6BgD@A>>5HC_sS4Z8T29?YXKZf{{1$?EpKkB?QZSa*hFqS z^t^dH4^hExJ9z$pc09%CJ7Aruasj&-7@NqK@(@1s|RLNxjed zW6@dhDyH*Y&@b)V0*(i-t7Z9X>@o?sef6G4+i`m7=1|RH58G6+juwKdj{bRECV}so z*Yd`^lde^`#r)&XcD_LNE z>Z!kj2%u;}PVk=Q<3!C=ONl}@aX{^EPfT@^Ii$GJ4WflgOiGiQ6%IXj)QyQ0l$49L zVooLBKXlykq|9SJ=10!S$+VSHv`eV5S^P`O_S)f~_(Xbi}jV z1j(A+d&k@fS8iT}%wK>&(e+<9U-ueHR8`0ml789U{Od7nDufbtwbV%FB~~Voas)~= z&kx`=RmspXoq0qrvPdNuHRi_P1IjzgChQ;uwfR@Tzw}~Gk0X~B^h|k^7+`JoQf=EG z&+VqL5m;O1fW)yt)G{BHw$f}F<5$&rGU-N6s^Sw+CNh^h&^DO!vJ1d?j41#vd2)1) z)z50jQKsSPv7>R34m6u z9a-gLQQl+Ymap7xV?8i+yKig>?QO3!Iq6e-LO|7qR)1f;A5(ZhK%t`O(`|fMh&z`} z^M_{cY-3DYWhZMAsLBBIwq<7_hhvCM=`{YlhBsT$ij8N9jriy^Kg;<yM+=B`MXrOE*kZ; zax5s`6eaAqRtN`~ z3f|8p)~4}VjXI+3ch`5e4s^c{T9ZZ~;{|4!1M)t4M!807I@ z*%(tJ!YEec*OrT`1X>ARP1hz_hR={d{Vl4eI;G#3fU)@BA~#tNAh&1Z`%nuJI_@-u z=W3=g)!v!W)hvIFjFVehn3YPI=vp>AqylJA4-U%Gx5Cz-(I;1M`J9?Ed0m+=FD1W% zU*?jTc!%>i6NHH6s4dxblF^ZtVWzjKvA7YUXuu~Y<<<$d03Sh6()yWai&;&Z+%s$P zFhrI^Ho?H9xSNdX3)aH;o()Fh{<(%`rE4`nKW^?~E2=}b4@yop8fU1Cv`#n4HdD&g zm~R%vFqs-Cf6s3%E)7uz(rzQUZp0>BG^_29-sWWZb!~P=AwOeB6HlGAZf>d+nW^Cc z_V!vTyUqB6W{VRsh?U(MzC3d{iK|y6?ev7}WpJaJ36Pbis2?WUooBiw6TfQvs0 zH^}}J=O$@6S(V1RBOwb>jg+|5U?Yy+Az+xwpIQx|*i4q)v!{7lzXfDdhRa!ICT;iu zNyBA%)N}R-cSs85NlHFZbKbBOSGp}*kBUg9D4DUcKVn70#{kthl(d+x8Ww8m!;Gcc z^PL(A{G5@%=uEvha*}fEB~Lj)w_f(xWZi9A#2BG=AHSg|31&mcBfG-C3sLCpla$JwuNfxP#)|H(>pYe4@<>fz2;lG#kT8<|4hs?|w% zaZ`=z7OqlEM^1ys<-Flj6HL`vXOePSk$0v#`p}RnJ~d(0>U1+5L`jP_gvqVa==t?_ zqE{J-#iuSB>oJyEDDj+SU6X1Fs5!cJ8;hBMw$oLivlG#^>f^C!X+394mKRPz#X`lD zu0@qz*izog+F@Di+q6c6UFs`=?8E4&h=pu>B+?bg;@K093mTwxR=M~c&>Bl=qty$? zgl%zE+6cMJFJ+gG>aA}?y2g;RveyR>!C0{w>r~L5upx*;JY;q!`VXwhwE0PWmW}AE znc0=ja!Yv}r?;TAoCftASpsvWcaCcB`>D>{jRscY&KhNV@TnX9*RE2o?HhY6i+sDV zw!F9R>%(|8QwMaRG+p7rY-V+SoyxyP#XqI+X&iK$C_r%RMoss^Ij&JBo}zXK5nn)*ABiD`Jcgx>wEY~I=gu7468Ll(%FnJAXTfZM(zG-pQ>ne%))b5nF4@ZK39uUMjoh z6m***?;P3Xj5?ZnZu?I6Ci~pCdGWUU@XYpji;`f!?T|y&PwCJ@kC>qLO3gjU>-31- zUBXzd31TeW-DZel%zwrbQ6S33hNJQukPh!9yvDBIXbI>AFF25&|pMms0+^U*X|kepcIXRrk0U5X*^nXf}-|zQVnd2 z{&g8D%v{t^g}vvobDD_7v7rk<1h_6+FX8Qa&OwA*vE3-XvK`pzhQr4lpocjbh`Gu_ zyIoEhu%s6g&SsyqI|WGlEOAOA6R?UFpyMmhI-t-G*NA;wx;=++TF(z8S-@CXI=P-$ z>DQ{2SnyQex8=@UYfnF9_5AcvnroX}LXcE4ceZ#&_`W9{+*;x|qPn4!B7bTa zivy?N?KUs|CU*yo^27Wcrd-1$(F%Qc;^{jcM^sh8naPJ3%58CdsLHjE?d2yG?PK5`f<0T|&e<)Nrt2wINw)@d=6 z9ub+K9dFM}*JjbbD6sHwP5Y-7_4Sbjje@=~DbBE3ZM|fdcYL9h?siQqB8zs$BJi-i zdpYES%#+juFH@^`k^L<} zuK^l`QWdR2kt+^csRTTwGIlQU>QoFFanDS}5U@ubBGW_#G+SzITRK?~&9ddo`;n?w zG(|>kxV$NN|K5CKl2edT9QMJ9W!dx)+wqFoHl~`r&RBNyQN+%IcrSSE=Q%#@;C=Ni zI0{-^zHLeoTz^|&rKu>d91G1hc5tHJo7dV&Wy;9??GK#@#-ySEm;H%yRiC_WF1`oyBm-A3%c-U~pM?Fkel&ge)&KsUFA2I6RdLCwb8TS99$sWN zhe>Ll#(h~!S&E| z<+&$1C%`}age7Y6x|mi*YNXAsC9Jj~G7jpSBp`Gmbjn#O@0|pG1KP;*IsA3IXsbz2 zE$-0Khw~bvMT=~!3au^hSl(N#JgZ$)zq+Q6Mi4d=h*K! zgGTFmB~nOJ)9l=D*EXz6zEamXOBMjyiuyrCZ98-X!Pp5`WML8h%kbw3%R5Ulrh+O5 z^S53=S6n^x+lg~Y8&7vS5a+D>b^p|!heRI|R;ChwOIfM*1g(?@+Tx}S8|qOZ?bZrw z6sf&{$r8jCf0y8D9=6+J^erh&Pf^6sgDYqx23(?;t1EOPMhUck4V)#{bA={%&kB7$ z6>BcqhYWV)aD?)evBjJQH&Kf-$#&4X19()$Bb@IA zw00>E#Wz;qt`6M$7HRJl$zlGbb}F(^KH~H5^$sbnsdLE-oW^z+VjjjGRlVn;w)1)7 zKr7vqCbVg`qwvY#+}t$Qh)Jt&G;?mC+j0lnyC=>iY+`}gPqX{j-aFZPA)Cb0w%=73 z{XC_WP1AeocHC9xjOO8=B)^`(hP`V-Ayu>Wgdi1#V5QlxeKPa>F%zRiR#{Z=0!WDt z>Fu9V?+Uh^E0j!Gwq0uNBmUH#d}oPj7vHeB)|=c@P9-KTOAwL}&v|4~J1=!9-fBr} zK1$axE6n2hQr6OHMQV_j{hoBVo1$?2oe>=g3fWa$W}wK%z%Za=Kaw=m5|ndn47OH0 ztEQrv!JgHwB@tzk$rkS2)N7#p9;fnv2m56?;VB9f2x6ElZAGeR|Ssb;wr)o2a`S@V}6y`Jsx5PjF z5h-$R4PCVaZU_aXU~cgNQXE&$jxcBrY|^I6=ISUj0pSmxW)cliur&n_DI_`rB_N1EcL2PL1GJ!$B(#iyvL;y9EljBG5(eAUy<; z+TEvj#MJ3N992Rko|*Pj@OJCJl0c6=dA@J&8wzK7w+RU9JeJP z>6pV4Q3RLG$c@o*xLdP%_?TVF<;hnY6$u%U&u&G+&>HO?0k(xBn;IO~)cm}rMn^UMmkwW|o^M%}P@i|M z#8iI;mUoWLa}@{K)R6L|hLnn!^2{7xt1b%zWf${6AEa1o6;*CUR9JgR`)8DDM4Fuw zwe74Zt4jX5rC6hdSktqKnyj{(oHX?6zITjn$FInSGs^*WX}_kaHJ^ogJC8K4-KF)I zjd(`53_gBh^8P-BnCQUZ$togRP?@=8my5qdo30Hk)qOuHli_{GMUPn%i z*W*v@^(z}&{+#}PamWNoQlUu^$fv`>d98I5-z?WmOD3WN5JMQxCpv}IK4)g2$Bi>+ zsS&~JPqwnfB5J9L;V#u0E<@dAUkxlfNuM@YNwO?%woEh)+u28L*rX&x2EPy#_#yLrbfM7Q&KcU1-Zg7i%4S0S!8^Q4pZlOKGbHqR17Jo(ciXKBK{#Y^xB^7A;|lOOlS(1 zqxPDG_I>`VIAvCO1ZWiOFj^4)O4mLYv@~@^8|*$4*QR9_y$(dL>wD@r+V*t{w};=3 zQQiMJnr_Ia!L0b>2JstTL-;L}ENP4?A!>)(R}UJt)eJ7c*0bTO0=21t+eVRn_^WVq zaSrecbJwDU_FUO)E$~pHm-+ZFUM{0q3 zg+s6Y08mQ<1QY-O00;obl#xMQ@fSu)1pok{3jhET0001NcWH1hb8=%ZVQ^_LWpZ*Z zW3^UoZ__Xk{@!14f)BvdwJ_daMVff6MVgevS(y+TS>m?Q@=`fTs|oSnxpUj3EWkIa zwejM6o_p?mK6`j_(t{KDxJXh-1Ey4=U>fG(Qf4x*AS>cpPvPIN*BfecvsmA%WVx!~ zVe|;j9zT9^ia*c5-^w^CSHSbKN~*e&P%O|mTjNlHA0;x6uLg{BwYuU*ni9#ai zYtm3jSWA^9RV8Cst74PHIH*=(g+CIB(zMtn`4XZcj}rox8kEWE%`Sd;GPt9y!~plA z5Ei3xT~-)T6(+f64X=w0PBr<;izT2euvt^#Bp7pg=|8 z#iebkrCiI1$_1eb6_KJM$#>;amZS^z6(A(rJ!T3L-;PYo2r9Ar;Ln)JX`q|S z7dD-t`^!FM!E_y;eGbqN4Zt#{#u%e{`0pf8zRkd6)4f89-Va8;;35zV#;$AW6#LA( z;3o6mg6;Y`M}g1!=tUUhoMu^MaY+uJZ^c?i`bWS`CC-I;XCK z553l|cZtNPZkKY5YCd83-a``Nq6md&P)dB^aZ|LWqyfY6#8JH9u(8d@%rP0wy2Lc+ zK6`|##CD#%V8|XU_xe5a#Lp*h(v!QfEo zv{UF<0DP`PRUP(Xy5%zv=4^ikCHhJP30e;>;vDhH+f z&>ST9lRQdm?3nk`ZL%Ipr3R~e^m-A?1=w>wyRz6Q825VU1N#)UBqgx z@bUEXg~Mdo58(4{NXb^0bJTE_fz}oF`$^=(X|dVlUaeSRMK&XbS-+yrU%>8 zCmr;tUM!?)U>)D1;JiVfb8ou!9!3NpaCN`e_I4Ar#v)wZH3BW_y+v?FrWS ze%6f}o1Jdo*wcw(iN|t@90xRaaLbH!2RnVwKf&qC4%&!g(n`APvT@$}4*WLmS6y_fWEkI4dF3*~tHGY2 ziQC6r?Cj95J7`m*NIIRaY7cMG#>f**wLJbiT3><=3*WAoFWOpr@(*;B7G+1dY5P`# zKD&!{imDUyF`A-o&`JlsnTjqM{gvoIs`KXP1E z+6eD(waWj-MRzPR*1cq%1D9aIf~3nfyKLLGZQHhO+qP}1%eHOX?wXoCXV2T2y+0yv zL`LKnSM5yC;dZ-OxR$JpUQ0!2EoI!6x@B*VutJ{^F>)vFMkO%KJ#k}x|EvDqTA2uj z1qlE^kM;jB-v2N8#@58y(8cuk@Ks-rU8G0xxmEiUpO2FQmxW-6Trf?KxGk=jT84z= zhM7RBawSbM+2>Sy&3w*ig1ju9wbpw|%ggKP=;^qiPj)p-Ez7P0)1hthZuU}`RcxggMcu`peIO-NH2g(kUdh=6v+kwx-J zP_Pq_p0U3iIZY^}@esLm4DO+}IVEGJjv*D>^&-?B;?4mU(!>)H#1*Ac2q@@GFn6;! zaUMlXKRL%6FsnvxPb=r^JTDKxoHnL1UylisyuQuc&byt%)duiCcyg=P}9D4@FVs=1u`mUv7x!& zrhx%}{(7$b^$fAj9F5|CzLC}T(kCpw>KT{%Wobs(HK`RT$fc|`ZMVs;zU0>b7JXSV z-CePCy`!>`VIqTUCoB#)lt~AK?s~5~lNxTLLup)jJ;My~RiRIKR2JtE_$+J1ZomPE zICUJ2pKrEAyPy#U3SoR!3lrUYFP*-`d&zj;N7*Ie(l)QGt2~TnFq%B=0v4&j;}j6ZMio-(y=+VKl^AnWp{`+I z`X=$yjy0uKXVTxd?`{NPr|f|wGEAe(zatk^{6X4Ed3-SlXaa>X0c$KBwU?v`L!|umFb66qCnte zjUY9m`UDHrC)B3c=RuE7&@k);II26Ka$Lcq^$K0h=en+0lwQ!+xFfY)%p4>)OQ%}v zE#%)ZWa~MZh~bDcag7s?tyJ`l0bs4u0c4+UQRt^9sbe)`>|jTp{;0^Wi+$A-VPuLTn^)9T<22bf(B=c5w9Xx>Mc zVZHIA&(**8u5z(CITkw{4gJTXis#E zEu&bqonp5^YcDP#V+#&N&SqISQg`COuC~k!=c-_J0`wsKaxqZ;_Oiz*uM=FUL6l`V zAkEsPSiHRMEO-_PqNK&NIYq@qVW#?wlfK4Eb;Fx2iQ1THEMsXsP1NSmWBc`o&>Ipm zmOSn9+J>~bjeT43!L@Vx#5qO@uP?eukod9(g$w0DMY%IkoDY+Qkfw@zv{}&yd#jt_ zj`#^C=%D23CSt{z+QVkO z&*WNLKDoa=r?bu-D%hys(+`pr6{dk|2KK@wk~7KY^pfo*$N_8lInw zQg_uUdnibtjB9C8*BcQWG{dmznfNB^7!_Jj<(Wa#%dveLU=sIo(mKU@_p2mx{S(4i=m|O)dM^=3U^)2i@vUy6t%mDm>J0HXRq;K*8<83 z%J@gI{AaK9;S>(|DMVB1S{Nx)#iC3_$1It3oWK=V7ffG~lQFEx2Zgvf{8`W(byDDl zXb!=edOlE1sRimBEo3Fp?O8(E+N6II5Es%CMi-J)KaROWmaZ5rIPK-VV^~mY-6-6Dg%UJ z*<;tk@zbueH^&BMx82G)(Y@l&vZ8(FYkam6{Ye<}^wSe=``nx#%7ErP_By9m*Il7? z9INIjmz*-UiWvrQA2%Tod{31g&sND?V)EjQFoOPm0fTaZ1?|PU1$rLbm8zf^|I(W9 zBo%G$P(jCb;kqb+MXJAh8XCWdxPjX``X2QvULy2{C~Q2m;A4NH+&8l*udja0(DJmO zqaTYDdi2&k5hWVFLH?(Y6Q3_E$|A|DpkhHNBh;nGt@`fP!kF zM35GBAsC?+76dZeD?*vU#65@Z()LCr&wFeAt{c$yyE(hH#FKH%$*b`lR@N3Rb~UbQ z9?O>3;i+$yxWS3IoI+|-YV*|42jr-a?1%|%@q`H$*t{U~IQn8R|p6^zf#*1m@6!7bJ?* zCXEn{(jSHyL+}A{VOKkocVa*ae@5c;MW+tN;L}xfo8#9L4CS$J(A|{~?zNdhOnCj( zEWkP#>B9e1xnc3mEji|ZxV>hCA5f={vl0xFb-^nl0^t=j7)$g*$>DQC_vjNO`DlJh zcDFq|SY+&5u_?53YaolQL$7GY3t zmwO!sIXoiV6KUuT)PS7MY)5NL#0K&n78Lc(E(VZ>cqW`FmS;4pFdYIv1_zjBs412{ z^mu_-JlRR4J&xW2l>&Aw49+H2yh$t_N}I!_?{FM7cEU1lH+q3N&k07G=H9V_@lM&&4tZz*zmX5i|49CT@WI`Z0TH1+iVNXwr{hG z!|gN8#=(^d@w;F6Y0JtDXl^`T=4@KA3kHJj&wLBhg|0!l)5*)$xK^pxzU+taBakqc z;Tnd_){RUZ6VhPTygj`u2&BVJY*$aL*LC)75U@Pzj8z$*LGfXgY@J&2W!U}9S%;gR^;GNB6XL;cvpD1?pU<_o0}vlz$m6ur3DN>{ zGll=-W+yt^YMMZTua^T$Zfksc2r(_FpQFnCDq6Qo$IP4BGl=2x%=D^Rz+{2oAQ)_- zpLyJw$yGuo7=B7Fd;ZLn-2wc&v>mfMfbp*t_~ficSrBjU+Dg#87CxAp!w0GdZE)lO!pbsI|NJzR6Ny?Z7Q2UpTl1#OYRTtP1i%rzH(>tJ+>Cu$uvAFO9ce_Bu0EY&#ndWd-*7PZ|XXfGkgCB0X59Q#<<_(itN0{;6 z_W9by%z)m*c4P0kgBO)XxBTcn_q~y^q&iOApLua6NXr^W%LW5JS#kQAHRnF5KUj`e z!fYAVm!FQheZ8BPI`T!|UebV*?SG&fDmBE*Pl$P6;YL=F&)lV>WSvEd($~E%T}naa z>Uv8;sb{RmCq2c;${JDe#(xx`L}q@zJpkO?{xfNdk_w;c4lkDalu7~%RIA>a zoR~`dB$=*N1Utm)DDl)M$pHGEM!oFtLBB(~mIepLLQ=S^aR! zxE7a-o3%gtO69Z^@HEcGJ7fP!Xy? zljkRUpRY=Z07|gDnVC4L?mJ^V`5GZp zvmMzrs*ffjxkf2+N2*GmPij#n3UOM}+6w;P+1cUnN{u!$QuOza^p-fN474mGnDR_+ z^D>lv1=gn6uFo8-(tCY_NH`vtPo9qU-H^|(=^yv$0KEU!^xvqy{C*7X4tFdR00x$Q z6H$cU&6pQX7v1H$PBT{KYAtFCUT#Q#e0pPAxT44!H1o|4n`8A}vpD0Qvtt(hR^6sP z`fho^fY)8CUe)LN_W4XJ9`Yl9=H8J^8dmEKN|(0;JFZk&MJ6JYnBO0Vq5~0L@g7vu z#pit>d~n`46xKv6`_i__79QOm^^d3LdG<$QEDaIrSfewJ&pC4{Q%pMzg!~@WN&L~a zW>6m3X8*wQFR!`XXk^J2va`N4qIGj&U{MKZjV(wR$i=A}=*sg-y} zX~DoI*KkAf<@ zFp8Bw>*L=D+q4`6#M&kC7778sRY)21C2k!ID>6|`H43r%hg5pXQ!32WFRN;=G+Dew zjt3KWLhftOF$t#)S$*aAuq#xsuT#{m(UmJi|025xKIRs`gH+}!n%GjMmHjQnB~q{@ zkiR*jGz%-odU&!>oLt&m#_j}F*uVs66+UhGG7yquvibOUNM-cMYPR9nl}E6?#?~*f z0Z*s#M-p(Rc92VLPt)W-Ss2eX?g&#&Vc{AEZmE0McdPN=BAf>->(ZALoX~qzO2ceN5RAL zcIO=W8EJ9ixz49rKMlRiWw%Bv!QVI4eL{RUA6o^%9@ck`K;v8Sx>$-ljdm+?HaF7a zl#>u6>37Z5lHqN18-ty2IOeiz zfHBc3^M%=6Qmf-PTfK*oF$Wj-kgVXy{f;i{ZW@V4z1N($0VM=jB{v12-yV>SA&m-OY$70WulB86&}zT|PD zvpMDv z?&v*A3xz3@M=NhH48)pNue6C+-LyaGKA8Aac$@EBX86l`q5{j=$d^hbe4R@r4FgPU zalyDYBiIC{8Oj(X(vScksn|6RE$c|2S=)phY7n)nAuXY*!B5`X1bAUtnmcOHkw=M= za%yt%In}(}P~;v>%$qeZ&1?l0sxx;9tB-=@X@uNH0h`5=siHfx8XQSgwTo94@CO6d zhk$jc+FQLM6rD^Bt41Dr0f49RmG9^IgrBD+qxitrtNz51l1)tb5M-Xmx@fUyr{}8~2E) z>|k#j8?PojlJcnzLmF$sl32}7ho}X4&=R!FrjeGJCmBRbNt0B$hig4?dBtbwfwmm+ znVVOQB4%__>uV}M+jmnY@DDu;J?wP0LV}B9R;Nm8a;?3b3I`?zYJ!+%WQVzNf!y8%u`h2sbpr(@g3)|b%-*j$UMVa@f% zpp`C+*qrglcTDWjaOD0}4>^;A-j~iTBVqF#d8#IIvsA)f(S1|!4$CPgD(ZHxb%d!& zlWMu-YYTf0h>T*^1lRaj-?M{wOjal3pJuplexB4Ps&2~7~eSxuv5aHY?ScQMel+pC(Kig%JuqYQ6`hzCBTKj8%=8#!aVArKn*B+ z6->%x31?G{q^2)qx#>QXkFNpwR4g7<9MZwKjyV#U{!wPCw(Q-O^gU;8nI~yfomL-b zCIoivq+&=AkJ4rJ?*eu643o^bDh$=-37y9V9eC(OquzXtz~|A-w6uZEl*W-ui?t(M zH;R#O>I{k@#V}n1jf@j$F&VQ+Xds8<;znjVNdV~5++$INoFD@lL*xk|l*r81U^1^U>3OTUcU`XUZGUqS#$a0|tw;lt%4>~Sq_ULhV z!-u1YXuy~txJ9;7DkcP6jY4F^&e8T`Y)QG1+v;5+jL)k_2w5CVb_43|g41B;KcPYR zNJA1&CP$vJ+=$<_zt{OlcENaB3ukNh-Ot@{pn{HYJpI|(=u<-bBiLV-M}mmL2QK88 z5Nd|{>qA-&jQ*c)II8`yU*g@kKo9`WImo9Zjq5)R5Y=s5FvH`Ff-}6BxS|cwVGa3d z0&{IhVuapAI*2?Zbm7&agW}G6B(7^5i~QKqPO^jIjnY$Ldq#+%g96mRKmM^nO5p+O zIO(r7r2%nKI+ys~;D*9#QnA&taiBM0_y)8y^l&(-#F0YhBUI$0{>}sLGMcp=wo4Mym-&h#cQ+d*^I>fG7zr*i?|) zhsQ|HS(2wY13uaIIbr+ z-d=(`71+_@1Aw9`dw&bcm8#K#y&Nqf-!C? z{;EfH>s^ED_rz>LEn%{81(>FCvgg;+N>i#NKf^HaiaDBB+WIGIsaZK4zLz4h$6vvc z5;TCpaZ}}k_G)ptS!zO)g3(~v*U<_)4F~PLythkBue@G-Bv(FWdELJzU1{Ad_UWOp zYnXGP<=F`KJBFWgmZNA?VRCavura^z%_eeZo9H%L;6{D%(+%W zdJcwO=A3i6TG?hHnJizk9mJTi#{+uHW2RSL-Uvgd|I9_jb);5`6Vg_9Y~B!wMfLh< zthx}TSm8438W4Xw*4+BUX}PPp5Ax$56ujXQU?)U#>4jzO^h2ncx6$TWYvQ}rB$^cc z_93*^-N?>WPGu`3;|NLJruphfkUKwOCLDA)xC1h$yGmB;3IbG&YcoK73}ni&0m7-b zRt>L359DTsGdMQ5NrFA@$Kc(fb55?BCGI<)&8}-3#wn0snTbPuY|$^ zklr}`DHCA@qL=DzPp5dwzTA(Bgsq=9D`-b0uxyT(7E!;ANK2!>$68^+`RipBob%~L z=SwhXHO5Zhk$Bpe=^J#2Gy0DzzkJV2%PiW;57&SG1X?nUf>@U_t0?RM0E&o!|Npd! zlbw;3iL(=}(Up#u+r|Xq&u*Te!|XIDxKY>b#;Qd`3^FDV?OyTup**Ou7OW^r1iNk4 z?auDhl@tCowg6EeW%Z%(0!FAc6 z56l_xK(ikRvOgZVZW%Lohgfb|rE7c4XLjca35o|N?T?WCG5eoR1K6N{-DDz&ksWIs zZ-@~$@v3hiAK;!e>AVel&x7c^Gqz$!I`lTkc)`GBey#wG=p~9QIjiW2NOnF)1fDEL zMaZsy() z#hXN%dwIfvS#t|yF}Q-}u6zsk4RQZ_tLwi1doFJ%^lplr_KGzK>ouv9jsIh*k6<5h z34M<;po6Ho2Oe-7_%5Vr`JK6Xk=;xutCf?+ zayvZy_tF_$x9ho-1>jDgO?1vhLJQ_@24W`5^!5l<5tB~ydS#Di)pG^YxqO64dHrq% zt4HASsBrtt;}pH;(YEhg0a;e-JIS@^xzs}w9H@NBs@KL9tQuOEWy7XTfi9E3{JwCT zIDUyd`G!RfEV$E$6OhASyzAt7Hj9jg8{kjouD4U{#O`W15ZShD-+LGI(V*9D^L^<( zl1xQ)DZu>4QQ@jL(Obc>?$3dU-yEhkOyQvDVolcmN1b&@JWzqotp!%xeJ%dt;#D71fVn)xzEJYmFwNG_RY%L^~$8_X|aS|7s#1T)oyj5 zKn*V=y{qDT7no)5ANlJsQJO&`O-idNfjXBH7TH~(sfrnIILBrXSfSn|wa5?AzZHIS z=6m~IC$q@gz+`PTPImT=ynErf|XUCF4lkZ%Q+pup&nM!d{pZq#`1<81KIQrOCtGrJ2Oi-JVJ%kqa`G zaAed>^|;xkmC%Vcn|m7#5Rf=$0y`(cWgr_%OEVZQ=rd*bgZ`l^ z{Wp{)@--%eFs_X>w3lF*dJ9PwE>@2Gk&D4rtbB{7l`CeC+SEO7$UAz++))IWV*=pF z^E`(Z{ugCMXfLjo<*yar$RvNC2&g})${O>BSFt6=X9S(=5KW|P;G}RI3o{yM-hjCP zX)GU_d|n}f95SD5c|I7Dj_ydgHrSGk047*iP6pD)c`~4O z+_;f(EB-p|nIHfFK-33!jHxQDy^_0nXMO&Pi=cPz%%Hj^4SLjj11^4s?)F-h76kc< zp(M@pFU1slTFi#E7>NaI7bsEo<8I7Bh30fp!Gg;(G}oDA2w503tfv)tWaldCi!(TJ z)FW#BXRmT792*~wL|a$Pp&}1nqSpDG63BYX(?5 z(@tUqf^mE*QlNkFdS{8Cp!6D~+ zs_+TkhwwR?0oFxQ*waKt7BKUs7pjh;zk?@LT_Ta3>{DDd{?{1Zq$(%$>w}{i>kYz`bW?(1Yl;-mbxq+jn2%@x* zwx$X@_~6OhIx;JQ&y2)011^_|Km0kr-?#dRh`;1~+3)$Jfo#yi>EF{qPTT96zUCWr z{&^<@)|gFhqe>*HkPnu39F4>Sv&hA+dcfc8)LzYCTmq#55r32mij z`X9RayG8>NF?B+20vCFWk;WlyI&2fdrpn&&K&l5)R~8x9j!PdA%ll~s7sc(tF2PH%_CRLPmCJ!41>n77f!BAozSYg5rQW4m+nPUK9u4$Z?J>{mH5dA4i8ck$s~FM?sH_ zd3GaSUUnvXW=BDv+;?9Hy_2me%cA=PCi*2DE!WQ864~wP1U(uED3uA^rqJ{6ujIV| z+EjKl7U+;9!|eP*45!7b9BewCS${OC0*tYwzd$75Bl0p!5{gda!D@@o)Kv16SwvaY8Do&wk010_e$PLdLda+7;aW@;My%5iZt? zmY=z&pP&gUCP2}oq^^U?E0o^1!_Vw;Wyq~*{+3FBwubchR*;PH`tecas}2EeUn%1o zb%iw4&pH<|P?4s|Ej`2sLx~;&EJblcB1#kzpCIZZoyp0b6%u%UJpl0bL&^46MKwyvDRIPgJ>f z4Lyk(InR(p)wCC)*q=;goScuzwVY)8*VO+ES#r%w7SM}sDlCpS@JP{4=SV3-ZeCI$ zmxKpVS2H)riPS8F@K}x6hw%?yTs`r98_8o`n7r|6Ub->53b_ob>9Ux)ibeq|-O6Yi zB{&4FOGQTIUm?|<{HF|)PduX%<-FLbxLmXkusWa%)F;tHls_uCdGuw(H$uK(CO`y{ ztVys_ER-4Frxg@cr5a5fhK@mZ?%{?gUP1?61x3ZATD?t_R?%BJ79FZ|>25$eaZgck&rr$1^llr-GJu64$n6bE8#0Z4-;##D+`gsBEW=gq$abkE%m zMyDelFSJN}`oE7J$$vW)0VPf zxO}ojT8^A^_P~8!uo`!8!zp1B_B)KyFLd)B{X25ZD*Y3Pvv%`;93(3uv@1o>bCk0l z+^x*G_i1=Y@w`)w zC?Xl*r+`f0dL}NoX>aZ0k5kqdtzqw-BizW4V!tZNE4Q_e3{+0KYXY<}qMf4kEK8bp zi1c%cs(`{KY3WlISVq5T!HtLC{;j8Y&o$IrhcjGk%HGwih=f8(05x-t9@bA`PcPBa z-T6+{_okv07VG9e4nK{M(Q$~~#pf3l7N9avWem>8w1p+eg+MEWKhB{av=rAg!9gOU ziVVv>xK?I~uSBwmGnMZA6G4J%jKM5I;o@O{jD-Z`Lb0Fp-ZZq(rH$`XgxnBN0qx>w)I0T%PAe8^%npP#p~$(KxNPeGeBATJu%B4Xx?Gw%iO{Fl|FX9I#V#&Pf@E#LVORiMaKuK zLgo*MR!rqqRE!o%VIn39O~kyY1pa;Rd02SIHu|1|N;D>OM$MZJ5*dQb3~a`z4)Bua z;P(oNNpU%%Kn8gH;={;>R`}?1?~>H!dbs_l)6`WV(}W0f!7O&oJI=@?lLtoVz>biw zWEPNK$br>(^h(>F_VO)HY5Ipx{aC1FPJ9S(I{A9_%U4{QK|(TBw-anH;9)u`NonN< zjk2zx{Z2AVjcD>p12GZH3yemJ0o_PWvvnosBWk%=j;MGBB7-MEsKo8+OT~p!-_nxl zq81Ef^?1 z+bQ-{IJpUC)q(NfO5oivKOh~dn>QT?v-FQg>J65lys6vNw#uYow+(1J(ZfIZ(32bF zp~3P!)rzqi-xrcqDyzoW;CN_igX`F6hMiEGWvc`OLG$-)o9Ot1>#S5>s(4GGfxXRf zZk@;)hTaa*=kRCD6UnI|kKFpP5O+) zz#j&s*E_K=lEp~#jH;{qIB~D?WNJ#%T<&u}sTZHWq$-Xehpx>kYpekbyv|k(@pt8N zlq&5ar$?KLL`@*|PX$nd?p{p(O8@*Ygn7d^{dmk7q{#SRVR4IfTQ)X|<~BV*#nxH% zEDsScL`+&p$lT!-*`aWJoQWd}Lft_0N5x=-Zqi%4GqCGZJI-7i%WVFzFe_wH@1v-YuDfxvAaWJjzRX&ZDn48cl1a0ufTsbUu$$Ed+*sS-{ zjk$tRqvH~7o&nA&^r=S1yyA(NexnUaP{fdp56LJoDbO*vG!NOM^>|Tz403}dU@=*h zdwAnJ*rl6ZZeH=4+1o*A z66eT6%+IWUxKl*Lj8y1Om8P?Bl7WG^Np~feJNkbqhD9sFJ#%aK*VO-zp6{2A?7)?K zB1f`0X$5S*q*n)Qa5!Ng9gfGc25^=?ar}+X4k$b)U(j*|ZD!o_xZyM&O?bGj%{##M+C6Vyp2c~jQYt26zw%K9A4>_Qm`{Dpn4W)=pC3Y?o5d4hFD*-&xA|waFp+v zt^@>BVt8>xshkn?s5zqBp-Xg-J3U_b=5;)REP%3|PjZ{PLw*~+gw>6(RTU0=8AN1S z^j2Qyj#*^G7E5+7&?Om`HaK5n5^lYtT8bOD*?G~L)`#%fdYDbwgVBr@hqgUB8cTiS z^Jx(m1HaPTwCQB9y*%rRH_t-4x+ZvwN!Ubm9Dz@AYI<>71(3nXCC=A;GDH|Zy zO*dvk63g}}Y+~85B>bIrr)#u>dIpHC&Zeq5G};=?F>5&s1@JM0(i&9NW`xFM&>nYT zw=vB-a}HAHW*zk-95RvMVFmB_%{V(Uo7ZPH?X5z=zlI=%m{WPJ8S0nvZ zmr)Ci!Q``yAa_fROYC&bV3X_N@!eP9kEDr?jo2|`2~FFh>7&c@ctg4tM$%3upasLY zX(BbnqiQ#*Wp*Elh!l`MOn9f!I1;u}M^1vhf~WKN&|WU@u^UA{Z7im6DEK-muGbei zc0XY<9!fbkmcfV=e$1R7>D#b;a2jE~And>bz`;!!-sHPy(Z(%*c8c z0-hA%VGa}da5K}zl?Pag*THzTSpq4k2CsHf$}Nn*K9P@-rIYw-&$-=?x^=jp;A(74 z4#%cD#>d+Srdzs_uidenXaCPb!`rsEI-C1uPpNmKS1W3whqg?&rZks^w3;}kx^gBs z#sJSs(?l~J7Qgk*Rj|=?66$NXw8806?LQV!)x5i{#Xni}CcAA91kkRgv=y12(!F<; zQ&?&~jh1P706O{6gcvVrI%eS8*~1<#PjR}=kfNs6>D)>!^Dtgf7V5YdSm=# zNEl}b#lYY@BD$@_h7lq7+DfkPmh6N5F^6lc)yc9`QLy0CD)oO;J(7s#AWdndR8@wd z@n2ezF!^Us;AvvH_n9_QM}SitCP$iZ$>B-jnRsj+?HP|{5u_ZkvENFVKbHjr8J?gB z?*pydPpB||tOVRU#-_|$``4^GBs4{K0vY=U|LBCW%@v{Dxhs;55L)2)A0{#k9pyMD z>m?jJ*JQ}-O$m{iby5GVnx_4|S0TsW#?uYm_l2rB~TGH&4+o0zeu6&ksRib@RuliA#WBt&k$oNmSs8#1t(r}wZ?5y$-Hs*0qd+|XlnQ-&`N#~xO$z_n@TrS+MZ zi}p23ZLtx^7=|aoAltE;q>zH_4rHo0X`DXCE5+UR)Jjp@(6ml7`AyL0Qi3)uMTSEbQ7XN}<9)y%-_yf>f zC1&+}jcM$nMWZ(vl`xTgBZ;0fz?;m)V4TW>MXW_N0&xm}5M-6`{daBda}F2wj7p89 zujrIB6#8BEWTQisx~wuf*X5>;tbP4WhIN%MGUy!Ax*&7blIBsP=BlaIr55yqf+wH> zL{DSZcLOZ40(Oxr>MfJ1Fdvmd(Q&}iY)D(C180w*Is&)C0mA%Pl-edc` z_tJWmdK}djkH0BSjG{2Rcj(B2M1z{4I}%L1rETWiJA_t)(MEe1EYA+tO@udRl*?HO zH^zS})DI8RAx*1^8MbEh{(eIa!rKl6|GUlF?U5+^Fj($hL-qm%lLw|aBY>&j=Zy`X zjd(BJytQnj^1RJU-mqa}u6_iQR*tmF@>my`7`>}BFPT>W!>sV?T#NWGIHRZeX6{00 zrf2h3s+ce;)d;cEOB~^QuMP;DTJF2hY=@*;-a`_{2#K~8YvoydeWxXtXF6tvu|&mE zA{4C5WzIk4v~833#A1)y*&_xu83PmsHu3wHQFWbIv~s7ol6gu972omc;+Ix7&**o2 zwHp#{IY86ML!)C`tqFQn`(<2Noi%Jut5*Mm(d#6# z3?o^)ui3Q2bwD-yn8h%A63q*L(l*4_^bsuNdZAR5(f~^HS;QjEgynp5KyfeB;AH?} zE4V<*GN1;ez~C_}hHJl#FcP z)&{1KHn(z#))_vAZHs}sqj}v4)pk|Q1MS(S#eKZY9^2!JT99$sO67E^))cIy)k@4) zUCHJszsA&nr-^kP57DR{#DNVjItIz2a$dS$@v7~F#FxvXgsHdP)k@q=>D6CEYWHz5 z`~{u3D9yRuFVOY+q!9DMZkpHy3Zk6zg>%PHP7+I@20faA{PJFsV|;pru{agD9g(}a z=KQB?LSNIyDILWOGiRm%SrXTB`Uwcb_|fQYy{}+WVc)^$MH=xLH+Wz6LNOFMHA%Fmv6(^pl&BB7{BH?v1PsV!!9!klP`AZOdMS0g9Cv@HXhnR zUE+32@mcu($xuBv;#DK^Fq+4fxF`LQ-&S18rr~KoHTu|pk#$Z%qD0%4E!(zj+qP}n zcGW4{wr$(CZJx5NKDRsK-H3ksJAZTM$`x~tkzcdfvSC5nU$1OZe8EB0O|{BXa+J%~ zo>-KeUI^!^6!4wr0~Cnj31&0bdhdMjLl>Ue45O&dt%}NN6Ih<_k~o#PEshvLv}^=7 zrwZx7<&OnKeyh;8&b!|JMFgDx;j76qx-6Yhk?HeJnOxNV)c!Bk6B})qx?!7t3zoiX z8J(HYGWqCT+uuO2PrqAyIV^qKt9O;UM({^L{zIVV#hnw%4R?r0JoS|#8{!gQ|^ zlP|G9*YN6eb7j*Wm?YYhMw_Oj>L#oo#`fXp+Z_|KEmJ`qr&$lj3U$kJ>0{HBzq958 zg!t&-!yY2Ys?^2L_zRYAAY~3Ba+3?^J5xEV>!^?wyg*I%sG_k~Z6=2eF;N=BM}-l* zO0-Jy6-;ewS&O&kDiN)!?79hDXnQ+N&9$DtpOR?Stt!6(LvxfUjQ6N1@khbNy|WfO@++1VNS`D@o4>MgCREB0fC^M**wM982| zPp9{qL*PH)KDepR$`$K8JIvV)EaC3c-PH0{woM5+Ux*94=aC(dz6& zI$rK&PLzS~ibxbFA2)i{%%8bj)YbGk8D*hmy{E`3Dp$j`v@1V52urK+*Dq@PTD}(c zxSrFOd~Q~OBhHQydC(<1%V7X2g|i9Pm_F#m2eF4LC+}e*!fNK*<;u}l!_fT1?wx#d zcS#5*nVEQv$Dhvdky*7g?_Du`;1%k|)zB7#D^1c1C)7@|Ewl$6?JO=;wtz+gd@uFY z?2UW4msiD0=EvDg7Kty+-D}0zD=}_pj<~jwuYIsoNZVbaU9}g+=1*mfM7bgrlSd~X z_())a=Vj3tryn1e8DU&f^D!>;O1;I8KD$rB%hsKp7?-T+W$4`<@h;0EY(l1L3p&%2 z^5BR<&zx4C2Qbl#9!3hL)e@vtBI=X%780K z&x!6`-`Gv4s^8q`if6UN#%4|piXuOp3t^+4?AU6wBNb*LjaVqirz0gI#a;zj4? zF_2f#m|x@41Yf=CXUojcwY@V7J+7xD$Z7>8aq@C~kwYJ3c;~89O8&l^dhUmkS<7u{eL9}|+dxmZ_H9-B%UFFD z0{A|?{PMfQkYC6p>E3Yt)VuGv@#ge9`O)+3wM5 zIl%pTPj%nq-pKig9$=|ebM(KiewTGlN9y^~N{+a*Z%4jqoN`AlMbPofJL0FETj08Z zBnW=c${H$7ofj0DL0hVP<3ZkhD+3LBL~ws-y`;^aiQHl%GV@zKcl1)lZU~%X^E1uX zALg+HoWb1lb%>_|lwLWTHUYV+JEYcW2O*_BrR_fPoKEdJEPHWbyvgn7w$Q(uJFu zU?i&)8VLP7yX+WKxNSPVTHQ#r0N!o)H>6AAl*O}Th%;%!D1C2hBUYbykI6JBY_n=# zjZaJzyhrC}6*)?uHJk+MM1rgoPXIpVvBNVW2Gtc2x)d!nul~kuAk3a-{F6Y*efF$z zJ^H8y%JnkaImU?Xc#EsHqcVtiDMYboU##2diUbuYGLGW>J#3;>;J|Al<`0 zG^{FPvktdVW${~uR#p>kbQux}t)CI?;`svejShAvtq51LJ)Vp)exok!>be~aCyR5t zQzW|zJkA?4?^2@Oivt~@reBHP3DVHIoQte4O^QZtVAV83jc3PMBkHqtj4365()k`{ zi#GJHB@7M3*p3_D5BCGZDb=lqc@|$yiT6WInh+N^gJzCR_WB}dkySwx((7Qwx5U>o zkv`PRWT>>969AYrTB?h@0Xd`5Fvj34PXLbY%v6G3%xC|7)EqJlJf2F?AWTvcSKpT8&a`yUl6wlOIzMsL%~1)?Cdb;~Ea$D*5;d->QqK-RJJKB*`*dxqFZHOG3fZ6yMqGLlk_(6;Rb*uunRO_2!9u(Q~$2YXx$efeMn zc!u=$$VEI#X4h`8VAZ2H!JWB)Yo@!r(G1*Af(f-`1>?p6j=l6BFPF{SF{%WHN$xuo z1`y02IhfwgWUa?GXbOaJvvOy2JyeA2LGH|%A&$;Bk}&b9&O7Y=xChGM+q$$ck#a8t z2Jk4!apux|lT+@W8tc%ZN7DGIh%&4#+M0oOk%iVDXmqBgtcLkCZzSBqRzB z=wS}^=X(*w?&%Dev6)3{i{`BNrgwhd zdscc+^7(=Bpo*^}058zNe$*CG!AhIMOEe80*^ww;U>F2uxcNnV^3HoKO6 zyr~#wCDh+wUs8VF8eA#&Sp@t%Wz64L`d{w|3au^Y$ZiMXLJqx5)A9#v3E4P*=J&SD91 zcP%;Px7KL}2i1O91_{6!RG(n2g2KugIYOYe7w8vrZJrl*8*zG7jG4ZO6J!X&owG(d zUaBqIQJV%0!P{7|{qPOvEwOcV<}+2F#mF?2_Z|XzMuN9F^V$J~DR4YA1<)AbDezDWf#Bw-#Xv?0KHN=NYSi{wxMFD> zKB>HEOKWh<+`iJ*b&D0W!ax#b1&eNNV&zm zwR6L%OYWKORz`t)iks-NWd{BU}x4giv{n3=gdgYS>a2}xEWj0C`;r5b5Ec1Iu*62*OH9e|X z7BvCDxXR*oLMfR#yNa#jMZ0O`#pYAZRYgh3xlFv!(A!-%T`+R7k5dEMR958D$+8wQ zT|wqY2zBaGW>@&^cE+#9pB03zb*9G89WnC3xko9`qF&acc2-=&Ey4%>e7p1$@Nse> zLt8{5b73&gCqwS?88=U=<5~Y*^!za6S=q>rp{30-j(|s9H6mhi z@WG*)DCgb1n!=mSP-Xk0Sn1z2(~z@s7f15p$kl!g&%Y0s%QeTkH$=JO=E(l+P-Ox? z>9}cRh#AQLzQwBCrrqy}HRGur)yg!HOyeqn>KWbI_}Yb9MX{omJc!}7X~VvYU#eU~ zYhIBiHD_+0)0)7Yw~g6tOE1ZPUQ83?1H1UdBaE-=08Y*?Frn*p^|Z*$&;px~X7xQP z<@Pf3O1QJh;0c4se!9rd6j(d2L4N}UL|+Fl|3SXf7WSUjb2_2@{BRkSSNQ}^A1EyX z_rAf$X`5?k=6unTWuIjm_~3AH7o8z_M-go3V0wO}Bo3c6;$DUB?bkFLssjL22U)4= z?+f=fZ9`%v)L2wpn@#hE#0<0SDq-cMh?Zv076lw7`6v6!w^$j~G`==>n?28CM-^|| z<^EzKNYXs<0u)=P347KiTrYGdT0O&)NL+`Hr%7%a zTeJcBnr6hnmuaD(Cn@sYBl}~cJ}~YcVMpFlBcvz>g{+{4qMmU;{b`+kjT!aJzs~Jx zPLC;f_;$n>z=9te z44oypY}BSDWU)*Re>H+>2;6%cfZ}=S8epoUmW(t`|4slYtggrB zBLxGBt1D|X7~{^19@ifx*AYl}GNG@~9{EBVDqU6Mp%GJMLARz#C+*)@9*a6Sk?HDT zux-dH0r}o)6m=jbMp}zjK`etfx`>6doI$YmaL7?JtY;y;KXP*tge6<-N=^xP_HJJbLujU zt=?FHC_0$eiGXlU-!TFqJh!LE5$zeoen`xIB%}L&V-(coNhVJ8csCresj~9d!<%RS zVz&@S;@9Br`~Yt?98e9xaqg_K-Q8oD#(S8go}jZu7CJIXV*}-!%}djhAMSvclM23n zVh?jtY1l+S)W@{>&xu>s5RC$HvXP0qEtE7ir&KTMT&Mg|m>DfQ13e?~jUTM6{v^9B zT1txd&DWsSzJC8ELVbf|Hx8!`_hAsP9A;E|pN{=&|jgV#X3ceAr2B+hrJ_~hp zgVJz43(yN)2907Ar7g`{A+_E1m1~e3LWuTtuqLdgG{NJ6U-!|i$UjI~p*>TU!JDk~aMn9=W*bGvnuOOj8jTTmc)wgAp)dT^H)#FI@Dx5Z=dG&q{1G4S*Edc}hd%XPmk z8TzDYscDn+6iL&L55>v+cpso)ud?y14*o82b(2#})8yZ79(k;rHyXS^)c&$ZwrnPE z8r9J0qd_d+T-r+BiR46A&)OMN>wZh_NvUvoW7UsV#0a)Es%MXEr9-UwzQee3fq3y3 zXnr=PJ^0#MGycKn{oX_3?UAg0A`Z5pbA{z=kNgFfO2dXzzZLfF<~SdV{qiKKyMU(w z`S5G}LD(Z%`N%^e>Rv^MRKcSh{n*>3T5S70=Mh3Lkharj@%~m{gum`u(tF+Z)C>)2 zI)Iha`51gczAD zj1i2zayt@=3Y*ErNpAsf*F5g%WA-!JS#DYRNC=7Re0x!IeEhQ~uRun#1=GI*kKn*8 zeN6zTs{kk0Mb@);VLeQQBNt%w>;Z_%qG+x)CaUgwajJW~Km-K~aqd86?hriQ6{pk< z1;jZ`vjv5ih#f{4+$7Qfg@l^8=bD6Ac=JX>!fVAP)LPA}bas6W7ph=3;+2HCpWcwI z%S{D*S>BaDG?sO`$p;VLx&oyikX@k$t5h;1+eyQnItA|iamTXxYRnL-x9sZiYgmU` zfR;NRx3l!^?o}>yGixI~p;Y*j%VM;xz}j>}xpYb~JhouzvB~HtH>=&~=_zzJehf~K z>#Om{Eu9(ZbqM&Q!lO9z(#$&h?P=&p1KR059)gJP9rs48(PfyH+5THJC&%V|c#s_r zD~;mSlBbp}cxbK$vSBaoad&Cefn-Nn7W4li50H_Mx}BEjc~{BIUqkV~z(d-axhUe^ z{ln*97vhnwZmGMowpJy!OVKrEEiI&oi#E;Gv!#0~CPvUHwD;B6dEUG~UOrxCs_T=+ zKhP9Mo#%=WoV8*&TSD+r;!UTEmz@mwZQJc~@qSf&@l($Vx_=3Ckk^b{AJf)eebZKJ-r$rP-W~IHw{>7Ix*QcZp+Io2HhDQP%`PVxwt8VAW_%~_ zX2o)P1Fm?9H;$gn5-bqB6OG#L%%D7zyQCj$_g&=p1gIK#NT@n65buKd&YMy=_lgAm zq6%|bA7#-JUS*2@h3!FEECjz#T6&bvYrrt_l$cqzt?1CTf~@l`=$9jTydOe054G>) zYV5Q)!P4c;yn2SAeXPSkkVX!Ff;{;zT^z#%w<+=chK8RgAoBLkf~Y zegqt4viD*77(3_yg|!2}DcTV>4Idf=hf=tsKYnf+DojR`kah@M#|!OKf)u}ioRTB= zn6I!Z&q>&;o$js+~Z9On;R|zGLSyJHO%r zv<*+@z{cgN(v2|AcPX9>=F?FY&vgM$wt#~11L?A#phwCs6&6!KToAMc!-GKx0-lI& z-*0wPDyt+M2aN;sTb9u$+N%q2@NCb#1w51nl)7-E$+1R;Ld#8ph-S zGR8?0XsQ$!>(lavXaJZAV(*N9W=!L#n>X}f8aV}08GP9+J%z65$fhpbLm^=k1s6mT zNl5fG7I79xS!}PVHI_V@q3jaX*>>#^cxH*t~*bb?3bwWwRCUM zifCF|LUyF;)d9tpglB$trW>NUV;jumI2?r*N~l3TryXI_I)w@DYf4ID#^VS-{3L1D zHZMGK9|^nd`yFuZ_N6i7?tocraTsKQZsbWK(gO6rK4L^<=8rF+{|p}3v;i@e5G7L1 z=uVWjDyyYD7*E`1n+v2s(Q8NXqyp8DD&n~(ZQBMbNZXE5O}1IeT?gIJ5`pv=^AwW- zuj+q=5R7y1ia=?QX%$SJC<#yct6D!S-1@@QExEs8Q>cru3&{_a1{fplIj?4xXVuI1 zmt8}eFy|C3CK3Fgp5%GcoO-#4mONYgMGwAUo`ZgN$SimhMVLaLEOFNhrBnO(0w z1@iJ{h>e&)V-4tXS~ z%BbD}|2ZV;WqvF1o?_K`nyR3Kymq99#2Y|AA^w0#N(q20*b94LKY3cS5>qqqff}H0 z{vSQ9NVRon8ErIibdlV8U_QWxf{++8rK7mwG-|$sK06~lrf%E5=3h^dCnL7ck?vaB z@t&8<)^KJA{ix#YoZLF}=5-f&^)J%z9`t9|#B%No2v<(l#C!uiB>uciO~U1RQ?7$p z(81Rtrta(T$Tn(G19j+Z%n?ur_YI;Ob0ZFzk9zRgXfB*y{z#`oXzVAia*xwCqGC6Y zq_j+R#U;$Cur(Fg6KI6P`81gDR7V5-rvZRS$af5{6DLu3edti70y-N;BV8z4 z0Z9RamleE@QI8Ln0Iq?_I&xD4ufrXH3Bq1)M!?%E?_$3JPv(aH9AKEAqvejq8bZmV z8Ekwl_+y1{(Ob~55nEq+M=ZCyts^gvX9xTz;H`Ao8cd` zd0C_xbGUPezx^H7@@0<^m(k+7_eNi|D1dUb(Y+?VvEpz0nt1Yk;CgqZ%di=}zJ^7< zP$UAPhaJjM%Z$!tv;DLLnqK2fuGE8(3BJ58wbu*%rMrxTAFCM~x-#+1zyQu=;r`Zt z9=1s@0Ej2+TcRrMJrKoKWn2Ml78J(za0%=BJIkvA-L~L432T zFfsftWzfTpmo;(SOgL8Pc0SZA#cH2xY42#=SrtI{iEoT-M`*Iu%iyq zAbPkd^W`(J_8gf0u+kG%6?r4O^4N*i&nptJVy&NK|HaY9d*g`A8=GeDuA8mRHjtY)4J8vFA3g-&E z6O^Hw@H$nj9|5K_$Y$n94_VV|PfY8(@0Oh9&S&yp_d>&3SAu)Ux&wkm!U5#@C+v(N zSyAx1nsjNHi@}_GLxe*O%v^c>0r^pGMt{)TM1TC(RR@?xzq_xtg3nW0)L*~jzK=U- z3S6OMl%lzh${5hzivspzgIo1%Te_%<=>{!Gdqz-*1iU_X-4`&>;3%5dww0d3)$fQ) zbvJ_TZQS`TOqDuS#ig;jvY-or8El_Z#Nk@^aIf%CcLBK2p{)&FWrb}iMZWK%*n)D= zbwm74M6nHk$o(U$gzLYJZ0i*wrVm}+(paz%7|tl6Sb#b#pI^vtd7@K|M9IxQeu5SQ zX@K(F!AG=RrOBF9m#?93GUQFB?aDXOD^9X>RFkdh*uN|tFt*W^I18Z*Eh#ZP=3S%X z&bvGN+#a;ZCZtBG(HiryrSh?^y|%d;bBi;A&w!Zdp7-Yp*@e%mvixzOVeqs7@%0wD zCj0dTWNG_0$u|IZ4HRgpNR%Boj@jzBRX^RSWns?Gv$NYi(VWql_Fp`aCKc~@O;Y{D zlTux;cLHxl2ch?YZD4UYNq&S|`m|Q3HbN(2DbvvUf-eB{XwTlMB9P&`k51_*Lfn!D zil_JZQ0$7(eTJimcA;tp3EU^AMWIq_4##+sDa*r)$nQt=YR8@kURDu7DX?hC)bR3I zs#*}x(ye0p9%Xje#XS(UAwV}r#!|oSCBC9z}BwN?88t~t`1p(!dc z?JbsSY4TAK7K)Pdv7_I_rRi}|NKP)+G?9i$Dk@4~gC9OIE(2?c_X&z_8O9|At#QwK?D z1jKWTLk_O^iibj8sARG&Vo`BpcmOv>Z9;nlExkvc^i1nGkZe*g%D%e55aDRRuPmm0 zs=?{fw*Jp{7PjjgtEN~1yQHlahE=PuDFWaG7+YXPnSDTncFm*(KRGV;!$~iHM_dt$ zvQd>q>$IL`9_t_7+t|x2qe@jn1#TcI`W|-g zpC`VjHAxh(J}=RM4XXPO0*W-K9&yGaJZ~4~b_(ipBmPh{)Z>&VBwx4vGs(d3HoT?v za%aXGk~C472A}{{sk!AJlah)ml^$$TzeBH$g2;h7P$Rb5yi9?@lGq z2ydca5DQNbp{t;qPq16x!aSlXLu0=EvdoUbnx3{geAm}yOEH~+i-1l@Yhi;Dh5T>c3S(jtYvjwIJQRZ zfx-q`20_epl4shKV_-3bKz+3xXEiL0e|ppUO%H0y+X1t2(el6=MOsb;U10%9&)KDJ zCh7`{&3O`hZNd4n=+tbM9^&|dhswV-RZ*i@XLr~fRIW^8tM0$cbfmBY18wY80jKi3 zKi2+g-&%%w%@3{I6YE@PeA;4J;r;x|v}~LF`d>9s2!3s$y%{_gXo}aG>0I>FZ%!0* z06keCgDAtGmxUCdoQ0UGr7q6TXB%G4Ei%AhTxw>b<2k1aOR5v+DW$O2m!0NXdH^Es zWmzy55J*pb^RrBkh$ z7|r#C|Lu0bwl9`4urA$0d3d8K?A&;hp8n>DLT!5;G}#5z{;km|XtFc@!`R?I*w3xl z-f_knvK$>VZ(9$^WQE8IeB%b6{t^hnWwYnshl|g}xUF1Shkk}%&C)!5dHg)&tzQ3K z8dUSL5z2Mx)z4w?WMPfmo!p{%4!NCjI3f3{Rm+*6fe{9=!LxxC-d`>yA;65=9srJ15F{ zTQj8RDwA!N`0JJbgUxfXZec6YcI3J-hWIH_W)&vRwjgX?u>CVm(Y2;zmGDv{9;gqD zW%3+MWwL!%C2#~uTodq`TQpLh4$87Hm6-CT9uDKXQI&cwEa|J*lU&;znlf}zX;Mwm zLMT~e!dS{P-1X(pvfFixtBaiyVp*#ww-1@8pOcE^jeuco{uXET0Nrk-=$|T)M8(z` zdF(4B$G-uqUEgLs0Y{O717v_#JS9BPwk*<;n$Otls9Z2O>L1i2PD$Q{^3rmmooA%h z!<_OAYu-xrle)|FOLrZ~qqgVuEx+*iNW!i){2c>REGAq(ePYDBbN zu@uUfg&~f4$*+*y*Ov{TK2@{L8ySihWX6wZM`t7Rk8Zbx)vI^GXqaU0Wf=(9l;}sd zXv}BeU5c9ax)2(k17ez;@FAw&*~RUscOSCeS|jlt{#Be-Is?8e^fC9Kb#_d@-5r&)KJ?W_T0AMEbPW3cCHA$^ zou~afxXt9dk58Rdqbu{KNuO&fofhX2b)S=GE!7}0Y4wLdFM6+enccYi=1R#C{{+?) z2i-6ZtyR~Q`V_MKaV8OL0^uyJgQ^*~vLVHb>8NUx!lkqVmoKyWBCEE$zxlU#*WrY8 z)znE1ub!uz|3g;Ews_!0y%Hw<5^L$Sg;z<{j0X+7sATbX#-2TV`+rbu001XORYL#h zYyWfpQN;g?Vl%dPGNu3TPxgP5S&1)@5&HkIZD}w70LcIASrgO$Xj{}Q?U()`+jjLC zfgq7k7L^c$bOv2pV@S#2T7}Qc4!N)!2k*r$U4=P+xb0Uv+9ydXOEs@&yFKmA+*&`~ zZ>|<_y%<$Pjzj9soOKtQ>71)vG!=CxAU84=p0_e;X;TxavQBP08OCmZc6WbrMx7l^ zm$x!X)OJgUf`Yu=@6P~9r8yN>q5~TnCs)-HbDh#bQ$rJVCYaK6#qJ^lafC$0)E0Fn zC#WDsq77p@%QH|-Pl6*7s45m)CQ7zC6im%(Eh=ZaFXojtFfE7nV&8P+msL(Mfn6|| znG?|#r&C(u+ZjHTWV2VND?sEF|CUhgDb-FzIGsDlIa}h_dF)*J3D*R6qLR1E8tAB_ zIoXs-g=OmgmBz9CS7fPjI)^wIn^h47y~8lWPCfA*f)sotQg*h~xq<5=4-DYO)I|O> zE15I(I~<}$Mb1@s*4Rw91&jB2U4(~q7J7JX1S5H9Kk|GAn||Q_dg~b0 z`z<@cgEvw%5dkh}fC5G&?j8Wydx!-=GAytFKh}HTu2@+7C^=M7%8&sSUA=rIvy{kn*;XC@$U!=)>sh*;xLkz;9-~^140iS z1OY{ax=}il+2ZSBUw`oJ)YjdVvYa7XWmCU@t~A!dLYW z=3S8?kzTA}nDd1v@GXdv)|z>M^L3mtqs5ybC+SfU3GAXH)nAfGFS@RXaDC8TiChH? zQb_F>rkm1PF%b{T=7`=+HMO)!0Mk z{Xp#`I}5IB=&LaRK$IzIBx~|3}Dv1F`&mQ%F^O_iO3Gw;)_2RkPy2d_BhhF?IE`(n6 zjD|~W4Voatk{=6v{VsSQ&l@YgQjvRUr@|=7l(|zYBX;;vS=Cd~m;;X@jmnW;z4e=` z(Y7vR&JnskI%+%*r0q9WCn{JxScXh`s18i#mCTJ1)El3cX*6h4rL&hckE8^$lkbFwB9DT#wi z1}?Ex$%jaAvvIRZ3E5u6ov+SWevy}}UVEiw(O!H_~@SeS?YIBup zSrwhGe_S6GurzgSq16NnrqG1D#d9x_>HyePS9IM+lePE}pRO=*o6lEit?pMnQC>x+ zv;OX}pqv2_k72j6!ya8eC}GtSt-RvpZkcV*xtQKE#VBo-u-#^wEr8h%cKYiFD6o~a zWKrcT#TGC#A+1mvhCJRjWMiH6jm>Nqx32)CUiZX#i%s>!W|J8P^_9C`iz(^uU+lzrXe|EQYY;QwfwuKR0e z6o$m;tDfEgN(Cu@RPt06`uYdvIgXEf-k-nV^!Fv?@K@e^5BXQoecD%j9$ncawbkCp zew~F}cKM&-+cPM?0sZ$r{?F1gc10peoD~2d^ZWl>dj8+L+r+~7-_r96_tP6|?B4ws zRr^&Mh)GDuZAq;$o9K^i@3;^s3c2m$0&@2Jii7wK+?3VP&vniipWQ7WxR8{7bHl#f zKX%%G&Od&dz4=+hI--C3ODUb7<<9%;GA>zudJPsBBtudz>l9X`j02!tWNnipF`35bKSNBk)GUv`Yqdeq^3mzF|bex!y-?VS%IXq3b8ViNV7`yjU?Zg5jMnO)DD7zp7v zELuZ4sPXM4Hlm>w#1f<~qx(<>`q+)e^w540dno;V4Dt{^U4MpLkoH_&xZ-{sZ#BAN zNd`8)R5#W$h?Ndedn$)u3nPl22%`(R8&6(7m->LXM+xL9cmul=B;ngIyB)&FO$+h%K0St6M?$5DxPr z(-AxK&ZP-tJg_LLa&AFfuibKAKsGl(bkQF`VyFY#gsX>>qJ99~KnEX31kw2h;rZr* zS5P<3IFcfx^AF+_KCpEiX^IZGdxP^}XZMzeCr$*i-N6s5A8VNb_JizT3#u|pvHHDZ z9Clm0%j^#%AB&w=F~0FB)Ccl@*s(6w@Y&NZ7J zYj-Mvf#%CC{MY#K38sIxPB%0gmC0=d$~~P{#p2f~%Xh5v;1FCNuTjPU!?RaJehYm! z|Ih=#bnf}N1IGL+2t#GN&3#_;>j`ms&}+@O&#=#@Ogcdk)X39&U%N-+Kj}Qt%YOvT z?mNw+*>~=sDYot1_^xrVqvm0*aib7|5;lvn(_m;1lb386zp2- z>c(*CJX5`I{ltR+OlK=_i~7648^+Hvxw8uofbL-IB%HU~XFK$W2LPzB-XmBSar_tF zD`)8son%i~?-N+WY~odu{oI*^luP%OtHgi z(tL*8?J$XpPyCV<)a0o!@#DWKU4xy{PnABCgbr>^XHDg|H!-`>M8sth z{pK5LJxa=t<{6OLAn2EJ-C7mW`pB{?5s4r|tRZap0kuk2J57)9YZ<5u2T?T>%b$;` ziABI>vT9R?WNrekgfE3OfD4bup8FXKy}kkRKD@5A+*>5Vu(BPqx;;ENE`o~C?-$DH zmw8-JW(`&c#y2nh?Ol%|Y_jj^N5gMVq$LImEUO0CbV-&HTSA0TK9HX5) zcaj+D0oI0+NCHZ?T37RV7l^3^Ym|P#5_cGh2Ik?Lw}=>ShM0 z`!eP{p@j(orTgb>L9dn3=+sYi2ebtkohr?P789x|nT2Okze?Ybr;Q{42b!F~BS2H+ z+=^=#XLY>(EV=0{4XWp8g<**&*9Fcph<@zi&Hfi1oVvVT(7+UK)!;~d>6 zND&4AlFR*)!0{!*>T*l-=C(Cwmqt8tAD6S>6Cye7%g;FH#_TRCGGI5x@@GNxcB2~d z2D3A_oCTqRRd&0*AZb94H2XY5pnhVr&3fFN=kZ<)da(TVEOCi&jVTw2*hd$vmMx0; zJdJ%gpmY(?Il2L$L!-okFM$2k%c-JmF#;#i9Fgs3JIQC5gY`xZMhu?{9y_l28JE~U zl~{7Wu->M-Qs27PW{sqj7?wcTdl>X{Bf78!tAy7gAaV1so#57-f{qG80s1z&5!mEr?%T( z0AH+2=vUtb0THTC-v$tZEC7?$1g<{FYne--Nx=W<__RW!uM~9!=$n172lp~81J{ar zo3ZaJ#p@0t%%L?Si29QB3Hti;nR$+z54I<`;|{Qfv5;Fdj#svjXh1*f*DogW@OU_a ztlPZCckTv0BnaPf0ZgXnF1OtChcE|d1>TV0saK)3R8ojPEErQEk%P{OPYLi1kX2~C zdwY=UW-{g5>mUvRi}``YLE?DUB2Q^ehHt0_D|V2^z`&{BL$ILqPbVN9EiuA}++RRb zA_E*2wE96H1qV0zot-zZQts*$D`oPALCG6o)@|j3L}pS-XzNSy072_R)cJO;HcIQa z%B2s#bx_;)>Ma{W%~xotdkJ{Ib_?SQF+)m)13)aF5GC-ClG#n!RSJO3$3dkaF{Ab< zY20+BKFZO{hvRPEf0L3wbuS&w3NR>cDZQ_swnnAvZkeCa#2#wO;6}lHB@N)cOg}sg zE&fy0biaMjIY*)tl$Evd!~oDT$~>es%gx(R5^&uHrZ|2(0-t|)kfVddm$)_Ly+Pt{ zuVAkR4?o6e<3(9PHo0)X*I72-zw$-@EaIB7`Cw(N(CunO{IAY!k%^iG+AC44O7jC& zC1I=f)%_>|d}g#;A$eTqAmgt>t8qB-{%}(9d|A5QtWgA`j2| zxIh0=js_k$=*izL{LkqaF1=OMr)79fbQ@1XEiS$akU`B%S zUD6z7EFq{SQar-M(8$?@+E0)aaKYp!m_07_gZ8T$fCLw>xm*+#2K3NeyD)2ykd;mn zudx`_3i7z+I4UR`S}=mZm^zWT@8bM8`m_Yl0q}Qc4dmVL==0~_u>A5@1c|_R7O**X zY0uc>>HJ54s z!VhRNj|~-(L5*v%unVd5MnvJl)Cvk=7(0S-hk}!6%>tN7FgPJ4Y7$XxLR+1Cmt!ZO z9niZJS=$h6)yEsYGUMCw031SurGhjTrx6e-t)i-c=L;tnU>VHqu1D8ME9HUx6SY6z z|5Vt@Amp#Q>cQ{1eFi>RI#B>cjyKb5hQ>ovKYl@h(yGDb#?S7&8i8%L<*90Q9 z;7Aa{IA|@7a6~1{{gBhV(Ds;r`ziu)eZTg^Gl_d z+l5*12doXATykjwIe&vz=<3B7_|4TDbn*FqqW@XSBsj@jEzO~tl3byi&EUWNwfME` zzlEAPt@P?nS6!frTq?O8r8GX{Xn*!JkD_0$uP<7H2buL?SE(JytPcaMpltWl>O{nN z6=f^0PB-hfB(~d>7rr~ys3qctGO=#e>LKK?gvh64@6go+>zxU>c7}!$yG^dv8Q+Oz z;~@5C(6h`57Da-+mVA8Db|8Z7s?&E?&)C6DXKKQHQ_g>Tl4EXFLb*jUSYei}o0E@R z<{~waTL?gboH!yN(P22i+H8z6jT{Z<&S!}Ir*6dUCv;d4j{@UOe>ApS4`o{hiUcBn z}@d zDK*A)%zsNJ3oWKp$d-K+7807-qepz*QAbKCSnjnx{Cc>G{s17>G=yk}25)<;|Fl)z z&riimJ`Q5Od&`9#c=v`AX%xRyh*rT@z$x@!M1UQQmHfs0G0wJx^?iZCW6BCQeyYMf ze{}+*!o__p)49?76J>{94P-?BdxFK2?lX_i0&ZDajd$o&0~#zOUn9Sbd93;qy7SZR zC0{YDIR`og^d_n)D>DSe%Jjoft6r!C7=yXz|c0&p!wTL;9Y3VUh*tf!($I4oq zNK%*^!R_s|ijv+FDLbypTG#y!of%4EWPq)Z(3Gsrl=MUfhHON-2GHDDbD=oFS?$Ro zeRWZA@%>Xq|Kk7p^mzszx~?WqHswW>V7MdpPx35CwbXMZy{$H#)-cwHj-Xz&Y55J+ zWj2FF8p>~-uta`rn?VE#8W{7UwnWK4{~@-QRiGyPohlfkhcTifWzCf(L3R%wZmAQ@ z$C>O>40nOfV39KJ`fmMQ`axo=;F*XK zIio?5*S}}kWxUZ?d_B1;!W2p!;nq6P4CR!qBv>A4+DiXKgx)8pPaPFjtr_+Q?LE36 zHBtMP?i0AB6#bgS?L}&z#(UQemeJ<|lsJ_UVofMTc)I8@0Kw)DGP)zmTtIRt}V>~h?B=aFOrEaul@%}*0dqhX703+3LO1h!l+&pYBo}ZPzWyuC)WsIYcL@y zekhCwMuP(`e5*wyG8+nFx9MUi7Ar2^@CzE;YxO|19(|APpQc8gY6BY`%#R{Ae;8{X zRT;4DWQxV&O^3x7Kb{JlzujAv=s~O(SvSI7NT}C~GBFm0z^OSB1o_!_M@AcWmt`{< zY#=IJ_b5h;rEx>KJGpd9FSL>n(_{1DTIzlEsVpnzsw8cpof3PK{2{K!sE9R=056(c z6sX3)6jM%ER$hxS)asxK&sYxSDS}xX(~*GAhB?$vO}q}Z9xPxJl~1t=I0E5gxS1X> z0Yjnph%A)?8%HR0=!Gcs%xAO&@NsL0p<<203Sur!_LseCU)Y7^ec+nCF~kPDt1epD z-W^>vCe+GqD5H#nR{BU75x*R9?MV%{NCN)cD7+Vm&A(hv@h-hG`CeSA!Bt+X0<9Tl zQmOhr9K|}h3}dF6iNqQu{^}9=C+)y^{&3usx$@R8F-czN2;U4j08~kvgc3%`0iP4) zGhbop-s^%TKy%ijy_h#%OYMc<_(v2r#l}>R0n9fk;KG3i&xzE{&i=0iHWpEV=KSr1 zhV7@9Dei+>SqXy1{aT8kK&vIfbjsC!oBnqf6ts`C=rj_AUxIRgpoyv2575hGF7VXk z&CTXEnMGoa-Qk-@5?eUbFG3Z;ZPeWS+4YR!5Jy<#f|Tr09g%AHG|R37+}7nf)?-J8 zV-=aXJ8bM5X^sGE`agB$qE?_H0!4g0k9Gud*s=^17EsUym>z5=!>BRgmEY=(JvYmO zaY0jrY#0+nQ>79MO&K_=s})OCt( z^4OTBe(~G8d4hKN9-nnyqN<5(nnb5O54XyAx1;SvZs}JRrGGt?YX2V(x!;cotqYip&^L4iAh9qb^IMu4Ym|wE$jx5unU9Bw%yN z<||LqXDaSguumd)SEu5gh7)YMCr0%r!4^q`=&F*@JS^}01@(ICfX_|gJdKA%JU!bU ziA2yUP(M7~WKNuwBzTYbub?cqGOs)T_~6=T_w9|TMl@-Bij>Ij@StwC=S0&&1=?+C zkGFaRwoH~~Yt1_22oz1vye6yKytY05c@5+%r$?O5C-#gef^OwW?tFVNRyWs&pkp@( zWs3gLt1`)`b0dxNKH`h6|!Q zr{kFn=|1Th(wn`b2t^+Fpz);)Kb}}%{#HWnDHy3XYVCj z#9}sA#Gnu&iebQD5t)c!*?BA^8b*YXK$e-)%ue{p6Y#j5oJi^eD>P9XD32%F&Hbkd@b%XT=gzGISxno5ZEC(n5(17}VNbs1B!`dlw5#(V zavajyphtUMzTB#1>=dK%k)O$$yKNBM0z;Z>(bz9Su^+WKspOpP#n0moP)?>Dzz^Hm zP0|37To9v=4Cu+H4I2+oQ61kVKbBO^N^3J^HY&=6#6xE6R}cSj(by5Ld(DW|xaPsU zMP#;{&HRKd(#k}uqI_l8)MslqsLh!-#@D~~FBXiVoM@bDwKnNECQunl8prcK@;D67 ztb5lD*_(HIgU94J_ZpV=@)I1W^em{5PXo*-uoCmg%f&qM)|5uk;tC0d zLUUuLOT?}eb6>J0ZXz2)S|H6g3L;J5q*iwZ&Ug@D?iHT2PBQO`vinKKn>aB{TQCR& zn3HRL(s2aO%Ai`aWNjQ(t6I`B+gh)=H}FMrvYa~HU*!rb-771Tf?pM1ehJEZ}n-$>)4chIKSPVC9hR$0^rz zsLI&VoZ^6tJmfs7bJi%fiF=sKk#=!WA}0)#*MRU$-hxWQyc*8v@$$V130ktR0vvTF zIf;&`Dl?xf{6y}ADm_%?O@FTL5Kc1Dm+gq9;o@2)kNc8_$y9CjVT=Zqr_x-vBl@f;ua^aI6N>EWv; z84yPuftioht~pCM1H3|5)s&Zu9AIp8reNFoa<-)&7``?6(2~t*mNUsL{KY(v-!@>b zCoBE+I0ez{o-8BfMY0xG$^@h59(twO>SSHMl30A&t{|@+vTz(j@(S`D)6g0KHKcd_vv!t=qxrO<> z7-6^rlvLiyx+V0mkw|=bEdI%{!mrPoZ%CI_a+n-!;^r1}EQlZ}LyYI#h9we^AjvFv zuc{PMvZeU@@+ZS%1dLTF#R((~lIUZWxB}cwnm6%sd49Khqkro7ybQRBu_QHx z8a`CH?BXEcBfXgpsyUhHU`k*a8FlBz)<(lDvG?wX;v|%J$;LIldK%g}9jZpFsuV5S zIq0tIeaa%7jc%qE4Zc|l+d)H+LNw%2ql!j?r&%gbnOG|}Jd3>13h}uPc}Xf)xf}op zZ6RztD+W_hD%7@p#MJgWn#g;5g;yc^tbCYK2~Sx{r=XJv6t<7+C8l0Q{b2mmis(0r zWEKFK0{&?HTO>O=tQG+L|-SS$5}I(&cD z0ZklFZa_1#7VxJJAwtV5nj;@6{G@kq^iijlBwQh#6$;VBohnDkx{<1U?R~ON{@GvvL@HrO=Nzsn zc&E-xVy1Q-w*u{a45lAxI5j+gV1ul&0?1xJOx!9He)yh_NK*TQ^*0eo^8@#~oYucW z=@)qk;Wph1;2yw;w>s1d7KfCyua^||rMsT(q290q zfw6IGx%>QJ$DOlGx7KmzFCXN*^OvO#Jm;Jv<(jfU_DE=b(-Wcf?19jAMmw$2ricGf z3SSd}mOVkLSM>U}j*b$ows^WTfAX$#x|11C&$#TF98Lv(>qV5t(Uxdr#ahUO=C*pT zAzEPhVyMX!eToZ8 zy_Jmhg^o<8oQgSp@JS*vl&Sm6t$cYg9FoAlVw=1zI3utHjBc#p9wz(6cb1l)OQfxP=OD*8zBvX!2Bm`36NOHJ>>;SYXZHZUX28}tA_IkBi-8?Df9oca zp>uU|Iiy?)n1_sB=FO)}5@48Mn`?!orK%F12081bQTD2(abWWOvAGfLZtH1{IfpMc zI8KyV2P_664a@)sfGs)Lr7@wEtIUO{hZ0o(>KY}oH{yV zHm6oWS(0SS&uo%B>In@|OOh<8F6WMdq5TZ!usrRTIiw;u z$$0LmB7WsA4KQzU8Q@PlXiYDo?sS?S10>xzSV1^)t#<)(2;lg#Gl@^)9wzDjM1XJt zlwy79t=Yh4^J)T9sI0flR26x27$?~M($ccqYGv;BvI}|cj&=)KD98+If zo6_eHG@%cuOPi@zGFjXf3|{NnyZ)cDj+ToOYwbOGLant`tpY#VI=ng3yb4#;lqt37 zO6l;BEBWRfqU9e(Ko7%X=mxrVl5`J{4Ns~DnHKM*6)dw_(O?=Y*Q?|Fl6>qK%>)}* zxL&_TLA;q6>zs#18P^@La%c^ZlAmi60VEnx$%OE!Jz_FmL z(8cZy0%4qxLmk+rk}xjjABdxC5Ql0{xmras}iDES^-y}WQI=i7Rq()0VFkbjf zQ4{f60I4BcT8Hv!0c8(Gfp9XTFW7q0+H- z0X3ExDwrUNij=PF;I~YR{KJO2yB8P3w}bBaSp_G^K7BxDSlM+l;9mjw-yf_G9zR*| z8-Ph+$$XI-P<@`XATxq>$WsOVvJg%ot@ban4R6qYZWPnP%`kj$G499 zCWy;`m8+|YJ07pJ+GjSRGJeG5se<6-h=Hfi5Yp?d+3vSsvL}Q}`ClpW>i-wwr0wM_ zp7%@OvVkW!R~*%8s_DEO=^7V!4H*KUsLfi^{tm@TndTqEl3vc9 zoqxaGX5Q)T?085H$SkH0Z+@oM?qz$nb72Q)a-??buA9|arcaO ziQ0x++iu&~7vETqcA(<^zBq(G{{fa;BI>rxwtC^b@??~o?a#(Ix`G9DlSQ+jl>#R? zmA_wT@^+Td{J}6NmRwjd()s@@tG%*5$`xT{SI(_3-6h(5kk$I%WtrUDu`V|I&%e)% z=etT&{TM4Kws+4ZwDdCA;AOD!pRo)gWwyKywsF}iK6jH`33(CRWDSI~CIt%~y<8{v z%rCOw0g7c8yl(e@_iokS{Pyc|E5HV;&N^nW|1Sm)xER1(IAnS82+=&$-nQe`Z*FzPT84L08_D*hWF7}z81|==#pDpvtq83>arwTLk~>%tdrpyi}Y2si5QMlp4v$=_*Y)qgamBrVj4#twQkjxT7cS1@K{z6_H!dFGrGjZ4{#4>ZNCa-&OZ@C0c zMW(TSgfvd&4l%S;sNP z02GbT%kty#a$CeFoRMr+mowI^+&(wHF4<`Uv4k(zXT|MtUj>J*TB%S!Aj>mHYF<{w zt5@Q8_kt-BF!%Q%TD+Q}bK1O@OXlYXCCQ8simCi!O)9^5cq((GDUtf%#nvDrtrL(N zUvCjI!bZqjU=JHGgXTEU&xOv=6!T=AqInFIukhN5!d3m0K0{k=;68kXTyc!R;7ht% zB2roveU*seXYq*gS^gdYO=8q1z`USUV*`$haq`p~*cN@jx)kT}5$pucl@#R>q7Q2E z0so>X1!mQR_gH>t*ZrK# z$Wy}auDoiWfaaq(V`svVF%P+IR3z80R1>a)H-h`fDU@0Pb}GSw^6|_)NZe(vd#H>k1p@+0ZW}y8R+G{mdl? zu(mJ&6af(Pf{Zy|KtjVQ^+#1obi#|N6X_n*5ETTph~!E$H>>-(XMuWS*&c;*Ikk%F=eTKfx31zhGRiJ-lEtl3c0P zc~c;QxsfhmUAJSBwy6@vWK9KzFqo>gGSr!C7MQwM?!@ykVHI>#+Z;iZW7v&QCOk`k+ek z?XG%@z|zg9USqTL+jl?3G}Mwueo|ZfrCcGW9e_yAHT_(6H#_CjBc+b)RDaUUqi$lr zB^$l84ZU%~gl5F-en3Q@IpGI4Bnju6^3QoamKDfQw2G*IW^{jqm)7dlK5ub3+0B=U zekszc?Xl{ofrcG1%17eY*u{H-aQKaN!1L8}$$`5KdSUiCLrrV`f?E-Ff(RSHZmXMU zuM){#KP9I>53T}$sRJZ4m}MA#B>G~C{+Kz~WlC2h2Px`;DZL^GR=&~0TgB;o2p9=EcU=n!Ro_J1}PFfE0vgb~2Y}9{mDCqKI66Sj?r- zk1#zQLH)uQpR)a=qbPgT^or7F-Ogi&4nDh#{M1zPvc=I{zjpQP1yy2emudquTRDo(5 z3!|lIz3W&=OR%v!Nu08#Cu2TU$ZDmImMq=`$m*yl9p+hbcqeG+2e_IaC>-}eO-(*} znVlfb?^WMSvi$6=$VtG}gl&e9O$&F^YZEi7gJ-Y;Zul|6r}7iTu@Dt%8c;2v)S9|k zYQB(Im<5Smr&d3vv|5j{tSUjKRzdl+>|!W)?UO)Wwvr`Tws4fX?nQE`VqIqZU z*z2MdKx6^F#cNdSDT$jk^vcjr8JObuWcNgz+_AEsZgBsr71zK{EtkRjq2QNhKk3^xW8^LGqK38aW~P z?BsA&)Pc{3aQAt0SFs>Wp@De^?Nqr5}1T#C5&Ml;e?w7sxicnZytj#&X9Uj_63^@*fl5kYBKti2P6`+!GV%yu-j+rd z<Oz0qQIE<0>?GRPNkL#*;<< zN&LFn&m}GT@PZ=9^aF2=pl%e|hFnMoXcuyzQY>;ZMSpt?FDCS!HJsW5S=a9!mwoLc)f!a7=@v_QwbuA#=u(UrY@+(H&U^9j$%vV z5}T2ZQSoS*5T1CcqmphB2y!nxe)f#X#1yqk{MjS-WugzG8~J<-H`wOfzGb(r==tOE z@fZ6CPrs)h8H93+s&UZ3)p&S%WYRsYWsBr>oX2qGC?&lfeMu|;&Ivhx0F#3AvfKD3$q892T(+qKcwf5fX-n33g-=gj) z-azSmjX4+BqU_!dg>w{iTWerCz;&YyA`{yJug)IfPBy{6x;?X{T$f>yR;sFs95OWF zg~eAV`G8MY=>9lTg!@=9G7a8vc1WyP3HPnhH>8f7U;%-o%7H`@Pihg1^lROVLV+*6qs zz&goYLu=6#y9kzwS>VgG0MQ0l+{wa(7X72%Ndtf>qU1jftF;)&I8TLLHp)4bpdkMW z=7JMkRM1U2+Y3hOs#-IM0o@cT}S_;*LS$i-v|?v|;r^+MN&Mm;yA_*Yy< zq#vz9LE&-08ZSVC{>!|GDty)Po#`Fe9;$Wm9;4D{pr~>58E%hp$3ijhc>Gb3q%Hwn zgf3tOmZ3DtoG|msjX~T?OfbD8#E<)o@dyl?SZLzRYNWlmo`KWs`9%h~xT!wGk%~rbyqi9yb(_R~o=JuNBEi3}lSOKWubfgz( zI_6=QJ|j?)<*Ekbu?8G$ISY!ev}m53w)WwpmbCQ&6Fy2K1h7MuZX!|vp%>*33%ORG$izwkpPMcq{08Q2najf9xJuM9jzS_{t z^E5oW9Tt+DeB|O^wO!3_+b|4%740%4Yk>~fPAjru*xDr+(g0hJ0|qBiQ)8VS*vTPp zKmJIfX-SFGV!br5X`1>mMSc`1*lvvrz}-(Q^O3DTa%qSVPD>26Ph!!}Juzm0Pu16W z<5YDHYL6^P-NBjP%xNB->{7{w=p;4JH~v_|>w5ixXhQf?UBM9A$4RauQATeUfFYaF zrfiziJ@C8Rkk`Q-FZtj8IGOVmjQ=>p#nJc$I)=DiTs&W!bhAK6Fl2ZROdG}{17Ad_ z1YY66(4S2jl~*Gi@cC4Rq*2f#nXu09yI*`=eBhAV6XpFC2O8zn@p5HM3Sl7+M^-^?WeAA>g-!?72A++KzE%SK%99D*F!f%LOJzg_1$+AX3$6FY_$Th}xY_@hhYHL((spVJGwT$gFU zGqy;cR|0n(K}&-O$!vaZGY+brqO5Lc06tRL6<)+t@BNmEX|fe-T)udNXKD&bStmD% zz$Q3a)W%6Vc*^Lx0IX8s(f0oTt<0ud53}$8I76D6R*v?vD)HiMuU5zV;26Q zzVN2g*iRCHf1=rIKdz%H{(HK!L+z>E=q^YE0TID`G4tnsm?pv_a9aQ)0R1RVslx0Y zRc_*FE|#4>6Ny-W$F7f!`80bQX; zqGdes`N=hKi66vG6wi~IxDV1h5ykvBTBZbL9!-OrVB!&sn($&@Ec|#Lq^Um@i#U26 zOz|bX^HTid1I}y~-3Q^Vm_*?;phgLxaJ#vmp3wKBdJeTjL^ld2G@GL4GD$&B>IES~ z^{%7WDAG(JAozq)8ch5eYGBA_fJb0#w?tkJCv-ZQdBI!`yf`i*f({*yXhcBgbUE?= zAzXx{QbC$VlO;)=rw8pR#v?*`EaqP7$ALFX4C8sA7_dtQ6Zc*nvh1_G0vCz;5~E6B z9tdA??UOuANm%`G8pR1J#sqpEr5YPaIfQG9o*`Q-(UQs}x=HUbu3A_`vhXJ)Drgi$ zu>x=(lc$20A`GZe$#+31_bpe^vdKj?kkX|-G8`FAL6i^kRHyf+X({nQwu z_{kH|=(h0xccT4mf6yKd2?)wNm;H+lS^>|te z=7`X@-e{vhf16RMvBW_}#o3 zv@g+;=pJ4@AC5Yss}WQ4qStE;3H-1<_`1_<4^PEKZ^#U~8n$cbWYnPU2@1G_Vj}8l z*y+lV0p_FjU~ttRb$Z>ZIPZM}MgZ9cTDO>|y)ORnNcRTc0WNS;EU)pPoVQUl034!l zG-wbzhND5JIkGhg1JE)UImA-qZu`YW=S92QY*U3E0s5vhY*#TzogwM~DtG=(13h0c z`KUvb$*&zE!3bxK2T^p+M5FaJz_fJzJ~+~mm`Dyb&lUHTkSj}6Z_4j9BiS&}Lt{6@ z%`%)QH4)o6Ig6rK%Z2ca-C>2zD%o3zfQ$?Z!zDBb)bq@-NOjRkQ7H&h{12d7A?Y3o z2ty^HiB#SbFC>NV^AgZ9dL>N85|c{RAX;Z0`}Y=zYHxY~6;N^p0)c(V0kHhAhEHiK z%Ni)Vh{#Ha)F?c-o<);a1lcwqIJbUEs9Zk~GU$g$0u8W@_fhd9y;(4=mm}qe zQ13oy$*`3MGVx)UCGAw30I}Je#lAOv5Xugw-u2AK=#sUp(G#GDs$?pcap+H}h*WzG zJuu5P9BAI9Kh;*qkgFOdnn9Sb<4zYd`UUA%5bUMPgzX6N41lu3Dkif4mWr*Ur0zBX zsw|iHUXY?H!|?TR_d@bIjMRubFM-gYoe`T#6od0i!ZShPlWTAC$`V?+zY8XJ#0!b-wd3ER!Sw^fox|A8e3l-XhDoNgYF&GZ2Y=^> zJ+-r@I68dq19+^hh$gO(lj^`AY25*1X8DP3eSGxs5vn(5UTn&Menb?ovKeMu{jD@8 z|5<#VM$_m7uEI?a`jCZaO5eTZETvho1VNSfW`aQjQGo|ps1ieMOHfOW4e7b$9;3VP zViLC+#wGUUyu{C>Uax1{$s*!|V&X@2ct8C(n)nF;pdnmDAqMoH8o*9CnJuS&@((cf zoj}4CyR-XX@ibbb^}Ahqd?PNt>Ga1mxKH<>SHdR{>t!&Tihz{>si&LZb{YFqQfAus zCnx}t)bB(I_~mo~@cE~6e_sBytTGe>J++TNk&3f^_o);U!kAYovDL0LGDK4dfuRax zay#0Caii5@SMMDqRK=o7upkgsp+5Ni{+OPO6F(g<-#bK;7X6D@zzcY}|E*dY6K*g|64zY%G_{+zKCDnTUX0O#A4@ZsB)sU+lt*O@OV#ELw z)eb*i3$5E~3|dsJ44QQP8>7zGj2=~czogn|aMf)}>~*!{GD=&j+*Ug(R68CI8nQUU zkYY75{g;j5mkzX>71g@EZriDLxT;#?(yjJhVHl-vkRL}LllJ(k%L@gIc1fLX`Ud#qkj4J*Com#8$jYL3RhXDk;PG_gSZX(W)$uJ{-fxoK{cE zi$6vwPmQCEHI8kKVi%-weulYbCt_1YX{$F^L+l}rH`VfgNn?+zy>Y9lKc^X%w!5vj zA0|IPOjgK;o$uSdvoVRqd21k!j*Z%rzO)%N31JzNTZ>OOf}zb*bWUB`N zh&n1FtVw}lf67BetF(!ddnwXmf=$rIYCv;OrxY9rCXfvT^nGw`Jq_qZ2?|LPrjkV0 zqo6XcR`b0|l+hJkR=YMbw4} zz9HN-MnG1J_l9ahqNKDhDBe&X2>drG#)GX$#)B=1#RKYmBmY*4S2-_!c)24s_WP_< z@VXrsU4{L2!YRAtNz1buW0sB?txENDEhKJ^p{5lL_7y00FhMv&hB8oC01dVOx+1kh zQqyd~0(QKZT#G&YV;(N9mp6D)b2QZ+{jEs_&C9szX`urSD}b}CGr6bg=|2)acrlBv zz1cq!K2VnOHR3{KJsd{nIi@~)pqzedc1X)m{7^Nv9;RZsr82*z{TR`n$CxbOOWn|p zO0fsI&Q7%HQH$px+LBIaMq!EwN3={3`Jma&tKmg?;AabZ7T&`w@}^@6><5moT(&RA z4QwWK$Iq|M&f0?tqcVKKG*n+^*tEA6EX&TG3>P6dia7DFekQ_r0)2$>Sn$KER$pKk zDCB1&IaFd|YLYhuuTl()sAwe#?T(&@mFmuK8FP&S2?VHRP=z{>i-o;vmI;*to1{-K zEq2AwM5qrzM5=T|Szh(P(ZCMvs{o)g<42K&cww~B@elN%>M z&C#$2KXve%svx4EnoJb&`q?wly}G!ll6QrVdCYSp^zSPYezwu0Y@-|_tV>5&D9=|^ zOa-~u^Q#|Y4**LQU+p4z3Knf6uyQannCuf5Dh4%%VB@H=OO8x1r;UxkA(XWzdfJkoG^zpD`}Tah)nsc3Y2 zjrpoOT_a$$;XKEly%IEugw-Iad|WxK2`gf%|2I4Mf0a)uR$8!~H)V4<3e8r#75hYQ zetf=wF`Fy@oGXDn{x8KAaz7|F8x^03oc6QO2*E-qbtOcr5i*S7nXd54m`Ka4o!`_< zsmN+YoT}pS6x(2H%!0hi!LD;}209D`7{o^uf0!*WVoeo0I5OA_O zDlB`uHDMthd`cxoE*Xp_8@&N9e5vH?S4+CnjXo)3tcm6zn1lYeuB$rI#8=kxsY?5V z<2kL^Clxr7eF<2@EkhbD4iJhWk0#97;N6<+Hp3e^oB4Us9dj5&xKcQ4uPW>AZzT~5 z4p49QzpH2f7HV4FW(>q} zgSKAhZ=r2y`diB|M0Su0)@0*vJb!IMNY)aY$KqUl(P>fKEC|aWI<}b%lFHVxR+^ep zI|FLfMOBpuZv8g>ug~KcX9*0r)bgx^f^{q7Z+VQ`? zLnd?i#0XgGC-X%mBe(`Z_V`t0YyZvW`mNere{7}G_|&d)a7C5P;9EpGmBrd#&&zT6 zGn(FTqZ}kudHqlFXC*x5*q@nx;Ee9il}m)jw~c}i{5hxD%w`#zzIuk5q$5K=%Iv)4o|OMIr90crgcEkOJG{J>&v$$d*4SSuM-qv4-AcD*s3 zI@bHCV`Ud!Kv9RXNml2i=%q}-rFCE|Lu0&V!ZLTg7BP!@gySU2c|BmUD6cBX;au0= zmn103ax#%&xhUqxU^s15&OtCZ!;UCVczheXQy$&?x%s|%a+j@kwqHolqx=G*xO~vH zQ2MVe8vec|gYo$DQCnwx(Ny{zf6ppl%?f~O=RN-|y?!krw8XAtbl{$H5w`dDH~ab- z=|A1s+UwYRx_R?XX@v{&(COqt!N*2wkM}^c@>Lk!ho;zuNTCP(Y(_rkh_KV2C@AfZ%%mw01IxW7i2#`K~$X?C8mnh$!77!K@n)iN)_Df3U$BM=| zK*c?1=m4^QT|-;odhJudm!(|>KedvTqod}f@4y_ zGG;ekFhfZ31p2}CAgfS-xs^@^2L~o`$*zL*$V@!+F||8>Ygb1ZwJFy`CaEPjUE#^X zX~?ZTdtYAlRi*Z~2oH9vCV_=l%vNmwBsh?;0vR0>SBv$+!cV$DIVNY-l*DnP`>${? zDG5b185fPps!D$mqXImjrS{vt@n)|e0&%pwy<_>7DKrYEQu}~K;-ZhKm||Anyd76u z=w}{ZLtb zdXZ)~UgQZ_Xqd#^)v-eeSW3_;d|vh*I|MZaEfI4%txF~&cn#qsIk|CCzepT)@}XV{ zVyA{ro>X({n@O`RD`=|8t6HorTDGMoTUU1tq$br=axKB(i8>MF|Ge~Or{YNcR!L16 zHT$vBvJ*KtV?KSh43pp%T2853CZQ&BPgT!S5$6g+nIaIWc>y=l*4Il8K9PfyZ0>oc z_v=UX_v_+P<%AMaXhui(W%U$&Qsg2?oY$ShJPgX2fbhXTEJ32Mb-k5Lu`?}Go^NfMo2L}hCSt!acwvwHk z3Q>!Ocw~0swQ%IzxZ-@Z-dRpld(0qjVg#64o3p0E@k7{yvIi8)rbH1&5auRunQ-Sp zJHnh7P?l>t6}CpIw-sKl{C|?%Ed(qpQCz(!PV(_SB-@SPvwv%IcU3xc>DKwGZF40K z?sl`xjLEvj8Mj#W=2Qr#8St(KwJNtJ{c;cRW9WZRI`EyAbJK$S6bLGf5Xdsl%c0!x zQ!-K<3m{Y|ilNTLQsxbTuoo^;Ztr^I3%%h&1rpKC8CgWtNhX)z-Q6psSDx*@H2zWS^SP2A zLzQY|Kk^JnwW3lOl>bx=O`yNs-7T zn_;{$X!mra`L%COA8_PJjs~pIi)^qo$2!8vBqpgWn?>MHeDG|c z0~D&gR;_fM&Wr@Zo_FGsJ6@_(vhuuF1sIbssRE%GlM2d^HkKz{b%Mf!PXqG2?^4Kd zC78Me@=O#8-NSQExqI9Rwfg<>`3PqSD@PKD93mSvBE0u=c*u%o-k`FaK2i@m^GWeU z-yPuUFA5_p16E)*OfmQLnG%pl~As&>>Q`@eo}veHB#mw z)pEOWP0gO-h;2}GbleAFJ|e!SkmUknlPbCXCHsx3e)ih zjw6lHU@-cwkK=%VsjK0@PO(<=0-}yRY*lZlVtz_nKK>d17G_b^A{F}-OXR7m!{7cd zus;PvELn%SC*;2W)R3VKl{KfWNnBk6n$yb+wa)V@1b<@>s z*Cqy>UFA}t^TWa0wVVxvR)74n8HkN&iV%oOns@ z5b{ZR>bKo@vd()3Bz`|D992He)l_Z`Y3+OwQW5csijML{D#_AqMStvcrGC|PRnhPu zagnu?$at(-jB2tkn*&vK_g<;#qi4#6wx(l+3n_kA&!4}5^YV53VvK8-x?l!*iN%lg zH_gpAa+mHzyql13$(LM=Avt(Ts8nr`>`lq~%Z_VdG-zloRR;$y>umyvt+Bsf7=dT` z8y0jM+bYM}{i9Dxva8qnqn8ba#D= zfUBc2Ow?5?Ka6}H5mxzVSnc`tlg{3oAVH>sc zy16GMwshugDb^X0UM0{)Vb-F&hH-{(1(+v>Z{*h9arh>}@~SL6r%w}{lpVTShP?G$ zaC?}TlU;Sr$wJH@nP`$a%JG(`fRCM2>oQvK2hyE#Q}^m?eJgu*HM_m~c3W+EZ!IXC zx*71gf|jw1WopzZ^^w`sP}4k-8!_tsBJDZqGmqJ*V#3ZiUrbe?G{jPzXt+*zAT(^biCJ9d*&PTyFK=;i z5XFPk(%{WXv>9bTq&HZj=4uRUOqoLu5j!On;e7N)Tcq^&wrPe!x#r z7b=vWfCfmRi0Ab(!Jr)!TB0E8;GX%d3Co_Ekoy_-i6;B0Jm=MEIh#8wuBQ%gQDhL8 zgc>U!T#RX0nsRHw@CBOR zuA=MP*)+1-MT>@kX6MXCE04wFlFPZWuG2TZOpcm(F<(o)lvi+T6;es6=E6^5?Wehn2t)9vbP5$C2`7x>tU-Q*fNi|DaQ>Q9PA4*?& z%Ko}_+Eco1lwza?H=C^N27Vux+z%(W>o^Iy;tslP@8G3o{=9rR73psOB{Yf3zMkmKSYpKdVza3ZtMr%gl!Eu4c`yAYCHU zGC1m#uPSFtVSEbt3Hhzu?Ai(2LAeSUEm4TZS9uu!^nhuWVTLQ(%ueKgWb`)g_B$92 zUj>VeL#VpW?_yLGw?%H}{Vj*1Xj}Dsw;S48N!WdDcbP~u$O`#OD4!%Y1zM8vmk2S9 zv`Q)}C3m}!_8NEyJDip3(>-7wUBTU>EkMq0U!g-E?0aad~ zt*^!?Mm+3lRlu3Jn=yL$ZJ1*9id*|r_kK}{=}N$E)hyIEs|a+3z`McNucA1&?O7as zgSAY}BV}h~VZR^>C@v1g>Glz{6{_x;SgF{y%3v&#u{BoEssDJSPW<+EvAV}uVzObo z4H7ctO+8Zi>s5Tt)!!Hxb<~;tUbaTTGj_7{JXQ!7(LFe@i%e6#T`;KJ#WC_!YA64G zE4j)>zHzf#w;YtrQ0zEBPb365;l07hX1OFch+|Wfe?+9aFDvr9_t6$NHi9{yDxT#(Go)8)cck`4m%N*12Y?j2v za}-oLP!}5MU0SDwB+PS0EmFfqP3*NJ_)Vw6=%|H0EP)Ijz0qI+8bD)=fx!R#>K@MK z@e+Oieo;o8EHm@hQ`?^ECuLIBi|J#|A(X=TiQ39*G;8V-O&8ltI8c9s()qc@{|1}G zRz^UIN7Z&zY@hDj6*P}SPRQftH6bH@w3Y3H0DTE4cMF*GM@A*zE=IX}wXcIjL7K-! zeCFnI=B7w-j#M+TT$^-Z*Gbe%;!u~{W`EeSyOutdVOO-~zCCeZ<|+TKicgtmw!UHI z$~Hz98*T?HRVQ_S@5>hqaC)1Rsp7EWdnx65gjK+XC@n^844o38PxE!;n%s^oRWm0( z9u;`UAZ?6aqDY6fo|yMuQT(Q+avk`<*^IYJwy=F_0$THj8af)E1;}R5n!n=l#1$F9 zTkui^#?)lpBI2cnRD;hMh_@wqDYsP=0G;V+=(YJwfy_@bDO*I=c6JGw6~H_zxUNv| z@0Zvtb8oO~9VzaVQPtV=u=0w-PPd{C#>$XGSx)7_k#i6C?fZ2AJ;w)v>A4ew8%GhR5^N^eG8I& z^;55V@EixhC`4-bs$a>ZUpB&&=yxtXdh|%Yl~BEMD45Uj?mdk8Owz0_Y%5y9MCM4@ zbZmnsUz8|cxK#3yQ0|WZ9aoZtn$(-bGu5|B;WG|a3F87J}>D&87#5(uBZqL~uqg&9WkfxD5 z>!mrZUV3F&n!B$y@?9Pt(gqKFe7VUWc8@J)@l0_KAY?lz2$MtjdK=@ztz)Q z>ET(|F7wK;(t8C8TbFCRzGAAvYCrJ3V?7~x#`NwF{7lOkQFRRD)m`U1$Msd z>uZ^kQPj{>Xj|`vTQAK?wPB9(_3CdLja{>-@z6w0|Rwd;iCfU+_uH>c$XApL4kQa9AAjqyuxH%@#f_`lT;>@oPM<6hjs1QMzoM zrW6uTo8YjYILZ(~l-L8;aK?m{%pT4dXgU@@r+}-G5w3I`Iiw|v=03oaS*Pz}kvPIU z0c71N+-P9<0aIVE9If#Q`csn;HDorVyjKl;!Y_L_Psw0mt!F{zWz#kx_(rWZtqAt+ zHiQBXMyZ}UMAq3DMx`!}e~f`-S{1c&R#^r&2E4*$-R#sT)1qTKzkCR0yh+8KJ4xC!N=B#^MN||)VRSjxG27*AtINw_G2x*d4WxYlm5_pQ?I-^@!i8l12xL_RW`GWXd zvpES@RHB(bZhvw~Pil^*MS|~ajNQv>W~K*2tVEaI;ttmV4746FwhZ&1LHnS>3j#hY zU79Rd3N&~dj7>7EnZ;8M)@X8w(0efSj0+dxt%X$iBt|N;#erSa4?G&c=X`&Cy7qby znAS@JpHTbVmsz~V(3`>Y9yw?ikF({wY&k+9d_6fWpE;y+J*!jg$a`y}2D3bLaErw5Ts-p?)F_n)AlRvao)Cu*PR@uvM1VR2nJbaJUzibyT%hC4#A zY@!4w)}Fteef&%s@@y>k4sb01V^_rgh_s8H1*rz70jPYDo0|7Kwd_Gci6>> zD#iv5#WA$LHW=weWjRcOMiwdV12Fe#-7&4f^ELiZ8Zo+v+u!E`z*tTlhWIB*xvpDh zuTRo(Mn(r~EWxDFw#Q)78jf}7wHph-nG%JkT>wagu%bO$(Dk6*UNACxpa}H)(FW5C z+5R>@*c_oIqEo)bDd$gWnT2*;-2s}*{_uSt{?za(LCYG8e7MmWSr@bz#cAS`*2b86 zVU{>=??HcZmn?($5Ag8Cv1a7*IRY%E#WxG+)?o1g4vR& zh{@#TCqHMSa2KcnxxY%6EQQUb;wi;ZGofs6x>ne4ZLSS^*_Y2 zgMIi>u)wXsA(>qHZw%U4j9W_@Hq?v+ZC;Bms%zX7I*T~JV0R(S8eBR#YnuzaR`qx| zhhAO=Ec(`Cfp0OR{goiDAK-2|;0!*51xHbxJ3O>#3Ks-Fn(TlnMCjgVXh zC?!Tja%(W#<2DB3KhT>#pX6(NS8Jf=!@7Tg`ME!gB7QwGtpGWcz|1p(!yz;m4{x)J zVy^@peFpc-#paJTK-UCKEds4p@hCT55H7cVnO2ls7W~?!<*Qa5K-Rhv8WH>_EG?cbz+^Mb`Pd}}iyo2`=*$DrNzFN}4b3j)xcgfkAjXGr zs-G`(uZ@X*m*9JLT*6q{*I7fFwMGT#E$LVL5!}O)5iSDQAY@-&TqYeUGxQOr#a5gPTYo5>)8dJs<#nwnw0;MQ6WV5ChApe)t?V$>twYi`@%P}JhLP@@y^6?VhQY`*je`i9WE72fu{V=C ztrtRgJmOS(-|%Y46b=2$;+a7aMYPDKiWie)b#TKvZ#6r~J+LZH9dHE^`7H%o))}0< z*V<<3=8-~3?Nz!3WWzqZ2aVzb9ih)D^Q@sHHyeGj_OS=3t3yhq!7VIrv?pB zXNH~mLbhZnv^=5=wffKH<0^kD>K2*y!63`MqbtyywP`LGX*(j>lc&nKF`3^r#H*Pv z7SqTE${_{Mszg&~OxeAO#_|B#Az@n~!GVcjv#GWl&bQEJ{<3jZ9K+Z!TNF(M7}Cil z+&ITuR%~bGUk9svY4*?jd|WPjV~~y3en5!C$n|`$nQ2Uhn{&LsbjIQlR8va0hFh*_ z>ZCJb!+JGMq;v^TU|H^6Mgg8CrrGPE&}Sm?Z^ZQ_Fb4$IVO`Qc3{y)AW)Q|Ha}@Rd z+C-Ff*3G2skD=QXiwRE#*P-QrMTnLdu;EP-iWR|LMAXJZPd@0o+vFE*T(a05DGvQf z6j8s}|C(lo<+jfd%hDGN3;X>ip%Su!csd%BTKkUKd^Fflv6fuL%MA=M4y~?K<(&$A zG_-wHTw5+GRCY?aoXDgFl_T}8;o(qELL%B0q1sTeFUc_%ENcw3$CEmnXHxpdx-P@L z{o?J(%jOD56_*Z$*USA8p=hPUZ$O5{Hm2zR{y z1asB7YsaDh3jKb$j=3_&QU`VxHVc?+NBuC_tX`=*y)r4GIM9X4ichefV9T&8pg#~x zgfexRSBq@&0L(=8 z3~zJWT^YJt?rt8v!0V+NsxSn3_@R3$icPn%CI%V=E6Vl9iu?PfBq~EbHj<=aA5TY9 zF;hf(l~91ecRWc-tFSnQd#CD%J1P>7lT?I4&;GLt-(P?-a=gnKR6}SzoAoi2w{L~2 zcB!I*BB?+-#F>fGSVSFW*m@&gyOP(;<%pRiR|T?ISm^#H{!Vb8VakERNiMCfD!Fea zWwQMIjsnDIx(v>Zjwo`_F;HAHTZE8|P=Bt$B4e_7s^HI`SM|e=Ua_85emyf=p^SBq zA0B+TsEB2+DE8W`qOE-MIN4}9PemkFv`Z`;&bI!%weijw$+Hs2;F1J=lM;E}8o$S? zL*hn8N6VVaj`DePqvVCBWOElA5@si7{UqNq-Pv~2-VSTfabLv`~fEdN5 ztfjM~kIpy~qi~>aWz5>Fcu&*d0$uNBGE=XyL0b+g;_}-^E#ofQ9L3e&bq00%YE_!K zO!Tla+A2zf19yJo(z@9J0>1mfwXl=06@w_buTt&3b=HchX-`}b{{5QB_>4rl-DhO_^%cbmbD_~&S_BKs)Jp==GYn*w(e zDUSLV?Ulk?-bAUfmB8`dmG3?Kp5cj%Yam>>SxnE9%eTKjwDN}^Li-Huwt*>UM{a## zEFyR5Rr^KR6zv<6E5{g}c)eBRS%o;(QtzC_;oX}fGQh{57us~w^0F!25~0<2KO`{c zs^3vdR6=P;dbpD7ZZF+6GoRR;J_@{uINQmb95N#|-q=vQ3oaxe&zPLb^ypWAr(ZE4 ziCbklzOCW($hrqhqhEt0V?5VYXG1c9be6vmk`a=VR9u1|MvAT>LPMp?)Y5S^EZ8rW z>;IiM_@9uj{|Vl*uybMlZ=^0;7lLo}hRxM?w*l z-(0!*5r<%Li18Z_V$TS9 z?gG!}v(4AYIF)EDE^Agkqd&G5oiD)HwN_O6dc1BnWqd(;nSkE5X)9DcWry^OWeOR^o9)lTCqht+#}l3FkHA1$~AslR$J2u#v4>>oqrg4eh6Nft*^K`vLB}zfT2m zG(3wrn_#2uvh>cohE$V!8wTd-R>z*U*2wVtg7EjIfH8+|e>c0$LQXSSr=j19icxbU zx@55^mWCi~Y3&D?kpm0yK{)blI&ms|PP;|arU+MoJ!xVPboU3~(tzDSNHtQ%CijCx zV8vQfQ+D&(OGSk1^dpF%5a%pJL!ROH2Z)nP%!H+&1xqM^aHqLKxVfJ`VKhzNTW&xY z4%_qIj+imC+D>6v1v)F~X!Z!@WARmh9>vugxgwtc-Q1@fWM<*%=g8)y=$g{TqYX~;fH3E`N;#%}8WH^r!6WRoI0{9O^_DEN^8L;7NNL#DpNA9?B zV0$iIn&3LU0%fC{OA;^p!@j>9|3=-!@|jlqfcx5}y?omhMUTQ{Z)Y0RRysrA_C;xa zOQ>P5{v)B>$Z&1{Tyl11$*TL(8+6~uxB~4Z3S{S1rjIlCbrQ0(ZIpROr>vN?u4Z@b zSL!;Gd28N7Nwuuiv1B-HF6#ar3R#@DqhG;@pF5A)>{fjhy=3+SKr`8J)$|plA6>21 zrIT4I1`Eb&Ryt5~tg!QW*gC$gLfd}~ORkYbg;t($F^3C*N%I84l;`Hv?wh~WyDMd`{C+l_ zM%7?|&Z8K8^~jOCEp-o0f|W)X3L&Fasw?dv8m|$}oV$S1Vz9UYe{}psr+QwRk9rjE z(00wuxHRl~2+aBRb8Ec9y0tk}t)R!y?qRR0=GiRZWA71zI_?3Sp)sSx{bZz1LZZ+B zpc?5rEE`YtvV2JE3tsY#&H**(X4wo*1i5LQUU!hdCR%;MtMFmoo~R$vv_pCw41I4S z(K2KDXPG<-_!cuZYlb~qxA$Q_%>h2-FxIEV++gd5b=@oJ&8e5(Zn8Y|6}DrAZk_~< zOlq;fD#3JhSO@92oO!9=X-B5{UDXdG@#?8I;Ria-mI?l>>r}J2`IZoAe=K7ag83g= zIWT41)7<}YIb)=+;%A52rw2}x84dcA@|2z@9$-n0WvGv?$k0XN)F0&0wVWN6`Iu;$ zxaqn>_@~4oQ7*5hBrY$eUFuDK%?7{uiN1uQAC5=;h)ZmS44sB_WnId{^XJPwJG;l~ zAi5{V>w{uPH|yZ~iDXAs_AW#P%S~dsBUv`jaT`~1rdcV=zvYAA-V_%Ia~10PU7Ag1 zTm%%Kg^S3+GDjk%1soX3N8v>f*FMW6+$UpVBPP0gDXg#t-g?!J@b1E|1kcFF$ew@t zF)HE@p5$^{q}3Q?_Yo^>v!BGLVz4qKt_c-&HHqq2tLRBZ(XuY0*;fMYOiO}G|DhE) zo~M<-tk+JWlQ(8iiP0_#S}mhBZvax$yiG_~uX$FF*StAvhVXQ#BAOzQxAnkM<@?{u zNUG{^HIE&Mb8hy{)eS3di}-!n{tsaJ4Ea(`sGu*;cEl(!y#Xlwnx@K1&0urCYUrx5 zr!@G<6B@)PjGoaOCnz^=HFNyN_WmPQ*1d~Iu$8_%nekx{e#gpYVALn|s_3+znbNzt z6ExDoVo0Ct0MR&`b_{Kd@-iwXWsV3IRg+~)77rgz=)WrSE>D*Aq_FS%$8sz$Fv_zG zSCe$>=aE=xcSgZH-y0zJ?q~<&rMIy6%+U9buV8P4fa;a?axNgG24UF`Dkq!sRA)UV zGdQEV^H65fn$-^kS2V(2Ug~j?4{qH0#KlN0Upo#ocyKIx9)h?7XzqCaO+XHF#%J$} zS2qfjjzq^*D;?MiS;FIHmSd{ z?jJ`jkk|46{(a}3!JVQCrSl$N1ELkIC*Scjb`vrPwZu2f0Fm%a5}vg<%JjqnVBMYI zpYniC2%LII%lEsN!M(o^LpPP$sXC~vRqLpw19dSr96~O2=&p+fZG}Ul8!%Rolwn05 ziBKU@(~xDF zc2wj+Xyk3v|F)=gl{ZVjZGQZ+gQUa6V}QQg&@)Zg-@CZT z5}Gz5D$Q2=L4o3EXnQI1n%@JYl{<(EHsKbBeP@ZCdNjjNO&cnhM|KLr z*u~VoX$VqH$@w>G1(}9pgu?@2L znQhEebtw-mfg%94lW63x_rIAZ+9#Dp>)0YbW|N{Vkli@ZBtnUGhyK3vCXX{h+MFFHE;9ydMuGCExmjT zmPQewPML(d{U%kr*-yCem!pb5jwOQ5K$zEJdq9_V2)zgrq9yXSuiXUE%L~jdp;Ro9 zBgu9pA>VpldXz{$9E0Y{$K%30|lWBV zb@ifF;G(?3tmjl&YI`}+^SnE`fPO3~89f49C4%7Yb0KY3TdGx#g5*xg@>Zj1$|+Uj z*lay^IekSc|D{0|h=!IRs{NaMT-k}q=hYNk1>0$#JF`UmR^1oTAU=VHZ6cq8 z*O-+_D3tnk*(aic?^f3M`7F&|?H#3W_=t4%W{8egZFxlm{40UolAB$)CnU)|Q*ge~ z4?msTuq$_`qbahCL&FhQh3J(M)@u&$2s|Nks3fnO1Rp0M?D{4Mf;ej!G8jMEO8R4< z?va!fauz98)|AS{Sns!CGMqfiRCq5uS+Nfly;b(1Y^{oYkwNqq2!?_T&Zj= z@V2Ug14X6^2>#aC&xX0ETE%kJ5_q7V8oC`M3kOAzw9e$Uw_9hyF5iKK$}#4OB14IQ zj8hjF1V||<>1O2dmo1TejL;9YKkyGT^-&>v~N)7 z=1&NFN2{Ryg(R80GR~d8M%0}9QDID?^{hPsw1&!vg3HoOD{KN~llR@ zvwrub8AXh> zT964)l%O0sxHgA?hV7y@nxm$Al#WuENaNCp?SfGAX;jV}+Er80;C(EkjP((Kpy|9e zdpUcd6i$#XR%P3adI8EKy71U?G<~GGg~r$dzn5Mc$EkZa2oIb!J-l=l2+SJ*z)zk?`Dt zp5x&49@^~Sy($@_FGuxpjnmIDMw94rOfgLJ+(>gV5$M?)ehhd9n^ z@*8LD8%zn2*W;+WH`+OZYe`5_M70?49fF`Lf>BA4N)!)32=;v213OAt(luP*5b!8% zqWk8G1+2&rwln<^V$|e{6qiXX5_l*wzlj8gsz#Y+uk25%x0r^WmD_|?w#|%ek=oeYwKzLM0W z^{>mtwPblU(j$^XRG}ta!)k^ubEBI6T_QRFoH`Hc2eN4`9CkH~pC?=Z%lT8IDOj)< z61WMr6j=D)iTUo{;$V6aIpSP+`;Jys4koQS&6^n6GlBaFy%`yWuY!!|-nXt-TZF@5 zQl%g564EotPDC^*e0zjWUhH(&4G)e|-hS2FBcbcXb(>lbfCdMU`WweE+R_x@{jz9i zEhnea3)b4rbibmKb44z{$lSj$Kw>3O(!cT;td7V|drRq%9@dD)Pz12Q(AiPGc6YUS zbu!z<*s<61(Lt5#CIgkg-*ks+9}y`pj6-~y6GuzSW`mKwcEI>)UuQP~D5y=q7*`db zIDd|ER0?((@YcsiuBzH<6P}UbyL)4MK!Rr86P1+UKF0gcJLb8d9MFF|6QNIzx?^9z z)o||kZUbAft(N1v@bD5|8L20gcdEV!-Kc+x5JUqf7jOAXMBnn^zHx4OIe6oGB@SJk zmj!6Q*Ka7Huse@q`k0`G+{^bu^YHVy#>&s3m#{l5KvZ%3wK+*sMq`V!N3GEVP-{S* z?E2~Ou9bQVIc*HuGnhpUKW)Xk$eU|#vNjX#5d?LV{y^~6LU{#h=PF_VwW=#oP0wbz zsv+SGm6AO}2N;3v>)Nep>c&aZIwo8qCztg(?j(R$4cU-7>Q>3l%G~2GvASx~tw?v= zV{3D+48hsLhuBuw+Xep5*>PeJ&ZBR=SLj$l zBrWu7CxX1E{R@8`Ikl>>J`=0ju#Hir`P5Q*ofIod`8H7tn1!_DMTBrB?NstI`k0br zDf&dWj>pHOG*eFY)JjelPoIh8akwf<6>=yTVrRFx6x-u1-vfRD<2fIWLQcbyY*rX; zbmJWlcnIuiJahi2I03=AQ?#2~sz?g)p)ic`MJJP{%Qc^i%fYq9s_7mERt7Rw;*pY=AitkG##(;&pcei&rGS$w7F3SGoS-)JZKl;#! z{Y#@5{sUP)154mV-8_rqKoCtCBTYy<71B!;@M}*pJKq#zkSL(FD*&i};ap$g%yab} zoDTKong}{-9XuW$CIWxGE2haUJT7A16{qJOr=!fH^gUwWAsck`!05P(V{i)KV+c_q zrB56wcsymLj06!$eRXm_7Rs~dlRYRy@u65Gk<}cLx%!+D&l+NpJT}qfd|8ne1nm}b zBR`HkmiAmC1hDQqAyF8nPkmD-=7c4l&A;9eWO88si0?rLoQ=c(iwXqi$bBmAFsH6t z2&|6pLoX=Wsm%phx^4;!b*Sj%!3Q8y3xX?v6GB*sr1x48=VP*WgqMT`vSUOxE(s5l z6BS?AQApHPoPO9t=jyb^A}2EHcv6rWdP~yv6&+~1Tilb0Tk_Bq&l!X{T|B|zn5@4S zbJyP&sC3w;+|GiRP9mE&f@mHViIarO=+7nS#~lOm!wp9qj7tp9dtk)p6o?b=#^&~L zSV%qtXV&@TM)|=uGImlZ5Q-k`2|?T*n^+H~jq+6T4*^?O6xyir=Ix4m z=vO>CR@B1fnS1i6Qd!yJ=Fo9KAuJA~N_nxXv+-8IZ#zUYEC(``PQL z&x=|-G1w@Ifx~Y1HdP?At+TOgDy#PXA;q6y37ZjkU2&)%`ic3RW0y!bIimUH8ZUkRQ0(7m=79+Yd+1yWxxK zWiW=& zEJmxKX(r6eL7ePT6Es@vMQJV+uNoH>F%kToWU&})t-GvQyy^N#?7s;*O9*vOMytS} zA=trW_)Y*`YGJ~d61b$loh$9RK)jkH#lqQbI z%x__!z`|)5wYrz|gYq=c;pIAlrfGRLE&=VBh&xJ&bPq>Pj-iKC{h^z;1up&fH1>~z z)K}D1GvjKG4}$ZIyGO32dY*TboEK3O`e~D8J}_`DFu9SFiQY5I z&QicoZxKsfaeSUtF(m8(C;nT?+oN0+PL`R1>EaI?;j?e*yz*rD%gWDbbqYR3M2Ivk zi=CpE4YYOZ$~c8d46)KkrFR1tV8W!1{cG00z?;S6sa-401(VhgpYAIn4A`#8z`!TK ziiYi;h2EmL95i*S>P4b*xl7f?!@9)Z!VCrP0Vo#Eb~a6(-*w4enkHc&_dXj>6AEd`Ma< zoYiE81=b-~hnA?C9n~>|9Po5_N=CTcu$l^%r!Elt)6E2Z6R$cA&ARWVjbiVMiZGML z>Wv^_jZ6=ga}Hjr93S%v+w?X_se3DA#cx?sw1f@kZBaUF9M&!r8&RKyQ(dCN3jVGP)uvOp2@3SjsA!yOY-HP)M>i(2{g1H+^+jAoo-_ zWQ+i;dJ7uvnDY0c`?-AP2z8d>&{CW4vVCLoMUr-B_0N_Z^;MhXp-P8IGc*j20ua%l zWKgi=%Cy}chKX2-F9uN^eP8Z_>_Mszr2W zi7M7s{|unX6CWEDr))r+I=}_1&}ty*PWl(gt6JsRLV0nEO5RH+sL+hnn}%IrnuZ}- zBo|}^3uv9&ZncAHG~?7gV>6^ZeQu661z3s)o|yt!zG&4N`3Ov1iCP+RJpcQ((zu#6 zP~3ud>T8gk2|{$3b?Ef;FZZ$nrr+5r;y$e$=PZ^*hek%txcBEOo|SaS)wj*%n$)B= z1cMQyw669$)i6=5mCN&yj``|}nv1O!F)tfhm;OSO5dVY~J-*5Uv%>4%vOpqP3x9hS zx>mvcfL8_hK;_VND3rKxbgg*i>>17{Qc@YHVl0Iug#s5pn@?n?7g~-GN1R}L(T3zr z1`*ODCq$d8*HNJt23;KM(&%4MHYH()u8JM}%7Egvj{N)So8RshHM=9k8NS=tU4$c8GUHM5qOWxy%JR%CDDF73B6ess8I7mnN%hg55E=31~;YGo#E(P`19Sq`c5m>O@6j;H=xjnZ=X9U+wr+9Fj`FGIk^ zu6B$hvVwRuAF$SRxLe{TV>el%qKd!Mg{a3y<7oeB_WY9SslQ7m)4PEyr1CrGV%IXo zc;6h9;2AkkwR%GtY%(FJh^P$6RaeEU1>eK&p9x;4u1VMBH6G(u=f_h-TC7)0>aoIE ziQl0n%#VELR*WWw?ZO`5k$1a*qZk$Si*KF9Jx^4q<^%hc-U4^AJL(CAKEDwrW&Pql1KD)mn5~q&}Jv(YMfN>n$IT*6|@aE5I7f)2d*`|6a zznAxXua0ul+F&;xt%i?d@sO`pl?t_R_;1jiI$cts1oG&=^4{xy;* zFc#y7X3e@MMaX7w8%5AFjdNG$Mr|E0f7dG2)OygN6{xpaZ9fp>Wh{Jm>cDcC`QhAU zeX(iJ$!uQ_+i}f*fJb%TKdMfR%sBbbR~IAo_)xatTTYuHwNMJ%mH;8R3QG1ZgW$~T z!YVe*yuQ^n`4g1}&P#(43`q=@wprZ(YRjuOZ8*9$8W;Ae?j*1BF%7!z<1KsQrN>vS z|LTu%n1o8!s#f7D_f^wdl_z#=Qba(KL>?j`(J;zG)HZtYIk9Z5?eE*8=akb-?3Y}Q z#yh`uVvyZ-fdb^PujyQ@xS=%HuxLz5dk3}7;OK*atIxhg*tDDeiwdA7^VVwCj2bSDVC-{H|Fx~KkrcW`x7*BJf<`ZeuYN1JSIh0XNL zMon%?xxOBV%R8~jPuG2R%g3Wp-4smchFf2={aLheG^uR|+|78fzjPea*rU?5Uwe=r zJyDRqMh8)S726QXJj9IZ3fY+}zrX1q_9a*Ra8Qt0`uT5S)*|ZYdJ_u(;Md~+FJ{gD zBW91a-CYSq5dM=FIdBY4HWvElUKBR?6O;Qx5O>IVv-=ZZ24iMnCPa_AzN#&6FFFDa zihAR=ks6nDc2soK)YROV$>pXDDc!#>rLR8~dwcj0xCn2;TJJUs*(SUC^P;qG?qOm*5{@jDHS z(>B{onFeTq53~Yr_BOtAbYE;DlR22qJWs*$Yhl>wLpl=sQ1vIweYzP%;kgy-)?gtdqLV(Bk)-PWK4H? zj&>s&&1SPNQQ*^W+1rGIe~Edsg=AYD%AjhVu?sAkAOsZ5IcSIc)$w$7D|R20zq9Y2 z!`x(Hwg+MW<_|CuB}Gy)H(0u#ayV(}o#cOMEYlyu&|;>{b8f)d^hISAM5+*w>AFuS z8d`9Cg;_iZZZ&6b#aD=7fhK%;^s>KYCrIcy?JW4qwG@xtwz37LN+k@1l4i_kpxtYC3g8vz`v;}QV@E&}FtnV3Ws?-%%1=(fcX8WG8CcYIA z%tNXnq!(H=M@HdT+y&}S8qNtjy8+B_mJQQu^P~l|OZU-T>C(82LZ@f3p*d={ty}84 zVFN2%xQQ~_eN(sV3bKc;B#X0k3zT zMs{tGI>OcO2Wvln2ERF)nk}lQt^Gph0Sp-fVbuaYnl1X-wY-JO4=fb9qEg9)64)qO znn;o+F23;D0IH2m#|4uJMjQaxy32`+WOA~}um-`*#lp~L{-^a^>N0cX9rVsaMad4l zx|Vhxf(}!=(SC=0I4}7br$Bb zD^I|av*%oe;l~EB%+XaC7EbfYNeoJwGDraBy6P zvi{@y^bDXvydu-1a1bA@qW%%YAl%Bgs~&HHkWuv6J1U6kd%4anL|d>|V+7m%j(|DH z)O==)9WVdd9*n3zn<_hn4D}}k?M}W8X8w#1@km;Y>w#_eH0Uvcm33GBziEH`Z%J zZYr~&Km88%cVF^b*O7e$6*{-L+hLWitT;hznPHMf?n1N$KlfsIYEo_-E!qvyD?!qY zOv{Hdk|fY0cOLFSFVnE;fq)urb?($Q)m+%y`nOr{h9d+(n=6WTkqqlLwCJ7xMyy`A z>zN!K@G%j&sVz>i1B|MlA%y=b8MeR%p(tY+@3im3%oKanQ`lFpYAv(`%d3<>|j~3QKjnox*qAmQI=wmW{dHt9ZR@p7!aR+~6;!u)@0~V|37#zOZHRgz}%D{LY%ul`Cf`S6yRBZv_4qYY>($ z>@^V><9HUbNzqa8A`2$q=lMtYg*LU5W33z z_xP4+_S2#qS4EkqCDn~jXDNsj97wLWG88NCdQk{+uJu$r-vWO<{w?*~ ze}b3@*f;A9o0hLCocQs56>5W_IrA=wvd;7)cZ4LdA#+|HjNwCnACDU(p9fx*Ev^!e znZ9MfS&*0|TaSIP!V8=+j44wFOhGAuT4)gJTZ2Ym(1d!ys=JGur#vt5Ll-&OVd;aP z9gDr>nyXctgcB5K2)$6WalMwCfqWIgy0CRUfc1A^&r{9FpsRlc4EMqKSq@T z;lUMcx1C?eKMtw(gEAz|wN}XE{!2tJh$eL^t7h!w%&=SdiTY>2$} z)YE7V)ZJ*xLLqQDsd~XNmyUWjLu$A<_ciA?(IN z;VI4cPYUZ__(0w`bNwS`(s7A!(?VlXqD%TV6`3LB7*Bv1DF5jQti6*^{Lp(ib?2^E zT>p_%Oxq-TtS~aRh!UXum+BepQNxg?QJ5(a^bxUxj>qzc_d`UainIda08l4Mdj`-F zpiIIEMGxq6nJgo0@S2lpnI*d1x~%qc30dG}MD`%J;=nOI|MzTnsZ1xST~zU&SP#8} zXfKt0t<48#;tz7LCVmy$ zdZX}ypj(-uLm) z`KMDg%Z2kl70x_|2qH1{13p%N1)$atY~xu7)JrXp73ac^xORcmt60f{r6oyR^-Xm7 zMF+Z!-+7;{hwTP;+oSW(M2@>a@kdC?-uN>q1ZsF_YY(+1yW<_rg-7~|#WcN9AgXzr zO!KFs7{fy^470K!IT%&v(|UPNfzoc)Ix5(*-i0j!K?tw%NEXMmS0xPOYq^Ks%um`K ziCE66cqiTs_uZ)Y-&C0sN3tV<>VsUE#zw2`N!+`bQOR55mG47{+c?RMV)3 zD$4*wET^WyMlL2CnZCvY^tL@GWjjRm>r=G8;q^BrXHuZNINnC znTWFbk|VQ^c;wRu@1VjCnaV3GNE9G4ZKm#u&QG}{?c7X+?D}h<>Qo!3>#2cM)e|^t8?hx{9hAWsZl5!Q~qF4rRY92gV_%ddyu(7DR zxlzaED#D>ekaN8d1LKZEr%V%|+0WZ(al%}Ia(L%>6qIJ^+LY-Q79C`!56zAr1Tcf4 zaaHwJnJ@|M1qeQe39FPAw1~ zxnk@=wT#xK9unP$*TLoX&E{J#&k3dpWF8FG5a5kpqvIV=r5m@NUe0^p(zReS9u5k-sQ37`)2S5NBRbtqdVp-Mlmg$t8}{aUSLJhpux75+zu(aND+R+qP}n zcHi#Xwr$(CZQHhO%zZJdnTQvW%i7eUD)Y~C&Udtq6Fr)RQSy)(C_kC7<7QExLbvR< z0vL=O^4ds^Wtu|`0xApe)CU&IEy_)gjr1PFO@?Ml*D$K=oO1I^hrO-uNcyq&$+wup zDn>-E^zslqy0RQ0&gF`1ii(R!NcoTu3Srubkf^u!A*&!MLA2$#32eBpu})o)YbAQa zs))P^(5%KpT;2O}BBL6D9XG^CXg4V$)LVjIJZoP$R7bl2H?ZDSm5-kW}-k zaNGXQ5)kEDKu{Mm^aqKbwu2p~b z?IOs;imOp5|Jd$HQTZM(lvvF@HpNg?$7M$+_!67ZSbkcfiT3`jAT0=UGVUloYC^0k z5kGQrTd|4#vrs%r!l!xio07oAT#NYSkua?)+0v?H$+pNw`9NvQNL9yGj@@5zEE9B; z206tn6WMc-#%Gn4lfOJd=!G`024bqZD{veM<$>s3)P=S~qZPhmXf(mT!Bs%YT%qN= z;0~njr^Nv-^Qv!}X<@_M`T8gRYU4%Z1kmltX@vx0DL>B(6KN6@?AT|m;BL$OyhOP$ zIqWHeV&G_+a3B$);M{zug~0cjaiJ(;aBcW7TKs-xtuk4&FPcq(PAf7!FuKJLv&mBj zbtBDZGyMiMhOSIw@rk`xW@pbGImIM0nv!LGg@A;RBDOiCo61@;dJ4xB+975|1-f(q z^;m(I-8$yRmaiGLxI(ffUu>Stp34iH)W(wC+drjY9a|L=ReI%Q76BDagJZbyIEZFn zvkxGG*uwG=jy?@j{o|%wh73(995s1_4SRUSsca>MK$}=yh2yZOVW4Et7dbUkWFCEN zw=9U-FxHo|Q?T<~mzarRokXUku;!_sab`WJQtg2A+~r5@mfDnX@^wB0MR+5wot2dd ziS~wPTG0KfjXZ9K zyP2=3?MLM^m%)z-wC7twO3g`Gh8YQL{t)ij(?_yX!V>V6=)gI>(6pYx#f?c{l6C#C z{8Nh&hoUkQ8lo=mmXi*$-w;@J7b>*sltZ}(DYr+JQ)COcH=G}{1$mJ^6U{xa~D$=UCEGCr4*nQcATL;20}V)iH#QQeb2HIUb`~ta5c>*evOFS{Z-DGXz&Mm@TuSV?&?+${E}@mQ zHmN!mW!A1j^p-5hXpFitIlcW8%ezt#6oHAPnnsyU%k|Tjs+)Ni7$>`^J2OWHvC+1e zQz3h3(IxwtK`k&}zDS!))$0U__`l8b*B$Y{ruVdmU-EDc{^KJeoByN_-mC1%p$<~b zd}_dOEePTr!9OF$v$F>kK_I9?1Q?SiQ9jpgIWGi ziqDv%nTY01x9%b?H(_DlA4i6f4B@b!66zIk%hwaC?`|SHPyAd4dAhQzs-n+)Lwz^@ zHT~<~h!;YT;3B{ln8QV^LslLK9b}y6CwqpA3idH2YIKsOiX=duM;j+428SZ|y z)!8w3>Wk+@E_WEsBR*^uv^9Dv^BRNWEc3D22qjfO77ZD?&rAB}asJPRoz*?zKg0q1Gaps#wkn?B z_BnQ~!Z62C$@yN+Mb^YWa=Cn?BK)o;4K6tZB#H+t!QTr4A0mRMqS5lASsai*^}K>} z>c}rQ({!Uc;m`d-+dSoGJS6d%YY#y%Ne@-)rPwW2L|iVV(g&!YhkYn8W=BvaRdaVu zScMSHJMTKnN8?v)3q(sQM5FBJ(GHI;(H$fIs(|GibG~6ynM4t?{eEYhIy1O5>Pu)e zfu-dns(dkK-f-zylR^~m;zY?exTK-d&&f)IcNU`e26r55m8(kuUA)axZ&#$UcTDSp10x&<1;!q$i@2NVp15E zWvpC^$#hRer3N2{JjIh4%K#g-J`N_W9u!ztUq|H;j*|^;?06i~&_rdc&WF{T=ds_1 zGe^Led6|9OIwSWy3XF+}O`Qb!kA$dikC1$sZx2^{5L?SH7tezQ!h#IPiA64U5k2I>L^bN7(80l9foC&Fl37kkdb!ZOKZDW~}dJ z>;>L@&9xcWs?bbZMv)u-^#;bZ8CC6u>|op-I^n--z4mj5bv1Ve=%(&RIk4~bve!@3 z6n3>gYS44d%Tt~^P>D{j$2VHbP9WdGXa`^5zVjCE=a#mG>%i$(6@6pPO9~Rg0~8P_ z$jyu6>TC%FYWUV~BYpv^y4!cgl7^Rs8>$tWU434;4}NtuNBEm~?{$PzVK0M#8^LwGtLM?3^&>c)-vLcd zW6j{{f_MBj@dVhsu|XVSXZF03sRb_d_TY7xC(0A>zMOLO-4B_$Vr$C93v#RXEenFZ z<9s9q;>u=R{fms=R%T(=qwf6a`yJblMQGXj1_#q(FW`NqtfqfEhDUku^(4;0kv zXGP&Yr!xM%3giiReMohQr-em^>+V|rd>fLBx#QkUMt3KIW!)oUqB{m(rHk9Cyhl^3 zp(D8NVv|96J|>oh#K&VBhx@*$gB2yom`(ml)t=vF*BD=9+9<=WK^!pkG86UQr8*ho z*BfIU%g8L)TWZ&y5)jxhl{`o+B)lP13RV9xhzJ(xzbnU1$SG-1%Mt=a>U;zpQ)HoD zwI3?sF3|ld4@6qW&}mVkB{COXh-9Tv&=!-pMxpRB84W;B&7<@q0VE^B!k}=}*is3A zOrYN>WzjUJ@r0wEGEQ+Jn;eG#5=9N&I|;;R{Yr>y0itmblNn-vXb|Cd?_}f0=^&i2 z29*bS(i1}*qZT7~isSKKT!PxdhP_H=eigWeENN1ea*i!iO`NUdt~VMYx?RBpNlDG( zBV?NbjAt?w7qG#ivZMeWAr6xo55=T*B+U<$ly$6VffAU?!#(qq1JW#~f3P(4_Uvmh z*-O&VZy-U0h@4WrhxbnvxdF%k4S+~~Vi|AQnRz(J630e*ExoN?SdMM{rze0eyo!GP+rAf) zhe>1LtlEp)RVXyO>DIoCia?L6UhA&OUG=xiLgwa7uJ8SqGY^xG4%~bD2SYEW&~)Cn z^PheF&63sA@7(|E({_n;=0Su907zj503i4;KJ9-Wvc9o}wX>@&o$qwO4Aw#p7RrSp43BjALscNc1o+xQBP0-Szdf&Y6ZT z$X=<7K~!?dFK%vbt#`AbENRrMi^_3J;i*O81r7oIjS%|ASR6S}II8AQu)E~>dH>p4 zhF2%1(-d+oN$T0<(%IMjrNwv_46(SSv_|v{M%h^)57TSrx1>u@MjkLrAg6^^Gd*Ia zL9ApJV^Bq@ay%sqbRrJ!Hk|KC(>EZ06!Q*0_qYBX5g~zBk&8_iWJqV3+ubgy3oI>C z$Ac{Y@r=3rxx%kOg_iL`SI?-TP=mrxDG(v}$Cnn50`U?l*Bky&Gx?VvZtlno8+CTO z3idhl6SWh}Ez06PqmK)vr`VkpF{6?g*$T&=+799qe*DWf-SwD%b})2tNRiQ35KdgL zT86#!sW@CdffD}^SS zz^$V77Z4viG#ONkGNL%gfspAm%^Vpy4H{bu1m4WwRn6NY_q={=(^so?iiVz^*(e*c z@Z7wdciv(FyY&9@vC3(`ahJZRcl&rT5V&ZOcgHN-G4jTpv&)65c_|QIHmzeeS1qox za^b+9H*pumxEjFI`986ft61`MATp_TRnrX zJ}Fx~Q?_5abp^LILe*NyTes98zgEKq@}q3-waJA`KiO-WKc}H`T?-M29+b?{x`7Y)|!wm5)}5cqMOh?kbTx&}0TbDsA-3~@LoUp*pu$f{D_wGCu* zc~Z8^$M_)Vj1>h3E^N(#)pG9Ix`}iNxA9G1ZRT|sz_s1)Cms!UjgCSW%K%3xHET=qjuir1tu)80A|)Yl(Vhu9hTbp?K~H3GqN>ze$^KJ!WZU; zQptYBzJ?QMxN8L$8DGHbat@E4RJ{0d8S~uncf-cnJ{2-sGtdnct^o{#U;*>Q9M%C3 zHk~`9-t4UdCz2trO{~hMKV?wQfuidl7 z+Li60FnNn}@~p+!g0~#(YK|f`Yz>OqyEL|ZuI22!YqcI~`C<8JI2gnGP_Ea!8wTm~ zd1A8}Jm%Rzy3>!~t5t0!*<_;L#ZdByy0k50Uc@F_izYP*2B0(U42pqcfzc5m1!ttU zDnaT@676E{wSEYrfRP&YU4$#x+x=X<5yz5H5!h6e@i7TdTH?~HJq6U^5Z-5n+;r4l z6uAdiDf7M2^m?ea{Xo)*;RP_}HG!c;pl4V5Yod|BsU1O5(MRa46;>$1^1%Hvg&S*DK0M;CQ*S*)v_nXfC`M`BOru-jP{b z7+?a%L&T``)lf)hbWoKyMRwq2hv+DjX5a`riB2BH34KF{g^Qm1=gQq%km^qLJf85o z4=;S0q+fU>GF#39Es(Q?&KXF=MtvqIyjaTO>U%zSp-U)_7e;;@I61cb^ymxOCNBh| za3O^OWNuIP;3nqPQBXRJsvW+IgFvS$&?SAe@%cF&GaG5vnQoBvN%m}=T|JsEcYPs= z7)n9aqK$5L8Yr!<#U9UuVEB=R^VZHBhs=5aJG6;6>fNp>Q@3kLlt_Q#2%xNR4W1D? zWbcEVt0r4TpPjaz-`&y2>iz+2L&)$Hy^vLvK=_pbZQhrX)I!RS2;vdTG@%t>RSrbIeKAi0^)I zdNtF9h{{PN3jOs-CEA5w)9`-Vrf64wj8e|EhiAvlt~=lYHU0F@7JMlF2g2`tGEbhr&Z? zvm10n{0SgSEkajGBFR{qT_qR9zl40RZiQ%GDNmMyflduA!Qt0)F*p#29TT*LK>v)c zO&ds)Ns6jzp=t?Lv%dz-^7_w)%r@1Z)q{7;KBNz%tyC|-S%FK?EodU3BJ|JH1!IY5!!cm>l*3x%Bf@iJk|R&F zQFjkTE7yuPu$<=Gqwiv5`kH}pE(*SH4d zR6_T_iFO7l7KJb^ScoPL5@G1*bDNvS5|C%epj0ula`SHw6N>YWbwdm@bL)(nIn0d<@&v#hGA(NJ4KN+Khox$pk z9DFqNaxl!+%X0m!4p`2NM!I536JGsRwEMM7+SI4Oz!t2pb(myLLw$4QYHA)`=_+Te zDAfshGsLhh7R15Ao&=m-ppz6cc)!yFAufs)+{M9N&#~9BmeYi}epfMUnxXU*%rhbk ztOAn=n448IY|>K+ck|XHPy@>i;7Jz&^SN+INLB~@6e&AyR@EJI=mI;piCWJi-fDQP z>I~;YE1T~I=qkn`ec+WYVKpN7CBJuIepu~83^a?Uw2qcuGqisBK~dU;7R3jpNOeFs zf}W7pVQsrnPhT7qWPAu7{L%9_t3>#eOoriXfd_+DY$32vdLb5ztTTvmjf&#=B86u^ zFhTKH*^pOsigCm;o{$v|FQ#D(J>Bi+);XCT)PJ~3V9)p=xSg_?MT_?_)29@GJ=i>a z02{3g*tZYdbM^h;{JHUo@>VF>;!H8p9Csf39`8Ec=qDxCgEW*rT3y_sC7YNjj6n6b zgqMgB#VYFLsY~GcZ9advPb6H@;UMn{Ym(Y#@ReU|`YYbzrnR@_lFeEhtDqHn|I1V#s=L8}${yKdCorrcZY3gorMz{{)N}Eai z_%lu?x}eMloYZBUWI%>WpCBYJXHrQjyW@LOo6A6g98Xn+POTINx;O=ul}@-xgoy4r zrHa+AJ#+N~LK>uiWYqJ15cGpj~B36L!LFDL|A;$3R=7)iK#=&b!q zHu)2LheKWf2U}BpDwE#btr0&VMZ>~4!JU$ z9sy1^Brjd%OA(Xvv<24GK@BeN>HITx2|fw951Os`qbmnlW)SA-52>noWpg$GpN7_* zhyMm};IeeSN3G?v_6M~LKhaxN+H%7RKSmE<^-jywqGz@2;Rvl$H8)V)lfn+87h5q{ z9x06qui{Dej)YycC;vTP&3pP?J$1$ejp_(WOyngxwxVKWp+WWWu`E<76YNogh9X%{ z&q5V`=kEh*m(!Doi76&Q%$lst*WZcI1b!-VS*D@sCSZWmGHyMA?SsEhNDoF41Kf)T zZFDRxhfG>}wKJToj;6H0^SSj$h3Odtnb=eeBM)_lm|Gc}){xc5D#c}BQSE2C8`@m1 zS};Yr8xy%6dXmn#>*!&($=w>G{UGfC}V zF>9I-+06}y>Smob+w8yU`2SX~{G)vtADspfPWe}`s>F`L8=sV}5UFI`C-p^=lw#Q! zTyFwouKn^)@^WN-NIbOugh-ZamzIMdoinF(KJ#S5D`oi9m5$$ngf@7)v(zFBSeqtu z6_4Y+6zjgWqr6q5vK|m2KcLXh^fRhm@p!t2XO^FmIo_B4!T&BEqi|<0+eW>mw1$C{ zN_jnsV=y?~!M74QV%k@`?sQzQpJ>nBO<>vbzf~uawLX{D69;9!?zi=*LIpPN3JneAH!`c6#XwJor+?kAJk>5Y{W@G^+uq-=Ecy#kIvou=J+6 zm9OM$kM!09(mZGncTJqH*L3=;Ym(DVDVR2$gg;-19_ypK^cd@Ps9hJNNS$*xj&HP% z3CT&}Im_R`mDh47=wFA@iYwEtSHahdq*G5bws$46=EKx0D^-IxyQ47f2@y)%1 z`FbnTw+D4PgDlYycB_<_C6*0D%d!z#gCQJ6Q73TU_`eZ8KsI98g+hqzPr5*?t^?NG)P;U*bBtEeJ?>HTB zR0~G&Z;oE{1pq+*FXQw-pZK-z|N6xFa|@zpQHe4)sTrw|j64z${5^P{_d!A!pkQWT z!WCC%Z)z)MIonn?$?>57s;H~0uP!fldvSAX8;N^!z>M(yJ&y^{*xNNZiX539tjF+@ z_aO-wx4Dx4vOFLaS*la)-njjQOh%(zwI$ zaO3_-(ckN(t?k9*K%2!Y+W$>~SnQ*Tb90N&Gx{4NdOD8}axcMB;)q1@IE22B5KYeP z9W7Fd|F+mOE37hV+>c;{_+F3C`vy!^TEW&YQLtwxr@>tCxCVYg1b3>qdz#Q`a3Lzs zQY@*17%RwxWH{t&q-2By2P6|xs!N!rcNCe9FB?E|4{n4O4Bro+pAeslFb`nP1BV}u z^6kI{QKmnYP3GfNaL2Vaorh-Z21V|Iop;Y8$B;b)T>`V*35~B{8paBnn0L!8^hVNT zVcbW|;HHtG2SyIFf$!Bn6r1K2>M6pICyW>kal)DQ`pplCo^Qqp@##Ehf`s?HIrt~2 zEOuyU@B(~?gDvPZ_+aLS#luOwvmo-JoSpC_zHGL>0^}sT4$YnK9{3I_m>)MtF)9Sn zKPSk5gY%R`EewX?0T>Hjk=7hDbnpmK+B%Ii=l$;inhR`LD3MV@xk)OAn#Vm|r;Uq9 zsq6fA*G3JrcdunDpLN#i?6A0gK?7Yy>-MCYw)dxPbKu3QKKk;d^Ve%}nXltwjXM`m za&%>;S)q^I9YBe0_YK=cc7%n_YDVj6^kppdLE&aio1Lp@qvP@!kVmU3;aNxNHJArF z$Z5q+jc!5FhhpLSna_Bk9!tk6%K>OeRYay$=VsY9Tcxd|^Jb5w>qS6`!_L`K#`1{j zw>LV3fr8?1mCrV5TK1$>W!qA{eu8bPXjugTOqInbJ8swl#6G}ByYB6t?sGP+ zRa3|H51b%?64fU@^FJ*$_u#comEWX$K&A4~HO!ihy1#AfZ*4xhmCCk}0Du3z?4(AX7&t5jH|N`_YLxe8@%((0SxBvAP1PM# z#7J;ijxQL)X~#Y6*nFG?#=|ll>N9NM;txT#P>0EhX!wr*p}0ku-L)CK?@;*auik6f z!wL`LvOhcG>Ern;pWC|^p3h$l@NWGI zp$+20c#e!9#2*yuFf32t(7h4;p2rixmS0Zk6<6|rs_2%d!rR=H*U(Cc+g=UeBPw5i zHA0(;-C+@gXAzk9fC;Dn!Z#EN+xOlew~WC$i1YHj5LW=0U_<go!-F4_JJD%?pU0II059_RI3io?xIMITy{~=!kT`R_yi!><@PW1} z1dC(SeIZ;93po`aHk%W^VcIRW>$MhJHm|UFTv8jv74w~Z{qlU~_Vzfr5&d?IPUrx=-|VT6kBL8RVi9I+8I#PPvD*O(T<()l04;) z>K*V-tU%tiZc{~5!+W+zaus?Qp)f|DhPwyI+K_fKuYwaMAeE_!LCR9Hdi%+|W^EIE zWo|W&!axhr*bU>D%d0KB)r|`(lu*tOXE1sP!DEJRroyqm>({%Yv^0z968@1ST3*zX zl^vd$x#QaEx=uN-(5=-7C`&d^5n0IN)Q3YWs+0&{ zdRUrT)c4Rn2K&U#=(=+A4*Ciz2vfhe_R{OH85A)NT^ixERh;Q%{ic`y@dRp2wBjoezi zi1s-S8Xd}XR+Eaah(n0KlOl24hB<{&u0sBSrVIPEu?>E?3lGX11SpT(>kA*oBL6JEBG_Ht=!7@&^dgUfZf&KffUQ`b$+=%aEV^JOr&&!#=h7!AHwF4Kz$> zYzE@0;vo7+9s&tOK#(j=^?+$-S_x^I1}QJs?>ey?2Wq+hTdD2C*Iy$&POj)Y^o&)N zhj4sf0&s`98&F4kzQon0elvX^}hHt3Z*0T6f&q* zpSTT+2ICyRFVFho-(R75y=kDzv+2=r4&}%`uJ`0A7+dbZ0;I9$SUdh6igWt|bk(o< z(QdM=Ml*Omt3p@k+}@_@^(zsb&;)-=vRd0+AqE|rTe_czXP3@`a&B(31KcOLorEeC zM$=GGQ*lt!(Tb=OqH*9T?rp2q#lX^t;mzniqxcHq+amB;zybscd0{agy8M-d3`%lM zRVD?Bb+7`3ngA3gR5mhHLQ_!MO#cL;r}Gu)9n&D30E9dD+2%Q(SO480l(WOJ)4aq~ zB+LbkXPGKQBR|ptwm?c9lH}rOCd-%ye^U(1K4AL$8^V$?_5-?_G$4$CxQp(~u$J`7 zK-$F``Y#5y-+_KkAahrkaI*w6i?WU6q^FGSX~E0%B#XzwLA?RvFy=wj zZZD3hvi#}FW_-ipWYPnaW_z>QUHq8tPYoVqcKmI#77pfQ51o*W9c z)|#-kNFn>VQ1mjA6wR-1WpjHvtfL5U!plq4y5VKp#?8D0q{+nPK>0p(e;jW<+`vB0 z4Q;dpp5m75>vAocVZ1Uzu&`*~;eE!y?FKlAX;&`Q)^Z*49dZq_3IIl#$sN~jX@V#k zW5|}-1L<$0wrRD?lR~R&WES+>?$eiB9X7fSwXEZFv=C+{Bvjx^O!HC$(~1*i8y)K% z2|AS_mAEl0LfM(&nr&k6l@+RwO1LA<7h=B6IO>&aw&6hboXfm=%Tw5%Ok-D7cVwTr zQ+x(xlYl6#=#?8(j>6)zWqXmjC?W!f*wSF)5NZ!hT3cs*T|K< z-;H{tT6&r@|8Q(u{@uCsnYY$`-Oxvf8VT09dt8!ZF5t_eDy4lP`=>V{iUy6qv3d`@ zQ|5Lf5}T}~4y~C@LI=W3E{$GbMM)qVYIqgdg0iYPlX`7(Oh7dte8^x`I!kQdRn5IN zgyJ(?bdpjsy2gKLqRkEqz9)Tdx)K}ZL0+0mXS;|Oclpj_Z1tlwGmH#|$=G2(k+fyV z&uCh1?vo+J?R3wIF$5jMAfj({olAv>iGrG&Zl{QyBr{J*quooyxUYg+LBa)j{lxy= z#eYM%M;*`J=9&&Q&n;*Z<*;RLcPeF6ZF(7jz?n7=3}6o0M!8lY&^P|#3%#T3!(gU=7G1yc zJUnix#ILk1nPIJOJ%T{3AERbQG=mj9=oSbrD#&kDhKqdP+14m-!odl*CApJ1S>rsd#-PCC;GNk_b3W%X@ zwM3zgCy_isLJBimA~h}&Rg!yQP)plj$pM*Q88P@)gpi?)yi@p-UyQ7%6d4d70gJ;e zr-hkqLknGoQd#cO#UFN^PTiwSf}hmxrG=1>`vwpAE!dG>h=tN5;c4t=gaa`%Qhx`Y z4@J4_$+4>*pwUhPGSb0#k7E~Zo|VAyHm<(!OW$u;gnsy|=MtL|mS4A6{0At?CR&2< zO9XsID7fo|^K5h-khj`V|SbT0MI_`YI`Y%xcjpcPe%)-aO zy9YrQ95)R~JFW=1zcT)2CDF~vjAblQIS^8%;pA1qfX}(3P6TAKqi8BewkQ0vOFT2x z(tX5MFfqib4JK-Qk*@1mh@A%1IM!N$OPq_FgO&S9#ZQ_;e8AuWj|r6WnLRlooe=DJCPnUf>j zH8deoGD*g4`5V7tYcB|J(8FaAl8W1t*KSP^qExenG)+LL*;iG`9B+esP}U&Sij=kK z3btl^4M3FK1Ax0}TlM++ypSho#&TG8F7C+daBlpM!B?a&UvqkXxBhfFk5S7ax9+Z-f*cuVjtr;CE%3DfMO zGY1TD#zx&npX#_dnQTnWKX6H2Xv0b{Wmpkinf*4MBthDHEuVcGW~AWvub?l0Jq|D` zs$)*p4ee@Liu#(}KVtKv+$UG%O}3P}Kmv{A6IF7>t+*s2lH9*ClM!RK9lGQu`!#B! zht<(I-0fdqzjg1XWMb<>`zqG2yNtvcaiS}7Qn$=Vhy_F3dV+`jVYsVF#C{#^6pG-q z(xj04;s*!?n;KYDvg2kE^XLgA5uVvNqSt&I$-!%CH~nBvn>492`emTl ze*mjSL?ek(4xT?vISK50z%IiclO(Ri`h()vlhvGgjEK#Tc;9I9#;KnSbF@08GF)Xk zaoOzfzE?+$n~0^yGWq&@5M8?ZCT2sYvB#6JRYqZ=iBTee97IRLM1?gqc2*wZkRP*+ z`Ep_T?QymeldTgFFf!gH|4Mn93;X;2^gQvTxDjZNG>y7P$MRGySM6;JpNzgO-uus4 zqc1`mtsbeoyn&b7bd8Lvv$ywkaq?;-rL8`AU*LQzipb@BGj1_`?j}WT1}6UShTLus zdS&D<0?AMHwd7ki@lJD=wd~-SA`733wHvIAQl**7`f=pLT#)<;`0P)GwaC+*3fDYx zWe<$!*^aolJB#iWhd)=mAMH+Kgt_TA0Zu-suhj0E$vAYS3GKq(@6Q(;V!`=5(w<-U zdg|uv_jx*2usDSoDIBA$>#j_i$Hd)5RkB8S&`BM3X!iF#XecshcXpAee|7l@)mCoU zr7n2$;w+{Y`PuqN??j{meNKN$eD)7F2Zdcor>1LK7XJ0|!+i45g_OfIPSCy{F~iGn zG#P%#Y^a^enJWDp%YKX4-baWn)(McO%MLx1q7l%H(O_vJaS@Z7L;&$@XfPI3L)7$z zJ1@eueuO)lW9Myy%ruFs!{?R-F2+cAp-W&nmk<f?+<~+f>goXxcob#Te0y0hSxr$sXyCFoEZXHhsaZ2;O?NA__SJ4at7M{; z>xqG&xo~JOqSJIwbP)E2-x;UoxqjUASC2zGyV;M~wGi!vw$J+y;p#DK1%(u|%;_O2 z4vO8vcW_s4oMd6r$X-T0p2G1+q_G@zYp8L&FMOacO`?7zQjlADV7s`q($ZFa+zat2 zp{Kb-qtddorDUk|Wl=t*=4pi%^qDqJz*{4T#qD>;6||B*z-b!QS+t zFydr&*klrTCphXJUr_OsprM_!hl7hk3IIvcNF1HhT{d2y;+51ZAwGqI0jTLNFQfvy zXx9@dq9sjj+nXX50mp3m3+n#u&TS4yTUUpjy5hm@d(d~_VBsPAq$yZyD@9{pQR2Z$ zS&vG=N|rK6A$&?sXwLehf{?5*Oa0ipfat-UXz*DB>#>sMj~snJI_9v~pli9@>eKjn zg&{AkyI%}1`jmc*L@wAwY{asJPHwM#%<)x-&MA~=MQ72Nw0ywajFh}rmA*;uq&$_> zq!Lx`b*JMI8Z54Hza*9l#)S0Vipf6p?IA#C`1L=n1Rf4vzK#&So-`J~{jcHCokBkw))MvpFh!CQU5#aZ#}@K`xdC zChz3P?6vNOV+3SnCb}Q1`HV|t#c<8Hd<1~FW+6>a!1&ObvMfmic61Df+@-thi>!pZ z+N%CslC_0+A6LCE6%Rmv6xZ-v0SfKPS-J*i5=$c?qz>$84HtkZS)U(awO>&-saB4h z6B?TIFO%^`-l0#V*yyw*sBwZwWqcVh7^?D{ij8*=>KJ_WB=CDFF8Bi7TA^v3ze`^W zG4>$^l{|F~WbTLL>9h=mG{5CKJEkRnF8Veb@1*+oU=%~XjZtw?souQJl)#kvYv`_C z9XLcb!rpaj?i{%A;Yn6YKq_$Z4%Y>G$mCEh|R_U9-_;ei@iNh zaWhRV&d<3=HU1HcXQot03Xj-7amY{L;`}`(uA0+{X;UV1S>-ugN2D{|W=yPyb5Vi!Mte^eUK&t$ZW zrF7oLJfI_NJQeUVT3(*<1Yy#U(P>q zjl6*hhWpS|&d4v6@X#x-WSil^O0g@qnq|T;e~gsb)qE67sXT+FeAHh`MnP?pMGMd8 zinmgYDia_jzkO%ul_s`c&kcak?_$lI|eA3){WuL`#nR)aE%12vDS^H()t)78M0wC7H{G zJQJy)osW)iBVaE`VH#}~G2ZI5F{xK}_4cq~vT^(Lklx#wu4CxqPOM~qTzpNz_1&0m zg$|x|N^e;<;{2cOv^87t*bK<4Z$tfvSAIRcH>pwXM{64i%9lloc_^p4#nvbka#?ai|CAtouAQby}k^h4=a zg+$a(&qLn}#a`uI6fOnXx;9wel02WM)Nbk=wi%Qot$rV8KEwOwEne7l+782Da-;}< zv4B=;snqN-FQU4F{siuu;mzgOnIDW3le*bYk`&XZ%jS8PbGRryhMDv1wh48NxVfI+ zc-G1SBpjon=wIl=05GR*YEjP%37grD-t3R(cGNeznr?@Y6NJOzvAa2*3LIg5IHdyj z-mC=_4#AS`qzs?*FU?Q9OPV47BV7hKqzFr_eT(cq zzu@+YMj1OnMe8;iu2ps%uDa`kV~B?ZXpK6TO0~*?)U)9jQ5ivHbm%3N3GJBF99^v` zlW|qB$g1|mVZv)rd+3Z(?l{5qK(|9=dhVA1y^%`Og802WWh>9+Ai2!tp4YRzH%_~N zv1u0q9<)D#BuW*5Xz_ew%mvmgZ_`5DuBKwK{o+F^#JPyBI2KS)`!J5!5s-xmV4MW8 zD?dQgr!`Wd9(GVBPIS^P9Hq?0bzAQzm=l2HNyhLbn8B2?(dmby4OX7Rs*MY4EvXVJ zIo)tGS!g#$G|o>dYNdQxNrB^BxUYIW2V8>m8urE4i;^z$xPUNhellY@DKBeHlf;?} zZQX=19Q9Wco3kN6_F1MKoaVadNpwQ7RFBeFnEi2XX>0Xy(qNRSfbH}CPBWWhP_R8p zHK^JsA&CKFMEQpzO)0yAg8k#^h=^kY(rnb4)sqdLe4* zIGwp)6e{d9WD-ZDg`0Zo3iv!F(AXfissp3ZTYFq~)YNAR5T5r+Lh&u&RB50^KY*XXFZ=D6Xo}d}^&wgak?rj+OS-G!Ob-F?T^> zL(ltdK?r_-fXZDsX|dVsmM7$>=v6B$OA;SDDtwe~3CR=>ew>n?k7|v`)Xqcz-a9a~ zEi~kC`)5qfx!1c;En97Z9wwglzVYerIJfI|KW`%gTiMcB_1`*Ws%IRB%c6N5uV_$o zC^utlH=@n5^hloARh!UqWyK&l%65&n0de8)LL_wU+eca#gb4O z6RFRt`3K8_b`4n$*IoFCI$`Ac_T6M(lB8DSJL4w?{!z@}WGCg(#rh>CxcD_1`4tDA zy3S~?NHHrU_I8>$pt8Z)go#t@GCXx+^Y}^8t|$C&@F2}#R)W_+;`+eroTbDVFHi*CCUeR`6{*&7lgbjMe;?*kRLXGUEo z_*G)OH4b^%VHD%G4b&ndYXEoLP5i3-Nn4%J_AmU|FaDf<>1GMww~a&3b~Q4v%<|=I z`RM91xG$nMnaQM+3zAsRhAPrw8^OT$!~A?Q;KJ~&-;cI&WEHy8t?GpF3oKr7QqZqE z?|HVFB;{-5EWrwwuYsi9b4^#%-*?XOSm`fS?XOibmcU!wo)mj<(w*0yFX_`Xa`8QY zX>g^K_2H9V1BpuH#f;bKZ2qEdLuPy0m*2_f-{TLiZMNjgid<7|X8P37a(Bd4s+i^^ z`lD^7_ge*ms676+$EUE59^u+EJH=cD)SR2cPj=IdbG}-to@f8>fy2vg9t+aY^rsbbhwcwXZy{ zjd*$c#RK!l6(|>)`&$?!@`pD=$wl@Y`rod4qyhR`TswD@mBvq1h>kqxw(sB{+1%9~ z6&X2x1+_l{8Y+*#q6s9Ar~Kui=V+~MHZ?Xttc_K&_pUko*&&_>erXrxC-Td0YiuQ< ziw;QR{Rt5rdnzL1!R#4o2}G{pq9c;KA{r-qq#wAwCcTBJXQz63AJ8dx&BTpl>-ukN zpH?Z~gfP)KN%_mi+)#C?D6QAf#?ZQd2KJ$*Eh^7x#OsI4EJ6{fsC*ql` z{4*@SO2h9>|1%Erx_Udo$d{~^)U&ry#3%Oj<+1q)HzAhHJcJ}_=y4iWR@b!&+IUg;@hw!O0_mO(bod(ftg(pAq&?8cU z5mEF@_rwWnhhQfE$3h1O{lT}j#g(MXrtp#a`qUK5*vvartNa_rPtNiOB`0@g3~F&| z7A-x`B4YRvBNj4RM?a`$Ed+qq32>v_`dN~!&J*G1xi#W$;|DzRD*BVIY8^A%C;Gxkkz+joi;7irako@UWv8-j7 z@K$F@$Mj)x69Vv=DnXk3s5S^tV0ZXxmneFVS@jn%m?rrrvz^oG-18ge>qyf(p_|rG z_{g|}go>oeTig%;c#}&=4@%2R9&}(SwWD*bW58!~j>ZP`_-Ut4BNvv0@A(1Lgo*qQ zU*{AgN)%<;viV-wwr#$$ZQHhO+qP}nwr$&86B9iXGtu4ol|T14bDy~TtaU0R79IrI zkS!9*UgVH`%*Q3_-Mdd-oRnE>}*tKz3zEX5$>9XP{%Im*bOjN6pq!@rRLcz|;3bQsIIn%+=T zoqNKY@bz4F?h{er(ZTBT-yn zQLs{R;baCBZ@0#nMtT8ypSMeZ;FLeQjc z6(5w2NA{q1ZL}V{-o)7>oWgnu&_1*hyq;HJ;4+ck5_;v=9q_r?y&73`QQ$^KHNt-z zhu_lmi){PL^?oOZWb$rl;KB{nsnA~%NL{9+cS!ryQM5lX^)}geCrKbC-wYevEIMa{rn>S#>A? z=p^rU5$;O;87BcH1y;@|A2f@8=rj75DhA_Ph2^q;6n)AREs5hpTra@74g3@KL9eH+ zYPXNTSvpkc=0i|LT@?VWv_N>QGC0)Z&=;|ZL!d>Q)~09r^JKDT?cF3*5ZqLDCw9n& z9qZwZ>j*r@((ie5vcr?ufY+G?#)u_IGJ&e+5g^=}BpcHV@@qh#@%JV!DNIFgG+%Yq zZ{@nHCBl;H=Hc%inixuGfC_p=PB$mA6}B~!t=E1t8aYPJg>WHC6b}SP1nhBKY<@R= zwCEHF=`w5eVjWCt7Wg;;q-_ogsV+U@uAnjZz6!Aa+#oExRmtxX?cl?-?K0?<%8v{M zZaZy>9GwY&P|!&fOUDP42ojT4?U*%x(1x91!6qsV+2jKmrv}rx;b>!x3u%!8-HECx z04rx0%2yTTs)5p~{Q{SOBSh47HNb7#d&9tgPrQ8TAUGk+$QM-EVa zzMR!b?>{|$(DS>NalSoUR7l@ir3;qOyxtop`}E)zx}G2dNUNVQoVMAV!VSZoz>IsS z`@{^;T+{wJu)Dt8!ZR#A)GWM9sQQSV)2e+P`GG=aMwb{Vm=spuRQy2+XMisEOT7U) zq!#uMAelWYZ$ZHlfQ}P^2M32JcO)9n(vdc`j^t84kcOK$V&vJ$4HOS2dGyF~ULV;x zr~b6Kp)z9RojzL$8v7(xm`yG>V+b)T|Lb5PE%0I8IqzKuXQJVzqbQ57VrCtAA2ODd z-l1J^M4$u~E@b3%4*yPa%yZ&AO$m~&h|f9~jd?SQUBhw^&Rkv*D$26HT<+5PEYJoX zXQ+vo`FUTMnqrM{>}Bmy)Tc!bl==O%KMDeJ^c);7iBG9ion_zA86kVca(WLJNh{Dg zNc{?C1+)WkI9GN69`SF>m3{T9`fnxb<`12$IcYdsJR-~mS>b0a2mC$FS(~Ujbx!0+ z6p9~s5mdrN2j-Zc6k3w|IN2eHYD94on&tAoO%CsbdOA2!Pv_vnpctq&Ql5sgs#~&@ z54)R6)a3|$R)rm$$@V$bS!JbyiP8xn?;)}&0t8PM)$w06GsFggo1F^}5BIu5<_>ih zhau2}UAiPL&XS?><&lT9R|v*T5$j_RDRW$JmutPZO-LwZ5hL!+>Uwj7wqP^rwzyC$ zz7sdG1mWHJ7?q)X(ZH%MffCJ~0N|p#`}&xs%@+qT`IAp6>Bi}j(|2VtZRI8BvEHOh z@iF~QdC7wqudxb#@XbLZSYPf$3NOS6!x~#UXC#?w?HP%K;xmw@@i*@n(HFSO`~2QcoYbV~LCou2-|2{}cI&cn>7=CbV@nCE z-trr%Sgu&MBWV}SRB&{;Jt~;?siKaik?Za1^#CACP)8|Ir1sThiLo6!twZ+Y6d`-$ z85B3XbP5ec&Tjws{>E#`^vl}X)Jtch>Ah6Ttm^%;=?L#rlUDu{2~_mzUA6fpnWcL3 zCc%)9$9+|fXcc8+s<7ylut&&*u0@9!l`xU30BE9$vQP9Ev}a>hADV{Q5-vJ#v#tYf zM^F1^$dL#sHb)hFx3ZQVHKU&O= zR3X|l2S+vR#nS|%5BxW2sJ?Ryr4Z(5o3=c>wU*@`=C$uE(1$)m@>3cD<7k|hM} z2i4G&e7*&I%~4O3u#=43Pz{voaq1oNHf~t$@cChXk>s1MglW{W%uQN}6L+#HUMGov z)XW<5$qQt^n$GpYkHLy<6&)JtipYr=5wjC?)^|END=f7Q>{H0#@5+mzj>gdmyI1Vz z-``1?%GRRgH>(U_cM3>DJQ30HY>?OA%Q|&dezN?CksF9K4|6|gTY2yMvZh8?;}q1e za-M@)BvEovhi|xbz9rpquUYm2_`CFuK+DaJ6kd1kl$sBzx)HBqJh(4mhQ{M|A{4?) zVa>BO@B55ZSRRIvEz_~S+8CaSnUg?-D#lZgdOBTIy01y=%*}{L?$Jk2jvQ2Z-dyAL z@dTaxTvdQf2e8eYShI6MjV&c_ZX1e;Se%iawqY#7DT4yDA#lOLjpj?!rD@BHy4X>j zZ9h4BipbRE;tNDhDhA|zes*`U$7qt^Qbn>E*Gl|m`AX+izprs|XkKFc0O%fx+v-*_ z{+w+!RTIT&g#q1Gi!SIKsvW4#DsCDQmIPyWqPjW!+{$8fDp{ExPkcPf{NGmfNMam6 z=*b+E((lmIY5PA7KF0QXCNu^^T5c+Y{~N(wDI>;I>&le_4>BcSTc8=gdlezbfPX;3 zXlGm>I{r)GR`QyP8@L$T(27svDX+MwKHomE>FFxkR?dkoFcZanPasoxO^^{->hk{b zO9vlN(W|b%^+p+Xixm;8^mi?sryH%eb!PQaoU`PCz1rZ03E-V+Y0iF_B^~>ukGdvp zGl$7I@A~?3ak-lTFMmOZ&bQ2Ow@VgzBY;<85I$JL!c|zp6xQQ{c`*%qb}V-dglRC= zd*{HqBJbSoVPz7}7IuM#UMGN7LaLxrD;$W;*%Y#iEw@3-E)N^Q;LL;|eb|7|t@*^TxYS zxw%f#ov7u5MQV?lb&WexmBaZ*AA_+;TyrpO_j%aJs1PYK&}wGpMVv}^ zW{dH!fzIf$O9d3Kijg%$>S&8u7s=poT>maYl$B0jgtEXsA3vyy__N1O!bHdG1gBhC)|G!}rQnMs)wl zMMgzUdr6kU)4oRMW$Clk&(TuU`&o%Ie2t5<;>SIbPmfZTO|=b2S9brz_0W?Ws+K8V zq{Bk@r3+_Q^0{_)=1#UVEw4oxYKxbX+mg!3R)jUK)Q1W+#EOhc>1=6x$+*W5CLTFL9HKH!8EEpRv=`PpVYFkbto*kj&B3KER! zr1+*vMa!9o^TvC*jq7Z7gA(KH!n$T*kjBZw6z_KIQKyCe#VY4mgi{@h2c@iG=%cjV zq}=Nrd6=C!s>Uy_x_3|3^3RJ-DP?8)JC+`crPo3LeL zvIzYA0WW${=ntt{YFUiWaEnaAiier~WYwe$Z90FePqL)Qnk_?wFngCIUOL`TaW>7L zKKGZ>^#a{uY1F$4+i*Q#&kv@E;5BU&90e6QS(|@%w(Wc&CJP~^-&|=Y9tkE#C3Bv1 z(g7dotOd53D?D%yeYW=$8k6SR`$mc@lo2Km?IQ>YYFk8tX4lz1lK%8ysUwfJFh|_2 zXN?|R(?bytHZ6_mHx0@)yB4jY3ZjOdSs-d+zA^=BMD-k;x%kdzzG7&R0;3mgOP*Bb z4MU#Ug|cb$v9rSQJO-cx)VYfDW^^i1wm04~Q7HIfMy9_B9H5lR?|vpd-xy1kdcj5- zftZ|Qx}>mHkP{pjaCYGkP`Fp{mQ2t!6fLv!GSid36(}ORr6y)u309r#nNC&m;kdc@ zQ0Bof5vw$W$ZP0NPrJIo2H$Rw8=SAI%q+*V#yP!OsUCn(i>SdZK;i)rR(HHGPHmy{ z7xUbtnXAk|15big8@!p?svj4)iBW?tN07LR%H3m}BF0Pv@_k{={-NL1Uznqq$fQBe z-VfW>-bniOeb&%el-8&ugsQ;;TlDni?OsmV$M}`=tt!@BMZkfFmK3JDx*^egpJTJv z^kdfS5An1 zS3v;(&I5#rF$I#pt)Z7ef+4O5(v+_|iS=1hQvqjI;@8Ys&n}A>&^5DioZY<|gqmn2 zFcq!%3RWU*x4$iIx38aOtk-kOzI0x8intxO`2n(1r|bSAaMWhkewwn${k6pZHNytO zA+(dw^uAY_L73hO@D9-y>kps@lAHrO{v*mHS!Z(29Kc+fs>&T7z0CmcH!yphAP^VS zqc_`qMI8;P3=Gy+aKV5P%qQrHS}kp`O)iXigq%u1kGgnmMvTU2n!NKSbkcBrl$?!)5ew;<%lh>~ zt(1CJxxvnBC2C;I^W=>6oeqC$@KD=)x4#7s-WEGHj^Yb*lk@rVzM==XJ$-bhGs3Uh z$M1){UQ%Kh=;98XY9DY-P9*trXhfJUBTNn>`2Ce%wg~TwD+AtVnh2Mhf@yQcGPQL; zh25O^{VmYVx};%ahuc&LAI85T##`G3uqFXukX}(h_%+yQQ!caEan5)3ccT2m%pO%T z4GlOnB{DQ966%$FP{N|EQZSW0WhCzE!a6al#>PYOHjdt>Z zBTTsZg3K_Ei_U?`yf5^4cV(TmkRu(Xn(R53z>FJ>1Sx9t=MH4pu-$H*)P(h!W>la< ze_0R`r{5{)gZ|WOqX2uzgL5G>-Ax`GVS!m!FU21%02v}gMn~RT+&Q!f^DTbt5 zrFH20J1Q&iGi|qd&I8^|3q+iTbJH7@)oj8s%B$U&akC-&xv185b`Gv}o?bZZk(4q~ zZypS0*?MxZl(D^#`T-MGxF~U(5SuRMp!hrhiZs|lNQObyfEh$qbE?Ay8Oz2VQ71oX zm1x~BYS1MHv~9#Zr{oy-!O`VKmY4kpBbEKCv-Rt8lEV9KTRzH!#~kj_I?8vAHD}A; zb0+%>f!88T(=0tNLyEC+Sb<^(RK`@uUlNC#y!8)0a0z_^ikLy6E`F*K^;(=K%g={J zU4kw?oGr}RfD{+*xHjUYdA6@esHNbnnJE>GubNf~rhmp9nh^JlBJ6pSb5g3hb8S;4 zgsMiQ8SvKv%Fl!0+EpY8T&ADmNS73}NTLahe=2B;Lno}zl^_iNWnHAd01fbFsW^ij zhkFX@$~>hcab^-f{VeGccOT_C5b`%iAjWby+azp=4+lJiz9)euFZ(z4khF~=jW1LVU7%>-7 zTAqFfI&VoGC}#i#k1q5+2Wh+nCd$|v_XQiSf;Ul^y{m@g`))tuf9k0w(y~i1_(WCF zn|#-4nAc&&q&pq}a?HI70Bo4xb4(Vy+*DBLsn0mDkh+y^b(Z{6Osm}42Qs&8QvPv( zsqa@f4NU{PIz`kE=m(rLmjw!0RP%h`xJ2^qH;+0 zQKk8HU&k8)P(*_d_a5auSdnVosOwTjVgg=mIY~7}ewJrQH+=ehSd;jy-?JGYYN#|xhcZB$uVsg!6!lR}RMtlO{i&dr zxTrd(bE4uiXlkPU0-bkts&a;|Qss&OqTumnkQ+7^&C4CvGAzkOGU=m~bpfjMMQL<4 zHV+*L@o$(xbJlV>#r`)6S8AF*_=4pU!Eg)^Y}rv7>Ev)?9pPdvnC(onB2vR>%&$1t zdXLtCk=sS)6mT!uh$pxaKU+VmP#cXWv|?z-%TEHyA9~EYa7QIK3J8jh!#9|?;HAjWE^EDOlQ+xJp1$;<4E<~jRHkgt$g{URqw+>k z4|UZ@=QWJ%QP4XI+!fVcwd=9Vg-IAPx4Z!w>lS#6b0f=VcikUcj*ZLD$)F{X?A`(Z zN0w_2W5`Mcu48fLkf9Rgt-d}^Q6+Pn3ICGYiC|z#?XZ)~Zadtwu8lM8I$>r6>#^`; zbg4zs2HVtj1eRuIL*xp(dDAI4%g#1AKS9UQ$fh#{mX|7H!X!zF0%A(UM`ED*V*1p^ zMFjyJ$-ywH=Tg4uN7O1NV1eYe(3(Ts4k%EX1<+U1mwyS|P$KSBMNNx87Gf5d$Cc6~ zRgS+9`sl%%-55Tn_Z{n9_*X9F>h*`aqy-eW_q|f1!ob;v(?DN#h z6IjUtozDn;0Mb?$eVm^&_=wKDj;g3IbNe4>EY4;s#~|91w5bD1|KHR*HrVmvR!Q-N zha#@Gxj-3Kq=YhgPdau;t zDOdvWC=(M~^PqP0&HL+Ddg6g;m`b&f&!I@sjZmd_8T6!`enU;ng1P4+y9u5T)+vK zTJ#8*XP7WphBMB4iVE~Xo`a*)Yg)YPRz-)GL!oi{VB72!*X7eNL3aQcW8U?{gI#tg z`{#+~T6>Z%YbD_gi!jKF8|E6*m`oP^HjxL3cA@Aa0j_X9g?P|Qf2tek66JjQDK6%; zKKaU%6RXQY#su8pNp+y&5E!W~zw3JIoUn4)uR@eUG!0@YT@O~Ih+l>|O}u`@bTQ%Z z0fG4n*t;w{i&TBFw5C?G@Z#PRwEg&)zxCno?p?StvME4ZsMq(sF_vk+|D@(WKQs~1 zn3{(8qex0+pXCLd7EGAh*j~0!=^H zL(Xpoz;@5%AbV<{$?x_4I$wmn@sxcdXt#4)>IEw}-K%^XAA_EAC8!OLf|d9{M+6zi z_c?S`ML#F3%#D1N7Ix8iPffu&N@7lIPqspph0WJh;)XsvyA5$jEmR$HjXjwnN=MUD z`&_KdMNk%GD4w;Sk39K`#P zo4!Nu5Z|Dri==`st(Q4D3PKa6rv9Md0^v`+fkwWSeNK$uG+Ou8Y@D6rJXK znvYOMS#2rSN3cSPa`5LRY#QrNeCO<-@R4(SorVPB-Xxa0qzOnHv8BJ}mg<6zk?hw8 z+~IRLZo8;7IeK$=eF9!SI8U348dljMgGy5 zr=B2cvMyx2LdD}P5tb$e!%%r0`O2)k%c`q25nF9OK5}rI;?85#Tg>;7HWVu#pcA^4 zjS!`&hEG&zdUg|sA2^$>nb84*__x@$4RQj`oennMcL8Xamje!3@S(i0p-LE)Yw840 zq-=Eut53QU`$<*8ejDkt#XrUj4Y^lqcrHw&adrbRx6a~<4|Te$vXjUEdeVqAq)U`A zs^X^={JOpg2=)ub%c-|%@33w)KtA>c0Zm0(a!?EB z?d`q~?F2bbruR?j-XKYcQz2DCm)+r^cL5C4!Q68%Srz+E=lbPjywwRAkq*p!FUK?_ z%;Pi6H);wH;^-lTr3cOWPE^w9ONo>71KVi%74$NJOz7>!vgdS_`YwPdB#rZLw~Q5M zD^=PCDJqcSn3&(vkyXrEl~Xu7M}e9OrY0b6SMb9n(v5T~a+Qe-|2FqfNvwH5mg$t| zTY8!CuQ6!Vgo{&kBMBjQ4BGv?KUJ&UC4{&DF$eI{86gm{XmeHQtLaTBct&;DqERtm zzIU>5a;&pX255V-%~?+WsnmXz;|K=GC;k>&b}2Jw7Jk0FB;tKm^KayWn~YB*HHdU7 zJV<@zz}ORQ#)o0=u(cb0GH`s)lSHu+1JjpJq5OkaX3csk}lIY{pZx%Q@EuRA)!gxl8q({Ii z>a8HoVnb)zkDpHB=jSyvjEqY!#Vt&S6^Yx_%J5*MS| z3>Dtu`k;yZumZeStZ9!mcl`B7QfV+j9Lrt^7Rr{D=J7UcY%>RhX%XXCjXOmC44{7= z+d8oA6@+^zU={HP{PsoOdx7tcuFMx$Z!y2KeMMbZW4UOr1WQkvAq6e)OeAq&F>-@^ zS4xs9&z^FN@0_2GE12=;qfx{{@kcEhtc*VQZzKbd38{zfgV|DBZ=Y-!3(IfAJ&ZbL zM%Ll$q<-9|^*)bf%N-Uf%Qj97hs)ZK(7!=r>q~c&OEVqg-{h_bsRv;#zZJr0q`dr0 zeTZ9>h>@c{qc?cPSr2Dm*4Al~wc@U#j9FDdu5*-$+4g*n;wCfPb&f~qW#exJWQRX9 zT_nmE6=B9Q_m{~o(KB*s`XwIx`ki5+=!GI?|Dc<9s^6C`Lr^EUG<$x4nhQgu3rU)Q zbJJfxSAv|XJ3G*nC*NdTkk)&)!AQx-U!9j0u4`?c_`lp>T>R1R*T=t5jw)^BYrdCi zZ`)nJrcdbd06+aCAN2R>&GDUKmk?c^Iu#ZlX8!B2T0;OLL>LNU7B@&&X(B>MY-t&d zB7030RlNOArA6MT{#-ALwB|W0n)AcIR#V<2=jPwtwW~NPO<2MPac$nv zxJid8Is9&g=e0n|{w+j!jA8PwKdQWvaC2}EkNXqCJj$x)7DAUF@*a&AX2NMddORAz z(oiS7PZWc@C|>IU4hK%SG$%5=MG3Kr!W?3gz*iKshmxAF=qrW_)MJhIvuLGOCUZs* z@IURs%a{VI`&+U|=qFXH#ftw2h7pBjQ8FwQ!^{3pg1f&B|k*}kE za-O`HJ4c?n%Ec@@Uke$>DV|wXM>A+tJ=K3dLj+LleshlIOIfs;Jjt=MzhVDlxl!k7 zh+HFhPmFEy7Dxb_%GT) z_s-JDfI@fUNo1DIx>wQ6+J|SCq>N><8BbLrkumrxF~mup_qdi z{T8pAudxYQ_ZHNr8|<;@KM=SXyDj4Ls5;FU6g9Cb62T`{PAd`ve9#(O-Ne+%RP{$REj!EFOS6=%BD@Gc$W^3nkkn7HCta_sn-RGkA%LQUXk z8?(2v(GJM5|Lj^H5OAg9fllrE6jMsLa~ZuD0`#b<{D|ekGfT1M9?~Rl(616irsIinWpAHnuZ;k9=s>$7%U!W>Ol8l*s z@1~RY)WL%CZOxCUIuOHhw*-Xe;nVgCn>>I$^r%=UaHhK9wC6BuTt^ouz2fsHj4lR$^IG` zCNjkd^3|m=^Qu^}Ihmofx`Fxt^t5kb@HB)NHZ7A8!`2c(-P$4ND$v`z;kApwy2zKi z_&0*RIFJ()d)d9^b@cnIPghM^nk-Aq3VjoLA{6%Z;0cQ5ZPl#R|Wr;neziCwJ!IUvx4 zB{jZb=Po1apQKr0V6)K|({beK;1Z1YeSMzr{HwF$>_<*`oPk8c!0MWlMt$+)YYULF z=gTlFe944-M5zgYEEn3I+yq?|F3K1wRK!8d!Z8Gm*-OXTJ|^?YleJF6Gy@}s7}a`> zQJ0v#8i~aLo;Vu;@AteX;oE#u6K2(&-9cP+W~+ASMcFQ1y84ra^G+2Qx%7)!PPSq% zrIU3IT5HA!De{R1i4$6s;S6J9?H$<&dK~vqmeubd0=+Wcnm{u*sBPAL*G9e$f#1^l zbw;f)?qTw$`)KAHhArFSB%mENB zBiI}WYd8qd_z5jSH>3y!2aZgm4PWtB+d6XgQCNHSZEGm6P6N9B{LUe6Rw6MV{iH)J ze698scaCo`^a(ai8l7@|K7)F9(U{sXM6^`VV+bq}hZ95s>uQz;IRsP@BR7FJhy~$& zaFqPxJ$I~>fBb-L?hg?vMTvt^5(BS!@aRina1mH0;1ZaV^(YotX+;&w`|WL6r{z>b zkcs91(_vZitRnIgX2QnJ=?VLA5{)I%X9sQMb#);IXCob66Wgzts_F+9mh|Oa2~n=w zRXudV814964X$8X>8l{M(B-37(vy=fd!eFJn=}NFh|$pUxXnZWEX5>!L=NNcD-=di zH$Mq(n=%G8SdK7a7Gw2puQsx??qB8$d%Xlgi;}vq$g{uGQpx9z?&$|^qpyogk(;pJ z=%7E8(hXe)l&E`LhsZlRH`Qu18c+`uYx8T(lyK!^6Y~U$)snDYatt$(BeLb*ke~Nn zlBy$Pih3P$5QOw$Ob!xsa?4g=(1lDWz*U~n8-0oM!2K^`6uC0`~bMXj4$GFqhkbpFOqubgIbMe0NrG*WM z9v7vGYo)o?^Q$%7KS}`Q2Tfy9Zn!}U>h7=H)|kcvC5LI z1_N$d6Zk?u%XEH|paqwhPN}DtMVqGZI8FAt2EyOl@33xV6>Iach{(jn1ciI2vKrIt zqY2#>mI$>bbIi)6wAd-}?#Y|lo=YqCxgy*)IaWGX^q=WxXQF9IOO|BT`G6M7=oivs zANIbRp|8g~Um|e$y%3;HPylr+P6?oICpPNCW?4!id`^c~YL>1`B|j@_p=z339GsGC ze?V-+TS>mHq#sOZ0*`WhB*A!lx0iMnF3AY6phvBnBUDMqGexN{_Toh;^>Q*VNdSmE zNX^FiS$>ACj z7ZRSNs=r3mLJu1q{LFX)SRLnm%6sa#{zmzT4$1O-b}S|A_KtOy1&%Hqav7EhfFCSi zNN)tk8In&+B%F>ZZ2hXkl8s)3M6Urp0GCJok)gdMbU*xf4-hUwfvyK4(aHL-$@LN6qKhNLaH%k{YTUrNu z16l(cdm~yiTW1#9|2zNzfSMY|k6Q~tM*sl;@b?#q_p4F=uMU_QSlP1tg7H+{ViNd} zetdX`9HPXV+O_G2F*O{+xDDFtuN4-(_6<-TyLg0y>C+e zx)L}Y<2l^!x+S$Ik<{cOrgOMGu9>`P;(wF}!!qMC#F9$IA;(J)vQb;9$724(3GKsJ z)Gj18f{7Ky=6e$A7c)*6V3$k6Q6wFr2dPOWAtf3TJ(NcV7Gn{qsdkr`X-^wvY?GJ^ zyOq_r6`5v_j4_1?D9;*a>5-Qr9C68s4=N_UWe^QVr3XRr0=dsK`D7Tzh~8@?i;sH`X|5{$jdB2R5Uwcj?sX% zjh~~-BtBqBBObN&CMBY43mO+h7|K{paF^kk$1%XJ*PhYJvN>Sl9qrKp_>+Y+=9!51S0ofO?G~bVhQx4TITy!`gZmitN&{h zlgGA0I>nk7YysZ`>k^*Z{d@DdkH^mck{|UaX3UN09&3k`ZtJ`BghOi?oH?5tLUY6> zf%EjYf$n14BGobi2pbIewAqcx=SFAQ@H{kbjQ+T#$L%$8aT%b$^c>lMNlSbgE*-n`+`Zn6sy8UN6W4pO0>nQI9&3!M!50jpI(}nLP7o?o6 zv$p{qj`wy`x;Alfju3@b6*3uYdMn#w1>F(r7*1_YaK%MkH1AP4i&*PxrKU)OUSv8*i}~1;h#g)lxq2Ld$ii|FkJQ zYFYp3l73K?#sk!v9b1WYQrDl;dkg$*>oKBulfqU#q8Df9XIUlo_Vuerk<<$LU|NuM zMDEmKQ**S$;;JSwrQkHGdwDyN3a)VlH(}0JL6Db6BGF?Z3fD*7hgp(n617C-)WMFk zjl$IlXeZ<5i9_-yoc4k+7FgbWE>1swdE#0a9LKxaj9+_!{2-SADkofpABvlCvy{)D zDQL7+JQD#cLYsuBAxCIrv;mTiZxWe(>}EzWhRb}EVk2b0gaC7K(g>ENnc7refVAal z5j;h$Y+VBnozM!`Qlmx`#Hsr+DjNKWmWs>#V${~kg#k1eW?EZNaH?UueQ@Vp8QHPq z;XI_d3={|SUENh|?L1SGe3iuT%b;}pfnMYRuJBm*ZL#oMuk?^R#3(8=n==lz@(sUWmwYNz0?+Nz@kuVP`5ul2-+KO8TPI`meL-{^tG-O>zx(Sq?7(R1y#qnq zVa7Fv%sI6!wu#Z2B@MjcU@M@Md1k4F#d|2JmHmd;8(xmr^M}*c(0om1Q|(AfnHr|P z2gz_3kFaXORY@bNqCqCD0cp4}P8Tg@Vzw1eO0jw+fNnR37>lGYFsnOqmMW_RDGPO4 zIwA9}v$JgN>ef?&23~W%f5{V_IMT zD9hs(WgKR2YM@AWtrNvqYnG(-pUrc8Scmf_rY|+pX>|yvXi&m7cRwq3IU9gxUmLcjVMt6stQZe_)=q=HeSpKTzCn8L!X;qbat6-0#ou)#y;zQE+lBj(0lI3mk=-PJ2>Mr#M^Wut`^a4Ym(M+)@PaX56Y3QhOXl(Z!%*qKs zebPJu5VXCAemI@qpv(H=UA5PuDn|)%_8o%3Js{V`bk#IN>Rt!eS~=(j>+c=SA0S-n z?)fV5Pk-Z}KU0bVj4s`3&lcNf=HEN}KeiDL+wf1WQd`@Hehas(8JZ@-J~x681W`qA zAjt<8xI9S3%mSjLE|LMDUnV6$AFcE#82iVXy4x=B!MrS}(cv&TNrLXE^P4QXRLpAT`H;S*Yg)|}We1suLop~7t@`CR_Wu|(HU~&v z8kPhfQb;92 zirjpN{&=P+a?>OhcoI{Z3l|V_CmtPZBxB4YR}VXFDwl_9K%)e^Kk`FKOsOL?Tg!*9 z^}TtMKIxp}9ghf*?^ZWE7v^qv-0L55Xw}5`q1G=`md$NkLJ`|BRj6qfrwt=09$DL9qyu2k)yua@^W6sD*d7fnq|VSt_hRzEg^dRdmQ(QRrw zNiyy^k{8AYeuOnug`)VECSD~ZDU{ZeRHs`bI8_ZyCU)O6sg0kgMisSVtU&SjwC>Z+ z#-^X)9}p$CiXzx5kAZV0YYfKhnbtEjPok|>ZAA1A6C9&0CIoqlW?Yf{#i{={QCN&j zK`#APYn>GY%0*xv1Bmy4;?K`0ig{<`L#en>u~e%C*R~4|}T-dWp7+Crhhqk z{d6`>kh{i}8^-7a6bkmhGti>ZvH{?_0w85&(*`}0^}$m2*I)!!ips=12D}zPeazc*1_=0kr-dXztLJ)^ZmgZL4n5(k-+2ZH z)bi7rN#LLESfNa}MGO`UO#0VqcDw9P;fx&Glu7rOE+9X|>}tCD%dXVR2mh{X3`#b) z6_w%5*AOJ$)`T z+|}$BTVNBOi@C2iLJ;6)^;I4g`m7mS#`V}DXZ{g6A4RK-f+`%d-LU#NHva;UPk%T6y>60Lw%IF)Z5&f{Uf(C}a zO^i*9aigHS+IIedT5ONC`U6Zv25F|1Vw+3-3!4|WDiqf!5f42aS>?|>M zbEA5T!3m%y**hoYO5Lm$_+HeBx27aym)dn0;kqX^Zsm*bxnJ7Nic&|K6(lzzE%m7j zC?H`AgapbuD=}4xnnE2x_x*pj1pkSoV609C7=eat%2NrEYm;6Eq@ zj!6W}E}uxrzL3W5y57(nb|iswQa!DgSsJSNl^PISIPo}^x^WexJGF~VnT84l2L&K7MXDX=5Vb{vTbGc?=)I0Zt%ge_wi>Xp)*uq?#|~J0FGp}){_SDsoph3&h2O@Xwh;r(q;{60f9l+rVx zsG)@^&pt^0K_%pqR^06+(Ea}{e@CyLY#0A7e~(cC0HFOhGxYzOpqJD=6fS-RZNH1( z`=!*$_qX(LWa{g9Y2;Q`@^f+}#lOiogM=Qwwe+RqgR>*U1-grZ!}+>s?0W5C+rhiT z*0FX3PL&q|m+-|psWy4bxMXC6H01S;o)M?@V3@M_!)~9%tY57b`o(l%6W&;V!4A!OLhT%0R@RI4xy^L6qbJ9#*>jVB_2slE+Ot+gAOyWR+)>HyBe zHUSx$;10VGQUg4?!_g`N%`vnD*$(C2^oj)1MHLP7r8*$Q(1`f8uW#hRAAF_9zqnUh3AJEZr}x6&tCTez;B|rMx zHY!Y~GXA{nBU!>^LnLLHrf#uvR2i>U;BXku$y8G>Y!i8o8lK{Ni*&%z`NcU(&UvP)CvuTRG4Nu@J}^OaykWT^z`jZuvJk2 zXJ8P4&hoET@bM-jV&Ld%!6W9%&i_EtyocNaZ2F925oLDaw94Z;YJ93Xb4b~)Vu~*8 zf^TNS<1NA6;ok$(zQz!{_Xq2Bj40jpEwbyf4Sr?UPdav&_cPR;UdSEJn^A8;gQ}L$DrDxVM)=`lBd)l^b zdzy3my~)kV$vL-@U8zsCKh(}jt+k%@d;W&y=B9j|M&IQztXZ<-Mz01R-3^`Ar?7(< z_%iM&1D|G!>$ghUM)d9~FIl(gVGm(wZP{Ds{f!-}Cbn3M$R?BYF%DrXXhPS*Cala_9PZ zuS(-{)3hT@d`XUpU?jVd^dalXwPyH|$%iuVMn zut(Rx$34dNdr+b3vshsQG0O4D7t3h}no0SHGM|bg>XJ|fMH&I=Df2L5r#~w)Innc| z`jEbaI)DJ58c##$tkZ@GP9XVNnL-;zdz}AHKvJ4^l@fLZ5916=j2Lw9m=bAOib_Tr zrRm6j1mxO65>Uc8DlFglQ9&?;5_rTFVCMoqya~+{e7m)D!YJ>xC%3;KtS7lOXtZF` zRnKegMGJ=~liQ(+G1iXoCX=X9)1YB&qvt!Q4n^yL*ROx@8-D%%GUf2FCsnmlV5))) z=_4@@(hc*Sf7dLmN$2T-g1MJcq*Qda%@5gD@*YF(&SC)v6;q6iF^(${Z_Pae0n-7# z{|{7)9zFh{)cS@WQ^qrx*1f6JIV0&@Gr6f5Z#^nmMVbenb#vRXmt|tiC|&Q;{wuxT z{63UK5!x%wGXZU+-LRc}IgOJk&0n4%VPY5kjDuIFp3C~S6OcmwSEPpYYX2 zJj1J9iWDOGxSAYt@2<36_*HjCQGZZuby2aC@jdM8n=&FD=H7}NnXp~7sHQ=>j^Eu8 zx8U~E5dv%pRyjQk3et^?5F9`iZK$4|EWAioQf~~|+;eS8(9wh11xP0jg8_BVD zUWDL{ZkrPPT^pvGAF^f363L$b$3XaMS3J!u#3K}=G@F?ES|E%dKUrU_{a?1`M6?}} z1Hf7MQ0+xdS08*oCQ_$f`iy7Nsk0>X166pu=oUf?+!eLsH;i7-FLt4N+8^D*U{(Mj zdPbn#S`yII^ah+9Brs)c3_lL9p9TC}fY zMebbP(y#m=8}jDX-F8TYx^sQBf5kOJoqf?Hs+>DlmwyLGyxQR@OA$Aty@F^gLdLW9 z61gY*kqioORZBEYveq>wkw2o$)G~D~ghTd`E~>A6iW zLb`jK(D5PKg%ODJtH*KG5zJL8-9A3A8K2vR7#~ec-4MxK7jd=xWoJ8os`DTPS1K@+ zrna_V!{!m<_hsQIYOpV0Gn0Y&qERj$SwVauA8$^*oRm6psjIaI!dphq(;xsO1G9K6r?G+>RLhQXLuLS_k zQyLfh=y>2bW|avVN89HpI!)cq4CHI7LH=4=@C=Tx`eaPk^B}QD zq)K_+Xt%aS^2D(kbc zXKM=R5%45r?jdihjtS``ATVict1^GK{=REC@I{+X`=+Y0r!TB;s91J(48nlN)?aE^mWM z&*T*SQqe4ZX(I%7c(yr6ng50`g&Oc$?81gT zS;?Cc6j^S2Ku$B9&+^?_&@vq~4->TQoptT$^FTZve{Wz)4G*QrKYz6dNyJ7~dGh!< zVL(Cn7Ihh#Klzkf2kJ+2oFf92q1v7^LfKNsTjKx2Nv}GNa~i)kV9LJw)>H$1+rU)+ zG1smFZyOV?4>j*|5U#?Z^*zUuS3Eo7tb?Q>Q4dV>?X z(z68b)qK46Lh;|Lc#-TwfIv_HU>+I(!2AE^Hvf-orDo@_$cXs8W8ee~rLL;2{WlPk zuxUw$u2f1A_fIHd=&%{Oobt#F`OY_whrEG`-~mWV_FCU*e)s83ZXEv89#F^fg-tEL z0S@Q*JEPZ=Nr%0`J^gZQ`>P4 zE=4fVt8|kTsN0Dg`9Br<2K6irEtRo_HRpEUBaWePRm=Kcl1>2CuBFYPO?jgF zLn26ChQ;8Ma=G5YHsooI32c5TY{;oLfl*6cWaie!@`98iY2t*WKv zp)F&Z_QfI%=3*xy4KWeb#l+O>4of+&L2uyU*il4?(}RU5%suYdU=H7jGDr6?ad3HJ zb0JUy0dA)3+g*s!f`eP=wM|B2Cs@m)$GO8Z;m|P@uD(55e88(7LzeSDV}L~zKmc*? zo(lsKZ7}eRqmGAzl(${f1-+An*LkL6bR;d#XC_R6X_l!1h$WMEcf7u5mUz< z4YpTwIT4uO)`Dt|AOhy~D4@iEvYD+;K{kp22H@pQIbwDL3(1SaBU*G_(%?ZcL|MBi z6ZGDF`WS^l7-OAcQge`4Vq9o>R!v;ilrqv2Rq})1M_@5Uq^P`iAB-^cjhLC$AvY>I zivyz>*KUY$Z>9}foGnn}jlES(rilXpor07Tq-2<0w@ACRB8x#u`XS@r`&>Y?pkSJG!QD|DFl zgJw)mMxZdy= z;Jz+Yg^vj+JStq0*t;(nOd+{Dn%x`axvK+|lYW#bzp1ySpGdmXw{of1Ue+w*&aQ94 z)yr#R;vb6mr7RbTET#K|{sV&Q)WCaKw?}GrARyQn)%!S_<3HaZsK4I4J`b5!s!x-j ztna^euU4enP%46ck2-x`^$WkZI)%Sc{R-^;>S!*oeTjH{A7ekl_)qBiiBmtB3(LyMT35m*yNh!Ls6S}xLIyyMJ5?a|4+ImPS5?Z+sx|{t70L?rd z&77_5%(jV2lQNBob#VoPwD&!DE`L|c4l@zH6L9sok!9C3;R1OZqcmT zg9}!t+>j_-Lw6{^-bfW+EFq_g9QAnRVDUM!l(}!4{ScONw>aJCbWhgs@MvGEdpAT5 z<@e+AiS5y1RAvc4r%13q5!=Zt*n{83l?_q-IVVGV_St-YpH#@cd7s3;rxKXiqEOQ0 z{L;+zSznSHxku(UhfNfXFcYkw%fMH%Dn>nj;q%H)8n;S*m77-)O0(?Za4fAAfFd3G ztoPySyYlnm>9^6-ca?)$5gbCg77axh;?Fj>aIt|7Q$Mi~+gk=c3_WtftElBreDhUE zE|cEhMB+2R97qBY6?wN|$}JCrK#LY*APFkS`8m|tV*n#0rq6k&JKicb*`&C$|WH7>9rLPfWOyQ@n#9NpgkOVM1lVlO^_zuVQQ$VhR7C z{DQ&oC)@!qM8w3hme4P;2Xf|p8T|`v^`3A!EvyW*r>Qpj3HRal}Cb;+-z9ReJ@TclW8D0>X?B*|?_0hP1Uu~V9MAyB&V zS{50cp_L!2GNwv3UU>4sNVdj7Y6;}06s<%v#4X;aTM)^_)YqIe4el1}-FgI)pSsar);?lf4FQH+@-p#-G?X=BBoG{}2B%ugY7?*fKPLs%9 zWVsDzluyA~1&p`wRgs2+xDv3$g)TjqZviOu(kfi>5-{DjVEEHMXb+K20zp*4Paq7k zbcb4syj%+4D6ifsaE^H3X{i#527*6Ei%AWC+DQB`7x`a{opMVsGZD|UV8c+dn^j4e z|4h7M@($YlVveI&2NAVNBg^|BSwNSClZ-%CPL^CElY?R~ffTrTQtS8O|J$={L*v_j z<0f#K+d8`xVQ^rs(`pY+;Nf%8eXH%awX?2NTg~$MPr0?f*TR3L z>k4l0P<5I&h*s+vPo{H$T~_Sk?J|E+dHEktxLtM8A+7QN@A(Vew%Ke!Kupz(#Wf8( z^H+iq;6c=H4P3YufnftQIdbSq|HDUgUxe4V--zMET~W4^(%L{0dyIAYkjyGkzcdHHqV_H4^VjsNRLUfh5a&ZUN^gQcdGJfu5V7 zwO)SHwOuBV|MqFq4YFc!6!1qL{a;U5nge(XcQ}&SU+tv{a2Z9n8MVtRmOw6+kov*+ z_(G#~kN3tCe-@0Y$mZeO&J0s?h;W2F8#c~ff3$u?n^=EF7VRE31T~wh>7{kz_rX#6 zfZ5*$1SNx%c4gmCa4ZG>j3HwGDB(xXExBR-9668F_fYm}cAsk?1rEq89!G7^N6^&Y z44sJbG=Rnsil#CVH4CcSAaBtjZ(KPU>xRder_+T<0#Bya6N76xv-!zp=!LE8xNj>U zcU{o;OSsc_*~lwoRv8{5q5ZYp7#TFg%)qk0 zNHnD{enPXbPc&lZpM5Wi_g>A_fde-IDMr>Sy4*iApo$xkxyu=|V6V-02NP3xwt zu`+*vjrtx4bu%q?xBp1u{U8(-FI6SXTjC{>u@b z)jdobo2)%-gK{4R-tpjH2V|k|XFE4~lR=VUwCVN`eLwaKk3p-AD^32AdYx81fgKR1 zm6O~GFmLp*rdIfAo_>I1$y46zLp!~;>*!1+)Q}q-*xA+U05m*WAqJ4YOh@_kc_vHWkzY!%y&VEaY@-C?E);CF#nhu~eK zHf@o6rN?c#I*g|gj9(}qnC;0g1P`(jt@LT9G4Let)5d6_-7xXb0s7l-1c}d42c4$^ zL(Qbz)W3D7QNucZo<%~}VZIBlkSu0PY4;T0w*7O8^~+{R>%cYJ5>5G~Cz`eD8Qb1B z*?-^>!L(rZGWUU{NGhu{+X3E4Bf4@(YFT7D98V5Ev5yXCGU{( zP+p5$8g|2vI;(pCq9MPBg8{kXf}S-{D_y zT}#XKK)=m18siUDbU{<3Hw!Yh(rY8)^e6wpmC@tK^DIY4P%K%M^^qOQyaGwloa8a+ zMkO5*;lUOxAPv1kZ4Su}Fw{!Mj_wdF6?vzLEFwpgU2?J3I$BzD{@lm54S=j}ODvV? zbqo+o(Aps*x9e*HfxgA$(+GUqU`>vFq%bY?p-!ITm6dv%jL{hHO#L)2qX} z6fw5qb+cy0LQ(}}!ssNO0%Bdg>UcGsa`s{(T^Yq^&YW&I?0^~LzfwsqsB$_pVe~8X z#IK5#28d84mzjr~dsZbMQqPbe4k&$D-K1*xrH#cl=J^PS@w&M15-k-QvcQX}$X@PY z%|JGu6TIVE#&PDYkaRp0!POJK3RLZGMU6ND@ZJQ>c30#Og#xUa7`qX(?t6<%8OLgP zC)trXv2aPFLbIqEE75F&$6NtaQetoS>p@V-Ns_g?Aeq%s+#jq|o~2X@Q(pBu0KD!- z=Uay1DThmHCkfXBoYonUXka5KHYuXGfb*o(^Lb{iB7nA_sd`;AL{nX^z-(3IJ z1sv_y;}NgRvm4a;wdJ0u_(=IsB3r&;C-NJVmBr9^m<&=t%=Unxnu9|zAxp;o(z02a z8*a;PprakHvxZP2S{oA+J;S z(xmnl2YPAFQ1swiG*0G9-QY7z03#JoNS#-oh;6wo%a@<}4L-EJu=$xa!~*mTv$}r} zf1%<34h&_FI_tRcX9y?YHqJ1tL_3K^qcYc7x@pGjS&VhTK1n`woMH&x`6yYQYUdzv z^WS)`h=e~_8K$~+`UEx-PVz*dF;;rr-8(bKaaQL%H{w74B;^i-2)WbsweBv;7%E(O zRY^m<6I(rG-yG)E@!5w0N{?CV=g;xrj51D2+13$yPu6l#*aUkJ&~Vyc+B+6&OMC%LL$k#Tt#1pT+d_OtMiiq*hEx)$f49FvgAz^h-E2hKUeQ*q+c&_R?;; zz21UN#`Hfl8(hr9{jyFvE*d6+20%X|Vk>I*qi{a#{BA>==mBGST1z%wcI(X(FFIOt zx}Yw}`3~f8+H=w-bzU{4ObpV+W7a&Ija@?;9F|lD8BK2b2ba9FYZiBICT%m5zHTGa z^`FC9ROFEE0x*b<|EBabq*fTm!{S|Dt6D{~hceaV=9Q}#Um1Z`+%6LQ9UH%3;C^*v zhZx78CMWXcKA_qL0UBK+DaUv^rd6x5>87PFx^%BK3oqxKm34#r|CFEdTf&C)2*CumPw^xCbs zU>AG73E2b!UYpfVi%zzEgw`~TMnj~g!2*;1B_@22aTlr?uYH-G2d#n{zA28o?yhIK z&Z(^%tj5$JCP?B5xOa7xgc6LM53Ws8{+8n;j-n7_)UQ&YAx3^ygQ|4GB^bX)B{wnWE@%IJ zM&F;2J$F?i~|n@ zsi&%XLah5XYTSJ=m4DC^l7Q@a0hh@zPsea<8SvB|97K^y-eMKH0pe332wJ=P^4 zMzez84ReAgHVDUB-A8enZ1ytYVxO*U*g}5{_SFa?@eocZea+z9RUfgqQ=z1^DNHoi zm4M$wXjqD1=yfy$eX7-UI?kr0BrF;9j(h%ShnQR$Q7=D#>jRl8H~9KDQ_4OQ`<<4Y zBGF*U%^1tt@;xeA{VutioU5TW+<#?eAUx z^;TkA;O}zvx!8J(B`KCqnGyK$KBX>>;wl4Gc%czlOu<}woab^My!-mz&>&;s60?P@F)=m>Hj>X%Wd~B_4zcX9NhWfaHh89EQz9| zTg-1rVigXw|I;;(Ev1G=&6{xiEVg<&kbbCe-y7}4O*4%3F0BguARGOCeqm@!sFJxo z|FvbMz0SHls>3uI@2cn+mtm1MojwE_XPec?TnU=!I#+N5*sVc5S9CDxu8c9_#+X;m z?e{fuXd})|Y00uPu89(y7W9^to1|JKM8Rf-sAG@2NM_e0g4zuyGH5y8FQr3Y!tH7~ zZ}sFjV5xEWc`V^FpgPI`t^Jb|JA(SVDx4)%glI9fX>^Krwo1u3xvBj5?p%gwU6zNf z{MLE>tz`$3yzCCW>D69rxL)~=-miSp12`j3((>;BJlS`(i$p$@$`DI&Iz01&g52t_YxBIw0uEPryhT!0ODnX zQ~sInNt+H!Mw!y$bCd(d$NY1MD!qSe>l5%9v)K=cQ*T58v2JZueCGts@w3bp=Iv-I zU&<#pZL-UNE}LbSgk|v>>*{X|AA#KlUEcnbEUTU^UPXrFIII!$&x4-o;^Ky1R(6kj z?%#$lFO028z zKfwCt(3#&bv7U$PJyc}zqs_4#X@5hJ2(gcS#oUGcUHYl7x{aMl5@kWej}*Q;-d7V7^n`xqpvom+I|0b z3LXXPWfrtx0U2=$kB#@YX=sZ8>W1SZ^ibvI&=O*fvFZ}E}STf33AgKa%BE#lb+f`_9ukxi*D=U z(tM<<1ku9j8|q1^&;2_ z5ZmHma};B-e}d4pkS1lQq&vk0pOM zXTy0|O;ym>vQ*pqq>9}$2Kg3O^$=9S^Uyzx!7uw|M z@v&{b%(9NW&QLN^FkDp=M}Y@g>U^K{#H6#_L&SR=^NIw)ndvq!2aO!5)aTq-E8iKt zf4-7ts6mF|PWr&)QVtpj7LhjT5T*8A0Jhh`GQ1Fr5%EiNQ2i9*I_O#q7^Cg4MtFA~ zjU2qMmma{AJjlMR$PgSy1%PI@@mO|){^lZ$x+^OBDE0xR+!id)OCIxlA>Yqf|{~^aFG*S*c?RuSSJjBWas1Ns2lTUx@*KQbZp(DJp0D_7)dTn@X z=)a|bIDs+L4v^DRM!5lgv>*rU2%O|=ml2hoh#5Yh^0UEN%O}ft_qS#(**+)JZ;#>A z+1Q1~+%ush>DR7gv}|k3FP3|6cz{vcj+}9zJ3uYPpvKIk1gq)fizC81hhojXE1S#C z^fCb^|vP8ITjp$*M2u;T#}dfTvep^dD!>2&hJNz zpI`Pig6Q9lWYsy%8P2oto`Kbu?JJ8pRf=k#)4Xn-2g~H|a!sB^_x4J@7K&9Uyiw;J z!(_Vg4*lgbJmYqhMa0fqHZI$5LAP;bovYNP3jG>0y&#R=3gb3NB47OcAJja0EB~+% zpwJRXLG`}6h+$nLyBEU_fW&_p_S*g}v-pvRy>1u(L*e>;@@Ga;|2&OHiSRyd0s=bN zPo&n%Zb$cr37xjNFU14yrZ|-H)EQ@AqCEPBLTt2P-pwKrRLRm*>AaL;o48Wwc9nr9uDz+SvdA)c>tBmYeghGb$C5wfhoS0wJ1KXG0z?5sr%6o ziJtG$Fra_vWxd^G-|2nc|L(fdag7#|m;HE=(AQ99v)#cn(kl4wCQgREk>tc#gVTLV z4+^)@2@&}WB<8^JX818tLiW+?3bfC_q?s`i1VZv2GvY74SC9+NGUV};yS>+x_~U(M zgi_q{<+F7j8(+c*3jRH4Kc4dlG^M=f*rleoVkNF*o%Y}r5h_PYrj>k}pS!2$6L3JE zVTg|-mR#n(L}TPBlf@wBz#^7^xa}U~4G(e(DFu@#E$IARe79RT)LT6QEuu{9Nh74M z`3HSY2-AKuWo86?1_{aj=03=|5j4?_7_X5KWq*j*R9O(sA4N=}3M6H!x!4F5BpI^s z!Ms3uqGr65J;5Wd!QMLuNsGF|uqbp--`uM|N`67@kig`!Mp-a>UZ^5PYv_H$)(OEp zvS#lOA)1`JHz54?qM}nE{K6?IWN+x6z)GXdBdHO}eg$+az`(G>Fr* zcrGlk?~e-E9#I?s3-!zzI8BvxNNF?-cFY4vV5%*N4R-QPsGY7M%XW&G0+Rv5Qj!!u zpmB*JK8PVhH_XQYVL!{ucF6Y2+kZ9df8DUWv~z!ePvN$KpMKOY_%@84{L{a*Md*1np>7H7K|n+GeqW|Kv0w1ZJLFuND~ zmqNzLWZ<1Dao5~OtqUxhLTtQIUy7>&T(b6sieU9IvB^=K*e>d(6gAYhv5~7{S z+y!eKOs^gUMB&8Ks`qNDB*f{od^zQ66nuI%1zw(GvaaUNst!3*!9QyulD!fYlMtC+ zv%QGnvi@ZTdZBNw1Iw@q;=0(Q+JjwBu&gg2b(6gd(Ft0H`vRN4LjAsZ4uqr=75_uT@k_ck@p zZEq0sfDOvzrgC{NeczG(>-%jW<`z|&NEOE^_n!|z;SNdR=3UY>*r~pGW*5Z+po6FB z;GUZ50=HO}-pvK8Hi^s~OpxAaJ!Wu#;wROELv|q_YZU*UBmX}nYBEHrz^c^}zBod~4$mX1^WU4g4Qe@*lV zGoQ4t3<;oq2Z)nJ-syrP4!cTonK*@T|0xAcC-)`BpNiD6VvF_=Hy`w`WmNawd42on zAd-@f=HtAvDu4ZBop)J#3xI`2Iuo?9Er9I~V%i^-^yc>uh?Na4h4`peN4XyrH=}c| z(dHAG2|1XGP*siGdTiMeLKgPM;Tx{lOolccb_l%{ack1O-*&}~O}cg3%woK8l5SyR zq&Fs2y^oo?RtZPGzw13*;Eo*2(;-x1!9U*NCMBegYt`-Z9_OzPlKOMY84WpF7R;Df z)mr8WiF>5^%n9E~i-SA|N$bOF2A3RtD|A={!>hnS`(PFr4`MNF{cKX2BiLS)H8J^s!ra@B*elB z4oFcIUo^ZK9bcgYQMDCeJ_vi+_IUH;6G=;8g5%j3VCMNLnl(K;MsI-g*01fmTdSi~ zmc(QxD4fO-eJR9gfgD2U>2xOKxCy+-i@1hzyaax<9Jf`P>yU$;yGQB@es1%-*c|g&U4miv{~li`3II& zrCme8cuNx3;f1pY+w65FaZg4eW+58!CTt9HCTzHQIWH{BlFp_ms}mUM;v<>K#-4SY zrm8f^A~f=KDRcF|y>vBp7esUv7Wj9m z_K`YM@T#gRF$ugcD04TEKIrjizB29o(?f=VudVD{J#=xjrTtL8LX1-py3iq;k;J^2&9phQ&PvC{2yc zDJ1)41MuK2qA{jcYsBGwvZ_5?qHrtgZ+Ajhk-Dl`=1vEq49gAxdu*iTQUBroX=S53 zMZ73(Rzvi$ASp-oTDNK^TdwuB(Cbhr|Jb5{gB@(QM^&UZG$sh7YZp3{RuDJ^b}W?W z1sl-CTuWi=JQ+23YzJ!Mu=|H>N<|NPda1YssPNv>*raJ%DY=rtrC!s&i&xs{kb2UJ zeVXymfn_Xp*-Chq7gc)u6h}<0%&m*#%lkuf(uZP3;VduJ(NhT{J{Ylf_FTU=nI>Uo2yMKvDz~Luuwyxz*Zjv!1UrVpK3C+G zA~8m4bQ$#Os$mfHBfGQ_Nny4?;x9wG9vVV2|6GI4(wJN@gkLJ$fSBTp*IJQD@eflXlGOdsa`}APdQfaEf=mC@V z8~VDh>+|qct4D)`0J|9jWY%%L^t$_CCtc^5b)%1I2v3k9f9YQM1h-iNx>b+AN`?{P z5hHJ)Q$|z9^p%rrJ%RC?z3p%(Lh&C+k7}up2b~t$`LNvi3+53{MT=luYNm+@tl7m) z*z6GRBb|_nlxTBbrmy3d1-HTW>1)6so+;t_l7q7kTcL2HkBqP z?GA%HCBvW2Pb22Er9OwUMz30(_hjFWG_>MGn95~={f+fx z;^yGe;ju-jyrgSd;JAf*{o;-lG!EjvunF{o;^Bu?^%v$`vSe~{J<06$C zLOLKd`!_|n#F7bxFKXdg^N=qZR+v%Ub9H1}3JqWksp|}%$cn~-jEVj%+As4X;L>~R z&X`|l&=1xoCXIhTI~Bo8=Yj>*VZUqk0>FJ&q!CwJj!w70J*1~1!HCxj&2C<+H(o-i z>pad?(QWqxO2~)90u&WGQ!v+I>eQ$rH$0B$lQ*~v){U>9pzSO~W*>g{kDU}GS73e| zj#D$?J$1BN$&u%7yo71>_)6g>Y?%#zJlyYYY^s|6T5R8^52_k4_e{=p&#hz37;@+J|SaEg5BrmOd=x~j_*F)2^ z%wSwDwXCrLl;2Id=e7Z-b=%$w10k5Fusgp^BMjMd9Rd5FdZtkjEbD98L(oOh7A#G5 z!6my-Dm$1dZ^hwve@92YU+v8wk10Lf!i{N|5_CQo8lYKBh#o}Q&Xe7qooOTDWmQ~( z7zeTFAR4ozZmg;~EbG-Zn;M)uWW9?lxA(*VmsSvR=6^Ij8vsU4_ghoFQ*Rk3 zXfXXzsBg*^D)e)GC5U_(fs`WmKWiN}lFEv-y$!&jTp>k;GQpG!WsN5vb};DYNh2^T zhmMK_oi?yP#3HqS1+*(*OGz}v$Sj+duZ~_1@_>qO!HqywEH^sd&kxhd!QGM<11k#g%|m$olmlNKQN zE6xl#xf+q22i=GtsyDy>(3m(lac)b$9zKhc>}#}ewHu*J3mO)5QmM0dQ+-#Db4DV2 za1+(&%}qa|P99O-sd}xX{F`@^qf%I^LndqRV2rVPiRz>o#?YszSjcv=*;x6b{GW{K z-*9x?0wLba+$NfcHI7Wi!y~rU)N?r=)2fe=o}KlfBS>_U)y%RYi?8oh!|A;Q#MIo6 z<=3m?vwJ2Q6&L0exl$|i1{I$ZKx4K7)+UQSN+uLHbQp(YNvy&N48v^V8k%&p8W@s# z#_aBX7cUV+>!aRy*s35ZnkRMVuRn_MKup#)mMcG@F~=$|8Bv#=5IJ&PkUvf~wl z_9*iHl9FlXyQ#&U9tD{lxd_Vzis-@TbFbazJG>`xI0&qSM< zb06{N;*|%L#T8EKu*f%Y=sCij7WQ+VpqEfj)J0z6b?d>!d;kOf!~E+ABtUqi_hHB& zRMw#+voXjq1wdc8HIext;~u?>oh_Ym4_zCE)om_Zm=#$eQwCM44{`gcPrxW;|N5!< zM_#_?#ftC0(SN?(aLG{EG|Jt4{^dB;_g2Odba801g0(g9&!A!FwAjgk*+_9c0GIE{ zha(bUE|w?6s-MHE>AUcQvHKk1Ci}{p-7I83mG6n*Lq(7uj~%Jox-ti-PiOdX4aej5 zSBcAZz?ninVO9IrIe=;hcpM(b?a!jW$IBd6^SmuDw!Am2SjV|S7ed~*$!!@JEI?`H zqlF`rcxK%1bf1W3$qfPXLRa7kkqjEFcC_~fRclp2PZ5IgVa_x~seUs8LJ<7m6<`EtBPAWzQc%AT`_=vvH|WSwfseqJ08z;ookjvH;BZxO&{UHiIYQ3Q3| z2wLGN`N3ZGRb)gQG5{Fv$d}-l{oHp$9+(J$R4I2{w}jke%MSfLvW1hM2q!(Wk<#J3 zJrKUScM3OuZx9i`*9e@m6^6W{00?hD?`OFMz1YPr0O84lCOgzQOCdD@liVByz}Yxp zyufZxU^tcUU9ZX?l|hGp2c&`qJq*Jeaf6J5Gu$&nw&k4-&-M7yxyoPYH`6^PieI!H0kjXQ&-*DGd0$EH~ zStf1^?retIimn>l1XW{IA2A-llly3=dir#F0hIX)+_=qAQkyz~g6!P^L_UrHq=hbU2Bru!Y%Gk!5noD4)E#>L zqUs?a&~f`GeLB_-^|ih>a8=_rOyr9*uIyPJgSU`i!DO8H7HO^FtASpp6yTJww@)Bf zQKZ>AWta2=+&EX|6ULTq#Q zdVb(~bNfhaueRTa##@4%d1ORTT&iBM=CN;gCghCc-cPym6OD0u4eL5DoCyh`!eD7!$&A$8#ZFI)NWbA%coALB9@bKz zl-7ohQCEnxP%+lyaCHLBn1J!YJ=0SHT|R(`8O+6%nxH5t+hq~fw=>xTq5zwB8fz*6 za|JULA)`q`mf4~{H?-xmKn2x%mqPA}DS2##)memI??B;x2Kj!|b!&}2zFL$5<<0^+ z@b@@1bcLEW7W5N{l&cCE68&dDip&xZk_vq$#rbK$_Z*fj3;sa8xv2wdQFSPL_2$;Y zI4tk--`aLbdEaN#UZ*GKwmsA^Iai<09@!RmyI#eBLZln;g;4!~OS)j;FyzsYecy)> z(Q|06G&$4$qbSq{D|Cov2*^|El~vIDeIQo2r?HR1ZKHY-znegnEn+4|c$k9jA zG35wwpV+;OrF&P~oGi3Hq8F!{ie=;x@nHR>st0EBSa<(ycw40^JXvu4iclc#&l4rm zJcI~#oq2i?I<<7>NC9_tO}i}DWm~XZ+v!sgsUU)(QeQ*=0?7ij%p}d=<+i~-W9Kg5 zKIDW4NaK;(JeAPvR(qH0kP>_$QMO^A`(QXDH|biB^QEoFnPjvcwS;#j_k*; zw*`{4^CrSy!rp=qU=^aK>_K32OP)-3l|d^T(CC9ZF=do~=h3F9@$G)XP?)Gj)jYs1 z02zz4(3Xk}aL0ue+Qqf^q=>%zD%X)F;D#GOa?>riwq2$Ew|3VFH84Vedlmvmln0Qg zRnTzrFNa3(tOSv>n~~-w&pkbp;ek{rJlz%1^02jza7_r}qi=m@REcs>1jsTP5ZSPL z)Me`7i113DU{yJ>&>V;bMa&7*caH>;IAjdX$2hBLqbMkMb@3`3r1Xa>=|kZRc+Vk9 zbxUZsy2@(zx{w8-hW#8c1h8aQDpI-Kd&YY4kRV*cx)89jG{E#7(4Yf$*1)4pz1fB3 znJ}H7N#|AFj;sGaEcx5l#NeMofpuE}B;>-2xl0t;Zm{WD+@WhJZ z!4kIz9>=1!_4PFHh6Cl!E?0U3I~9zO@KCL8MXK~oZ*;;|YXh)sbkxw~{Y^ndp)#Ny z8F1GI#$ao-<5Kav7*eRI$bq~KGYh*Qj%P`MLgA(u+_HdDHAQL=t=V8h^lI2ddWVZ( zM^uv&(162XlfhI_mXvg|(-r-+FaM9ZP7+jUN^F`)sd2fYW!SW(f4fh079Q>3`=|oh zQ;1fvFshL4EcD-KmuNC#fGaS0i4n#gEy#Wxu70~mv8HSYBEufAQn+M#pcUmH0Ed1mT1dNC zt=YX6UXJdl998XNO`b(No(wJVJr4$7%`8bEHsNVPsyj>o3mYw%q_JTcRn&xuy=CNB zkdzsWBmg~7T}KUpwdsrd1ZR!0@`8Iq=C7Vi;KmGel%!HfQH#4*eJ^A;GK%gFN^*I{ zy{!Ko1{b*i=P-jA;%uH}euX%2)?O41l3hTI6c{F>E+u#;i{l9;0|+*-Pa8#}S3JdW zqutFzrc8{}6~T$qm=`n^>;GZv9D8(O!Y$pqZQHip{j_b{w(Z@vciXmY+qP|+^PXgq zNhT-t2kJ|us@7Wfx`Zup>d`0zp(}nACgZb_j*{|%$J9*C(GCLlCp4s^&i!wnU?CoY z+eF10PEY@fkihv5XBy;{5Q}lbswU<3DM_H6n@iQ4DYBFYBPyL-Kqp4Z_jqa=y=w+< zeaU@)9ZP&Kt2muRv2FNB%4=_77gb@BvfAE7&7SkvWzGr-_nzU;OpPz)ucs5>7fn(> zmr^o7S73-%v9EKwsP%xxfL`2IajiU9t$QjPgnqTMG1awRv~k=78N`oN;Jm z>@?k-iAJ)d6!yACo#5}$Kk^sw=yMDaGxM86@1@Mnhmfv!PjvFv=3^eUJC$lfFMUQE z>&1e=?1WgTPGoozI3yW)FkpNoM73gt0b4vu+Ot!8)v8f=&bL=>ioI6i-pmFmuCR6>8DGxdHmvKtN?jfVm*n7Sg7E|0^kp_OpU0$~Pn zRt{>_^;L!CL+#SNG?jw6W(UTQMNR&4N?LURc^Z((Bpj)y=}8=p*z`f>3cV$L1nI*= z>VT15!@Vp{x=C;;MXk15OzW43`S!W>=OVO2!YV;#kvAVG{pU)5UQyH`A->yKd)1TY z5o5w4|CuCmOhfsKm7v`Qq`}*VVqD>mwJ{bc3jYv4I3k+{G>7}g`e!=aVcX!1_KS9Q z2iRy@ACvt@Drp|a;kkd|-f6SlGU6I;)?W%07P8OE>7L&aq2Xk4`43w8#|aB$&17W| z>D3{C7!bgpT5N>N?V)fuRBUx1Nrj!=1NE+|aL+P?N*JnAkev<^yw-KY7TLYPkW7Z)_forjE42;x!%%@?L4BRPtPG+q$LiPb_Wm=FjyMqV0GY!%+N7bjy#D@3$ZT+l%){bRq`UNMMqnF5f}x?Z zhIC_^N1t&-vDuJ@kj#UhN}DB*@wrf-KjdltnXP}`=Bmp1L_6JHaokA$W2d#mcz`P- zF$>?8Z6)1qI9(vp>-owdVt1hJnG{})MBN&CAxlk1M;td?n#wJrIoId9*m$m8ltY4s z<_u)9p(SaZp_vKC3qh=S#!5#n;a-a1%23_IkFYAx8H+=}G4jkTR}wg4ygL-c8!F?y zPDHK0Z$55fRDXokb_F#!Py-&wEl+&>e%ve($Ppes{Ng!Yg1R)p7A#c6HHP;g@ZanpA3`KPJznr-~TQ`M3dXfO2;Xcc};-5ADy z2E`cKDYbt7?-u?jVM3zdtCL$yQC=p}jDoQ&C3txjK*MU{6$$LdNP}6!Y43U&vw}+S zP|`X9#YFZur&^6SklhhT__oT6{7{oozM-&pPJYZPE7O)*Q`G>=F6}LybfZvw>5s8T z?xsSJ^3%`xQ3a;Pz?{(8uzyR$_-e>}>(m|A#>QnPFP~O$+smvHDY13K_LEvLKSHg% zdxXbV3E7hvptR98flgZNJ71tMXv~6m03n&P+=<0WxLXftL%4J?5kZ8Thx$z50<-x~ zXNl~$h~YY(oi-P{Nl>uuaFYuxx#X=kQUg&4JOs-lI2 zSMXP`%zp@EQyEmVC_1IhOyKx=DU$w2Vi$Y$S0@y<vMUn8`vtZT9<*SbWn5J$(T%X_p7_Ye;XDGV2#9MCCRaMT?^{=as}d%w;za-Q)}@>rR-@%uaR7`q={nJ;tRo`VVI?+l|vJC?3ayL{QmA zs-GXH70LzzGjiKp03qK1K5VTz5TY-nN{UOw2WpiMnZCT}n*qu~gAfF=P7?drtAqx- z5Hg7-j}*jU0!5!^atD5o7euV^S=|286dP=*?<@{Got{f<*IB1qxmMY6B0;I%&PL!% z)*jzNMIU%+j(ehSkc!P6$as01`BCWBY>aT-kwHNRl2+HV5?`!9A)Xsbr6teolOF-^ z0Fub)?X^K8M*ND(s1`t9BR40YaE%6^y~-wufbo>d*;zeJL4WI9K-)$+hk-GT*!t2V zOFS3FoKUayll0R9QQK)+*x%Wk!Y2DkJIwCk9nb&yHBfLhphW)#SBaR;174AO0D zY>V_gwG5%ojG-<%v5ggl#LsS#3Mf5M-!L@iu-V2d7fDo)Ra{vKo$oze)p`jm%SDp< zPB7p>1$8{bVd2A#By9GAYt5Hr(LlG@ z*)*;KieRf}IjROG zm%__&m)RJDB}uHYKQGXm>?#f|=S>0tqwo2(%DNqG)FxGspm?_rzhzepkrR0vFVEyZdWJs3hf#W3&P}=^5h$!i2T;wOl`M$AGe_Y5YhmKM}uX@ zQhA2dv&|0Ob@=S|?2J>I)D^h*HQwi}7x)bx2wFd$Q1>xL`xz#Zuj=rVcYQ7YZY9OU z73cs7F0zKH*2}C=sXg(QOdx_dLxQI)?=(^C^vZWC(wU1?uMv+yX*co8vi{o=b1~x3 z1(V`eu_+moEAQ}Bl|msX80og({e=5}QvLt*Bc#j+G^$Yp0lB38Zz(tjBiH{?>UAxZ zSws% zQPvqX3uQOML`xWtvf-mV(d;tx3K>6b)Xd1AzO%!YP5cv(KJ<^ZlV#o`3%-C@veYce z%#7R@VZjnfejZ3P$ik`tvutQl(B>dFk~6bl8PA{6X;7+k+SqUgX!pSaGMGJ(g^7Mn=5A=dsUfA0QmCi>qw!abtE9Tfxn z)Vu3|2dqE6D%<3eMh5-n4?J3(Xx3+U^z<}O&gdX~Xhx}-9B&%%-Gr~CIB3aEY99*c zq)ymRb}=3gY%Ws2vwuHNj0|^-Wd~zr{r#9xmm_PN7#OglclKUmO9iWvR>pSJ;^NKx zdw(jPb3@~&2^1Uo=3mVQGI*tXd@>|3kbJp z1*9A`sZ$UaL?`^ega%dk2DDa3o?#%~n<4IGB$icUrSwlTO&$rSL|~))Nh4f)L>m}C z++#4|K>^-0>ztQo_o$|`xcPm`h|wW4MZ<$kt`gW>Nm#{UUUDL0uDo%)VrK(aPxDAx zU}Emh`UhG2V1@-Y1KJy3Xs(4CW!AAd=)E|4czAABtXMsu0b#k)viz*({ZYtvk>gmb z(sS5wPRj_J*_1)LzE}fBQExkwgY)<|!?Ze)7FyMo*6C=dxtqJ-R!GAn=1ALtz2xFz zb||R2-leMP+|#Wsm^;8uuQYYN_3vwv*1jrI^>I#og}Wzl z$cKcnn8sDs$YujlQF`LM%ulX7e!rZ{M1y82N=I{_Upl-`f*9`Wtlj8m___Jmc70o& zLq}<7%uX#3etTHA8RX?Utu$Ap6|aqMP#@amw}gJoh=kZ=(11Z8m{o+~=7Sgw*#_SF5*U zowJo3y_|gPY)5El-6~*{ckLX{?Umghh?{MDwhs1g;BkJYUy!p5p+mspG$@EZphz(P z+0y+rOW`%wO%R?CIL6IwVf%U?#NY63dl1Ft$25$x&fCXj<@*Wv`EKj#8u!L0JiiIQ z1ZW<+Qsq_QZg8xg(AU9j2hhuTn}HA)_nOvWzP&i>)w$hB=j`C)Ce}XDNbV&Rc-g_vi8P=KOqk-1GLW%$AS)2R9g~1YprU`ozOGK#+5MxXADaqYbK^ zsbrS_qTmZv04Orl-LFIVh!enneVx;p!TjM|mEUhLt@t_^v=g>nxJ}Q?OD>T6I@4h* zqi_q0h6ybqK>pdb{NpL00c{FW%c#mqVi zl2KwGEvTwP=Ipu7PJ7(`r+!DlP*=hE7$xewcm-P+v7R|N7Le47vcLK1$vnpK@TRNs zulP_D)Ax{T>FD8&J-s_|CNk#oSc|C-g9~3}GVH!A9~Ir!`MfGWZDlm{;HzdqKMAfz zKj6*!IDzY}%Y9+=ZhDdd1?|HI_c<=Ee?-+_*kDDTypf3`rc@)8CwM!qqcb;47xyJD z?xS;*LSJojK#1-m=#t>!oz&vSx?8xy$*bA%n;u#aVTr@MyS8KW)3;N3qcu(&hK) z?JX}30TlKF#rln`^3(;{kj)SwAnBL0J!7QHA)e*HHiaAUKU}1EN{aH;g3U7;U~G6A z8$z>kTkn9&qhI#0wl@QV`f<#(=lI7`oq&~a9&jm~oBem)$~bmJ!%t7sm)rqX$q~SP zlk4j#mRou@%c`mt-l;GJr;~~}s%=7Gy=#R-yLp1~2zNq*)!gQrOMZtuuw9y5{}(Fv zIt=|@;&0NhBfsq9+sN{H+5U&sW>=kU9^i8{w+W2!*MRXGk5<~(V#}EpzS@N+IQiX} z$IiZ8N_CILfoC0a^JKZ2yC|wqwC?79_nPfV?Q*##67J-PiP- zR_`_gx?%e>p}7Q2Vu@ekE0N%^E{so^->;ma0#Z7o=F|!5RH9@RJU0%_g(9{F<>k2r z9^ULa76tm`Aq}RE(IL?1=94qZpFVn z!)g;)yGSDBF$Y`3&WA*q9!s0)Ucn4QSQ9Z}Q&=+mJCq)+a*RrA)?D}{J`+v((nA1} zhcz7ZcdI_x<~$dh>4*tI5h;VGU}UK$_FtKQ`%0z{S}JRLA7CMHm(%0RM_f-Kn6LevuitW%q;C9d>BaRtl8Ad4_%O zKuUqO!E^??Si2PW{i|EF-g>gcu$I zWmqO=Fr#agkpda2YBLV|zI=`hvH~t1vVaTSH41pT4EZB*2d;B)@-`r*b-9!xLvP;5 zY0S5Rmej6x+-XXcCx+#}64fP(AiGH5PgL9q=f%9!P@3yfdZ1c%CR-#ANOi`RYd6I~5qZ%NjCq853?8*x8H(6FC0@L?_@TEHvV8C%yoP(7e$L zxF1suuwpt!%wtEv-A4|+(O24>xs`ErbifB}kpRkdK>X*oTjL%*VvD|3k3j3^q%Gz+ z9@wUtF%aIzvm}>#{XakFDF%~2M29R?Q4K5wix1jK!0B z%VHAf5aVMz7^G$zHbR@YP2iV2_b18ULXaVX)uKH20)3ior}DLnRK$3K7F57y1y=RW ze_g}*`5e1>_53@H-@Lr^R|hVqkJCXWXP0da)rD$<%}r?B}~kMUG>6=K9OspWmU9FlvvL8A+DS9rw$Nh|LEO~>bRV*SToJ11_#c~f=5^rZ zjTEDQXAtc1RRLgVP(s7$Uu-nY(=;02hHcDnzA2%)Wor8Mx*CL=$p&VVu`SEQVIiS# zId*KIKC4Of8-$aCxFWehe3sY3S>8V8!Yz{;34yt4Fl#U7qALs=f|aS!!ig=$8)-nJ zk+oIKrgf#bF{;L%l}nGRI|c+0td80X&;$J=l;y=?I+`S`l*QW~{$;n2TL7i+4+S2t zZl)$$7dujxtF(RuBHLA)-v4M8<3I;fNk}qgBTESzzhfe`Et&pZjk=X~Hm*xn2a&^t z*0=)IEiCp7|0-!@)hTDYaD*@0gIRAg)c@mKcJtj@_%}rbE+8J{-#{C9iNt0baMEYc<1CUL-#kxF0FVLU8l+|kEXfy^g zh5e*m;2S(fwUT(KBZ;QAev4WefR_#<}CPL_QyK#PjkHiYYp_T#Ygg|O*~oipmU~jdvdiiSH$I z0IGC8gYR=GlHZ1%ME;A7<8zDJOPMDtt<{@UC?CxMd>LP?bCDFHx5bd**ukM=S2@+P zlQ{yVdYpCJ$8t(%rdan#41xZUT~60na%y{KDV_7*o`>J>i(h#SAVx4bN3R<~duK)h zVU66X@h*DpFj!7JHO0y)w_f2&;0la#@8yWBo)oX+>S0aIB*mUJTz;1kdwUb#>P`c}z(YZnvScwG>-vWm=Ogo-U zQr|h^ZE8&e7@N+H>TQdE{C1mss%N=|YusX9qDnm7*@+~A+~ZsWs~IJWuC3m*pR`RR zk@AZL(?lHSQR=qGQUvWjupRP4FFw#^00e>S8*RPQHdPc30Qz0@y*F4NBl)&Q&V?>?RD#;`pkvwF*{}5b2*;wCER9X`HRUe*ZMx}~E_>$N=5{IF zxcIPDUlfVVu341o=X{!s&wDityhk1}b*=n)q!qtNT%*4tALgAl8W((&8F2>jTZ72FrJZNpo z3d9Y;Sr(kNx$lU0e3c{*t>tnQpoXA}!YIU|IHS!sW`uCkHFhGJb?}oQi*{#OlE_oB zC$9EDLqaYRs+R`BU>c!gG!`5bXZ=)i5}*=s&b0abfi(O4ezukxe!%JJHpvA1b`h^g zvhTXNV3~^)PCOHl-J+q%c0Mhh_4B2IzDIsKBk5hRNd%QzAT$kho-$6C_@n#3d~6{E zlC%3d1{6K$Vt!n)+h8IWTe*ZMvc)?RCu~?nL-p~%H6JqIUz_j!ktg%ewO@qVUxx>04Beh`M9t(j6xki4( z4Q%cig}7csEzh204%@0IM0PE2O3X1#%!wmS$VHNiT&==D$=1Jhk3>dF9aZ*V%WFAK zyV$g}zf(9WhV?9Vxa)c=;>A4GAt$0~D^70N0iV*H>1h-`;yJ>J!@|S=RmM$iO=LQM z!u>`wb6EEd>hVBZ70xbveBn^uB-Qx98pCV6kUiHIE+;LDj@pTo^7^63)Db3IX zbWSX6IwZH!&KY^di=LyX`(8G{urHb}%y@n_v^0RR(0ZeNmuYBVY)XAQ zjsCT>=iQ==E2)20o}2Nc-4u*nsqIaH3)Z5OIY*(s<|$Tk-=)7rD=AeWZJlLGGrx1F zN*DHPz7U|XxYd%ERc()xL&7Xznts*2k~8`=NS{^h#t@+fAoF0)Q6`e zDU7sptORF|s6%pnoxMsfBwRofl4g>@;zm|MH7tmN=E}5tj5tasiYExMFR?L*u9x>5 zn|aQ>4sa#9MIE7KDxM4m1b-sjR~c}xx-(N2oRw9vh(oA6gaREG8(=%Ufy_%Hly{j% zFu|R_SyYHghV(}SCwp|Ez8m|^tjP4t(OTwuC)5qlj-_;WYW67I`=IaJcEX$C#z86nxYxLotJ z6OqM(P_!gV@XA|WjMh5JVgBNrHu9`?8I*R=`4p1WTii?Sd0VYjn(4Vu z%JJb)*t{|9$Xy|d~3icEQ|6K=@De<;K`+%h`c;p zJrI8V#BBaI)KQiCuUHf(AyyIOy39wb0scF7PY4n;uZh6oPe@^B|He$=oNC)rM^9?2 z%WY$LI=!dz40z}Gczhh9aVNvedN$||2jONOxb^oobrX*&926=UJ|Y#*%+IjpsT-&< zmD8T**fQUY@LKk+aW|`0lu?YT?r)#h(g7bDNjd^_0tklq<2c!8SHm763gnI zbr|L1)&^%XU1;H(ngoew65n}pf~D?J7WrjrJwf4pmW^_V77j32`q)P&zSj}dQ)RYN z(WL#Lt~CCQLI^d7ox5iF=@eYWF)jFt{Ds1?)nq-sDw(M7sohgr0}q)-h*+dXgu}o9 zIK1(s8Buo0fPjuyxveb002A{CXmm%G0h`@{QIq5NpwP!a?#^?10UyV|7b?HlM$~_O z9@FP8CFqp04{+X2si-Myg@NkRxYLr`Y%Ge1or-Z4$glS)71lx5AvD402~WBl5*TTD zZmJeTf-Q~)*x;Qgc8UstT@{gHKy?0(@O=`M+%-qcH5}~DmEZKTT{YA`mE$g8ZX9Ou zz$479=Mp8bGn$lKWHg{*baC?9ld_auh3Xy-4O>BI8+d?+)fS=I&-{J1xLD(h+72c$ zOw?n!QLIK+{6iQ#yC$Z^tXu80IL*FMcbyB_m-xwztMd^iSqUKstT_I4#uMl8L}5G_ zmX;-5ueSJdxyxh%tRE;E>!c+*F2Y-TSMW`%H zeiFt;iewIpagFr#ozVwKmjRdPS{cnXUteI%{c4vzF@~JvQT|PR$Mkn|h;`YdmtWfk zOG~#3t0uQzM#53OMo*K^$!m9tQ2isbdg`EAmrL)Iw$jeyMwD)i0M|ygnU_m4xi_ZQ zF{-;RLFt`FgX;!-i+e@?I#m{k0f#Eh9J`K(w&LWrm4>X=UZaF$zF>S-%x-M$w0S&_ z(N5=vxc~ia!wK)*V|FG)xDn|AD#C8k!>C*S3ULh_t-s)g&cPr zK2IG!t7=P(HllF%;a2m?pAwY|B%k#Q6<2cHJ~T5X)A}}B8-$1=z$+0kp62pyIHvVD z5t9eE-@-+qas%)Hb}x&FT0=D*tPIRjD5LPz!_-ZW>SIx&i`O1bsW z4h#&_8_&inKyC}XWP^zAL(5;byISl{E>t=ncycjz+q7#@o_%maC>chr`M(oZWg-&m zj#gw@l1^lz`#gDS8a}3rq}{Z{J5xGUrqa~xTS;lj#+iPZwj!K-*X&TnSJ~Rdc97v2 zf<@OgCv(G#LN5>sdvR#;b!`et&}3K>)lpWc+Y@+6J|$Rk^ruvR;TNW0aE?m(G_?O< zBRNH5YNsGp7NYRo1L@GV&GQtVbp;m2E)DxV3Bh_d)U`NI4IHl`=Jq8YR08Rb1!NdW zP-v$B`cvI(SxWuF%WCGYZLw}(6Kw8kYg<8?^Z5L}mz1t~L@#I-) zpQU-_dkk5^qa(pIA3B;#03!14=NH&UiEu`u$wD_xIai`3oH2`t$Y5y?_$r~PfL z^QoE4+zy)>5f&v}yEX#&lHX7xgd}Aw>jvMtVm-zJaDsU432>dCmf*CEG@;GbeF0Df@uH2x)~Btl{*=A>1gFqI)>%NN@>Tgq=(?2A}w$sP7Qxg+EJ8{{SZwaqee|L`Fg98pk zal+Wam#*0JMd`FHRS2$77}gdXu=THwIFcrlJTms{TV4Pdcb~|uG7*g>J|=JM%TRX1 z36u3yT)(#P`g6K;SrjNY@5Ad-H|OA9?IdHdCnN7AhH~%wGpR?nA1%kB{SnB4{jW!i z&sh0t+VW2#X+fUsgLno#r9AZN$LBC72qX-%1P?&cyHO?DN__*zG36`G*(^}p=s(sl zkx$S(Vy$6^7T0OB_*Yp^8_UxnD@KHNr&duu!I56{-9UZi1nz~zwnnz)Pn_Y}`4UK( z?>5I9_uD)rlk>hKPfJgl=yzAM#Fd?O`s}iX>54&&bof0kyYR zOLh;Xu+9i;)g*+imKA#P$CWN!I>KPGIWn|i;VV_jSB75Q1%{Q#UNi6=KqB>! zGL>`13%S|Upouhskeoa=>Mn1~$a;~cw|?Oux=9;YQl^m;2l6K-=%^|JlVqJhe3!(! zWqurO&oucT`THS}6w?E*UJ9r;)FpCR3f{y03CurNL4ugQoN7?Lp@A3|Sfjf~cx05R znJrmgt=DGMmb;xUH`!QCeHKl|xm*KJ3?a}#rC{>H&*iJ0%rgC7%q4!b-47NwXWHcCamG)l-Sj|uQ415ZGZOM(6Jcz#s@S7tn26z&Q9Q}P?se&GW!Y1}5!=+Wt znnzOE>k_nC7@7)~xr(6|r~Z69pU&hi3;xq2xWf_hVvLFk63=UXquabLUBc)aD%3U( z$^3Kfdq&on%YehdGl&lQI_6L0U9i994VxCMo}rG*|MAFi6K+4YiSRfDU$!vs3iq-( z6mpXlcK-W@5vy|4po58v-h8Nse}00b-vEa>_4VQC7ZKY$$Y-#Xye^}B+SG(CU{`bI zvC^^2Rys;*3Aej^=M49&ZnD-^4ERkPw4jsHDoL5N$Nsk5q;TXG!Fd}XdYcSFGDhS^ z{Zg|N-BDj@@i}sfm+i9Dm=gl4@sC?)s;$b0_O<+JTu|pRv1XxE{;2(O)q=?=$}4T{X}UA0vT?mXUd@zZ-OBVeg9!Ero!;II;J z&=)9ma>q{mxl8ox8}kef5QFqyMD;K3RWQLvOM|H51Ei?A!tea+Cv4L_`d~Yo&ergH3wBUKL$E>eKKaYp*STUXilv1pnLqJ+05U09B z^vawX@ec75@q5RkI#FiOdb!7uLwHM7$4dG!iljX)^R_`0WR%WS&g zh9wh?btX%>O1_o1_)4l28`X`R!JziBbl~7>Mh7-_t3=Sliqi@4>BLz4YLZh=V@euY z@}XZ7zU59J8Hy&W6KsJS1Yrc5d5#l}p$Q9TtjM1goV--xeGj;v(X?G_O2S4@NH@Zp zv?SKmZI~5ZVTg+J3cE*G2vT@wz(*`9XXELfbWz|ubz2h2ERs_~2PBC`%|Yp|M(Wc* zrub;v9UMPw+h!xEAL;5%0?#}zZ~L!_ZBxHy%xm-AO;#^sMw$BL;%6O%7#JMaTc14D z8;x9M<*u?TG=Wg@s~kB0tr6dNr8i1#C{Gv_yV+j3w&;YkV`Ta|lb`p;L!8r^x<*>`<}GXH)WX0jq@H*j+Na^j`C8yxhs( z59^{6_5%g;(Fz92N$xnk{i3+)sG=8|r_e?8OMP+%Kx?a|S_4S&l&u2>?u_bn)iH|y zASf5XHSRr1lOMYj>VN9hf#~PGYuPf0m`rV@q>O%nmBwT)>5!?YU|*X9AncmB*E$|p z^+49CzB%BO=RWZYmsU|VKX_&bOPgf+7FARd>yvZ+Aa0cQq@- z#pVKovK&;*P4pt#|IMCD^DIdvZ-a1gVzlumZkW~5pGrIUy8c9Zx0Q_xXD8jx-18x~ zy4Pt#PjAN`q+YPY6BG|%XH2k>&81{+DY}?Ll4EUO327o^nak^Xk*Y|Z5u|>rmf*+j z^vDq<gDo;aLC1qTpF9Vk_UosAzbiE;>7pcgX^k z<)`sqbjus!J)wbDRZZ6KaZD=2s$Jy85;kDvs zjtmt|-%Cu5TcT3hVfJYkRlKojuKu_6ld*QW8S9AP!|eKLJ%TAOUAE@?+(21vn@YXT z4eC43QX=)OxG2i?TI_qIG`l=ps42PVz*aeRYnKy7!AQg4OVc|UDAWigqHZ@yeQpY_ zt8b*!|pLL>yoSi!jz9LvW1l{-iz)|rHoH-dl*6%h3c2#E@{FRKsp9)jGQT5e( z-ov((5KT5Y?O3UN3ZZNB+*13)D}7tB0*6qx#O5$I z5Yy2j6x^}k6Up9F3vLh=v85oDoJJcw=Tu5=-{7GR8dL00Pj)+4+b#`#(q4B96fNC&T~SexLgF4}LhpgnqLEsL;e**;^wrI*WO*^%FQ90c>zCm)Anxr@F_=vhU62hMc22Eu>FnzAB z!ZN*YcpLv^oL`ApMJ67*p*3~jWKm;orNLKy*hvi+zUT~Pap#ciw?AxLe^B>U67RD= zt(=gAd#~tA_5m7ML1!+x&z6@XGUJ-R~v;w}?UXQ$%#atGw`4{=w9bsJ) zx@+0+9n3K`>vWn@?vdbV3&fyro`S8>_PpQdQA%v03}sbhQJIk7f-qDXTYcDAWmf#) zp~>+z7i0}ws(vkIS;cptol<8)6@~o_z*UH>*darrII5sU;2IE3s97X&2-T|)_YIzO zJR%AqzAx`HlD|O=vz_MOJBq)Lhl|~63jKQGBFb?SmE5~pbuGHbfvOPhzi$S$fA2>w zPwAFybk@H${mo=Y$1}c8P7ox+WQHN1(|=K`5+CEnK8`q4os1e#T)X*PlmRIywOJVF zrK=2>QA&aLym18Z!P6#OYF`S3c;HgPIU@0Smc_^S#pp}aQ03bacUx#JDalJWHGjH#Sw$+7YRas)lLnVLUR?2dXlP)1idRG&`(7ths>E}3X|xN$b-OCAd6m-3gUb|V{`BK^RlLh_c23#2u< zrF{q+gW{r;?2p&y<H1j*{=rrO$C;it8l&)?vt7m-Gl?Qm$2fn%}n2G`EOg5-?$ZUsY~Fl^z^ zR&3$;6~_o(Zz#`w9b693l6qG}s?uAE`dzknWoovuM@Uy1U|n>>zn|TBrt4nSwWbk` zyp|Qzni1&X&Lo3h$e(pa7EHHZO^DTcWE=yC1#56nIs1F?AO9nYeCXO+~c? z=rf1@tC5z!B{MNlT&&<6@BQy&q7(Ah>IFB2-&H})8$m(GP_r8UOvhu=!=~*2s%ggp zB{rYn637iul<|$eXR6QR?`2uPL=N#PB%?QB{Aeno9Z=FQRi|o~tQ`FO8nq)6Ga%Bq z(KIn2;q)|>K%Q)HL8_=gpe#P zKr-qYN_35}ZpZYw&j!Z_1)s&c{~w^8BjYE6@V_?339A2%)8%C7PH#M|R-8+E`-4Qf-oo zV#g&(20&q}SoqFNFvRJg4bqrij|l*bMVUPD zT}~)uem?>e8W?!>F%!uW&OdS-#TumwBB*uf09s9YQSwJul@w;umt2rls+Nc9aOR*s&7iesvlXexN0d)NiDGelh8XV zbwwhhJrY(nO=SBp3Pd;~eyzzY*Vl1A62i5)a6?e1&`g0J@h(U@(=_nR2{SalKmZZV zpdbATpB?|hVSy5lJ}L;uu)#jxH8jFyL@)WFVwJr^W$;NrTPW5)UjJH^F;baFU;$-D6VeFg)Pgx5B<|aV?1=TZ ztnZ@f;hgQXU3jQcTe7{d_5`KhhE3=qj%2({q91ahK((SfXGKk9m;|hbJT{^vCPsiPxyx??M>Qz+?@nF=EmE9>@f7w>`uEZ4=%yj~{-Lm0%$Mm*_nDqB^4Sh9zUK3>+`0HI=*WnjKhv{@;}zGD2_HeDlg0dFR?%uRUk9L{bSU{)uKJZ(;Y9u9Il=3KJ)KIA+~qOB8Kn-A%*0rKSk%!R)nW$(%3 z3)8hHTaLr5tIw^G3k;=@;IY#rev$T{SbeKXq3Jco{ER&inc&Ri!jPr7o4?IO)Zu0x z8w2BH&e^v`b+F2-kmD_aH!8u*(^B0q$U(W~Jde}$CnJE1CxBaLSgg3`r+CHBbnl2D zDGIcQg`c4r!U-Nx@2^u}ZNXEJKCDQb?xXZP%y%=UO`<+&*B1>zudlX<;5^;YCAF&$ zCYfNDV44rQec=`9^u)~t79GRz-9|QTNw>A*1MoiSJEmMu#DRhV48HsyORQ}>r-wsU zj&=V!Ajx@MJRyP!vbo!unqzK29j+-1KkOq2AcD3~I6OWTp-PCubYAcE(ZDrOV?g5K zxt8*ZtaW?YdZN6@OLJJCGEkW}LKG7z!vR|`rXoNTeJdQ}BcGGZq9-DNmdbz(S&HP^ zU!kMKKZa(~!MLGF8ZI7GB8EfaArwB3Yeqb2iknl1FgFQR&sWLSPe=4x2b{Tp_F(iL z&LQ%c9BM)=xT}wz*)7xSEcM40{I_zfhnRP&4dF(Ng3{9il=vZPUW#3W?%YHgOf)wYW@;#d+?+93P% z-+t!^n&$*<#e5re#lH0_bk|Fa&`gDW0nNH`6h~S;!FiXpt%-@!30SLtd<$}yW*NZC zxxVvbULIKEFBPvTMilRGeeIY>(0MUKh_C-3Q2&irPXUTFL8iwvgriL9i%oCG?vR<6 z)I^(DU(x&LkT3WR7-8#%ubJ{STPiP{9)}Bfh!;aEIEss7auj>UxJRJI$m;!BUgmGb zjb=IS3WIXnyZEc!_xCFqAyh&c^!`4-7pM#~eM2vZh1L#Bwyd_fm`U?AeW^+Y3d8v@>vq+%ZTM?O_pv{BaV!qMKTw6&;lL&*RH9^UWb&3 z*gar7;4#+o$5c~`cP@@DhaUr-={q2?zXeP;gs`*D;_$8c902K`3k7MuG`c|Kj)Ybx zc*zwsL`7?aWZLp}7uid^nW1SDFc}$MciF;u z@@BCQ;68>kHoM+BYOCmDkdpFpII~ac5`#zVNj@f?9vi1+uS91zQua}RQOa+GXIw@y z;eVMAL$0@ix(G|Jz^AAEcI8khLqSb6`n5T)jAcw%XQvWn{^s9C$-2v zk5A6lRZgn3k#LEKPZ?;E%S(3ux{j|~wj@4TlI)47jU`^t!;_0dD=E{>8ehvB=9mFE zisdjpac~!ewH;g)jxk;TmWs!z`Z|YJ`@JsO(`6ZaZG~N2!&8RaOCJI z?H7`2A+)+$Bux;sT+fQ>_m>+bEp(-vR;$NyuTC1HYS#)qz6y5pFLN$k*0ly>W$3KM z{4Zg=f9oXolbYU9xGW%J=8K12RtF>o9UCX_cIsBDsM84OI5dBNoBS z!@|taOhQ8m+4Ov7?_=-??HRM&ctnplN8$6^WN8=>nVG~43iAwea>=B_UE|!rco)p- zf%V}h{irPZmB9KYtWju#P>U3RjWrd0eS4x!{i-E>0p;W@5kZ9t$D-%x#sjn zyyJvYMpkGSzhs^nnV|=&f=ya@a@3OIdg7PYiNOfOLFKr@G%3)`>4^m&tPtxYWjh=; ziKZ@fvcO*MK>uNArGj{$i$vg{0Bnfi_Nz&-={wHTS-In;&gzfMxV%i(Ak@o~2FxYX zI|}6Ri_$G+jJ9P?HA0c-J^abo@BA(QEO6AeFOW=dHrD-<)JXdpgqC~^1Bb{`KS-XI za3~T*RAjhSPp$H#=!E#yWQC_2f>!QOo=)iOy=A4ORatnsQ>u!Nl89Ml${NzO8B&*@ zGnS}}5}-BG@JY09st0vfD{xDzU65>&!c41nweBGy=*NBg$u>6g4H=XG?tNJfdx<1s5hgB=@a!C+oH~(;LRnV&V*tu zdx*LUo3OvBin``#MIu?ArC@?va^;=bMrA;a`4sjJoX%pMO(dRM<6z05E0jX1~*hjqRsz$2jV4ZR-pOb>B^6<33s~arU zawk`S;HjlM#5AJOb7UVGatl2JPD0jgcE178wRW|1s<&0ddYlNA<`iSj2OJg`mXt_D z?}J|B;u$2k83Y%p&dPE0f4N^b3#)_JQ&b6I8wNIOg$>UA>_P23g?j_tWM;#GtiE`S zMz~V!Z^5Y7mbatTGueW(kv0XP&C5J47?#rq7jEgA^9@c&grwb2+o zp`?9EqI{3B$nDJnhm+?Rt{o&Esad8RXMZ97=80|Iy~=_FRPBiYQzU<#DZ?X3$oA{` zP}N-R@P}z%zx??OISqKYuS1C|N1=Ytl=UlmBQfSdr#zc@<3ZO{@eEAr&t(>)`Kdp^&*M1NN5z!YW=Jp#|lf0Yc}&?z8ybPTe4#Mq@p8uEO*@&)Iu#PseB+m zP`LZX^|Y65CeSG5Nf4t!NVwNq)4%V$eo#**wjoNMcx2Igx(;cG z1?=UB8HowZ{1%Jw!_fDzaqyXlk2!lVH zX|6`xMp4`os^#_75NDLv9McN_wLbzD`0|Hi&_p9VbL=HcWN<1)KLtF{(%|(sCntge z`+{p>V?$?pz}J8Z=rk8V#0;mM45lAIFRZJTidLUsf9jN&Ah`Ehu6Df z*?d;66Y+m5H|T#P$xD@sDe zlRhf6NfKKkb9vlo2JG0TA$-C369m}H9)7xEu2QF8>}c>;_OmDdW3(At;vP1>IzCHk zimmF}vqaQ(qb94=1OcVMRCC31q?^ssL?0j=>9A&@9oxEkzE^c355t4;irX%ktq6=qGF=}NtvWRHbLd!-E~DS@F{JewilOh1d% za;wZTVm|P!P0@khE)o@^zyv8S6!zdLk1 z02Rudt%}0Gl^>?67weLEJY$P>r@_Qf2Mu=m7_pW9buuDPGfgo>w((~DfIT@RKQ+Kf z8|;c9reqkrBvlP0Zi#93;y+%{=9c#d*a~5k>**DBo+Zur*zTen8)?N{k^QtfWA_oq zv5aup&!)mAWTCyTHv`OX*H#&5e6HWQ>;V{W32vvM;PG~oMRE4-0vET_S+Ohay@cRh z2sB^v{UPMFtK40o~giwKJFfa5)p1$p|5V)y`pxp^DRCgX-cN2tcD&Igki> z`@ucqI5X&D;TfSt!(bc}jg~W1NLIDCqEW*ca%G4l0y7evtPrGIm%Y0QazRH5$S|2C}AX7jasikdN_9i6LZMVP7u!S#Aw4urp0%2kjJ?8 z=ms+mi-7P{5011e1Y8e{|6IDmj8Nqd&JEK5LEGOek^qVWdaTg`>7U8;^q=REr4gtO zH{vtL;8UUtjCGG4LWWEYfKL!0PQO3p4%K7utc@sAYD&(#(~1hkjFlhAa&3F0uiMF5 z!w}aykBeJfp^v%)uuZmW_SFbVpOvwk(2U}hWxFs~QQu?UlONK>0BFukX7A(>F@*@` zFPSfw4-$yN6G_}z0?9Cgg!2DhrNQ42C+>ODXCU+BZl~1$Qtt+=V|Yw+C~$Q1b0(v( zz@FnKK!PaZqbXvlthIINWaFq|skw_G zS+Xdw{ib%M2mWZ)l)x_QgccZe^y)kq z6{%6ATWMn>hh&5m)yQHZZ$W~|hyg!XEGY^3C){XBR^ko=)-r5de}a$y2!curG`6TE zz(`{a!kfwseEEw&PRt>fH?zj zKKi4O$irpU=!?z$gTjswCX)Fc?9)<7N9t9~P}Y}*K--IfVn!wTJ|IJ0#Whi8PCDct zA%)!~$`!0yF%M04hmkTqp8-Qjff(z!Px6MYnv8pVv~&o!+nT1VoZFZ&T?lfYqEmi6 zk&)??U6O_(9LZ&$u-EiKN^H_Y>;tiwBb9PrBtaKobS?4>f=xdz{6yY4oR59JEISI|7z>VY-%^N(0hlSq<{dEu6_lJVc zv*hb?B&y_^ehorz=W8^suqvcvZI(#>ckGd9SO=iG@xmBl0WU$acfRK zPi-sWQ`88leLx1A$^`Cq9``$JTr;XO<^|9FGZi}QTwvO+YFNwwaV|+al;Z$A&-<{+ z|7gMKDQ}MPT=#P_43uC1Q3{?|!)_>L^YdQ?+MdOgMPjSG4j`*vi4V8Z{*65NZ=tZY zej6=7Qgb{yLXY%<^0CH>2LN4;H-K{_R;cDQGj^Lu`lNkNpFb=07#DGRJsVWN<~Ui4 ze(rL29w=XcNZqYevP^ZN$9K&uWcPP@RiuG8bIstDw?h$0&>0+3I(Kn|67eknD^X;*2hhxfLPG-fM1tE-&C`t_d!F)JBWS4xD^h= zKIQu8Hy~6ah2i4-^}d*$eRJkBKt%gnTA_Da-(xjACv&++Gm2LJVj-%OPZ@)1B#w~d zhIv;$JrtHN5UP_0A&IZpjw4ILGO&llF+us<@!?V&UoDLo(Wrbm@_l7=Deg`T8-mEZ zTts!bbTBP7)In*k*Xk6mQ;^Z|hOe?D^UZHFq5gCxomgL??9z&gxGNPaDfU=udEC(cI#%#bg;71>kaXvFgHS1zOb0?;fo26==2KSR{(doF|_Gyp&t`~N>g znb`g(L}_{b3sDIF>~e;ivri2B5EIW1OFWw3*->TxQq+y-wR1TjplysSEhnT+U0zRD zVl-@Muy#^wQpYq2hDFO`KFn_Pm;XZ0`YF*17*MtcMK`v&=peE$iV(N4 zLSqhFx3|ZgM#zt^EdVt5!aV#K#~(+;1%^NdB!rn@{%1~XA&c2y#ef7i)Ded8gLGJt zagMOF$dP`tXjqlHpTf=WUCErDoE+YX4!oI@2L4lFLBcwzu0Q}1U^vD@nqI@9%D_=br`Wa|S3QO1c47dNKr&$7ab8>4oTGKLVbWLOea`1JNT&dJrrYXyR%=2>8Rp z$ZuhUc?99L3r=T=_Ge2Rbl|cXZ&H^ndOC`*K5SAhLVd&zgP@tjJp9SpJ-*H%Iu&&k zNI(9PA$Q_3-f(~q#B3SrOm?E=C|nRcev^jhT|tFJ6bz>c%81QQ=`d@==Rg~i1}qY# zG|KJDU*=nQqr`>zL(9lCFFpSBIP}1z|DV3Vc;Ekwe}-XX)pSE{NH<|MU@&6Mg8C%{6`aLaZL>Q8{SoI;2aOh5um@q*T&7bkv}Hi9RXbN~SAVOZvR!q|TXf7f&|9OXw_QWp%ZQr{#&4tF zwAFJyI9t=pT$fyTr7Fx?H;E$5C>DdIn+`XgZI`b4P1>B+U1WJJzjFVz^oq2p^j*5T%)*#NDbpr7O+kU7W$G7OVZ8ELLp11x(F*T^u3? zcU8xMpIxUKdM}A^UxbIc8T1M$OE!50dTZUd|As8W(}I_IU9`7uy3o3>*s>S9;Z{9v z)N0KVvTVi*E9;C^<|C|MM@~C&lXVO^aJz2nC`er{q{e13qiO!FD*c|c zT%ob9$tyiMB}?35{%b}`{HPS zG4pEQQ6|S%dW6WdyPC>f>TD10VIqsV!<5?}h7a}k;mD)hj{b5$TB34oCn>GwL5N->D~QJdMvEOGVSUKTK=)GGPG>Dw>_$Jx6qgn` z3JWxfO~9l`&EB7cMrwi475%X{D-eNS-Oe>!!wxP?zVcf@))WFwOnWQo9^P4dHv%93 zNhAs+F5m91c7e4n!BZ~?Gg{*xesO#Ix3#JocC%`W>lKgRm2nk97g78Md_C%2Ti&FKw@TuR^`%u3c9+J{px=KRgKzT8CzAa)x|l4f7gLUoaPw| zSFu91O!})_Vg4sdzn_OHjs&?x7gc6C`V&YkB808^j$)Sb6*EVBZm1h(r-8{-g&X5npp?U{k1=LmjpcnJX)FcV@5Yn&9J| zmtgYODBKnZP+qWq7Z@Z1T4jmxixj{46RP%?-2dIoeI1L=Ezq#aT>M)P!#3%QP_Llx7l=yZ1j;Uj6 zM5Yn(Lw8jh)0d)>jnlw3!)f~=w8XQ)+IdgCG{||dB(xEjlL=T8w~bmu$W?o~pISf= z@?gLq0~C;fk=AV7b>-h!ZV7m(4x}42ikxM0xG0qxIIqJ{)shmBuO1TuT57o#C`p8! zLPSInhTF_ZSA8W#zN36bFu3h`(XcMa?%x`$`Ue3#Md8pCKwssA|pNwFbiwp$e1>|4Y{5kzT3q7YQj71~A0bR?Us;Nww^DS>l z50kB@Nbx4wI$K|f-9?Ps66cYOjI@UIT(GYOF8r1NtuR3klE(>GE+-y(X&1W5&FvWn zzkYXA!y+hjAlcILgGfdNzz}(U*{s;uXEth;PK=!(ZH5MudlyEHFXs|^t_gXo2qK;v zknjU%zjze=hg^YmB&tiL0mt$tdmFoLs_aOAO?vUPRAZBCHnT;!Z0HW9MDS;WOs+Jm z>6!#jeyy?v{sbK|OldoqGx)`Hj`h2Pk2`ZFOK^=l+Vk0Gd zT4wAZu?H`^SINhKnx564&8m{Vbt;L!ZdD|GUMWYnO;QhKJyO2o`S?s{zXUCQHyo z>7|iwhNN74`C#6#qY`%Gm3(oPiafg069+H*`F^|BOm~5TNPC-3no^VAL&bCJYN2zM zU{^wxISI($gckhvi@JV*o!*e1m*+!M^BQ;G(M%A;yNC`?( zqH{m*3!z*wk~H z)@i!)TBz6eXN&HY4PUxJxF^x|Y+cxk0-h+vo~M{O3)>%R1fGYs$5LMbwL;(icEw#u zqAobF=s%FUjNlHv@>C%`W}8@zK5qLdHjnMF!tm~&+u+S}zwcvc%yjP}z4WhwR@8%6 z9VQSK@Ec{PTw{iq_7HeJA>o2<`-l{%$m=1E*2y>UtaefwMLm0{8qJ+lh{uog@|BOv zrZ&5M7lb_R8sxgVy$&Ic2&;9yb=1>DncFyt09TS%1dk*m8Pg-$LhbcsLGT+8{#0SW zP5;OSnE!(P?~n8U7@wnc$|AkF0RZl^00A)n-+wr4EDV|GjIMM(^@v#!eslVWa`9V6 zbORg@D0``tYaIQX-(Hl`T%oJ3ZMU}_b3K2%b|;LQvaYHW`d2Na*)uYxWfCP#6J=Z3 z*xA>}KFu#?v_I~r?{lQxZax?IQ$)_VmYx(cLq|t(r*{z!h6C#06J{Fjq*Et}BsqPnJd|unq zL7~}?m=Ns#9q4Oi4+QDo6Ft$@8UDp!*D&+)igWP`$`0EpLFZ<6Jrmm@9k%sbu`K{e z!|jSE%MQ?>Be|S4jYbYvKNGWczm`kBGrJj%I+*WL|I?t|YjOmIn7Y4qOo^U*8%&R3 z!C~2Os_PBv@wTgv+2p|x&^VfXi?-lQfC-Y}<#3hQ8E9qh48+RCSb^zm+O)^n4D?=r ztBZ+aaWi@=)$6)J`4>clA%zFf=D;yUID75hTW+NTqBbGr465ZKMrRh`=bkG&054%- zB+(sAp2C^OshhJh%AT8zn1Z1MaRlNhn`Z0=_kOTAIZ3~}7;LVE_6%_c?SeR8%FKyn zX5PtEvCv&t5r>l&4BfVEW;5z`TIY^PU9V6zVj9|B)+TdfNThjP@;`Fuh^K6>n0U@u z5@O_JZ`eJ`#*k!1hM2q}%cM~x+AYQwvxjD}uKw;D0^>f8O zH;E^KlWH%Xt5-1Ezx;e0T>Mw~ejA4PdGPD^6Y;pudCy@4d^{G2E+G{Q0=LMvPM&7q zd4wgO4!`C6U#V#yl78+oq`rYfU02OsY*+Z%_%3s6=kM$16ZvBj!9zcLd*z#cf4QxL z08u7A^`2wHM4aw4Ue73Km&bS+mcQT1#YrS7^z)wKLWetlTmW4B6N=EVvtQso-T(~| z`d+V4Li{#~U~#f>;63$nf#Ke->OZSLDMc)jt^A#R?0x@wk^S3Pw6_1b*I&cWh4;Ez zN=g#0-4?vPs`?SMtDlRN0|O4^!hh1FFkUNZjDTVZvQ9kno+rl*z~R7unVp@L5Bp9! zB>TKNvZ4UWb`9_ufA(;U=I>6GpX~+J`HvbaqxYve?1>oxkP^wx{V%BtOsLs+kO9y{ zNf?dUP;&iM`|G*l@6yh_V4S0T`26a(U|j^%1w2512Xcttw&=vEFcq#o38t^9mPynq z!KL3|XP92VbO8`w2-inojEE0-p5%2E*v>KTwT`PjYN3{A>|s*?J305=&OZl+IL|rp zDf?6O+XpZsP4~t7;W`rA-NIEz+Zq&_!{-Gesr>rF>i5#Z-rG9m=0*sQHt%g7lX}nW&dm}oUrV@ln$F1m!FEl}>0DkLuZ;SJpnC^tcsyZTD@)GU zkE3sZMi?U_;E1(`ghYEdFw1G64 z)+zR$bu=s<`w*Z{aKW-^Mhz*{qzYS)^QYv<_drfCe?%**9GV?Z@N#c1izV~V)=zQ| zMC!C#i1Ok5h=Q0T#zyYvxdl3DFJqR2f<97nllt_Vdp3cw%P2U3ZUD>BcnxyJ*NX~I z-o5Wj(eRl5fBwxD3y+(7ajw+dclhD{iAUuLiwBq>>3TL%sX0E@^V>4%QwSq9;ixo zllakLH4(FO-$m@41#NQ%oZ>2N)P!YDt(tHgTbG(T32A2xtS*~egG441&U>A+%?P`a z+h`^plKa*WMjLMiD~T#JukP&uPnE+WphF2zl^#F8CkQS6Te3w>Rx3% zn>#~p;CVT?nTYwKMx#uxbYcr@8JvVWE*SqOFdWeBx#5~5uob#DAg zl>rdDp8R>8O3E*P$S>uW{5~9oc~T;f)8M>EK}>d|tuKR9j)gHMM^1^2HknEmXO6o5 zd8gUann&dAaQA|pjdJ)QES`Ie+qPVWqVY2b)2BaiWKXJn-fSnZN0{y?APt76bTTD`^ zt`yx=X!1Q6&Rfz(-X4<^2sy{Y!5m+YPAc0uUWLb4!thxdU)H9#Vvm8K27I8tfLzb!8wb zbDA`NBnGTu?MIDgT**)dHl27lC@k;08~RdMTzNI9?Vi6d!%JZK7(YX$nV$c`@HIFFw64tf$*sba@9w~k!rw31~}61j|;8FvJ!yCKdh$c zQ_bjx^gAdT&Xj)uaZW9(=y zBUGH$S-kEPGme4d11qtDN!0)OtM>7X84BgT6mevLTD4`e(>=fJAgHtr-yh#oE{lSU zz}01<`nA;4b2^@suGSFI5)1kuBnJ3u_~y{>q22e0Jn({>Yol6r0ic5m8Le$egYpaR zoHc6(5b8(u&A}N-7rL-v1hY0na2INvgwXBM#OSG_!TsdQ(OqVZWva%1@PA|PlGwbA zpjdg=-M;{qVsT9rT5wk$V~x*!p_Kv~Fg?Ai7#<}0O@B*Bl<+cq-FVZ(p-*jYLv_-@ z38IGLy3P@d4cyS9Dbnogiu=k?Rx2le^9FxWe#-J6tiWM6U_TvqQ{ppoaHP1DUR9^_1yITy>Dtj~}p5f2G zt-R(NVYSGW8J6yJRn@7%BKTc;|D3OAjq&#-SZZ&IvMVYer|d{oG*-b9 z>sQ_s1z2H-^7quQN=H&JTW*cexw5S`Lb5dmon&>PZb|&V1CMoGX9tn3m7WyZF zFrz*aM^umy6G_wM;14^A^52Cd0)_KoG6$C_r{A$3{4Ol+^J>sH&ow#+3u(yZnC`s> z<_A2YH=cZ1p*5CbGIU1yYGc%@oY4W++W7zzTD*z3Tun z*yYH@3mM*v7vr;D=g#~V9ae+*5oOAgoieCJy@Pm7^>=f5L>!}}1G;Crl1d?3$RR*~ zq3`m+NiwC`o|pM2oXDtAKS@E$H}NIQ!$a8>CnAlX&9oZl)YRx(+{Rr7ZP7ioZH*(e zzVh;@mE^^U%sy~|?!-D&P_%Z`Is0hQmMmn`#qJ#T}YJ!uw&CdIwt|AGSpV4^* za-8O_iPFsVj<*&Zw4p+JgSZy~LK2leag8DDaI_Prv}!gbOy99Ry6!g@)I*Yj7=L<+>1rsw`GqGcn2`!4T(J& zB#F{x{&SZVL31(;6!NCHQb<1jcr9(dNwF6#8E#Rwi#m(t<>qAP z!L2DVzR%8hX~~r>$!2mZcJr1IEYPt3D8Olx-#g@mBY1>D7GG6ZbRyZAmEF;5DdNeG zC#!EGYO0vFQUoioBqSJ=CFY1~NJ76lP~AiC(ouSBCZMQb;&lD0W>#YIklBcQvuR!& z^IZ2m)|O#o%%N!k6%Wv`!~vy}Q=An>8XW_ZA$F?u>4Nhhd92)4H@bU0>(nrmOM7i` z9A8%5)UyNW0R3dPF4Gfl1m70Vaai3C&DUmIso{r$L2!Mf_7Lui%}abaVpL(HF;%Ve? zCf)K0FcU;&D9T@Gu!9?vFX@O5o!$K5C4An-(gFMU`n<3ztLie|9nqKflj8{D z5Ru0ZE*U0amIjIkE}KOq!K?{-*Q7}rHY3a8B(>TbeI z?%z5MT7tGnG0=9jY8vME>6q?B|6dGPE1OMc#eig$))a_=Wq!B3tnQQ^OuZLWik2t@=clzE3e6<_M~GNzNmpvB7G8CmtjA(U zdS0RT^iT?LwW}0SP~_){Ki4PZTHF95SoD3i7zJSH(5YMPLYt^lLjct(Zrznd95N~KYA-Euno_rIZmv|R zp0zSZEtc}j|I0fO+*U;M?pwJDb50r??%3;xr*oQ+j@hG#Vm3FQE0qreM-LTPG0N2s zTRxHyO^zds27LrUkwa|z(_|#r-7M7hF9o8hH)`_ffmE0yXMUdtZoHvTW7|y5S(;@y z5>vUyvbH2$U1#DKmJ2wAiU%n{<%^U6RTVr#<&Ts=c_dZi6sxL6h<}Ar7=V(BGB8N+ zbS-9_v=><;<7N;e3`6}%vH$=y&aN(8fDO_UmY<=nH3ZUAU|_WaAV3a|eMX)*5}H{k z9sgw|g1}m;;iLgd7MGTsluM}f96e?UL_a)QdkHzel1A5;_JJhgYV~#MF?|&17gzPAB^Dn(|_$hdh<^mct=cBfX+mX(+SWmD8M6v_WL?$r=Nn& zIC?6MB7(t&5KKzQTvw$SKsR2XdF||who3Dw#5r38= znthYdB9DT=QQtq^y?sR!&O*od^fzTA$qw>f-|qRo_mX$Kk@H1PXV@w4k4L9snz62? zB-Mk)nlq!pX>L`S7aoXI8ViUPV~ppr;yuF~MEKuoP@h;z^2$;@ZA)|btQqO<9(={8 zloq%M(K%R`13!@2Ki}dkh;dkz@}vW^K`24v7=l$3tb=5-;g$_=?3P_AL%Marra37& zA&_f~ZS4d}gB$n#<1IM|MxO<(S;HgLc22#XG9?Z?84f-C_bn%)kPg%ebFM08sV1fU zV{rJrosjne5kEjR>!_2zg>)_vnAz<^YX!-QxQirKLTOAaOdl~;yf6A$k(#Xel2)M& zd26LA8)tv$mDy*C zY^!dH3@NnCs_V>AiT%_qwL~WFs_sV0iJh97M(oHIg-wLepXg6MJZ2rQmEN|bn}GY= z-h*QW^}O>*PZt>YLRxaV5;>ySECy-{CocKVuNJtSA+L(d3i9Sd@*PT|tvR)MU!qQTc}BHS`t4vZ!T2 ziye%Qi@EB#Ulhz7;$F#aP`r2MlZEQGD;m;LbnIjNt3RU8#+2nO#mk!=zVJaWZIx(C zVy3p>ZzWtGW+iRHI62kqB!wA+2%>~57!pDoSxD1>!)`sg?TfSUrF-1W=m1+a3f>fx z2bH`BLa25s`quK>C<}YB<9Mo&mS#{~CLw_mncobxfa!G0tf#X-wR>nKB6E33P?WX$ z81=vi$Y+1I5plk{DXGmrc&(uc4uswn-Eh9!yG3uM6aU%+=w6L1beJ9JeaJMuY2mhV zC@6o9xOUgs7-g{LdEhmv!f#3UHNUCSJoO$6U_Y+3K=`ejVrunU*53izho2tk37Oq3 z@CKMqjRQlSvx>ggYo}8D@_dx#m2g)A1s9My!TiEk1HNOXXNg=mB>gR|5$M3U5Y@t# zbR2yqRzKt)*wlI;PiHna{a})(J)7-*ORa>HyB7Z=Tm4ywq+u^m>9=TH*EfrWL{R}_ zDAZ6ek5oQ}|K{DjOk4|C?NY#*6Y?{jVK8rlKt9n2GqJ_an0S(Y5=>q?<{bnMOC>^T z>V}#Pt1*vatuNd^hHvbq+3*T&d%sCPl=c(tqmmc#%=BEXxfg?(qE^10t`*ToG?f^? zVF$)_g4X;^1f$a|wotNRa7(E^`FOCUu1 z76fz`y-@EBk`fQ1&Xy=QW{6=^!I%<1%EvV!9G%)sak5tf-`kT^l)!b&RuhIP|EwSt zC&f!e2x-Nh=#VU>hb;w;5om6xX z04r^c8LcQJH`xvNDLv+~>}wyuJau^N5_^e_+56rlt@}T@mRy{xR`RzCQ$!a}hB9V} zK~zjq4o%pfi{tCr-qub_dRV*D)W!M4;#iz1+Wuv)P^Ndzj)=KCBI%;b=cMT!)fZ1h zGClVUQ58$j49}^rhM(u`bL`B)b+N?(_s-KC>Q;}(DU5R*S!9C_@lgd7la*}1*^ldDZ0+L$BvTY>HyP?fcJU$jn@T-j0acVKs?wd<2MXGBGUWz?%c8TLC$!oDsWh8R>+T)>D4>$Dcr(oFyRPA{G zu?u<4Y8Kyqv%XcccvH=_OW5^N@=If(P+#d;dC?QqoiUMmC(5=+H+di&J?WmP?Qn47 zihBQxurVQs7H(IfQil`DD3n4KHqDZQ6tq0uD=Tk@A}NrV22LtTpQ!$(r|Snn&J966 zQA-cVNi>gmSex1nj~L2T2*`PobqSHD=+lMlme@O7@mFO~=xZq2tU z7n%s*a1pk}bmx4Q;vdEE& zHS}osH|3@JIQ`Ui!D20$`tgeo+vdsJQVqx3$Rt@W-jY@6$5xrh5 z7dJhY8(haHrfc*o|3#BMtZskw6e0(rcL&tYOG+SvO=6(&)v{FY?7;xNZ*}mzhcrK}G}@ zF~(ZH-{HZ(8qasIVAWelRR2_pNrAH!K{oaJCMQet;!VW~E|!$3E3%8{CF!8Jq9=bZ zD9?vfj-+^s2F9}|b(1(#M@Q=x z>=qT?WtJ~F&y{Sfu~vM@L6hgiOl~K#y^_e{C&tHA#1GcSnaWVOy|m@9xU-bPYvL9e z<6Xq~YPn3vV@ekz86+~mA|+^s7sMYh+_{QC)S_1`SW;9+4brzwQ%Ft@jc0Eq4^5aJ z9FmHB7Tu{Ds(GdkE|!UCkci@DtmS@miGY}bC?yKpoXs4YJRiKFX4Td-KvOr}q61|Pg5-9FI+o;-53!auY*m9-N+7dqBf-oca5B{;W2-h@IW#mU8 zB?J|*9t}be#z?u&{+GS-q8IxpmbP3-CM^)ehd|U&`t4^bRD-m;4#R?$*Bn6FIsP2| zm4W-6pvLX$He(C64&~bOjX}G~in#A`^)4uy#AFd@vzGg|1l4F4x|BHGEs~(iaCWP3 zw)EsxeZ0;|HewWIOmguyX76+~`j(-2c80W<*O;0knq-)Ky{}g43n@EKfKn$ac}&1w z`}aj!g{n2QqOWFd3yq>O`%imDh=a~+q@`ND2kOm1U^(1`s(Zp}TYdzwhrmFD3nWnq zb@fNd#&=W+njsxKQJlu<)0He}vNk-V63qrYX*E42A~VP9AoI1{0OI3929Mu;Aoc_WYzNFbdZM z^-2E109F;rFvq4!(bzX1Sww*)%Fqro$@9q`W_paETsbMqaT zE;TSknV&7GHJx$wz$oQ?W{mvxV09KmHbmAtP1e6e){(W&Q3|e+_hPko@w~Ygdf}{B z-<-pvG!8gZ3Yml)TuVhan5*2t-gV!UB}Bxx-~ zsi36O2o~l8Fq}LneEkY;pKPUg zH!N@xvRI@$oq3m@NlqK0Wfp(;(+%dYnf3C2}PvRZ-?8^eTo6>b%LWR4O+#(ApeQ=?;(L^s>9z^lj z((;20AOi^$z?Bw!>_OpR8w4Ouvr!l%cNKh-#pCNqdEQI>-G)=8K-xC6{XG-P*sqAu zIdiGUTJdTHFQ-Vv@4meIE9j?uiT~kPSw#Wyng&k~ky^ve`SKt7jz^j$fy+ehBn^{B zP|&r)i!~qcS@ei`iAGzK?u)&%qxWMCAl4f(XF1+K!T#%AckrC@AJmT|Qb^~!)245R zBxgqkESQ;04ab#6B(^EwcGUD(466n%L2IAj=N+B*MY&!g7=!023xz$&sL1*MS=%YmK)-_$syYW#~3_sjo`98*3^m9nx{q2r997O zntdoLE_t%_k`ctUYG1Z;Bn5X9ct&(!ZYC(y3SECHWk)S&l|B8gYq374KV7KzY&=?F zCXmFI72zI*zY23kcSu@^S$zqzpb=R{E|zA-Fv%Y#k!Arved){Z)$;7cGic|-r?UO` zi%C>+S~Bk}>5m#FyYWr_fsZmeejYL=RJ-}aLYDID*2b+4i&Q-xlR0RNXIh+i)}a{P zgwa$5BUkxiJ{}-7D+Z?TWg;1#^2}P6{-wei(FDu)XAHv&-gfKJhm@0K3y26E>7ZhI zQ2Of3v_r)*yO$K5*JB6BwV(pf##)MEnpc8=*YWwC#*vf18eg$ae*+Y|rhC$~E^)-a z6?#doIqkYldVi{)8j_UPEU$8!NU>Y@C3v_02&szw$(ZjZGLRWMCyaLPv-zV$W|qRVp1*@v`EX|%%pP_C*O z2nwtj8kzXYUNb%pb$0N`!PV$WdLxZP+$L(vuI)?fch+ByU_Wk8%l*Pe8)&ZSZ3ziLy2;}eyIqg)c2%n57v^g(mq+ZXw zP_DyrU+4n@pTdkOYbw&5Vf?-yt-;jP>t(#4CGuJ4`Du3B04?UBygOTpD$l}^N_sht zcDRQ78IVyV(D{# zU$_QYvDl8$(7ec;(!8AKQamNr?sWIhileupn_o)v=>D>>iE8B97%O+}rypXToQ%bL znodB-`!)=6Mv6ZWOy2@Ij>pfj6XKTm71uG=r2M3s4*r0y2xrf;Afhei{*8RQ@2UZW z%J8W)h$QtC14a#BTw5m4E^ToueqyZ*N^*KEY1&||kQIa1GFn}2NY;cea>pG>VbXB% zxiLWS3*)N}FzU-Z#GXELl|++3BH$ncfbn&nJHr!fNADVdUOEC zW%pdcb2j%XIlId=VC)gT%8dbEt=d|$T=FGW z3|6oi6nCbrS|BhjUaPH~b!2nUQmJ1q!Oy4I^E3ZIN7Wm+bvu&^y*pFPfVq&Pl*>9F zpj)%Axhh$k+TDOlAWCdgq4`F_!j0{#v=Q3Cv8hQde6&F6-JienZ!VgE-TCX0eiQ{f z50~DUQ+SvZ39h_StkL}3E;6|+g49=*S2l=5%@F8)QA~=4x?X)Y z#t-xt43jYMG4fWs*ZBC4(VcePQ$Bk+7lGkeWNbA&v3g9;5Y58@IxUYuaXtSPkb~{= zUB{AhxN%;mIU?8T+BoXiTvS{^rm2Ba%EM&1s{bpY2Q&tvPMunWWrGIE>m_0+)-ca; zT=XYhAh--Abdbx+!%cgVXyr+9LLgzSOua?inbWs;wzYaX_pmC^=+%)4G)_P^3ox~C zV?XuBf6rfl`Jf{Qx?R*KGmj0vE(NL=&VgpJh4v~I%fLBxW1p__*@^7FI0Zu{5$F!6 z)p!0o>iD=C^adtMo=pRK0luL9h`&X6QR-BzK~d&N$P9l>Qz*6_wCtXSeKIgmHnI!& z_WgEuYgsP#CgJ7y#L%nhq$u*Ea?PG*^rOnetHy@ZIa`5>X`2b|_fx~GZQITYsr@iq z6Tz!ZY+uuZT*YapqSr_Ei}jv5?lStI^68RX`}+r+SGt)ErBV%9%x~2T<}t_08pg|4 zC`$dik-?6%+A!~w1={Hk(Jotgy1xeTG|{A1bdx!nR>MhT%_{Yf>OZ~O-N>)yKsP@l~1B`j0)TNUl{4=C3M8043^U%cyf){OU#+H=t?=#voKBi z`BkPv4_G%#IEkKAxpVf&W8vT5k<*O+1Wrb4QE4}9m<=V4>$V_JlKD5YgxvrN_C~Z1 zB8b>fqqmETq!K4qjxYHIE{aMu>X(z4@&`$eu@Tx=A0suEI+8b+L{5OLmsI3{1n5}L z^1ImnJ3!KLK>i-xMH`jwc|m@n?rVg^Z99>^Qh6M1+7dF#Zd51De2WH&kBFjzv|qmX zG_tQ+u?SJtbz;aGOk|_LvvZ``j>gT)(~I1IxusaxSgOnbHuyiGtCok48J0kD2F^=M zm_vj<$^I@xSi!|HY#DevfjR3$K)b6^T z$fQr?pEO{L=5C=#hk0fH6sj}BfVhRSuo<~JQ2?zyQgYgHtLqoxbe}eWr|YUUDZftd zE)XpMh3@E6tl!rYj7&vMCsQh;YtJkPQk#ZZH{Q(pJ6NWOKMB7y8J(YAKMLs}v_AKz zjZ1|De~LrZTCjE~;-;ee6jJU_?Jk{lon?Z3KDX&^SJ@kWP%pb(px?^&+>!*+tF}xV zX*15_;r&``2N92)TicTh+rg0trDBJyjlvwaAG&OvwYEP_@j7 zvI2N|D9|##VjW^3P}CG;dtbMOI1E^ZD>YfW78c_j_LodQ^#yi4I}C;2*Z1^tM1=4_ zLun*|cp%7@#pi+2?H|~nFcI;W%?0Tey8=D<$4;&OD7m0$m_n@%w7W6?Cvg|FQ`Ubf z`Ut}OGLAe6pxtlmQs;t;12vE>9hGKmK&2H1o4p-0ROAyGxw#2J8cEfjTFXzd>jR?~ zJ`hB=q*Y;&BHNlPEF@!^g_gBYNze9DPI9PbXvWv4v zZYZHmYK7LVQZ)^L1Y;utn0Yy(7*; z4HcI~s3&}g_Tm?0{jBgU zX919EF@L*)#T;}8!6n6Y5e6wfs1KG{tx0*5Y2eQkK<03=*B|xv0?9NA+5(fZuZPBJ77?`fa2@B`D*SCd&(LDr`kPsHX zhPG+mW%<3YC=obVkQ$H>bS}_*mVRWk{HYi~eSO~mnU~0;O&T}`x92hwm_v&$afMuP z4Mv^Y&7zQQ7@AmgrTUGxlAa&}VAHaCW&ami7r5(P1=Rd>w8tS5CpeB)!-mIiT;$$HPyqSWtKnD!#dkqO?Q=@U1#i8H6H;=04%Zjx?A$h}fm6p zZZh9~lDee?@iz`dfjnzN(XoJj35V63uqF>l6{^!2pFV*@?-wGw!X*aY(>D%tl3h}} zz&yQyvw=WDQ1$hA@IH%6mONL;bX$prR$!Dlbd zzP*?yU;VU(mtoEqx=HT#wQ|cTHvNs-2QrPnmKV}7m#>@}lt!uA?yuYT>=~(vW;Tw* z%Oq2YvfgL{RnBQFQS=emmka>c9na|eh!-8uII{kYb^1V3INX$HsHT~e-?MPrtzRIT z9kPR4s*!;d^yB@nPiTG>mtTg3F|X!PTX$U!2EaGsC%kcqTMj%!tf;??||M-k|f zc~n&?Oca$fHBY4OJ;lc*|LN$)rRXjm z$1NPb8n=yStB_=A-9`1d@^9RWnpPViAL02+bLunx6LOMBpM}3U$KTMy($~->$w@+y z?j{Xp^4$mIGWhqecJ_7uzkh|aYM9&%q0$i?iIjTt#>-D{=^EY~ZXQIkc4Nqj_a8Qy zO?@TofBOum2h4`wAVGw-x#gxpVRo*D3L_1Op)ZzDm#ug~uBES@E2m;Q93?7@IkS{M z5O@jS|7wSBg+f%*2V&onZH3lB`&MRWu(e*mx6wl}XbA0P5P4-(2+c4Ls=5*UU7bA5 z>w}m?QEu<3_}l5r1a2@6J5~BXB;+&*YILZsw zwglM8%Hx6XmHW;wUw`Jfk2zR?`&i=cZ_tc?7@l{{&x6ZwI=erP8O@Z~9F8ZfD}$)V zIKP!JS-0V8HS3nhBbW#*)Iy1EaHU9DM?xk7V?-cTVwZ_f4yFp3Pmr|S_%&&nCnJnZ zYXSPnShdKF9aEegwTIHT6Ch*#nR`mMLI1=1D1r$1g!%;{e%1*zj{1{t*2>Ud4dsij zsoTOXQ^9$gdL{U^i}k87lj@UYudLf6oBp)tgM{Qs%@y25k#qF^$Reu$!(<>xtk;!F$p!IS8%6T)iwXXg1|Rw zL=O*_EalrdgAsm zyZFlaYJi-dL5*0Egd!!YabclfGIK}x8GJRO*a1641k@rrtM>LG*AMtck~C*=!ZDCk z^wMe(==+_)WINDX!kq{*ffY#idqUZzM|SAdFDpD!WBusME9w6zq^DKet1Jta29_h; z6>M)Dq)GUg0Sl1MpMcGiW_k4~=5v&D4ApXKbU=1@M=P`B`=Fna67MhHSIOZhGt364 zLt_KY!Gu>5y5YqCqk(KmRbvU*<@WAw1~}2oX*;dTAYRyA30jhh{_cSjOTq+@M8x_6 z=VTVJ2B=lDeZ)V{2N?s**PWaD(FQMpfaiabiW86vBOU!cLB$K`fj@;K092b37esxj&IaM4-FxY~Z*{;tp}*_dl=T!(59-)oi9F9uiG9LS=$WrE{A# zd0a~ly~@wy2r>1v8D|{O?dBE(s-$kI*BwFd_w9SudFCBiV3^Titxbe18FZ(@_N&#> zkiTDXVS-exF6(}DSQ2>CU3?iQly-%gvy|PaH)~z}qW~V5Q*kj?sZhoDQAQP^v!o$yl9Wpeb zt29E8v!hw9+Huk>?rxM=cN+HU<3FX?jiPVK(pT%B@2ji&*a2~j;LJ00u3N4AYhx(l zHfD+|!qj4gU5zrSe9EfYq)lRBixJe!nI|0Y3GJf&4S(Lpa%Q3>WBR{XN^Tq zmebCQmK3Xl|FTvG7~_PrfexHZ1;fk`KqAv^1#CWptSwO0un!U<>2nD_yA+lH5Wp5` ztVR?-xLZf04t&k23R}rm`rPU`Y$Q`5+=Gpd6-ll8;~?WCUwNs8Iv;-pyTp`PY`2#T zP``Wz3HVP>&7c_`1mJYu?|2lIYLX{-E)*KV#%5sTo)`&uqD^91x7m9OG>n9l^ z9d!x)mM{%|m`=fT+>4{NiH8o(MtZoF6w^tB)x~tv?>t3~41Cr^-2(I)>>gm4Dzt?G zqK~jn!&;ZgZPNpkoA(bw<_lMu&O)i3r_Yiis=EFidSpS-_^eaFF{bLUPqQ?CvIb`B zwWRI7s+hC2jOxqa1>NA`-Z^Dl@ZltZJ1UXEJ2_K2gTTCgZ=&FyVL8>3;P6g`2Q2Hu zICW%-;CNRc8&o2|2EO1|*Axbh*oUi|!=P84;yNvZV%Gc3O=bC!ZHymf(cIkJDWi7q zbdfp$G>|F0+~bKNPx$xP4njWf`T|BE?mn^QOAGf5km`bvg2A_q@^znz3xgX-;u1FT zmChAyGEtgFFBLN_L~4=vO{WqP!9m=WlrhJZaqV+S=>13W4J)ejf>Yy=QIxh>-KcE7 zmxtG2{(WnUgchp7X9H;f8KW`ia5(pEGvJK~h;Ld|ByCRvOSVDY$IXV?m4~SIo6)@V zd!?wkHH}&+(%ynm*?~I3D5F_3(XNGLBYHevEUVBGQP8?qN?u=z5i|f`m)}mK1`x1A zX!as!QgC$*2O?*a@QkB@8KeR;7-S+xBat&ZR3_VCj%x#2j~f%N^2u87I~SzO$aBRkwEF~jC2Z5p!*1tu6La~J>1;UY$osK z1rs(YpLYw5Ts(tT0(Ck{7bJcAyl5GOQTY|=pP_a9km{x@8Q*rx9CiPZ_#DF@L-9oX zPH)igXX8n^Ic26t3DGycD3yOV$$4#JkdQ$efn>IeFFsCbVqptKTK6Ac;Mq*?11TjeyUMRKzFY;l!PY&Jnfz zhJZnZ!Qv`VIYb?Qpf-P?Z+a;J4~};CKTy(YsjX;1bN~QEX8-_#|7+RRb8>ccF>-dI zGdjYxa64eW_3{g$fM>PcdQ``Y6Z;Eokrl#EpO~D5zA0>hi^H`lyK(e-GZ{^n7qOMB z6WarxC0;bQnVDd0=4NFTWYZu=UORF(pz#tuM0hfZ8RL#}6$``{IWR=w3Y;f{#_JQF z3DD8m&>&?L7xZ>9+ua_cVPxD8)ZGoQ@d21Gw~5W>%I(@u{4#7NHdU9!ioNORI(?vp z=NZdKCR}~x5se^BbBG9k^NO+2P&G0_H+iE=9}a-gkA`SgJ5#8S7|Y(G-PwcOW12*e zEyCLAcA$k8{AgDnzD9%bD}gv90K#_QBs6ovo8DwUHe!Vj;&Ow*-`64!{c-qr;L+E8 zvBRM6dxEN1!4h2lrEmBzl!0Ht^jj67<+-NdcxTjL`O@_7ruo^9=J>2 z<3fB4$SZ7AD)P+8+*eFI<6y>3vW9yI832ilq!0{{cQ6$GBh$<$%Q#mR+55n_V-ws_HvI=XrjZx#D%^^BP`1A-~;mtA4mL zsav>VI=#%*$#vx-|7DCmuAcJdA! zEJ6W$)DC-dw(m}6=XuX_UBP$es_Qy}oU-pwrPoZ;uD0{Nyj|9>8z!o@k3@P0;zN>b ze_orncrLP;0|3&KU3#vw;StP!9-hxE5-W<}5EgkkuLvZKp+sLeM}SGTyg9)f00_%i zFZ5hvJ8uEw0Y7q@q|!gRuu1K`9ky@0T|n(;XJpsSu4epGh8-dEtK;fCbC?A1?Wf<> z#J&XF>{(9hXXxl;#XG)aZ!WGK%61IP(7$*Eb)L9br5Vi+Hp4+lfVW2HRC=Qrft>l@ z@)s_2bl^JBPtZO-_puQ`qBH~%fL<+Wxcp(;|FAaG zx-ia4O@(FhIN^6O@3y2GXu2-miR}RY*e`Utopknb+iu$$J_P6ZE_CBO&&<%RU88|O z|6sP=_CF27y#LGlvnjoqB@(WS6->2EjP(zR#V+br?Aw~RSOkiYwP}lqHw&HlgWHu{ z7@a1d`b<=S3BoS(K!4NOCtP86Ci@NpjRZ!;d!KjpasdKOG!yP$m=-MbSOIFH$P9dF z1IXuIP~IxxhtH1bjLmbw)bo!u;GEIvJ;&<3gxM;7b6hXZbLWoRZz_hdyTjv9y%!_* zRkoIJa@;SyjjKoxBUm~7BnE)w=;7lOIaA|y@-y7-v!@RO4)M<08Tyw%YM#u%^x_$Q z3Sh_{H=qjG#uX|-@O&393Ka{miF=YC5gC^5@fqs{8Fn)zupf3~^DHn~ z$LjaUb_J%`W5QDJbwYYJ*0_Z3X1zypN*mg30j~BDrx`Z#w%b~a)cZ}x%;NUhjIOEa~S?Lp{@P0IYEaT+}hjHS;f${UmlD0vmnghXw=#4 z*Pom;42xjIwt0p-y=|8v^=t@U1wj#$JS~HnomlkNB8p zu75~1j%NusV_^t9!K#N)WE{e}rLScMw1q1@AI4ufSx;Cu+X;^sU&XxVr!wHLvp2bA z$)>~yfP_(B$gh9dguNZ&AS)Vfxg&ty7R4Bg!$L+8I#Yz_Hs64NHv<&f{3tVHJweVp z0*yBw9XB40H^8UJhKw3u87J|DPpSEtSYHLeA_wIKt0>NB@DJXN7BgWLSVIKM(Zr?! z57ka&$Q0V(PgIZxCEyfJV%c2ugkqgWg+-*;A$KQOeVto>?zvK#uPn0B8qs60;`&CWN;-+c1iU zaM8xNKoYiY-6?>M5FGV22YIfg3k^DoQt%v3+@W&;mTe&0Al41>h9DW1k^{$$qM+&( z1QC04iE+qalT~t_kr0?p`VPKjyruS*n|B<|s-ydx`~KM$`G)T_9w4Ew$dkdE zr4u-)$E(IfKP%#wL%L{!SAoULhx-}g()XB-$pkQ*A}wIavHF&wY+pbKFZ0!{_k~*x znPLG(8FAt{u4lxZk=4y#)ol+l^3mVP_7RyK1%#0J`!BQurfKS{DY$?Pi%4X}NCh2% zE>A`yazU1-#L?0`t&rV?^w(dkksK?Ma(s+UfIJV4vi8s;5PI=;)gZ_a<4K$JDcqvZ zN3%g*k*-2|V0HuTI!VZE35zBIOK*yJ2tgAEmqq_h{(k# zoEGz}H_D<~i+K~UFR$U#mNChHOQuDi=tZT+Y&Uqm8Fq)bql9%S>)Al59>R zMsa+Rj&Bw5f`2{}aE!HiZcbTn?J|N+wzzI6Oy^w4$ByiF4(Z5pc2YsUGp5=H*_->i zWw`E!EHftcn8}?U)aq4|XC~)*57Qy08F^$kr?PL;M#|Py9xfy5Ol3`1k@bD85u|*d z4-Md4Cb~3cFSNbRliz+#EbL#1SMhc@{4N3lirMtRo2|RA!L#hrWo#xEtk*R>0*O3* zC|V_RNeWfm8?^~KW=YlaC{iJM)+O+cd35M2F&gjf!C0fLLncH830mkOknE|0tmi_O zLPy(RJHAztK$!^aV_~FbvP&x!KwL?>1I|*)781@i!q1pgY~EwfQAlzomLA8kS3py9>JhN6~O77mSd@sU-CK;WZd1dQgnWmf(*keES`1OO>8cs#s88@NQ?v$iF0 z1hZ14)|0lloc{j(D@kzRq6`uE$YP8PiBbH&iM{CM=qh2|E8F4wIGU9!)XV z3A30Q`hszAagvi`X{K$sBgi^|Y_{9T?v&h>)?|BPmxRxO_>n8L z5+TLNbgE=XUPNkBXVfJnq`@Tgw9kobA3T)d%p|)!GAMQ>%TiA%OSG{4DG~@ySaW^4 z1*#^6(e6Bg7!(x-Zq`yFr+bQb|Cp0lnV_K zqn#%a4X4F$J-(#!?YI}zm~%DOm{JNxLL3KWYcPI==g9FQ@fll?LMJTxV~3&&iN_wE zFr>VuWcY9uUx@Lv#b%_2hOV8AhrM*}!5=C9m=+dYMq}IvkonXZtQNx6m@l@2O#w`p z^u&r22qnv-0r7sbxUj_Sj~0n=1;H?NdwUM-(I_L9hSi$OfavK%@z=rn2#h-ngc=?K zKy&^kGe?VIB5K6ph90vfq>Pl-Gx)qD_ptBTqx{m$7AR(J!o?SaS7&lMm(v%(Nvo=?U9j0-G zNy~{(9Z$j+mgExpR)YYM%~~J_xW4s$8OUF4rhg0iw+mYCR2t?f0iMw5^d^l(EArp8EBKi#`SsFOy=H z3QUP$%(k1%_+TRSh}*MOaFe0bMD$d3Xbc8C5U26agW2lpnuOaZmoTJBbyE|$VHGbf zqZDvBL7>(2EchO9;4>|lY*i{|X#%=t?w^)ws?o0Vn{SiX2-`h~Urj}+du7kciJEX7 zEAs_ zX-pnu4~&(7)ZWU-@Zx-kN;bv-22>o26yujIOUiDomO*g!%}1vdiU~b3mS{6shtB4# z#fOPL`9Y~4}+#7Ei5qw>*MiD!;zEg=5koe9W70hxTZ~`y%$|Kwit*p85_9*@alN+ z7x+42s@ja`D}~*;Z6*L>Tw4hqx#q3_z0M^zk@y&z>71&uRLiWn_UBQtmA0?D`0<5T~+N`o}ssYQN17TyHj>2MXJNc z78VY!Gl^zSl zVuHmLBG-0~eapwD;*;h-CG$NXOvb8}J;`Q=uq55~?aFMXSEPIvp<^f&VU~7Ee^d%l zRf?CCnG`8hbZW25k|wB@OGf=KnkOxp@}Md{FdOldI2RQE$Ph~QQ0g~Bgb{hFw7T%! zx~Z;q0`--^)Do2HIs<%@U2~hAA6|;c)%SLXje*e7R>fs_lwu?%@I@8Vb2bUMXyPa% zOVmdIE#%QywWr86sXm!a89dAeh3wnNI}ZH1Pk z%id&|hHP@vPgg_G9O@_aT_Az@#J%#qAdtE8Hplz6g>^wrmkmX%yh5)v(cSqE!xV=X zZ|h2J?gUinyv6u~2h*6cY$IdSOVyeKordaQ_4rBI`1?=FSl9EGpDbCOgr}5+_Z>@a zW<_*ao`jb)RFcGYRp(3QnKzk{`izU;j`~?+Mwf352>=FDPrB}_i_;RS-+TD)CZYaT z#A{NTWtAP0!m--StkMLP&fERoaHj38NPOozmY2eLyajitJGH2_TjHglmU($tnf=ai z>(S+YOQ{<#Lr|gjzY81L`mS_n22xtAJT89KT(2DLo(&8akNd1S4`&-}M(*L(QZi)~>egx2^Nq8V~xfWN)3VU`S@LtQWGz z?jBQwI%x7(rXM+pYM8U37VZyHKT#wB? zZ?`6S?H@h$)MOku2$7gpLg#nI7L`cgb~V)_6#gWv8_*!ph3IR)4*Uyn?c0UFui$tJ zJz^5d;mS5u!B+SRKRJK%Lb^^S2zVvE&%xqpsU<{yeBYgk%_Hx;X_LkprP5zpGlnG( z41*e}@4(0w`nMCJTwhS>zMJ#%ys$@;`Gd&`l~WFouO`00 zR|A}(7?YL4sk)qE)#8)WS;a8euUy}Uf3Y4sKL&`GfG*zY!9H|hSy9uGb)Qlj(kHsl z3kP5o}1mlV_{rnY^hche!tm0;HfS=Y_UkIC8E6lJ-dj+Sh%E8zuQX!TrVCQ38jbKJ&jWcAIf-SGL|qExhi8ek$T5&2c1rBgmq z5ShRg=}`@rb?t+G{CgMn`+5b2U_0|s+aka0DR@xao>5_3l)p1xxIA$fp0vt-VgA<$jp)C1cASgACw(<008b)007wk zr~mF`re|UMOS9MUQrj0r`Pq^C(^7_}?c8#sbn&-*ah^*3Uyql0aQ>N~V3NO;Rv@W}S#v|Fv6pem;F8kd(Be*HW3j0yR43$mt>t0DMw z%S5be?^;d6cFdHftGm&M(F877CrCao9upjaeh=>I_a@%F6V>^u5IKa;i6t5*Km?gJ z+Umb}(Ctb5)z7h%1I=$-Y>#h}@&+yPE`!{eA5UgDyVL0G01*I7kcIm{6dQT$2IlY< z?oMXm^m{R=`}o-Q!$vp1zTex;0--CQZF9pge5tNyH{$XLtZniAU{fLGTu{PLWX;%# z0!_7T9Fa`bT69j}EaG4}_X7}X7GBpA# zcnE9-l)~Ic$;li*J3#^lqy9bhn7eAUetFz%c$W3ueibf!mwL>z8;I=`)%TsJbWQkUdr1YadH8q{)$71o9`#LWZ z#4}SgUo*#g1$Vr;!Z-pXG+|xnGRJ1U0_kJ;9()4j_~{Wt;k0UP4X>n?hdH_`^3~-T zQlt!_5NP7-xni9F@kM95(8qOjo8C08=$BnRLzdaL&b^g-Y@XuPH@UV-wa|6OU~!%; zRoDdrjpwI}I-}D7TDf+B>FkjY zhtqq$3Ik4X0RSnmbnBGJ9i6>$jveGy4vR+AIlD*oHL4sum$_}4W3iRj$@q6zJ7cKG z%GX3dV{=YFH#j|eE){OdMTrMi*wvO_VH%H5s(tTa|7DktqZ5cJ(eTEeG7~XQC zH^;5r#lSZ>(@dD?mvIReZQ|^3E}U#LZ+5R0 zj}W^)+dLG`#7sWeP(Z)fgx^kL!efpT%oN*-PCreOQ$Bf@TtLF)gLJZK+yc8Xihygx zeW>nUpQOkHUUU(i63$~|4#DZeh53q(4NeOiu}%upHUExaZy_o9&?&kJ2F6R9s{TC6 z4?S(-R$jqW3gdda3;-DO<66|7d|ckfU(GS;27uo5ER6Ir$G2aB8?!6;{?mfFN?^eb z>muEiA!AyByh%UZ@WX|PcHOmgy)|JU;Z)R!U6#D@G%RZ8D zUm`{#7htOO%r0i?neSg*#Yxx_@KV@SQ6R~g{c>*uZF(Y!33gD7_eq!nNb8%enTMqn{fS>K#EmElP_R$ymjlGdjNAlL}{Q&>1#upY{fc+DR zABgunzs%7;*uBcx%T;&YfLOapbjUX zh$CS7+m~Hl>tQ_CK7I&Qz`l3hkDSeVkV^@4Bn(abeHP9iHLTU9oyavGml;^Hr&@x0 zP~+H`ho*p%68`O{%)J#aSYHpvh`$*XF63NuI0@^H+Ft4hwpsQTb-OT)bCbC7oo!66 zy6cT-4u}pAUD79R*SAQL8;A2#7N-Ey)rgz&R76LhJPt;n0Op+up#wVG(cH7Yh9ern zPc``8kgs-d?sP%)c(N{{eAF3qTuA;>HuCVl)sYI6mv>W6Bby%NA$+YmBd*}jbP)g( zWXKM;S%0J0!4Jo41#2QQ4Y}o$2mC>j4sRY_Xl%>6Mv{+UqRO^y~=;8>+w4+cXm*xY8dI$x=k*81z? zZA16RdS@{OlITYRXv02Lh?-D~2A>C*dqcB=GdaFLcpx$ux*&syO+12(0v3-WD8@aE zgKba3f>t=9qWw_XqwZj;Icrv3&e4n~&IV<3ZT=Zwh(%R+fGvXbx_VZ4XddS^N%47( z9(v0k=LK_(EET381}rpv%10SOzj(49d(cHg;i9wb_sRDg11Dgr>?!KpG%&BKyuf2r z5C8T!*u)^c$Fm7uPsezj$@LTa^Rcv=yC^=>GsQ%~v{T~2uDDLp$>Y`aJ2AwRX`+=Z|5sayUH;E&PZM|yo=aX1 zxIp1WJWKU{Gdkz1GJsqm>;%jis2N!zi{KV0Yy@`Se03%CJ3uW$*JErhL2UK=t# zBd(|VX<=NgJ3J02z)+M6I+*V%@GeGCqJP8^H@hCa&J9{$J5!@ap~6e+15vEPPNncM zEYG!Nm8tL2YHAQ*kK`JOhQng*t+1gu@&^y5P4lU%Wies z5cW!3Tml4;*NR*vvy5e7qG1MG-_GI;9X61eP;@&>?%LN5k+V9tZh>EL?gIOvyc;J4 zzb>4LmG%VwW3dr@YGNVGdto1x64nOE$`QibF zo@vCyGDOq7kwW=D_JCQPR>Qqaab-O`D{*fRZCNyn?FWuO>K|@c{th@X6M~uiym8OP z95gy>$(X6Y62OBHC@1DZH}M&mYvFkYsNCZ8as14@8TwE8=u3aL9YG8T{r9$#LD=MA zLFnoT^QA5nZiwPGtE@Tc`1wTvJ~_MAs*eCO9R%}-M?%fzzO>z z_Vg(-J}0xr(9R47F*jgHq|7u$oJ|b@67mpHknk`<5R+S_*!34xStY5YFR-FKHo;M9 zxj#sVUuWMPBBoAR&($jkm0aQ#bX;#Q^zq5sKMO1eXrtWqSDq__m*yy035zQuXXTi9S_O!T8kf!QfkUi5}OON{gF$VRfG z@W%kMkgU8Z4GMIwbUq4~ZE#d^hhNNrjwz%XTgtov9Q#3Bq#1sKTKnk@VrxchNi}hj zDY+FfQwJYg;%mX#N`^tuPC-C4T!5FLRY6+ZskNo-vV>ONhVz1lK0cda+c=e8*sVm_q_%7!HVn&5Umz$u$(ts2Y{p)nU# z&uQL3!_jkYZ5gW16q9g+{B@)lj+%0OEUHY-8iS3M7nhK-@qg3^!oMLE90*#ag)c*4 zew}P!tld}eBNhz6m=2w8TGJLkkg)7Z+6Lzpgt%Du3UbTkN#3#Z3UClNN@8P0j+p1# zc0S8<2EwGxGxK^hW{cW*JZjmFs|X7DMvDA<)DR=7<~<8%w>tGeZ2UYF9luv%G&HR? zKAc>QL}WICk0{2Z##2Cd7{y3%qC{6EMY7g@L(i3J(*VABa}S=Usur#( zI4i`_BjKRiHq%tHW~Y{rqg6HWC|R^Hd=c(-WK163lqgw|x%wD<-M4we8a5=#qaZ|l z#4Oe^f5AL0QzM<3d+|&P42b*n(kI%cw>7MFuJn4v2FX0ZQHiZGy7@R zt$R*YzxGRa^;%u)Q?+O-_RbfqM&X_&|5PL^_j_rLw1DT{TY`G(OOlj;MfmK)$RSCB z-r7&Qy5X2t2>OZtUWSuYKR{nrf5-TK9pe|(d@K(#F}bAtWq;9rL-AZl3~ZG(hUSjG z6_KeGkn(yb^`45Er*g>Q9g_xK5ir$_K6?Cs|9~+BrG!4%>sM}9YCvn>#sJ?wP`RkGT(wk@ z`xOyVI|P`T!~5(~E0{~5Sco@9>aq}>2+jQFY4AP?<%Cq7l{b^Z)r{#3b=OEQQS0pd zPiy(W=B!{b(ehbTnwq`%7gD~GvcIZnJIojkFtl4}3Qw3a4>XYsnk!?!ES-%kOzfz( zb#sSFIxOBOxZVtUbz2f|CC-`|&zdpEy2s}y6#}1zLFl0X=oQvthAnZQ4h9H96DatlLnPrXZXwD3-lc4FQcq*MM5COrjK zN;w*~rKkFT^2th*y}=JRj-VMX;jObSJjOdE*P z$<$C{02Q&|sXQ?>S38qVzfDAP5n!VEx_O?)u_Mhm_qR}D2bI2pc^rm_YatDxao<#a z4<~xL#c${Z_gqG~kQM=d5O)X?*EJg|{+Kc72)Z;(hg0aiQ(ipXzN6sPYQ>c9>}(KBgWKCeGJjXyVR3=rf~t*W2ba zMpYoI3cv#LM`rY43bf9t!$mXG4?k{)_79;L7#PuB?rmW#HSy_SisdDo4VSsF^Eq=) z3I1CA23UPRmAtKF9ve7hFr;YfZIrw*e~8j%&Zeb?9=m;Lg!A0S7PaB0&K=-B-cB{xQ-J?D+uu05P6EKlcG`0CY%f zW7lO>OsSKrtsLjj->h0{FHmM&d&bwQ5VPnxUa`l#fL@|9RkNfEo2>=mbR$t;>k^XM z+jaj$I`F}e`KBlI`BS>teaolw{!*waK;rkBU*Zid$AA{q z-+;N^45T$jUoX$Y;VTW&{})vJ&PlUB!(mLbrd7EL9><>Qiz9TIv^mg%{z1p7v)cQ{ zm3{LpLWlHZZ`0%NsUCO{=8P#0Jig-{*sz zGL`!_HJdrjoF)F#1dtVx^o+g_KE3+@(y-0f#vdToPWvSxne?VKdKd032otPN*GNY3KhEzU)Y zSUX4--z_~A4FW%^+sdj(-3f(Tg~+$_?~Fo6*i?X=L25tUN1SrdYcZTP$^%KubPE%u z{G>%xIFg5A+fyGEF|n(xrO^o&KEGQg$WQSSMhw0W&LKm!2w=ND*$LPBDW^@ldwucM zEC4!C9(0zQklMu&Nyj-jT%rA6=2}2du@o72=O;VU^`f*m=5KVqy~2}K1pC)&ZT!wq z8yPXwGQ-S|{=o)*JuyK*=WAnr)3CU*R>d0q5zZ8dy>KD_%%IWlbCd2dWsl=jV}BM{=@mb%i3MdD-} z*W8NdYITOj1P_Z<;{W`0*9UNh_SAOMXjE{vTHv@ifDT=~f@TqtkYsV3^x|eE<{1=M zR>Zg?UIN#Y{-7($d52OIXlW~mV@FkbpnOymbCfzRG)(?dejYGNtL0JdyA_g(yl)CT za^?{9#&}lLAn)PP+HgN)^EX+KC3A-3e?u$SdsvMT#ZmCVQ$C~*BKl4f3?3jR)KHw_ ze$F59<6jE&B3EEW@vx<`h$9tkwFrA1*Ez)*ZJRGhHI)zkm2Xf~!%1$5QcII2zWiIf zb_+{)5YdDPO0XrDY%EyV2{|N?==b0zfpGW=YtFn`5(K*<95vHb)vH7YuI^+`@om+2wkfT6QWS!oESBG(OGs%3^>MbaS+EqjZk$DR z4b@@1u4wA5k?15T2qzmFX`WTwLMyqZzl>pCc>HVk=8|g?YgSCb3Lrp2VKK9o2 zbU*euiquF=*_O&o41iV>iMJeS%P|GEWh{%tONY8keuyRJGYbNHN5ZBQ8hUT9b6${_ zOb_nevq_ZE-ekD<2IVMfJ2?`3DsieLYCym9GU|ClEKYWiSxVkyg(Ra)?9>&)aquD_ zpt(yaBO21<;QNE8o{z!9%^Sf3N3A2qS*hrDx(4jg-HWrVNl#x{rl#&)_i#)4?vs73 zu2rfpwmFp~ao-gA`jnB7wWnOzV!!j9Yt;WEkFi_OO@b1OXaV9%?ocL50bd``s6i%X z!fYy?9VJSCG;As#T``AWmF+=kB!IV(f3*%g)2M_D;TZB|x{w~Xi1%{6+~+nIe38_c z>)5PG2Ake?lhW48GU6MKnd@3=m6^8vo&h>$8^{18cdfr%H;=$^bwdRbfza>JI^8`J z7_2TbzJVD~v|Tt62o_XYI@0S^jj?YXSW91}MsrCw4-SJl0qAVL_LQ_p@C^t=GuIS3 zvGN!}RO<7H538+FL%k&uXeZVjcck{KLTQDGe-6Ci*w?xk>5=evD#4Z!cCwx zJ={LP&DMrzn{xYeg8}aRDv7Zw_4fy~q+u1!ytpc^`;r7da#~({uaeB&IbOEuO(ADY zmRN-Gua<<%qsclx2F08}Cc8}a4TwIbKu*?yMjF(7?+=Li5CJL{^3>#Ra*~01QOLuG zQy(hM5OPf5L+4ctwJ$V4``%Q18;V@6E1ks9R^v%4GQq<@-9rc3GhgHvNis!k)h6ue z*<_(rMr6-?l1fh-rwu+sX3oJg8K6!1>s3fm{^DSXNNGc~6 z*-#pUs1`Y0NlGT>QxdB3m3gAuM+V#m= z_EwSw@XuyrrO#!fRA&nl#{b(1d1_sFa`cR};G>u!IAf5+DY^*C9~16_nz14;aT;kn zc2JceIPjm|9V-NNr961|Sv<7K{1CHMDnO1~%a_bq$=h40;x51SyW|PQ?t}QIL&FtrhrJLOBE4ID?cVPK z;ej%`#8b=fxOC=XVc$d?xxQMAKB(A8e4SjOjmBx*KRTp={uhc~{Cdoet@gLFV&9s# zddg$z7X(XWQ*E9^wI29;3_(aNaLEDZA$Xojmd;FT+_+-NDeDlTvGh*nzemt;&4w{) zW9y;BPv_0$)Lt20m<1a(S##}pEdR%9s$8#9PaC(h;??PmHA!Tlzk#uXX)+5pA#kM>C054#KL9 z%+ZV?FhLoro3@+kPmIB!il{@_W{tJ2kCna*SY-7e16$nU64G0ML|AxFB++68R zwsgH*h{e!;1ab?ODxeY!_w{i8W#gF7fyECLF7^jn8KRjxA{g^_clNA|JmTVt7>_Si zZv~(I_UQR7@ltn_lZ9K4`uw)2<@i49u;Z4F8B$4UDuWNU9Nn05BX>LJWKp%~qa`5l zb9>;7-V3&qkjIaxo`Z86pj9&^yraFBG_%I(jKS`ri?QuvYX%7rehU&Zn z!}YMdX|b1O(H>Vl#_*Er07?6pHU$iD)tzqRxwA#F>f6%dL^Mu3VE{w7K@ng6BgdB; z58uWS!b!M4K1P-!*t+bHOVbV^NUn$ZnG6=oM5M_1VjGSm>uWJ-$Nt;U%>lYRPD|j> z<{E~`_uJ<16*s)6523Et6(-)$Os8r=k^e1EcF_+3YWkWh3Pc{X ziL&0?+AaL0Q$pefMrDzx;%4%gh(>Pw642Nfr+LLOV+L<=930=#2WoNLaB;q}6p7R} z6)^*14I^CDqRA*kNQk)iow2d*(kQfAg77f3Z_yurdLT2fj~Q!hR^P@nhAYl{7KlNKSb~qbviqMPB3m1tEEU^oSZS6 zmKG9$%=SfJABj;`Qxq12@5-`2R|=z~sR&2 z*0%oTxp0dwgTo_Jw~u;{k;i=~!p{{!vqc6aNe}ojXnwES@#1Z3%;TJl#toPEgWQ)WXf3~z9q~2&? zRPFxdzG~U*Kz-@WX?Qgqu+?&{4T?nIN-e5qg3UVXBjtLX0eGj0UaZk+t?u*qb1|`; zCx>hB$1KLp<{w3xzpMI5(_{6*{asF+npOMj-LBeg#a5LFD6QdmW$IZ_^h2Y0W1~oU zMGi`}v)c|uN*QJqVD2Yakg4F72Kr}HU9)GSs`VClFz@$64earb+9=4AeCN)mH5BJ$ zqxe;gJE)p;C!JtR4WiE!4;2Bc#n+yj|135fq@4T08EdfH$JF*pwRfX`pFPhPzYzS# z6igbN^j?)zxmd#k%oCKII-h%TfKi zF&fRjSIH7y#QEM9Dj4j`l_JFt)s+Pdhl&NpTayf*!N`9yDTUm+BYvCK3JUO?-_NGo zVP{11xxtjGUX$MY3a%oRjB{fYKieB2VpL1 zfB7^(%0ddx1KY*B1?{C2-PF;O1OY~*O3tqT;PRlt*FFGmrMZ-janyj51ev4gO(DUQ z@Yl0Vjy^-&Nt%;z9KJ4_8&tPi83lX@=qq9f7_lO+C?_Ie0Q<74*?|hBmqk(-LZV$z z&~pD+7Uh+V<4m=K%Si||(V9_JL4{<~N<4NJFs>XROE=w%<={JQiYZJ6WxeVJY_8uY z;9nt|af&doocZ937UdoRxC_|VOA9mf^HohKDgoMm_T}kdk!8=N&|Xf{^MC2gXF`~r zkrJcdGAifC$7c!)%%<5j-65Hc4?bs`rSWn5|(%= zC3DJLG1o11f@O-{AZq2*@Qv_GUxg-QG0aWR5vwJBl*#g>wF|J$F3{nIaMpw(ua`&y8Ocql@ zt&ezZtRe8mNuE?6ua^m}ZLr{<^WR@_nug%3g%v>V3$s{=lRpM~L+gyfkE!Fow+ouc z5${M$RfPYd1{+sXVz7M0Rhly^LlDnqFcU>6fOZ3*GkLCbk=SfLwE9^qT0I1u&OZ<| zp^ZA}-Zx>uQfGp0q46Aq*iO%yFqE~q>k`-FSI%ok&|_n9*y~`u_{|6ur%S4yj`K-> zwn7_(%s2Ahtfxzj=E0RF$i$u~QLgX?*h#FH@tCA*-&f}cGidCAns%G|H-)uQejU!R zyuC2cT9Z#2ib7zA|5BbT0Vcx!>f%K4QgY4C6I9O>g{_J_KQW^1t^-X#WCOn4#yyEE zhA7qOuR4mNmF9OTzpd^Y*Umx$pfAr9mds~Et4RxKVfpOSX}}@?H**!+($o>wB?!{E z)rK)xB{hBMB?mAC!JwjU$)8|!9ZrKB7uOkgg_t5QS?VJ?=%)_4cV6s_p1{xms5DsH z^URJw1lk-@ixG;z@ld+xsOjs83nX-TRnuJWlTE06^I^U%d0^rbK-!aede#Wwxw9{p zr-mRD_c8-`QIpJ#BCOo4f?(EExY1N>yrgZYiYeu0JB=-H8NJj&{=SFSTQpgZtWt>qvvbkB7sq%3AR;-uo1lROL2EL56z#2Ok5J3`+pmi&=6w`2h z`>B|_$^}d(KA+mVZ7AQ|&x|1NH!V{)M>2pk4c8Va*sDNF^NYQ>B@AMs{3y?6wi|Gq z)(cHR?AL{j%Ama}`S)x{v7%DQ&PT7^Tt?$>gkLay%suuNeU)Qu{{f4H($@tst6r>4O2r?D-tVk|4jhrNMVNVqvbjT;xjH}ht_FGuN2{uU6Ihg*^gN52gW92sw<{(yTn%?S4Q^cKEcNcLMip;?+To z@lN^R5&y7cU!sdwsQ0M2DYM<)S{&x&o2!dVM7qZ|QMAW4@{$s+t4zM1cd_>^hoWuj z+8vXRh)me)F@JI_Gz7q$3nyuT!mT}2_r|l3ZmS@<33U8fZK0b{6*K2WrfELAWL)^| zn}8b!VZPxqQSw9x}bL^S<)H^yoitz z<9QgT$_D*+u-3eGW8lrZM~A{;{u>Qv%l2yFw=VxOofl&~KhlbRhE5%tt*aoyn?x+6CxDJ?0?y(TSo31tk-`FsoF@~UE`h*FcvG4Lkp45O9~+9s=cwM?M| zfukN(Ef*oNY%Z#7Psfwldy#ZcD`E1PCa=mSS=sktvES^XSM7cnZlyTqs7bOV3L*L4 zCoOXXyVe~1&NLQ-#hEVDt}659wF%5d!U(A39>uV@6Zx;6()`M*yenFsxxmlqhONl% znSu0W2Fu#VyG;JExOAW{oDv0R%8CTMV=th=iun|TWjUZV_Yi^jH~b-_QLOT{GDQZd zQkeJW#?)@AMX%%mpKtwWcab!$&2^C`4VT03r!W3R*e*_wI5NUOTE*qTvU)gpd~eU! zr*U$n?NTtAv>qUCRs^uk400EAp{RTMPWkn(Evfr!P-?cE8Er;Z16Cv;P^aNUn+);s zT)t%CdGVoBL^8f43p|cK&j=I1#UsJ9V#TQxs?gJ{ikkM|SwcGu?SbQP7|D3n(mDGk zOipBmAa<>35X4M*gGn?KH=A#n_p$8UoGl}iR0zo>KYqq5VoO7P9`>xxu$Pe66gKrmZBM5o_>dxhlcf{A)a zVRxYv5Np2+H}6is0#qIbFj9so>6Dv-ZqY(VRTLse_JFn$OpF@>U%F~M=AfZ1`xA}) z0$U-tKa!m1JXv6G;N1uLA%--o4DryV0tK4ny=~2aHbdn?ru|7X=D84Ua=2@95WWNq=Nxg^MY6j>-M__yH)lBpF+dVe~pq?}?L^tM-0V-=^ky8-*{eDk6_LPjYLU+&01fZjjy?HA{C{mUJm>D}E5o8A_Z5`ZI2g#u?4oNd-zNt1xq z$2*vxzhA+31^?Ec;V9z+u{aL>gp}(=i7#N<7cdmZJqqpWrD`^81-)+h)=&o;(#x7D z@XpMyz!U#@?-he+?HCGsG`;$wVAGolSK6^;n#%w^(}!|&x_-mu9c>)1yl$_q3nUq}=$_N@L zxHDJ!1qb1V!38mxRniNvp+Obki2Xmkyt}ntPvr6wX%pRs7M?hhi!N1}>tHm#MoPGy z<11t;G4_*!q*b6cIDy8l`6GNw@PTLy4jIHW$FX5zAtd~uQmWibAYr9p{&a#bGsg|# zzZZUw>4dmzNNsPZx16=WPj<{hH<_~Vr{TJ;W=Im%BNn47(2jM@>tBQzU5l)Z(3AGQ|K zt@v_fm>cAQBeDqvFV43)CeX*<5F@v1VPPPnpmA~oA;9BPS1NEwAFOEzI)&+-wSuETz=fRt&W;^D3y1<3c0f#%Md8Y4oZWL32WR zNY2h@Px6otP=CWs}TzIR)54#Wy)!2TZbe5V^tZUv+N(cDd6Vv zi^kyg`98O!VNzHA_+VM=eSc!e|Coxt`<`u52iGB0wr}l|>P#nCQWLpESc7k>s^rqLMC0CBJBq zWpUY(HQH+-s3Y_xIx9@-l5R#^B!_WSPNh3jUlsi}slUL}2M*k0jG}}^L4}4YK4Y?|i|mqGg9~ls z1$_h^8b!I_nV4;C<*zQ&fdu>)wnUn~AUKMYdYnvdjX_&2;A7Qwv>v~GhHZmzGtTxR zeT}W-@su%s4~U z!UXfqlIth7Oz|AP2HYUd@S3wzzbRa-Ed<^GHRhaOA{s*3BicPZcq<~H^j3%;5G-8u zvaRr2W+xmT+{_>f?{?1Oq4xXYbJ3W?hF}j28(H96*xbV^h>?nUHSDwA;U!u*VAHMF zYr}>|L=rcih#4pXNipuzmWJj}4IKI^t1@*yC!b}p@{ zUq~L4%y-Q6p4FsCjD~By)=TAodp3h*yA`{X-hu|+w%;b%Zbdb!xQN#9bN5MPy!DMt zd+#i({@o_0dpud3DvSex_g@)lg`~(({RD#wlZ>vpwB;W;ev$@vh?51CcpQ~aa0)@dtd9tHJqP*j1N?lH8eDU`C;0t z@})nf-3q_C$43X;$lh>Zw+%fDTVHFY<5hm}#0)d1?pX_pGuzz191Lq9(4bY0b_|Qu zj-WJM8lqbUah9Rw%YA{R2Y(Hvar8be;dDp<8FoaA3hjEOE;%#^^NgQdss2X3QY`Ys zdT90|#C>KGm92aHLZD|Jm)sXOtD`bHJjY9PZFRKH1N62|{EaipxNU@P7^u>?my@uY zd1>JdxkXsO!K|Yo=}1~u5710>8?6j~$+y`>R*k*B6lRZ(@l29Q_1|I0W@=%(WMf!L zWQ`>2OEPDA5Qw`A7~Ma9X2u}4E{}Vj)~?g(3RdmybFF`Z?_KepI-a{YHGb#z&cIePEQe#}suq=%p8zsK zVW38?QiXsnArMPcHHK+so|P4K6I84O%7?iKfN7pr8$WlCU8v}*T>cXmb}glnzQt``tFUTO z8OFEuEH&lpqMKDe!)NAj__5?&l9By)`t3|cpp<9L1i0Ces#=|}GN+I#_FXI`TZO#N z>4@J(Ed~3c%(;?Os1hc4z5=+yJ9h6UD>w3VTvEE4nYUOCOcOpxn+08S3@RJDvQ2$s=UR=!_Wi(C;?wu9M6G@&o4UiyWfYfh!^iNNYIB@F znAP*?Y&e&=XVm^%^V$tDQtvC?vr)=+u=$6kw;wR(+$?~6@&M;av1hTf z#PtA)zSxWS-!}Rmo#z_D-a{}L5KtQw5YRvD3&_^P%8|jv*@VHw!P$(##p_=aZC2Ze zU0_7=yU~CnbW*Wu=W{|`TkQO2i-STz`vGRPuNcC ziKa-pI~W1=mc3aiS?r?paF&`=Z%t=;;!x&TK8tKfakES1Sy*)J|M6tR`sl4&+ip7E z7@iyWMCS8tBT*TjxIDE-lv@XkRy8OB|1>ap5x#&Z8Y8(X?(}x@xBP z%#~wej9;zdo|e_pQ?y`9&#+x+Zhz*XQL(s!ug+{~5Ly4#nqTttQsSb@7NV8OYZ5?Y zVqQ%?S{d!qk!QD|n+XEjI)+P+&1trFsp+%57_!HC5k!5Zf91u8^CdJTyp@C655wuP zEEGE-d!^K<<^sP^ujzImTf;~6*&b7`3KC}|Z>6seZCa z2gSB2LdPMs)f(08qYw92wwM?_o8qq!E!2e>u3sW5Q+^{27C5*SbByu(JDVb-fTv)e z@t+;^h?xmZN-@UqH)ryp;5#5x$S6@5Hqv$|i!)Jr`cT(Y@}_WEo%x)q=8a&gjhE1-3q+`myj7JQ9Dx67?^Ps^MNeU0KOf> zs7Z0(1V&)h3S}|~R?_SB2F9^^fED8*hafpgdPbEvi51xuSq#-ck8EFo8SR{Hinw@{ zM$I^!RI0cA7kElwI(o6Ra|{sVaYXomYx=0=U3keH84PdH z1iai|mB247!T@70DO^V`Rg?)vE^qIrSrm%a!Fgfb$-@xM;6K&KpnB3|_wzxv2bxRC?TvZaHcY3U03?sI{p@T%@k~NXk5P9 z>HYqQ51wGMUp9Mt5fR-rn9@K)(-KRn`L4N3?HRj$+|JmHt@`cp>AK0{rtglG2|GZi$7!&Q;{`8Ld% z-C47w00S5r4T#bhyE9njAAbQ`akW79Q_>h0=ykdBqt>wo;9d4)L=t#T8z-w`y>d+yRO7g zK~NAQc4E%-aDoY7e_|m8K8XMU3QOa{bH`j-I{ql+Ph3Jwto$};rF(WPZk5Q@zQNxX zXoC;ztKlp2@Rjjo>J}wHSaq$+K-@7K-im}Q=j)9a>R5U|Y~c98y}dcv#h(UkcU-6N zqkS{w#D%{32KjH%`VUgC&S=^qzzzg7KKH*BEmsrAf1-4}3vV2rJO3QvLl_r zs=vV)n}c@nRw%}$d|?w7?9bd<);AejZVNz1Yw1x%2~C|XD&t3xdx{$!(c*=3maNz@ zIlSIY#rWk0a!Fdz2BBWb7!O61iL`1GTH42Jve_qE=`ni~tP^TKxc{smGK&;76=L#r zlZ(K8(`WLxUDIP_fD{!&?#a~$3SCkrF&jPcMU*Bl%8a?Xm6Y;jO0|Fm%lmnylZKoz zg!b8%azxFFBAE?hC(Q6Msii3}{+WRt=xT5FiGCyr9y0|*=8Kmky4KT{d$-Wu+5DlT z-}6YUaPGn)JDbLOIDp}W36d@oV0cG9`JxxTg= z5ZEd2v*VSD#92~^Vy60QR@Fd-mLrlBaA}w|c*eOc1hus$iyRDs6ZsH#XDT5C@%00e zC)k?wkMb0HtBt|5uWdTvi>orOmMH#)hhneqx@f1oT}E3v1INudLq5j(i)9SjGI_-M zU(YELEug)>G+~ZN$We+A1s818a)&J%G0G+t6|Z28n*il|^x*-v2X|E@0be3l^wdh8 zB{7BlgRN&qKr}H=Gc|6C>w$#znKCNP5)fusq;+W!fXd39BgT0w+WkdMJewzi5(M?= z(ttbiL#~^AeME}GKo`csTlE44K^o+1YG)Wgnt`5r%c`upb_L;fO~uGkR62+I7N%s- zUq_tAGpMaM)QdE^?!-NI4+3)x<(&gOW^W$MBZWvjj2KdWsoBro9} zSOLwf6f2uZ+-aFmS2%g-zd%sdw^q6LaV@6M_wo?c=<#*1UGMz{YWl4D;{1AiDg1S& zumx-?;9J&FI&%9%pnCK15VdWXN7(rD{8@ykhD6xgewu^u0T7aSQizkMkNYUCdaLtyUsrdS-Uej?TA^1JAkWCj?uU$dS{p(H z!m2Y#6sg_rITLyZ2NKd;9oQ4Ylw!uxe~b%NMso_d)`iRdu2|TbVi#_$y*dFm80RTRD@Bhb^(>U)(Wr12kPv<%@uJ#)2>0U&!GN zq}qI#p>eZz9BHObPVl_X2$wmXL9KN*ZeH-T)v>4Tfc)T=60&i_^o~>~nTG?B(W^p!`(;L=EsM_!ERoC)>cKC4(y%&X|4?F$ zRj$TJC@Zgsg$7g@m~d!X4)0Zp7yQ=foHu8sl-@cqs)@ZFm!l}waVxBfnp$Jxg8P+_ z4_5YXv_YPsZ2m1Qu`CQgus=?II<|wN(8Vwp87goEFlPv*;sZPS1Y@=-r$vvD!`lu3 zY)KWcu8-YcP#}lbU!a+}-kByG9l3X884P(j)q$hj14nKg@F2B~t&U!~AY~v!Ex1rl zUJypxAvdCZU7z^OJQESkq^@wBQ_SS>`8@-TeVg<$N*$m}Qh&96Sao%Fc6JCOnr9}$ zsJyz+2z~>R3Ki?aeypfhr+(j8ze}+2+dXMkk8Zs?!NKk=o=nU+cmp1;rGE5g3QUwG zM*d<}54~2vW3`@6JVzlqbz#LUppb`WCKeryXm!E>gUxoLhR#*cAi7Wwrz;IXh#R5{ zCqK7*`2D;VwN_|lic1w9Y*$_%jVY=Wv>(x>{RN+#&ZG>>xkt=`7+qod%>4O|J8ysA zz^L1p8~YVr2#JTUCChb&7z$9~FuNT%vjh^xUm!i&Ki#S?dNhpJ7hd9kidNQtQjoam z{MxfbMEOkildZ2-$w>NhkN#WRwYhrjVdePyK zgB0BTm-)Q&4FyRFuoi^o>zqYrr?q~Q2U6hCg5MVN?p;3TqDkXtx;y}+JX@}`XU7M|q#;D_Gjsi->?_uL zU1`T{u`%{tO5&^Oo!}9N%Mi-5w;-S`Kwfj&#Vsirya|^bObkZx#x_WR3_m~}>3f@> z^$m~p_1_+@uWhxAIuXDGmw>kvw^ey6SNJnw02f1!~A`feuzYHTxQN_Wc$mU!76t8*(W+z+uHG0{h6N5WS z;%CFOFc+y1c{U*Pn0)m|cw$U*77zo37bq-k!2YlSVks7(rUcLLQG&%{KL|&&^Q1s5 zfofrt<}d}r(fV5wZaj7dQQ+Ev3RKG{hrS!PMAzG&kI@|?iM?g3`be;C>w z^#t@aR%PotUYQdUmhb`PTd#95JV?}#Y^F!RIO-n_+MoTPLlO`hBGS=UD3g`r zEl|^k#U^kg4;4!r5R78tHpAvA_0z#Bd>9Mjv2!bY5%@HhSUC`Dg#%n!-DDTYs@%r< zi_vFJARqt}Y%0+Nbs3NhP-VA*Y>^_|!Xu368oZ!YUj=iNk`VCF7!o90fMpYrAPf~; zw(;K1HK87;Co4n}f|02C0Bc$3*TE9@kfv~9c0n^aXcXcM=)%I{2}W0f zY?LMTfS_clnsSEGEBd8yAy-RqbM$TSd^836mDS?7TS&2$V@Y?G5ZB|%G14E1lU#F#R6J9 zI+fifPiA3pQlj3vTLYeYo5(+k`&WI>u=<_30vfU0o8rY3qZokJE%UYB*>)@>UoEU% z0dEA@m$3*?G6H|xEfD12gUZieXZ4}^WRq6v>u;o!?rtaYiwI}*oS9CO<5*_%@b?_r zS1pr@bw%NZM|4);_5I@YRo4i;EiATtgiR%lryW2>9KLKFuiN%C84Z%E`?;DJ!{W@s zL3N>oEcj(QEeG?83dWQPF$tl?<}QZO^}7@A8@O~8=EK9e7`#aiM(nF(YtCU;NMwDx z=Yb${BwwoT$wZt#@2S7%$xV`JCmqPK$u&ibaBIR87pNquT0YcawP_zN(%AjNvP6P> z?w;{3{X*+%8?`btGJeIT_n~;?_!U{%vhk5)E2l~!oh5-6gnYXM%E(#kJ6-_n+ods| zl@&j$96c@ziEaHAS${Xt(#l|pHNnR?KDTcFp<1wP0Y-UWKoyIZ z(t7oOEp3w%q;otQ1H+XF;AgoA)az=djI2X%Y0G4$4N89ly7P=RCXqR?)w1mNEV6IV z(cLi0mhhT*+Do!AU-c@9(DEwylUisNxi1J>9|jbkT8S1+fIW92*c$$bTLjfRl6~eZ zPF9XY>neqOgGDH@Cu-R&wRe&;$1D8HPP{*532#Z5O)RC=(Rhv>s1Y}evTS+@$t#BK zv!9M_6}B>&B|fn~KdWQDVC0cP3n*>?GA@auAlBV|-7K@5FSu#dJnF9XGd?{lMT7Q^x<>58UK# zPqDFN`wM@OnA(^u&gr|g0*9v03Y?w9-qfWiy1WdU4ir-!etP?fckVevR7mF*3Ty<* z8!M%4h(<|?Qu~VgGkR~lFHSO~au4bmJvb7M4V{s1mub6bO7M3i*<`doI#a@q0W!zD z(4B1Sr-mYG`B(1XWZKvHZ9ku3Q&x&PeUBB2T9Rx&H}pc6yK=3ul|I2`GDjqqwT~Mf zsSa*VAjX6)JHI;2ytcS>_^2*`b}zvT4qO0R3}Wb&_Z^7_Ol)XP4agf6vy6(U@hYt! z6ksh(?*LF-kZ@Fd`u%Dd4neo1U7{IDogtUYW)!TCh-XVV`pEru16=({g(k~{V!=4Im<+IKx0!vKW0$K9* zjTX1>igzu&R{tB%+YT6LQB0dm5fFy9jzHzmM7tNp(FChtbd*E1VN{D^2O0I#AgbDj zwZ(UXiDxRDFXS3k-cl$G$`i-$kgk+BC2=MHd+7MbC<*F*?G@%`q$JcM$a{->%au2lh{Ba$ zeoY=%8qveaXO##;O39v$%dr8BCX5GRaUi!r7VD>`8&OXr*$(V5vCMBZeSfug+8nh@ zDduy|&DfHd4KJtRk1p1&Jd-;&1xLvK;hLDr=ihJ7nrfktL2}Q{QVQiwbmi>KhvWnx zwF#f{42ucYBJPQ&pEFV@lO^Y=D(M0H%;NXFB73E=nlg8aM4f`8p)cvVLW0ppgW2(< znxx&f9eJ6qFYmjB)RoJFFDQrzjTILueM`MNgeFy^N06g^hDCa5*1OUae9x;^a-Y#M zZ;pBX>8GBM(@vVlqfZp|0|U0J#-bF zp5LukgvcQ56rqhHEKnKfi77i(PtdSUc#v?7xJ;ng`{#WT(X3g*G6)u_t2#mvqqIhYqI^oied_2h)e1cFh?IJSg-20-jmBXtEb~N5a1yh~ zHQ?M$26C(&7~|`V=}(;gl2Bw*&^BuI57<0et3(|#9tPW{v8mD;(7rk{*dA(C^&+0#mxFc zr;QGq?qhbwByu|+!8+4IuIX6b>CoEKeR(mg_!x9i&{QlFS9hknyzp4E0sV2(HY`MD zYaXnVyy{pPp-%(I_G(sv(yw^Mo8`kbgU&1;XjvzH;Q~?0a&dMZe!Rb7jOkg}o)MGsaBB{o%a1C-j zRZ)EjQO0(khM1+bsWpYjT`VqcQ2Js2oEIEMw7Ry#{dw zJwrz}P;cY$2Ul&u@gnBX>?T_^yP2a?oFBEN1>Ffzk|4o!z_f;+E!25%X+Ay%_Bj2) z5U|d4 zNd^}pBc&n_&{o-)pIPYN#@bY`S<`IE>YPH^#IAQ{@6pW8ZV}7*LKGO@&mEGhDs~U5 zg7`rVc#iIGIKs#ca7_}X7K2*g0$t*if+Vv0FuPfGu5@Q8Uw))9DzsxAZq1iqy+zbS z!-C{2lK(x3aBfO=C@mg6suAZOj;g+{RTdF(uKz2cNPGvd4_m!met6ILg3wwF_ z%H4!%*FYRAJ=Y9jWUdu@x`BBpMRlFsWyw#Gk3w3Bg60lYqJH7^9#S4ZW-O>+Ys_a; zk9=R*j;OmE>6ONFd!_rzy#J(GD-TT+aL#R!)v zu?jIO^ROLR;K6Pa~tr>TmyO4E5rqm3isq zkJfS=I8i|j`3q`{>zK5T*Q8-hWtWFwAF3K~20L6Jij`wu0 zUvtuPew!nU3jL;r7g8mg4$6tU(I91v|aUwn@$|@yvq8PV_nL zl?|TXkPNwE z#C*8Qq*x(*h3;HRri_^}l8$j8AlZI*YGitv6eeF%s7qkwlc_YbbE$iD)H@&I=}KFG zmE{ben6FNHhS1GdOgF57(K}ipYj{5a{CbzswGN}7x7Jwg>a`l%172&P6M-7C)@W=@ ztUMwk%sM%H9l$L{3vJ(nJ_*^h97e7*Uw>(r#sjiDN$b@{pm|Xfo4i*mYe*a0b`-yc z658a&ff6nk6W}{hZgdoy94&&pyZZ=+5zehOlktY$MLymA;{`Fzb8R6+bl)_?KZ&h)Rt8lMN;blhg z6Jgm4E=Y4QbdO&5e%tZ^Xy(=kxR4(+|Ge#=wp#j1ih82<+q%ZQDB8}l z1wBT?gpdI}1q^jPM**j=8hb%kWK-DB?It{f1DT+|!;WfZ$37gI-{<;YOjktA}@E;juJW^TSha7>sszrY5~#?2v#MTnUK=(~$(Gd8O5)m`PD<1M+Q(j^A~U^WX-*7%g_UCc6Hkmp3<$qUrVV1h7~ z5KV1y)3uP-*tk(|;%%4p)5Rh!jcZJ6C=_l z!B2Yp9IF^*z{`4J@9^pA>E%8*xyBparzPaquMF6R*{tx zxV5yS41hrf#kgVfC`ZeOLF>tPe1MbMWB2$I@=Q{?3mMlxGbdvJ3G&IERY#ZS5QVBY8oq&WU~kS& zj@{FLRAT{qCS|ju_G)95Fc*C$@YUL?cmj5CNF}XhzO{EW;|b4oJm%<_UIYx-_Kx(r z#uY0K=e_+YmulFZRyU`% zM^ey)6#({Ct;P^d+bakVY*S?|tQv%`Gni2{Acr-(P*c}pY57gA4B&caJYD5P->$KE zBrNy$9*7YJKv;hsIyaYP*shRu&hK)AVC_n&qZLYx0A}@=SNs$Fb6!&kz6M9OQia;3 zw8jdy_hMTXOI=2Z)ORU}0?>L6x1Aa69_l739oJfN()A4{eC^?_MJ~t7D@EyF6>_V% z{>#t?6t1g2#+4M7Ya`i%V_{wV3r>bRj=PK{$!O}($GyA{ggLZ3B8VUCZzkk2h6@XfdyWMGT(O;HSI`-LuI)fM9V)h4;db!oTe%uBc*Tz<}BT@6P*1CYNVk(WY_M>f2pb=Qf)j-L^v*Gy+{vC^&W*%ip(y0nScT z-KZq|#*yGNRF%*=`RwUW*yRKjOKSn7fvkZY;d%=`vlQmePJ;^ln0)e;H zFY!Yi7z_@reH^rH4COoo9sJcR41aKp`5rL75-^?em3c^NnLNXXu0ebSR0qp3k)vVeC_3ZaUj&9m?HlS3^*{kSZYmXLqoCmVFmf1DAVoEG> z8Kxb3z0wder8D#qT_od$fXui*$Way*u3pi{wyf*%Ei9`V)TCoBK3NAmt=*;8#OmpH zHqwQxbhxhm>tR9knTP9qUk!A@i$VrwXA%b+TqB2%!%C1mFZvv=FmlVjFxT~+#~Ap^ zzX|2Szx0{!BYo|IE~th^MbDLy4}VjPR!k7^J~jC@LMa_`l}xH1BRK0@7CKa)d8t8r zRZ#zv@{V&6ejGu*bM?LJUgg$1$RPZp7yeIfc#93AZfgSnf|H1BB4AFFmD!j))ZjuU)`csjxP?&r59y;J|P|qX9rc%rZaP1tmOwEU{?ir$m=@ zX@OU<^YTDX)-qlcHqbN>)VKjLGrB4Xl1T0>vh^bjqG={-<;Z!})<{r0fQe~ZMsRqM z!tgvA!e_CL+VLfzwb30(DoxlHDi&m^DaFP1Y<7aUcdO0#GN5eG)*)Z ztvOJ7j4L!DT0!UQ;(|{#tU`tmsoFGyh|}tYyC9mQ38Mo7Tl_W7vkobFx+aTvyA9tX zi#amN6^8dRe~-*H5EMwXwKJ#r=_JZ0;UYGVaivd+x#vIZAv{jO@_guRbHaQ$MW~Ic zUDxsLy+3lln;H{NTtmTMP*CM;+Nx=~;`&<$LAoVeB-S(>fDxamjEKrwld$ERV*8nZ z=@Fzh=?#4OoK)^*n(F0BdaUg=SQKb0oMQM_vR!=W>#D1Xda?>+^DFZjFp<>xSSrBZ zGD^cmzu{TK+~GFAc`!iZ-Im(u?}0@SD_X1HhP9=u9qFji5FInu@@iH)O5318>R2KA zQZE|9Xi8-+3XdF9Hbq;y$|iUEikGRFq*i3MeG*oqw%C#Z6ALk(+Zd~ndhtR%#n&SE z_s6#S#V@>A`c@qN(c|`j3KuBx8`)K3TqP_`)(R+m*$HWK9T&8-kE-PU!y{joCxD?2>{25GVv$`HToFO=PMBEj~wz-R;=7O$5a{$|wFI9xGbj$otT zFk!~}Ec71pMLn{YWfq-zI-qN8r%gi~U>b`;pi>MR&k{4v-byFXg zIoVkT!(aRSz=y@3z@jk%es7YzcJ&XhAwh#C2n|fCJ38Y+J3570!Z?4V*KO~cMyvXb zJkQ~&ZGC~RZ#GFmH?YIt&E;_P{z3?=;tP+)f=CVXj@GYS{S?=RX14q>$~fu#W<1vqiwPaPW2w`tO8QM+Y#O6G_in6#~4 z=(4i0w*)~Q8J~iB!aCu}+4~VaV)d?TcOXsr*nM;|v*F{Yx#e>F!5?GP%~mi^g?sGd zF~Rmyc%{kqZfiQW*LA_LO|eaaVq@Ez4+jD?PxRmm43DdC@3d>jX3N~=y5Bh1-W!(M z;al)9H2yskE17myeA!59C5!LKroA`X`$_BD;Ebzdv-j(=H;4XoHT3W5vR#hbs^@b_ z6+?%^n`TS1!IQrm~L8G9gB2pbOAKL$#2rD54iRA*p6klbvG z)E=WcisYDG0`crY&g3;bV+td^)e8I$pFK|UY#|(iSyR)!^$jG^0%t2Bp~+A5LJ_)IIFNg< z#h~hLW0vmJAUV|Xv>V-|P*|H|Xk<1Y6}BK$Kiw1hsfIxK|la>Sn@Ia5$(=6RuH*F%N$rkP-*^s?7Dmz zDYSsCaNs-X%!tR2d75D<=%-62${;oEjs<6}v_~l~*4I z$_dg&=Yi%q!}Vu&wUSjD^E3fT51cZCL#*m)&}M20swDad+dJCE&VF^Z!&f?FK(_v) z`oXiBL=*+@GaX}bO-;o9Eshw(LFIn!Hgy% zXwJo#JAB})jcXk~4!7!@By4?gl4$mGFv2a6ZH}tnlJ}$Bf)}OysujlF?Ef+QQcZ2Ea+54*MSrr0-c{|4A zD&|eTMM)w+xU`W)nRNGv|GlBEfra#p8My$li7(MNprg)QvKLKoRSO;8NNnSV75Lf) zAIuiEr=q`9CP9<(V5UaBFj40b$b|~+^koA79Z zy*Fw>6PQ(d5kO_dR>aJvm8?Dqkl^}#h*ylkc8E8035W8=R|PGG>? zEVqq|!F_mlQio9|MClKN(;psKzOK^JQqK~~T*K$^n}%^aG`%I6Z|JqIGsSV)ai!eG zt{Y_Zj=g@edjetI3jxP=OkkWiYI{ZoenZZJmlF7;MbQ$Lfbf+f%+;l8VVD;vMbq-_ z_zc;Ccm)4|aF*>K{0`U5u!>&H;k%=qnrvi^OGwV*EzP=*K9J$!n5TLIA=wSx9 z>avYJUen=ZTGLyb4EBx{Z-?j-?ZfZ|Ci>IWxpvdrNvk7*4|*_F5Y>=sgIIfpVTPu67)^I#Z_0xst~!y^iPR$|=*=QmDX9e|l^Sw)3^FcjpeqCr5)Sf zkQg-tpkG=Q5=6}A(jaRW2fhqiYq;1fgoV{@sawBbk?S}EczN?6bB&SoxzhvFUeK$$ znumVD*tc!X!+3(#SG7#VdtDx}Y;!;(2s(luK(Z))v%ttMgQxo#*(G%J(ITO3+U>ag z))Q48cQB>Q+T1veLY86gJu!hh4`Ch!<}zLd+8p_qL+uDK3M3)Xc6J(P5m}!w*w5NK zRjVh_rmPI}=XGWdC6EwCMfIcO(@i%zQWIKXy2OBKxhE9&oDBbYp8h(lYsM;MUpe0R zk1?_zv&is@DCISx-3mdo22)L_ZFGZL6YJD*>N@fX6uy3 z>n5tL!78axX+!t~Q~7J%?>6>(#q;yBWygfvxUIDOK)xpsKI05uP5~ zKq!(=eu=Y~W2mi(61XlzgR-%VEi@bTSeG0QX*vB0p&0(fU<~&Q#}Hf>db+#2TX(eX z(l!ccP<-61qPYmPy+?`Fcnr;fJKWG0vwaEE(GYd0DR`V)XVu=;NGnn6$|%|PkJzoUv)1}v`t%3#WEIP z2q!H+&Kx-85iWo#p4`f9^yqXbMWvI~MroT{?-h=8^>@x#$P3bt$84^}l?dBzcohRD zpndy$F{204@TE@k?7lp9Cjk$|oF(tSFP2yft6&+t2M9)LdS``Sx5a<$i(XzsG0|~sC4L(j(9%!S`fvV|gIk1G%hCGgueAt~SMrC;SCXMUt=OY3Bxp?OFfRY{2mt-5*9b!*WG?ApPrj!(iSbrY4i&255H}khS{|yyL+M{MJT86&B^W16 zsvjqli{pf!_ZcTFzxg=nH4#6)#yCZ43Z0*Ej8rpN*?7Fffyu%^vYU+yz^WM*OupBs zR8Zr;)ffgN26dYUOm1`BXSksF=A)%wpoWidun?9REm%i4A20x*n}KT8AirJ!T!}7x zk7*UW;3gF~=YCVmVk!f8Kb(UBWfbbiRPu3H`P+YLb+fO>@Rv=Fb^e8^yNE%7ny@kk zAjl$(BA3HQo7(~2+k2=zLGrxt9(B&5oK#ERM%bGAZ909#C)SDxm;{JGv7>{5!EI3e zu$WvN6#V3)Xxr9(<{nmWnsaNy_hD5S9{l){pnX_xZM;6LDXrOIcy9aZ3W0O*6F06E z6p~Fli5Il909(g2&h;%z8l=BKa)pNtWppwtVp7v^4Ku+w= z^WtR@&!&0<?Kz$GTsczV@&J{5p(b#q^Anrg)&?CHE;P<{Og0R9jJP&apxC46$j%< zraC#DSoN5kHSB35XhMG7N9dUBo4rHl$FL3JW`}RlQ9OmlXJRWC`eqG5w;dBNB0*y+ z5368`ou4_y~t4c9E@Lj<|ln zhdY3vyi4?TQM$goEssbRp4;F(0~q|vC=fIcfepeKRD&377HnWpW{VXOS_@^PJ$zb# zV#l~bzNVAzDF-~zf!U@BOm}Fb-pXC=jLS3a!=`-Qpf2Dh0bmD$>AoGcvv<9VLH~C> zw;pXoGkT);uY6%osO44SZhWpNCFY_W3OF0FHqoy+M3|#5t##8o?}`lR7tlPBscyf4 z)oguHG`>I)IXxS$QA7ywswVPCqtQ_fI*LRgwk7pDQB9Zpc!!b56&WBLMkj$)m;|av zqYfYRB+i=;U!wBZ%(WMhoC1G;?py#`@miC`tJ-eubyMa!ac`c%f3rWk>40x`It{UD_s1f3o) zXL6)rjNmrVjecYb6)?(v3r0fO49e=f6t_2Y_KSHbWKEfmkzTf(t)i?u<0Ss1fDp-ys z{xopj$L3xVjy-Lqbs?BF#FMw+tO7Hvg9D<2?iI@gsqcMTn9t$$s%}W{hMY8`!E^{+ zc`288d*jCmw#d;NiIel0)g-=JUXMt!z`uDbhS^CSU|~~)XIWD8_r)LWtdhG6fB(C( zw|e{}h;n4p?7E*PXfB}p<2P_QNlO<(>KeG*Jkc4PYhig9Aag`TwmWxOg*;i8rI!nA zt>u?fj~EvAbA@sVKQw{|tVFIV{CIoy-{bWl{*Das%`@}vApO;+wTgVKILZq;g3;H& z^)D^6o1(@2+=yJEY8Yh#*852On-i!R;Z`yas< z6aB5y`chJ$I;+6DNRMzJZ}c-L6>w|DvfaTT z#qITj{#Ez}{&qiov-{nH?`7Z{m|=YLp;*p43U(rkm2!p)RzwZf`&x71^H$wLLMzl} z>qw#e^^UfF2&!@U;Bs}#Tlon{|YWN~I23dbCF^rO+0c zyB1HHJ4Z#?b(+44?cD72^cC&3p6gIX**8C`AO=6I2LWYPfq?f`)`EaCt3aF&-mC=y zWmbT|P3>9`P-Yc~%Zt}*K|q;RAbLl=wIHC(DiBBSFV=#9G6G^nxrXVfFX-z-fRrQC zkV&SA$s0M9V62M`vua4}t2it!3RdgB!j-GWCQs0=?>`vY!Ny{E)7wv0#?AB_qi}$~ zu%8fG-tQ6nud!xx@IhlVt(S#jn_$i$FV9tkpwoplw68kHhi5(iACj*(B=+{m1~cMb zcdq_VdMs%rp$=WARTSKd6GM-U7qDS>_5#*-_l&tlEO+Y#-`5ag#;oWyz48&Qdp@DH z3aD6q@A-t*I-r)-*F2&1`71Df1779r7e+*MY(IOjyfy`osPTEn?RZQY<^y_OjRBI*yXKb!^vCl5UTu(h_B}kw}%4?6__E+dBt>43qRGfd?&k z63=FnbQoi+?HvRH|2^5*c!IrxQP1v*^y+#ZwTA8J`O~M*w&Bk=QSUYxrR8;WoR#x* zzL+O4E+{;OrlDuOVVY#agrFTxCJ{j>qXI@)+$1ACJg-mC=x`FJQznb(dDszX(87rB2#j;I7$*OszG$)=<-^4^ z$>xM@hKKc@zkF7w1apVIjxH0V z2k2KGCD|x1N~C-QJyAeHFd@9$t2%!}tBSXBW|*{&d)b*N+}W zho`ULzwe{&Z_h8fyCwsiSI4JsI?>Db{pj?p zADtY(JMIJU{#gg1>zYyx;JrpT@46R9Z{f+|%j1*d{`b`C>*M|@w)h&FJdDl{FZ#zv z?@tadqVx9`=V!fcghP0B+&elsJbu@GwF4c1Mx*YB?r9%k_TCt1{~KI-=NqLZ^;4@Wm{+>+IiTa1 zyJ66G^j2Zt5IC+6+~y+qcNQ0Oy#gn<$LF{=J%NA9c|822YaG(j+>H)L@icn1$UY^o z%D;`_*DuR-Snia`0Tkn{<43SFP8Pr>Hz&90>`6YG?_6)<<8gHI@%Vgzd*74Cz)rG9 zu*etb1U9xYu6SffX0A(<|{!}iiDgjb)AmQ`O2NoB@>nFgQs6!i1w1jXI1BbnwBuYY< z$9D)79>KiaVMSY_fa<1& z9h?aq3vg55>%fPpB*22E;O}0=%j;1QJ%%svum3t#Z&T;x;>Gj996IxtEbl}>i&-wO zehzQOllZEXN6&sbpoS(%wzuIF1cB#fK&AbLXP1j{^qAg{;(3hqq{Fk}W%Sq}0Dtb$ zM7+)m*jGld<-i76#DsAhAxTj{qqgYf1BE|r)0LY%9oceO!_u&9%LJB1P4TcZxa%hw z4aTpe-l@7_)j5a(w{bc*mBSVZHI@Jjas?13l@EyycAlOQCLcv~~fU&8zVtDHq@R!89-**O>n^w*YBMTF1oOb z1!cL=00Bk&(dqk>lNIm=adu}){s^Q(fd1sMX#htU@tOxlLX03{GRD7q8}RGAd+~bE z>w}zxKXFppQr^M8NmZ%PKDd zltz@i)wN@4oSc?TCWVil_4N2(Fj zx@rc!;mDw;^Cd%LdOCXBJ^FR;{ks8uL3xZv`~f-g9WkombuuIoM#f|bHiKE2EJisH z40c&}uq=ku{Z`w4Og+}m)i`0^K|t@HVbjixMGy9)r#!m#D1>Q4NFf?666B)eIGwihUeIPKuUyP9Gg1Mjqh{uz>q{oyWeo4~8#Wd= z8;{ZSc|Ry~Hk+h#eqE|vi5egxL6Hfn0DA@y`PkdYnRFB*j`raVa+FsWC*4ysL?W$_ z2XP(6bpB9@9xt*F)FS`Qyd+P)2 zgT-h2NCmnPm5UzHc8OeFQGPU@u)`tN(Or2n5 zZ7Z@}GJ!&oFhfM7t;+;x8i+rJmD1kq1SMz!^%UZY&_piVGOrY_WmEm0elL&0g<}f& zFBp=3{blWe#bdx^gK=FJN&E?ZP$POUx^aBQ@(wS18M>l@W8y5MbVLTLE12rMlBHP8 zXnt+KC{;JqUMq`~bx<{@KIfU=uEBL`u_le#Yj?kvQ|$YkV*RDP&f@-o%lp0y9BZoC z{g^1TWRWPpTLB9*%NJMIIMLHu1|WTiTwVZsRf42|fU=yd9(V8x?5B4CKr83SFdP_D zP;`xH4r#%rARrx?F-0)<5}3)%DpL$ws=X;{`G`MNh9I@9)Q7~lagijgnLI@|*`ml~ zS@U1LoL;9HBD#ZAb&F;g;ES@lK%$S)t2Df}mJ^gG%a4sSM6cR_U=TPeBP7^}Q@C<> zdb8Rlyqv^VMoVtT`o0%Uob{(_Oq>-ct7NjA^s%&WACbx~El<`ZX2dRxYLShQJtd!k zK`|yZ3Or`0rY8csegf@V8Z1y^*n#@C(1WpE(UO>N=WczGH2I&^jxXtOg;+z_8jDOnq@FMRx?{UI;+A6Xzy%8&pti#Smh!m#O-BHn}6~ zDexkkICjKT0J{c5;w9K!dFV0%hHNHx&l-?^%rm+I8PZLWHvT6BuVqqFtIo{c#u{xS zAx$bID4C)~0RtMM{Rz1mo6BKSgxCX6DfRdnGO#=PW|O1fI6 zthl=QB`vCvyIaHkEI+i7sSRMsE*APhCVC4CH!yem(mniAZIWHtCU`hL13P-X!z4|zzMl253C_5(uwH%h&B+sshx5S>dU4_Kerm+Eu zr7e+AYmH>f$D(`P0|8?(i(=!vCmEo~oiS9BnqCL7n&B8g7G~;CFxDkIrAde@z53IDg-Jt7+HLU@%&TeE--m z`;E|5L~J|F7bR>8n?*9l=o_@M1CGEEtz2HhuX!F+IU0jY7`j-?a>otq;v_%fz62o| zgTt2>eP?HGErb6MEJw<;bO44TUyg^GX3N5er~;$GfI}!?%5qtAgC<4wV0tM zXQW_^_+qSSJXBi`!B!|N#B(K~U9oJbx7xa>J1NXi{yHvbTT2E&@YBLB3*>sD4;Ax@ zV9#1$kd?tRM7zZq3(!=Z8gI3M2DGQs$kmwy&$(DdJ~;wME*gqKI#-Gl{DnGq^K0M( zJ2tIgUmwU!yA(p?ZbmC`!bi(i5Y55qoIsPzYo4VyfE%RLAM^CR5>X?HTeM)e(A(i5mV$l`B# zy+E?P&7?C1t)D@GA0@knRIr1ON?Le&N@!#$Y&Lp4)bgT$@3{*t$?&n?5okIovq#Kc z(hL^r0wX0nBDpV_9G&!DSrh-|-#{^DN(fE71;=>qpwV1@Qfa_rl&0v$r z3jVM;UQ8x`*d%3VjbNA%awEh#Tzd$5X?&II@cibz(VkAXMFGM^?Sm4iWPzT;bH;F+=KH&o64 zh3a{r0%5sdEvB<*9vA2ofSQ#WUJ74DFl$}j(GM83VeTqKlRq!PK5?rpTp5T6j{xc; z`~1l$0pf@Mz=<<@fL&89?QSfefKaQ~!?;Rskin8!&%lOR(pCdoXHt*MlBO4b^Nm%y zn4v!PTQ{xIC~HzI0WeNBVgrs)+C&z|Cf*K{O^ow{+jG<+&8qDL0Yz9y0$W0s4Hc^x zHZ+T^anrgzf{)R!+GHmRKxpv-wy5AMC7?+-+)7QI_zlF|Q3Om!F_kS9!(u|kYNEet zg2hZV$Mw^(-KA|kN1+jt7JRKgS4;8b06Z5-3*6rR698diUeC_0x|{GuteYyfX?J4@ zit5Z5ewV+PNbn;GnwDb(EU?FVQ)Q!i!amMe49QU6RwrA0u4`BuXbodVy7Wx#2$k(y zL5m}*%m`4j3Q!xuu=jf{P;znoi8Hb+sLg_&z*qB*Zb-GG7z?7LIRm!mZWqBr>k1vr@}VEtjtP%k z%@>zP!`5)cW!%v0RRQh*vxK{Fq%unQVRMcGJ%OM!nyB&Z1M?ks8mDcyTXwiEqiFCF zFm`hGX2UZT3==q?Hkc{&9jKTbltL!?Rc$=;vYAoqNPz$!EngDiw-h)Yt5O=_Kt&@-A}0&}|4;n))x4jQ7T zpv@O|hD0jO#~o0XQ1gV^IjveHY>*8R$HvF==ax7^Yc|H95e!tJoyO=n&|sq46|0bA zqRuQY`Mu^$aG>p*h#Fi+O9T+;60pLmIRi_ZnzCh7SVe)LzciX<;{wxe4`Xq(!y@o3 zc`I{bB05nRR-uNF1wk*7_hhdQI@@?Ez>ADz7gXTw^=k@A2piJG;Ns}REA`Ikc^SI& z3@>};zmBtPKqu%2$><8;xHX-IvJq*Q(i8YqQD88QKQAd%&aZ**UPB3~RRw7B%yfGj zy8Yy_K5dtlxW@R^_A~g3%wmW(_YBP2Fv}xAh*{u)!5E+h&-Uch?h%|5NAejQo*yd+ zLU~wMep$p9*3})LeuKc0V%!ED-pFSZq~-Ro%m?Z@wBbK_i07eUCBa#0JU?zY(}gl5 z+hnbyL)dNuoE6GwQ=Gl`s&&Y+fN09JnReg6?%hBB&?SOxi&l4zhcS_J=|QOIP9#1J z!acQ_*}67i2#@XeyMylQ*JxUPHF($SS$LS1rQ*lQcsxK(IDkhj^AaMR{8i+*^p~`v zJmRi=kMbdioH=k5lJX6|0DvOm0FhlKD0Yg(0ss{fL>e3Fu4k|pFA}nBao;<7TaW&3 zgd@@Xpkio9RJwc&M4c%ZPd)YtEo#mw55>@7u#W{iVetp*FSa)jrDqAQT&}OIP*nbR zbb|&*g+VRgRr>lUdiLVQ&vv14!Ba;G^(5)TB%_RqM!quIq6PMdc?=Hgky*6R6@mG) zU%Y_qBEN{bH;ANjIefew^%Uj~dD6&?^BA5}9Gy}EICN|XjAJpqgmG_EVCtuI#_S`{ z5~sfqcs{v}?@9s%|4H{u@UQYSCOnw3ty+aAn1RJaiSv*zfg!ebc6Jn5wqa;>3R3j9 z8f6D@LBj$o)BL(4E#SJv7CO~X;jI(uUUk?;E3z_9RD$?u(Jd?&CuUAGwGyim!<|j; zY^jUd?fz!)vfKaIg`;8WyuZEKy1%w;ORcj0m>!!!riumY?N6Ntij}Ue&0DPMKz|xp zfc{mMpNctzS*%rq#1)|CIRQDvoo6V4^Sm2fP^4hpVFS}cC_nn&0^0O{OJT0wk`Vhe??=bch)zsk)*> zN)n7(B-EVoC1GT$ZS0B`8E|pzFSak{W%uBwadiPn|DS9($~;%Q&-mF%9vAR;PbUcw z9)@9dezE{RfPuKG-cKBhltK|70bgm(Qil~sI81<$D6^wtMQN$J73in7RzqqHN^ou@ z74t28ZS;lAK9vx;Lw+XVW}ee-E$$5EYd(z__lizQ@S_x4>xj6bkzG4Fh(gI&GjDRx zY^^hz%Kc-rEox4`wSy`4qkk}0gD#&OejjcJNIQGh?A&YMi_D--lNn7U8j)T+N28dU zB7Wc;f-v_<|H z63R_M8>XX(I%Fk55wD2L>ttkWf~aA`Zpd3!y&R`TQ6GVWi~Xs^UEa?|R*WG!5!)2k z1qT~wBQNw`QhWwpqvLU4Ve{sI(Qp_H*N#^1_Uau5UkrvQ`2Yu0;mWSE%VRWYHQ;;~ z20>tHGW228q&A)AnX@Nr23P{Nhu8MB@rWTqMq*}fw@EGlD7;ODNn#ZObQq>QU1Sv3 z<&Y)UWa@OPb<{z6dZub_AGpWxk#N08DI5SQ21HVL8U?5co_c!7clK5gIuss03`Kdp ze(-cYxsJlemZ_Ry6w5n$et^PU%TZ8Rwt~^;N%HYGR{L6C0Z;6&lbY z--2e|Ew!Q1$1yZ^!La)h46Sd`64k`A1NE1fc5KVe4>ar;ORq69##g8ns3X(YadriZ zPkPhR(R#qBwU<({IZacK(K>H}a3IrO3>g|sq`3jr7F>B&PE!Okt`g6XQbV5WR?GUe zk3{)h)Uv8QZ%4ZZO!Y=?W}OUAN-2RQ+^T#byUO->@@%2!K41#kvIVP~hOkR_Gl z!u+t!Mv-BG-%jM=dgwV(-$eQ3#KXN_I zOZ-D2FSh+f4Tl!R- z%JrRQWVOKs(vjvL19Bdr8F&uz2HJZhS7#9Z8<$XcGO;mb8`{(;?S7pX30nHGO%zCQ zO#@(+J%0|++4xL_>W_Lz>N)d~m)qMm#^`G(tRMm#%PQ-KdsnjkkUg+5f_xL+GzUfm z}aP>OXF_N=I zab=^(#238#pyCV6%W!JM^XOIXzG*$QQbkpt&1=w0pAIlNeX|AFc+%`9WEP$`AhqW| znADoeNdb{O|9V6cBEOzMR+2{@aWo^13T*31Ux8|W>T%{PC;tApR~`Afi2pA@@X2AX zk0|@kV_5g(>!J7wT86I1>F4N2&!7GD7r)r$$WAmR*_fQ?%4rgjNQv%9Fdn4kr)UD0 za)O~BKdE!8FoY^RYm3ybJgxH!i>VIoDtX@>oB_<=7+*1rw3tim16WTb-%!hRahTuW zv1Q{Fz$g*p-5r5N2Sj_YaM)2r`apwtkZljA$DEg&Mp5T@-mKIrYKCZc zF)b?ek?*|%zTUO~PZ3$q@c0%*{Cd&!Fbs;M*B!dO#`{mOC!B&%K3a!=)BR1WrDa^k z42ZcbxP~7FCAM^35ub8JNBSgy(lcdn4bLwJQzWf~Q=~pr8XS&P!48w*g}NAzC|81^Qf!eZ*K!4zGZ#q+sz>t=x}I7Nj*-mD|g%qZzU^&H_E)L9YsK3jp_)kGJniHFz|%2cjm0_eD4rUs`1 zm{`x{s2SiETYy4(^B5N*!>U~^D9e|4ba)ThTS~X8uG|)~hfnB= zo_su}A7s0n;@1T|C%+$h<;eF(&#?$@kORq>g_|m$0UeAMGxh*JHQnd-2k#DlJ9znh zzuSWhQQl)bhu$-767>x(0kmq*Jo^hilOe7F97Z1=!jy^Gjc&oveZ^L8H#FqHG1da> zSb84JLs+!$IzP9ppA%4)9FM-#53ccgRqta0C@ZE*lrs7ERj zgjSKJvmD7pyyt48n#~JUfP?Zjla|v7#>e13)r$~ z8~%_(8rx%N=@&nHy3>a1$2j?yIz)@o(}G1ruvIEJ3&Txmq-c%hMvFc7~ACd40x)` zf76coDuJUd1A;^(etRX}p*?JFU1O})PO-@FjD1@}{0TwC!6D53ea%zxi64hVqGb&K zpuE+>NrQF`B>q>W$>+#kr5OTFI_f-t)^a%HmpA=gQ#Ed@M8Lr7nV< zg))@Q*D}?cfjhq}8Quy459_>CuF;9X+cQ0J^`aaz)eT>-)Mi-*mw~cQ-?J z`2;(Olz-uS+MKOyEAnxB{R3TGV-6_c3F^muP~W7xur{&M?6o^?EaL@^ zpK5G^@$5Cu;f0yQO|tWK{JS?IOh#>|gH1Dk_IDs0qs$q*)r-cYKhmEPR)Uh9IkFLq zVbt0BD#9mdDfg40AlM`Y_Z`Vi_t_+~pZ5S=m43LVe>ZxItWk?Q+Dn|uOK$ux#V?zi#i*o_yoSA@?bx8QF}0sKkO#DCVe>ATwM$%c7e@gn0CZU*|<`9jc02L<1mj2=!@7@NXoj zH9=JBhXnUqm$tCrSK{g``MI#jQ29BkRnhFFN6Xa|a=zdxf-{5Xv?^E@37iI3p2Z9)w26Bvv2$*k`}e5Pm2( z;H-_H8y1D8mc^XDK5ia!>Ia>2%v2*EFBQK}kg7Al?WzIly5idvPkrO*)Dx#~V?+?R zsx*l;JoLhN3JL@vx=VaAsH~U?aNY zRgUVGx!6HZ6YXhygpbrzab1T2Bbf>0Aq7$9M_fmg#IX=;ynFsJ57GEUo-PVoZj z$tHJTQ@6twJQyjttZ66+%AmU-r*S-iZnDvZY=d~^7THT}!>;K%_1S>%2F(jD_Vl$5 zJJFNUAb`fQVXMHyImOGc2b}=sFsL0bP{v;j;XYq&63{!BRIdUA7CcBBQMxTx_V%da6d{M%%PdrJ&oTVAlG1(}X}2@0W@(Cmb4y^MeeXeuH! z6A;!D4`j{N2@3ThL71?RlN+xA@XysSq-c!;$~ zIob}O2-{@%E%SQ{u7vhZBl3aHcA&qH8NnxKA7R(+cP~C1o;a2XO&>Iw8Q>UColWj| zul?{V5OBZ^h&MumHH!}uWBFMO9d^(H|82XrX0r(O!!0Oe^NMNot!51ZX4@3`QVskD zfj{?v-!SldSihT361*`JV^0Z$L8hEGuxvM+8QsB-`L<%7>@_3Ow@ISDG>lR%NTdU? zQwYE?-hQp)j4>&p$wQ-agXs`x6F|Y2@9c1$mP+i1IqrZQVBf$LkDX|<*M0L2Gb|il zT)?@F-X`=)rDx;w1>2NUQlBJYe9@@~JjRF1QgY($f-{LyPdXfE4m;bfLV0=C-C5UgTj8G*R}s=G$FwYtUAAa^!N zuCeEdS5vz5Q`2bi&N1CPa-S9fq`ZSUUE-T#pt5a+qf8suuUhU zZm(mS|KX=QmPrN5ZNedRcz}VK!YD0=0D^#GY8%>D*uXTFmKHPnMn=VImBSUf%)PU> z0UdB*2#$ia)qIP^f-a7SQ5l8^M-WtYU_lghfuE@5g&awLKEh}<7U5rQOZ>|sB}F;| zUpt%u!>Ga#qBA0T$nXIU4~ZA$<(SB(YBa+n|QlZt>LcXr1CgZD&+B(rw^)Q%X@%0f2DK zw*o`Ps1rXBB%8tx$5e;dJCPY3)l*xBTCh|}!!I=#HZZubo`R}uy?`yvIOUj>`Y49E zBVkV%((b3U@JtO- zzQsDVW*9|gIjX<~!)>+bAW_>uQKy62BpBFjMdt93d$7;18Es=dT}`amRXsH5MSB+) z*mJ{AfBma>a`cq$3N%64Ekzfj6t``FVs{YbVE5um$|$HjB|rMb)1Up+eH#ozdgL8= zkRto0MYrRsVsK0YiAWA}iu!9@No4Y4Cf%BKv>~7NF35ORZm8nc)de|L^fW>8I%9L-FNP4q?s0Cu3F>X?T(JSK%W{4 zvTK@_1X=4#QcoV64b9PO7DX=;J7^V`MXU})pomBMoL2bNHSu|&j6txl zMiV{&eXmdsX%znPl9{23n+^ib^a-z)QSyRKEbxQK!R( zd1cLz}9syiae>Za_%=6s+R`rofs8;q82DS@b%hz4VK zQN%~1&!E=pxp5Jfe7?!WvS6A_9Y!{-vUu2ZtIspoF13fW)Vy3>#`@#n3lY)q;%X?@ z;1Cx{B{XhypcS#csYp}UX5FlAdPlWv#~4Xptb;W24lp_C^j^#8MOIXpu|Ton`iuoa zK<{8dsWaUA77K}9W46j?sUH<$nDQ|Cm>JCF9kCrlZ`%}KY@jhS3c~%R*O))S>3Jur zAJRX}n8H9#$@E9!peVwclvyND>Q8Wt*WV`g9lWoJb$!1Jf5HvuS=jwBCxY2pr7jJ- z(Nby>xufucDl1QNGLr29v84vTgmhb;evcfh)sTL_)SR4`@JeMu3vI1Rrvu z^4TVumV5;oR9-lx2(^DPxm9R~VW^eIs`!oE{JtJl@LFts^*)qr#KQ^;PrS83OQ5c$ zboel`429m6{DSAOJ|9yuAwwoJgK5p<208`_0O%bXwt5M8344hlGd_?@UYvHH^+Y%d z#_IWiPh~ce8bC|}{6H}E|ie_3^5KSEy8CkZtM#^6LLQDI{<)#;Ip zQALY>J06~Cg2_`dOI3ml4JubP)3LS}IV^HXMxW};J|2fy=}23d+{d6!u)|$ewjUxn z93UTgYK0kpNM>x?qgp2cQ00(Uu6^7Qf>WH8d4yE;x;#Q_^Z%+Ne3*>Hq|piSuU<8v zcmxy>yEi$f`7LcPEERG3>U=C@md;)N>zK^s#q^Vy& zmC_oUkR_Tl6HjDL?sU+@u9uK7& zh3D85a*9U~PXcLk+m=+@AT~>@Shk?&s;3A0s*s?<(_i<)E@B(3G7i+uBv@2w{gsKX zjpIDCbx-y_LIex)E4;9bZ+xBGQiIk$0m5Qd?QSQtu(`?2xXf)Jsg-aF50=`7XWm_} zAc%m$+ZBVBDE5HB!0LddKD|WCmhb$f!74D~R=~gwg@>F&p{RXHYGu{%l74Zfa1#5V ztacdaw5&QKAB}|U^ERZ*gvRbTu|qs^T}kspY#ill3zSNBiNg>}LYS3ZcvWakKJYh4 zGjFcRU5JRCMuINo2gjDxHU4ld1K1bmcj6PRoIwc7g78f+ZqbPZcbjlw{2KaNfiX8#l#vU|Epb^A#Ed)ssF zri!c#WAJk#=r91=oJF`?sR~pG08&Vpd}aP}L@QO6?1r_XxdKoR-0-{54(M!#!{%B$ zHDg$J10CIE=wY*_-H^G5g=s+RF?ynBmEh4|>R}QQETDz|R>*!%E=QG#pG=Lzd@g{tc_ z{WI|}#eC71moz^w^mXy5=JGMFd5}|oje8h)f*fpa)W~i_?>?tc%~7P^Sf-FLm4NRak+l<2n4HOi?VZJ@+6W?F;_%zz+t2V0#XD)X0aMp}I$0WzwzI@|CdXK6 z=EGnf?}!Mrgb*hpNviJYi?eBT9by;pTLL|&>6)o{9Mdy^7$U?U`Irm1IPG>^hN4O z%)0AdZ^I+*ZU|bCYj&JUwr|f`Bspo)hEn81@TR{Cp=)>>(w=&u)mC^RV_#xi2O9+qG@tggl@ z4oNFsu~cVCIam#<;~o%z(DSoXZMzd2#(@|NZEQ4fp-On9GDJ^=M}(9_V<{3^V;COj zyP|Hefz;#k@nsMyp4DXF=ZyQb z2v+AMGuIC^>@Xf3OVR#d=Vl%pmzPUHL~tJI=s2NjpGsrubLL_7o%&%vww_hO-hTGg zXq)1p!%q|8(2=kzp;QTp_I67G9Q|?NRl+jHS2l$STsfYB1Dq^I>T5yPV~{ z>94!tHgjIru`@kPjY{RR6jcW(i!>b=-u-7Vvb37UOWQ@?YDrg6xa6XsMvFUK+J>%H zE^X6DxUd^|8Y`DISDSSNcHx7P4v)N$NX`&}@GzgE9 zLSNRuHAy^N$cSmRn4ozR&_uZkB=d=LGBBNjU)_tnN24|#@rSd05vFbCSWONuq9(YS zL#%Rflbl$R=YKKJD{Yx;Su!m&c9xqp{VT6jLG3yVd%m@Aoy-c${6&?Kq)M|OaK2@M zJE)q=c9^iRWr07anrM+FWX91<-82}wKqGiYu0)4 zn9UoiFCsFVUUJvuD3Xc7t@o%K@@QlkfG!}TTqX zo_V5j%`biq-yZ{nvV+|vr!tEaB!e8k!+?Ny=W>zYyo3~S`o2JPqG4Usnix`>1v{0N z`z=T?4eqRkoL)F7=5cy5ou5~26&4j`Tg*Zn*EfwWZ!SWV=O7gf9S^3r@QpP$!Vv_4M(xg z5luabyHWS-#EIq5w=(Z}tv_>GKRr8FO*<`bZ4LMC*9`zD-4MR)_u~2P{lLTA8}PCd zGWIcn$R9x_LHOSwPlqS`{eY(}IIH|J9w~MSgI_PgPP%kyfS8_zGay@qC?T0e$;OGu z3a5Ii;5t)-_a*FGLw^28q}HDU&yCEp7k_jzYoDNG$X7B_9F>mM9H&>Xb(ZYWZG>A5$y+yA$P3Ct7_%5>zM+>`&Rm>%9@@CA^ z5KbV^rbkV+tj43VpWl%3_He5S}1Jm`5$3Y z&94_iZPEqv_8WTp?5B2(pU|`C-$o<7fYpv8vEHkDU+zcjhaR!(4U?XlTlnuu*<>zTPTaI~*N!-DM5@M) zuL^*Il1xVWKF5wNcai7`PIlOTry#)iE+)AJP>EAmcdC#0Bg1UELJlVr#)@v4!H ziyb>89K!w6$(;qCq8ZCi=?p_1=X|S2FtZkhO+o}m1{Gbya5e<;Pf$w(1QY-O00;mV zn2|wfan8>JG5`Q|!~g&n0001NcWH1hb8=%ZV{dY0FLYyYUvG7EE@SN-X?NR7^}Bz? zP!7~eouw(;Nl3v>oYs&gA$ADsF^a7uqPAotxoLp%+qv5;(nwy~J~)Si-)n12Gk5OH z+`0SA>~3wf)Ry|?T|ABO%P>`b(s4TNsB}@>r*U$xiY&al zi^oufYCS~wYQ8Ac-69zmP&rrWof;lr?r@RaR%;jk1(@@vEWUpzRC^q#{k^@H+wj+q z)Zj6i#QB5jCwUPUiz0&hP|->MM${F;D6;r= zQ6TQgNd4bdilCdU6{lVfLi%(rlJ@)MH#cs5GO0Q^0?gPGaa-hyXeWGt442 zkFr@@6wyS@v-D#;fiJ~FSioNqz?n|dM;w!JnoMHqJ5`!R#ev}Ua>qeUkB;C3)h1AQ zkr&XNB8(G)8s4TK;guPzBrW1`L-~^41r(rycG8(&m9}#HK z84-;L^mDQpN8b@HN_sg-$BS8%6g1il59{s1e5CL`Q?n3eKMtq48F-o~s_b@yI`?Xa z2r&s~NIZ=C0%jG#JR#QVHbQy;yiyeG)8KHsxi_~hD4GexyTaQ(F^2Vf1m~zr^B1>RZqe9%d3mu_D^~z>do)r zWlwdlhwm<~)L;J69l-17&sF#Q1pfS9^?rAG)f)^HyzIZfJnQ#P5FUWJ>Yfk#y+KFy z&yUZpPx|L?JL=8#P@P{4)mi_2e+a;b7afGIYuai6?-b#@?_C|ggD2fL{j>h?_tffX ze|U~9oxG*`s(sx&{Nojlm6iNtlNLzJJ|sQpi$NPZSQ=DFbD6t zXJ>Aw-t+*W?whk7g2YZi?W^AL5K*_^j$t?ek+Y5(T=tIp@CATD_j~Uzq4D2$a0HGo z&Ii5UTthi{uTHw}yKkW@?d2nYV|{#m)qBtQLC@9T`psb2A6^f8>g~nF361WcclF!; zac^*_&MpQ6EOkBTb)b=97u!ZCFf#BOdvrbM;}`)rz>Thi3WW>h}N_aO2^IKHa?Q!SgEs0-&&a!>cY1$6$EXKOUNr)O+a5)zImz zI`6$b>%Z-tANTO>1p>P14|)MiP=5dg2s>{4rVA}!53zM9hCPF?WvcAZ466RA>Yn@- zz?|s9moOZCM#Bu>@jDrPL*TeRP>3k_cOGViUV+oc{w2zRUHB(2!tn=Pqf1NkKy@eK zOr0!}4-u^LpNH`4mw7zSck<}95gp%;lks!`Z1UOkF`nZ?g~SMzih z&FY`dYaYk*Q8<}oHE)uri0|rZz>CrN;X}TtYX$}tJK{f2q$UussXMS(?+}jvt~iBDtL=+xQMjX)!5M zZknba@)q#cBpw5IzkLG68GQr+Kq^I=0;5izVCrC)pXWO;H-tSRe*CU?{OiH>`_aYu z==kFD_pR?w2orjVYm}b0Cwb9Pc{c8-X_UaX=sp0dQ2$VWf>v=};Rz1E3}+h#24NFq zA3)Hddj5x@{}6y}zh+3~U!(jnoX?|4a7X~?&D}J-&(%MV)bMmP=)EPRO}BuL9;(mk z@c~v)doQT(-F~%uy6H-z>Wh234C-O)`>;YISZB2pvbDRxl+=CR_ud~@i+}Av)WQ@R zZ|(>Zx~6mz{HQOyBoYr36@3ETmuX$7+bF+g1t1gr7*68}GP*V}ox8;}g4vBo?I{(z zkCG@0QMJ5%qL+aBRO_F}!tfz;&OjDK0%KB(`e@KS2QJOe_0X*@34^~UgFRLvaPnz!37W~yw&cpfmR&Bvw!6CLn zdVC7~gdVH;?c$CU#&H(W6Rhws$rKFleEao0e43`=q(jOZ%>y?LqigLA));Y0c#xs@ z;bO{7%k*r&uECq8DB8K-5zLdx2pD(qG=dTDsHhn41R}A1333f&6?6fM;=hOsF52+} zk_gtt&OpTo%p0v~#tCS|Kn#D6s0HX&;6MX01Vo91d0#xB(0qtO&^)){IrhpaISGrf zR20F{Q)oq-LeLtGrmY8P{VhpHw-JBA0w7Nw)9eFKT!9KOG^g6P@%=WEK$tLgV2dm= zhQ%tkod-~(iC;gM4nYk~9x~%xajWHwcZl;n;_kI;=mMtqVI3xlbmQdiyg0fGZY)1IsE9jWu{v$H^9+lu9JcK|Bqu>H(oC3kU_OVeW@+@Q7v-W^gcem@Sti0GGiBwsuyo)pgPIDc@yAi}Nx)zS-;Lg#TtOd4r)S-_1CXV| zHdpVc_K)p^?5ZCHJW<`_UssTLOePv%+enxsBY06Nss%cf-YY*}WcPD^ijR@-`mj)< z=UGI202YX01whJkAPzRBp_LR^Ry1KB2COYGL?2Z&xsQN2304UsDmB8_(3(3S(9oc)hvMqpuNyyO5kEdxKwF8H12{%-v_YwN1U^}4F0tz+S{Ja!*JYHz{ z0DcEYfiOfLw98h&Vj5li8W%?nZ#pn4%)O&5gXK)$ALBeCzCzDhhB<>wtK%NLtarC~ z4Rydl^@J#Z_Cp9lE%?b6NeI-sNU&jz8Z;wIm4=jGRu^qmz9F0u7bVglVbFG->IsuF z%6YZ@I*C4+7NENRl&bqR0wOm?wT)|m7eTvJkV!O9KU7#`H2D3w`X?=f)4u+8H5dkg zIs*FDy`!;%wFjklq1-N%pxGB!jfkZVkT|j?J+6jGcm(wd#YIV&)gji=xX?-yf-mXE z_)@i5aL^xUOV)aCP{L4c$WIdh{Fhmy>a}s*pHVjcT z8N@}5O8D2o#^nnk$m~b6#O7(NO+z*BfCQ)2LU;{J9m4*~M8v3}kE3~^NS4sB18by8 zb1IibPz=1ocVRpQ$H0!Syl4bOe_^Fm>x;FjOGRq{j{mb!A(ZIqDEz{V4KuA8#Tf{l zN@`(tWKH;s%i##5-`nB4wg!V-L3jexwL;#44A2=dnz0rGRuO?hGnBZ1ubZ6o-dw*u zZBu*K!^`U-KLPHs4^sA-KPm^f&Y+Prd)oO^@=VkY)}3&~+jDus6K&Yu=dyWxWQOLD zUkIaQ6wNbI%giqxpgHiDv>4%!Z5g&h<36|mpWLAThu-Mq&0Dg0bX^o!IjH7P@2((u zZq38`n#;Tr47I8>)Hnv@6*R)epy@V3ujq$yLZ+lGG7ocD+XqdK1W!e5o0>mtsw1-C zaD{D**b&y^WV0*KN>H3~t>w?HrW||&`pVLDMhwcftL+_^=!mq3-Qi#azEac;cR+>U zcX~xIO~RKIRJlZLruSvtnI5gHK2zcKHRv+z=x>giOuqsqC*gV+tcXyVa|~Xbq9z5J zpf_vLL_N|1a#P}}OwkzXYHEw1`UYousjcy}uj%-K>YJCKu5#CO{ zhOOKq@Hk>5w%7-wi4{4GBUS|mddz~95q+L3p(>{^pz~?O74U03gRx)ah>NbTE4|Q6 z&8@AUu~3aNQjXciW|iR)sEJiDzJJ_LJbzA@u|f*L8bDw_Qn zL`$IhF*(sMo^<+K92YXT`j?%&8UtR+Z0R|wb(^v3UB~gWRwewKFCbn7$L8Y z1kFPym~!45_D@H{-;FSabk-Z;0?{(*`W(Yrqwdw)w(U`HSo0b%u6?fYuYGB7H{5Lc z7(V6NE%<&g*v9dhPZW;h!cn8`%G>q>x482rbKq{WiAUgm$IepTWo`#Z#A0tul zfCuQ&K-575JxMor)D5jYH2N`u7U|j#(ISg;Tu!%PPU?3hHy}jw+pp_fwp^`xM6eVTSw|d7qo*lHQdDSA*KM zhPGi+KdfszQ2+d=S&Z%PvG{iMt@DeM-dXqeV2}S0ikWhT)~UMr)Hon&3!u3*F)j+D zU77X3r2oEu?kv=fJnX$6bs=(mK0-dH7r=`W_X`5Y))uXBjRl1g-WRp>qt-8KZI464M9T1N|#60(V@wM$pmRD{uzaOqP#9 zqus*smZ+OgY)5J<;b)<{Ea9cx|#*#a|I6E0#zuF(R zxsD-XoB~+rF9Y>G>rSgf8i2f1+jVacl+)DUrh7Sh^ZQ{B4Vcl*#nnlh-vzuVO3)4N zKzr+0Z#dJ(G{-6~OCnmPkI0-ea`!@`R1BvWRTA*MN|=tmlRAYFhGv&Ae@~gF&~S5# zl_FV0UD{(T4Qn}=>y`uGf!x#u0EO9HV_+9ce9M-6*~M%ijkxDaf>emQ_Bgv*Z%p}g zVzKkcVZW(=C8_fZtAMb;pt49pn4j_HtUq|yJ8?utrO@#iBw~$jy8U5e8T90WZFjz+ z#MSX{Pu8`~`SqK(WL@{%2WOBwbOx;fv+1D$Z-%lRh*IN?i({}ma|$U?=S1ZS*{D{~ zjHkNRBm9|t66DYW&4Lq277&6kPG1A(HH%N7s5QI&s??){GJJx2^n+*DKo+OZpaFqx z9tF_RPRpi^lrWGH@IBz?T@bAA;lHaZZ;arvblXS$H(=NE?+Vg-xgIEu7~-XvLk9*Y zT?`Rx>97`vyl`smLDs&t4#&F6u4p9OPENLTG|909qQB)NVrlEOqx%#lxByf1AyJc- zUsP(DP7o8Cr?8T4r>ybb!Md+5Dcc_#937mWj39yVx(DNgikqq{s!QsEBt%coE^gLc zD0LJwO_O`>fSCc+#!l4{iicFk!@k+u1zI|c=T}h{52J^L7IA(M+jiDahjjMnwF;46 zLLdkpM)EX)95G6>fG#)dwKzd_5jo2tmg54=)Sz<%_=={`aU8E}+^#3&3At9?&- zK}858H4S}u>=1`{oPWUc!@Gh4JM@ZxTY>PkF)vkUmy#Xbl1nMOSC_`g1pv4ho7lz= zybjtTA}A)e65%@)}6Ak_iz)Z@v@vUh>%oU`g-Ro?=hj2=+E3G)_oS8>h z%`hg~X+3dgW0vP53b;6)5SC}~#?iqZ;SYe_-4E7qfdal=a!68g0jpECkjhctA@?md}elYJ4q0$#uQSBI2+%gjkb7X9xbf#>oK9h=$lo6T7A32nYJE?yO3Q-KH+%@K zG5x@dRxLH`D%}E# zYOsw2UoVgDmn%@u91Fh=FCr15Q_{KJe3eklQ(SNnD->A-r1}8vSPrYfLnPyzce0`L z_ETIukuz4nz1*SQd(8PJF)TaKAxK{NKJgu{vJX|jStp4d^hS#^=m-c+SGAHluXZHk z2CEp3u;UaRhE$#o?Mv(Ldx<^KNtzfE@c~+na;;Bi!o+K+u(3G#ldc)h6F`|ekNSG zqXw|Cf-{TbXgZONgdubX{x}V=vXDEovy_y%gcU39sE_nx3ky4(N466>#!I3b-1u5~ z1l*Z~%9xncom}R+tYj474E$%Zlg~~o$ygpr=r^&9D2JwVrZ?-Lk0w~jrXrliq~CIU zQjaM2jR$3Ct@J)(ZX8uUbRNhc@k+JHp1&;8NqWG6gE5APNTotSxtQa~e2Ahsl8~c~ zXf>WRq22#<#vtH)O<`OcIJc{Cd0wQ_gRqocm0GqTJ|*oPIU;#ml}l6pbh#0Owh8H6 zKHxHbd9Wc5a)LrbH>k~8y-~U~<(aT?S=|y4W=Zf)({NlYcr8A`Tnl&ALyKl+kl9nlSeVxZxD=v4fo{lH#L!l z{~l#24*IfDo0LWkdP2TLcgpwJy9OP@U*u6-Vz1OM_WgrRwFfr@9EoueeL{qdB0)Ze zkX#-**;(xMG}F1N0)u_KM|%M+cY^~C(uZhH3|$+fDCaps2S1;aq!%D2O~{KY)8PD^ z#s-~CZJbA1qQi&5{#khsN{_TfK=AvG&(%$ zupd;f1{=tgeBhUrq+9x|;Z@#m+5}}SFPLpnN0QW<)uJAgx`Ej9Y$9%MFrW##bd1bB z^SMu9{@KxNAAepZyZEz26u1mv=}tV}05_apHuoL7+sOO_a$`F5Z8K^tXciNVw4EaKaR*ZX>d4 z9Q;ck*=AKvV@PSIx^dXir*?z%znrc1?IxlL^cQD1)~BOyNiNuLmm@!LT;(IW zSnwzYyKc`W9-YQuX9Yxz#B}x&_S*pR$ zs*Xdr@<{>8Y7o4T{d7;ODewk|iY`#jPOTVe+UE7O4F>kw)cb|`c0jL|uuBW9?0OdG zv%6l__bazH75f<1W-%zK@*T~j@&~cz4g11ucV0une~o@Zb|;N>S@~!$Q5A-80MFnO zPIA#)#N^s{?BFla9(c)V{$1weYxD7Mr7=`h1D}KI^}j4gyLE|4GGhTT{yt}DW;rTAjmz~St^_;PCj6q7|Q{t6Sf08rR_l!yaUC6pi_OG z0=)q=5APyQlr(AuEC;X+Lp03fS?`n-f87~gB|e+l_hVsoBvaz$Kzy6a9G;dSs09AFLu_OuM?a0`WBX;iBklR_7T4O^?Z9O3ZehKxU860wnl;P0eRxr&>-R+F~|ZV;(#GS8U841L*5vWA?q zO;XJ^o_7LnQ_gI%St-z~R%ez~x9|GoVJED#{n+2W$pKo3LGL-S_v!7e@D&p$tt>Ua z!FAjWH5+?3^eimluhkvCHdVZ7qpzRqz3z!%Yj9av45B#6XcIN3+qcm+O)@XcU$`Vn z&;6m6#|WoMr|A}ug7i?@24G#XrDbGYuGF$G&m|AXg#3XhtB*9*nHLtuVHENDEuu~)YmV_t`^_F?rM(3i5y4a|s#Y1`l8 z8>}oK+jig&EL_^qOqsjB!Cta&d9N+!0F*KWOhN#;YZv1&gkbL$Af0YV>yt>f$?D~l z_E1N(Y*4mU4%zi3!ykTwni(a$r$h(`$K2RjI*3aETxTJ%aeI!A@NEf`yPIdp_}19? zdL`3;DNU3qq6 zQ9~Sv@s@g(mFwF$^(GD*NSxABZlmKON{h~*wG5@tb_Kcs8Y(Se+a7ON;wFAwf$JE9 zYdD#!wV|`iYj}aRwIm3RO1&p)4OvvXjP?(V-wu}|WsF)~3|KGlhzhwub({L2E4z6Q zORaJ|sj6_=kj>U5CtM|gx)iiB4e=0L{jZEFYp<9D(q3O<06}W z{g#y41J%Se!VfrILgxV5do=vhNX%(<_MjGb4D2yzOAe8BE0`TDJI)pj|Ma`&6G!NM z?O`IT&n~mO9sFGpYckvtnqRt)vAlGAsCck|&WqA#CZ?G_4G@Qr3O1**`-g5(h1xS1 z1KuhQnEkJ9cPx$S7i@c6`T1|}i=+X!b1PH3BHJI1t)bfAa67?2tNRJo+#R4cIZzP5 zc#{fxp*fU?nJ%(=y>w*RxJzcor0ger?qcM`tVBaY{=^P*zAymm=##u=5wLp+Iz8w8 zk_aCI;1&R=4VWQz8x;j5Hhxl%9K}Vb3=C`;ef%V$88V#8d6qgG%|J#kdQwy~$mJyk zp1yL8B)pqaPU*2@1FK?9N^YRjU3;FI&E%^+LhpqZ71+yf6(U)^zP_Mas~P$7STf^n z`Hdesw#R1cG4x|6TH28+LFbMF(TFFCC}mw|IN@A&h+9|qe`iP?HCsYQ@qL0m7U&Pa z8qJFg#H?HD2g;l$gg5NylO)%eD}5Y<42#uW?Wvw3CReVmvJ2LmUcdEaj#=DB`-5k{ ztCLP^x@%XL^!&D7U9HlXy>=}f_2TRx8n=pF&z-6;t96WZ097&7ebsIOe>(?VuZDCn;syVvn1>ZF?)-Y$btkORipMup$}k zs8+;3D^{h407uL0(&~QkLVJ{j&zOS%@Bp+aHfJOcw^w#$Y;Rj@(QC1ZP2f96Du_eH z?u60nPoL-^MO%R3?h}ve`1bObA3{;%eE8hFZxka5cyKOW za02(><+v42gs*D9+-EzDROUc-5$P-DqKOvL+Aj2OCDF!P*)YtdqOONt+>F!r3qDvd z@{noO9qmO&{*Fx15f`m99QBdcTiCogCh0QNm-juUa7WvvdocJc{J@*JdFLhF4>f(# z(#L47`5*WG3@iE)juakVoS)Gt3h>|0_PW8LF7fiu_F&wnd<6Sm+JSw$Z{O0K7WoJ^ zesR#_vvUa!dc^3QTg-_v_x+(={k-(CQNGdTQ)KP1Ogp$qChOVnb})2oBrN#3SN=@VbP&=T ztY%oNTc&;G;F34#USuXnfwpq6V{ahXJoC3W%qC#QWcr))Os?o(GO4}3$CP|bkqqjC zDd?yLLm&}!BoaM6jPD`j^o3o7r<~Vb7)iZe?)e4gq})*8kZ)1IK$U4G8^C!P2NCiJ zaVzTNMp~x!@c4BwazSM4awnxSt#^<$1C*>a2vST{5>*U^#^{jImS@FhW)1m$uFMX5 zUWL3OD}l>nRV`UEtrbaGO>0GEHW}5^*Ue6zPG=W`@DJ5wM(qg$GyWP0_IUg>uS3>g zP7cZdK70AOroAr;sWbVt5)-KrV?Luug8b@e#e@1SA6`yC@cf#5rYR(wu3~ z6eE&cz+*wV6qrXe#RkX_u(X_hMtfjnR>94&f=eU&Ai?+0J=b2D9B9TNu|ck+tn5%a zEq;<=>}b3&TSzUJUCy?tEYy$=dqBWZoK;<%Ad7^k4x@eRy8BwfV$CQa0xlqxW;5A3 zfJ&gIlngMDWQ3j?Qou2m98GR`C&_Em@?nj&scx*edW5r0my7_>(Rg8CY*slSVhM9h@Cr6V_u z5V`L*bw)9uUv$ibAL<74i!#)_<)&O{uU{}g^A>+^0gMqi=d97^no0&M>OTV5=i}X= z%QgN+2w0(H1YbFQ5=O9wwL#jayhBdlG}{Gm2PeSR_QRoscJ!vSIDeAl=z_2oTn3Yz z26?%|XD6Q8foiYLr^3B>Tx0#K?dfxoUkz0_wz;o%NB^)ep4aITtui}dmMHN@yxCvy zFbYVDY%MiZjaJGfI*W>l)SUBmiu*m0j=8py08WbDG-}2)cnPs`ReXR6eaiNfr-AGA z(sm*2ufk}1-kRoIpmc!v%U_b7(_7ZUM*ZHClk zNKC!Cs53l#`ZJq)_`LC*W`6S|n zyN5@P52MZb{6HrP2C6yrBHQ)zJ;`<&#U$$huiSvDzol#DZZBbd4F}WX9qMCQ|A68o zxjkYKe~p}agx_C4p_AQs_uC3vzz229|3U67eoJwids|g(}^xd+!mL`($~Tz-P*L16Jw2LwQZ8)z6IPwZ#+I{7%l`&H?%d8 z%TvAMN#dll;I?>Cc*akJ2VWKDD%t!MdFt!eh_T(*%!0?XGNfSL1>8A$8>;@((bDNX z7t8!XRKLQ$el*c^8qO)tXg4#+XFJb(w+1U0@d@?e*x9DqEt^GbqVA&a%9N2Nk(G)x z_+S)**Ln{T2e`yI+)1k=a$9i#UKxW-i1~}sRLH6?^zvZf=YNq=gig4;f5UR>Gu>P> zv)W4BkAlt!RT9k3qKR$o^@XonqE-OCxsE3xTU~8>Jq*{3WB0_Ht)G%DuzQ*~4==z!JJc zslvhA52c1RDb9dG1K={-Pn^`M1|mS5JQfDqO5-2Z-Pi}3vXZh|88IoK>f^Z0TbR1G z`ZMf~y$5#kWU-$Be?VN$)&6JJ-N^vR6u0PB3GobHH6#lVGX%#zQAAEZ%m`!$|t3+C732R}?4(;8uDOq8s zs_C4poGgEjnG9M+`)6IH8Sz?+TkqA=FKwuR=L7qT-9mc z3jr-Bb{X>7m)+^qAFq}ndd*OuQDe$32&~Zs+K!!*J1i4|)kT(NJEw2whs+f<7G_D4 z?&F4pWx$%2Aad|M>+72xS-m;HvuUJqh-TZ&t|!=r@*d!-6^Zf&pAdg%BCY2>>6-71 z>jcTr21SaOzyt8)BR=r>2$cSyR&y|&Sn6#asRn3 zh+_G&UGk{w0^K55X-GIcDGZKmX+dFqGbEvo0MHmJ(2biuYKC$ft`_Heh;Pi5h8cJ# z2tAnDn3(l^nsXkt)&=6m_&3JE?_`vLydXPA9iuQ}8_C6hOMk{yj)^{TE{?OtQA8{r|E-&47?MbCc9p}Q|=;nJ2RM0jr0&y5}K}^ zZhpdgi3>kXDG4swsIFb&0jJ4=!i&RfEmguR&&b|r2IU1NJ6y(gpjAykfs&Hg<2tfb|Z8gi!Q*@zR zJwPQwKB;0lVjcn#@)-Kw4F1%Fu>6#L4a{KZHQqZ-)3Uwe-)#EJ1cv z7bV-IqtQqdr140QECS61TL}c>OG)KSb_eb(d!^k ziK}=WtVI~*#&?Jirc~}D$f}Q_!!Vrky8`Q_4aLk==&W!AO>k6g> zzp5zES~bn%*m0N%y?TB+&ggfb|ZU6FQ=I^C_?73s7@=7LNk2V&2Fy znUOUN8Pf$u#mDp=q>>$w=IS;9c?o2)*bijNST$ciV40f-yg{(k3kY_dqb7L<89#x& zaV-1eWI#-v(@SIYG(}(dHgDl?Mc#BFLFlmznq!n67W|;=uyRr*H~_Wf5iL)y9sJg3 zPV0SGUkdIUgmt2Q^J}qCLv8yfu&?kS*KzQ>@!^2dNt4FcRzcC4-bk56C8|L3qipS z#F;hu$d|@V*HMc1tHoTq5*(%chh<6<*A?EcLAS@rBga@zt@-$yyqkY#)eTmO4Gxo@yu;kKwC4-XQ8$%a^WGUjDoI=#L z#^u~T27`v=Jqw1?Oe?9PKQK9tWoH6ciOLa`<>=;ji} zYM|IPgl<0)kexI{y3T+=?B*{-QK50B5KPLR_%>P#9f=n*7Eso*X z^$JTEiqqfQEdZXMmyTyVY30QJR=WJEUbCEX4UMj_tsZvH{Y-E#g}eWP{m!1HuBxY`H?BGae*sN*ocp-%Hv!h$TBA>tTqVpW+XsIl*$U+QCVt1Ks4<@Ka zp!hFLicU#wq9tGq| zh~!IIsP;CwEI?-**A|WsMh?Q3_F12&JOJM{>_KD*O2g$^j{yv6GAK5rdEZ{YHZ}~j z8)VS|$29;AlOJYGv_jo4Ihd@DAQi-#y2DMJ>|66CCi6s6ANVT+4=1CZqSEFO^|j80 z$XrX;QAoTLZ)U2Qy*qTQwYvJ zFC>&}M-tDggFHI5%0Y%3#-=5ja}-~X-!@NN-w}mva7gYrHn_XbfjDV*AnP5gyiSm1 zLozHOBFQUGutWug{{{Iky@mW0-`A)Xgw2}|KmT`>N-b&Y;k3he9U{Juvw5MF@rguT7E( zZ}$ZH2p+k?2vcf+0!&Y+ER_&OW;|;sBOa217r-sToYWXcCK0w}1w*nc z0Z$z|<-);oD;G=rA6-QKWq362U`ZD1TP`Y;=b1h{N!KHK=PiG_hGNcUyPN~X+mGZ0?tc>>QV>;P4aMYwhyf2~@-a~-`~ zzjxJ{hM!1lL#A@O$+mhDnE{|+z{A!V45!E@q4SnSKK;pCrGo!?qc0$m3-x zfTK^WlQ1i1x#1qb2w}J5+W##S%sg-Tnr)?4uuoq{i^Vo`6`}a03ruXaT7S1g`HSCS zABH~5pBn>?#(w)+r@;lc@^{BZeJ0(^6*n|5BxV^PoN_YmdSt9;d1a1ML1fM z#YR-bc&!^p3@8JbKokrsb#dG;T!KMgBr$!@wMEcQNi4;sT^Z->aY-RC;}23t!mdtF0usT- zYow4zR-n8_*#NJ@=^ziz?MIEE%%WRXCY3+*Lvr09eeH3t6 zlTVE~k&K=2=pJWU7Dr6Kb4)1>5v9g91Rr9LYG|tCu@r{Oku{^-%l-DxK4ygy-kmld1#+PKe`kDaKhmSXZOe3P+rrGV9H;32A$l8YXIh5m z*!i>$r|tEAEb7Y88qDOEki7Y*b5nlPYWizk3!lSu%X(w;wOev+!4c!^IsbD9;{!5-M{vE*2YKHS;ulxd$~t^#kfYT2l(Lc`~Jxnx#bHZz&IBKag9?t2tW z2S;67t(3QNWeHSUwuQ8r9y0kynK>~)q}rzOR;>aKdz(WAnmik-H+@AnAqjJO3I0dc z8|b^z5}8f1>-wsmJy4+?ZhV9htu<1x_l^B|zU_jg#{KSXgBtO}~s z1%;?)^WLGoe@aS|rS5KzP;1$}u6ASJ`-cbULW0V)oN}q0fOsLum%O)uI{TbU7CMC^ zQkRD^1Efwb0l-WF*5pu9igunxje zvp+@T1sR^VC2JRE!lg=EVVaXUQHV57r`T=}^l)2hBVK)6BjNEGW=>Q?FpO{lk~Gey zOPwQX^VcbdceC?KWIJ6dst_ZwICBsUR7?e$(&m?6U$pqjm&0`}QN^V@sEDPKzWf(2$lxaw3>u`dzodb z_jpBQDZ_Hdrr9Ue$7P1jGLD7eIJKtCHr$kSSVX+p54FA6144IT-A7^Z%yu$t5~re1 z3;8~G?5q?ru`Pc9;i$d5punB26K4?*{wi7zn;*e)*(-|uh77M(^f_Nx#-z+Soh{qU zhmv>dGntXD&N`*`=dqc}E@uM|V}M@$9Ws>`o9AKhoSk&(M zk)H2GTz}Vj{~9kRiIL zs>s(WUS@E8#FUT-+jBzo>_W+X(9?7)43@M~-0~-!ixHh>r5+0IJTrhjVByHg6x53- zq^zj%VjCqhJ+rtZaobWM*(^dfwV~W`cfmPr%2L&hItW_e=~7;O#;~pAlhlY+zipy> zupDjo#7*m&w3%I#y5+b6Aw#)4?2B8uH`m@CY-~%b_SZ+K-iayT{)kaP_v$zxCxV>7 zIC0{LE6Zdl#hS?VnCR`$Ebls|eLz9LuIt*n1_%GCb`5utg=;I=mS0p|8D)%)L=4_IFdY0z#*KQ^tgDD6|GUCq-fxe6vJjg2Hv;VUw9qrR_6>?AVD2%T$4u zm=1#A;|vwbxeHIQWVudJ-_!FxoXti}vXY^0NADWb@cA;GtI;?R8=+K?aw|Jv{_?XR z)#FSyhN9}~JcIACNb}q`e>q2)!uTXS@+^T`laa;B;7i6o_CP$3)J&w;66qMKyz*Rg zt{P}~fb9#qE}WveB5a&*ZaE$-)Tj;%{v9oMblr`0q|_(jm)(xUwmIm6^>8`Z2h#5~ zV}DL(StAA_&6VOA=aa7BicqvN+HBKB(wYqZ4TXJ`cfk`YD&Xn~H5^kWwEQ|7agVox;#V_NVJT+Q-8z*$-lu5>xaqwe~NUXQ(-(< zI={|FpJM+mu(;Rh#GK1)ELG9IJh4(q8pCBg7z|a4l;F1n^U_}5@aVt^-n)HmNho%y zddg|uhM-~JO|ZKG5yS0Fjx3Howc!0WLQ_d~xqGPo+2#ItQ|3C1Q?~g1U#e|t+f^z( zA^?ERAOHa5|3g-AHnO8L+}8F~Bo;>a&6Q=;8@HZ8xKoEJI1!L3;EMy%HCEP22(C)K z3fYbh^YC%;-G1Csg*e?@!VSt!&$-F@ua&dDT`J2uq%m#fnX^cg3FgE*@Ig}gu zNHTL^&xQQx)^G&%*4kNLKN-z&f4~E2Tatb^0(-x*vy;jBb{~VW1)9i^9ifwCqTezF zgs5Bi;N@Q%juACTfCWw)Fqbn8A}A(|ly{0B2+3Vq038rdy1&c>eJJ)eFGRD*7Zfjc zXv_rnHm;2EKHl9Hljy#I;;PSrYCq6>Xe=TYy1Ktc4j>(HPVTP;GR`&Cphxu2y=chR zpK5hs`i2NFV}-UGJRglQI!{vMLdlu|zTPu%IjsWNjIuJX1O=Q zS14Xz1;uoqO)uzfyhNYM#7|Vus#Qn_klcwQ=Y5|`EX~z68IeB}PV_HPo?`@su@W?8dbLmq8M_!HwaQpl=G+$RnShD8b{PNf`(5RWuuxJJ zh0lXf(`?M$FZTTR$5#O-1_a8B%&e@(HgNzr1NwENel4e2#E$yu(L!mFohw&tNytE$nRB=;>Jl?aU_npw8(- zkvHKCJ^jpQU=0CMj7Q*%c&FH9#Sm3!&-=K0cqxPIUCt(?OlzD#DmgU4O*Brsx&Xso5V)pL>c|`W`^7J+gJ!j2@1g zgLhCr0F-#vE;D3Ku)#?6O)G_K2-H#$3XV zjpng3cZxPhl7+jM)bl0_9qXleWd){eZx7r>yS{%kZ&@{BryBy zW6ANBpqBuhxiq3`v8wN%ggdfgP5A#x_;@r>0(PN^9IhjkSxw&z4BK>#X)Mxuc+txA zTx7>WfI2aS7n0BMPTH{`QUov&X}ja@&?M>!7?}wQ%K?yBOIP**qx;eGWP_}t%AWRj zRXAXPu8SooD0g7ICyFb`2bkc`MnEQ#6f6IItImJ*i1w?!{abm&bx0`w8CjR7@tQ+{czTVu_pnk;fMkHox z<5PW*5q&1!&>fI$hNnDM5{SRD=6$z{jl|sOOAXYwh@Ub*@PM4-Bo{}ALX`S9A>4Z1 zopjpn^CQvQmK=1u?s|W2(_#&*`VqSI0ErX6_+Z^$Usu;`1XCd@J!9dwQb~Zx*%qVW z%`YM3l=fIf?q1lNg|QArEJUvYVZ2!8(Eq`2@j;9AX77byn->R$Q=#4UvL!i%LC2}_ z^XS{_Gri_v=z5%KM7b-YcnjA9LC!#@c^~L}R3!AYkSqQ|L6u!jP2%S@2E_=*#0k4Q z^|NkskkI6E_l+7H2V;hmA2001!tPBgmn_43mi63q5$$foQ^yI7@n73PbATbsDc@d0 zfIF`Q8*RDAiUuCmp@>kuNk4NpFSD6t;3KK%2@B{PFf)h!g8Z5`Mk?pnaYh1(KIogE zte3~pJHgUGEKYG0i1q>5c!j$&wRgJ<#It>4y>m3r@HdhDa}~`xw67n1h3pTaTScud z&^7eCT`E!g*@y|P5($A=WXrt=gdw5_^4;xDF+(RSbA%uI@>`}6E-9|P?=%(jH21C|Ey&UjoS2fnNKm($h>^2Sm-wRT-O_ z5gZJv8uZTt=R!Tca2>+m6D36i^A>A=lVNtiQ(`;&j&Na|@n$ecKQN^LWGqbk(LRR0 z2RWctLv?Ny4dk_QshKG@F>`KGJ>WxjvBPtA`JI@Y>0E<)q~#T)9C!o+uHdG)5^XKo z+Qks1@YPAPDs(+LYUCOWa=kO4Np{fi68PHl5}xJ0h&XO~u%KrYZ&Mjyh%l^QvpfTD zz8^TpSdPe40HSS{KwKz{YY^H-GE_jAz!NfYz0|i{8ZV1F23%c0DF)q{20KP*pM*$G zUBj&g>A8L&!}RUpacHmEJ-fFQ*(JjD^zvsooKzfXo=ZAk>vC}dU~88g>r29?~VC4_VmJY3HI)_ zo0d^h#zX?a>MZ=^Fi6C$8RPSy_5+dW4iR%gmmuO1WK+a{=As^*t~1p_B#R~t;K}I$ z+~nv1^({c8A7#9zrW$7fC8{|^^eu8cHV;Wr1d^iNFn!73RJ0I>G!O8A&ktLB<7djG-}VjT=-H|y=_0G?z!q+=#J>rtajuca_F30o4S zfj`K!m(j@nn{l!ooVM6SWsOLaeyNO4Y_Nn{z&zCsVHWc#PxF%usj!@7JRoA~|BTiz zuw`r~>TB2C5^gh=1e3<09b4dn9vNU(khYVc%;j*iRj8{;C4DqVXvxG3D!^6-jAt*p zCI0GEOfaIJzuyIDspOUEyarIu1!SYX6Qx;A)EJ*~S;9*`Kkjs)i^w4fdCbtV#NIDD zzd9L4f4Sk%xcx|AK^%o};=AHlLmZG1x(h6%s}EpZd67I}%nY0j&rJ2gC*UTahb zIJL$3JZ1alDs0&As7KvLYmZj{qGTMoIml){XBwkj2<#lQzcghj&1_oL!Jf;jimAg5>(W3ygyvdP{5$4;{ zV>#hEO+msb`AA+_WB!`eEI zGIgCOrta_VM%v;`E)E|4>NuN-r`*$|@qrmo2G}j9bHQVnF=CFUi7)T#m`f%BdInQg zl7wAtZ3tHAxG3abl7MWiPFZ};6j@FL9j9C&+Euk&Jit(9n*!0h)Kkv)NsK^Emcn0s?&C9GnKQd7rN>(M>JniAF;Z28L|a1mxGnG>u|Y-L zz^1(1WljERuJJR3!j&y+8;DzQ=YF(RXa{HY@LBkAVi+JhRc{UKUI$~|b(HGL$yi34 zP?O83r`wEN!Q|CW(oMk)vLMxq4qFCtsaGxq;7ZlZ6q57V>n=b8T5gg#vUnc2$0)s+ z&rymQUY%UO>IrC15psxou$O`k6J+LiEB!)s=q28mWlX{6N`m~OpMlMS3fnc}1c`)c zHXVnbfUkX_(*aS_xd&74od$n(5$m3U9OJOo%3;IwvJWmTs8NzCd;x{{FD6N6i|Eqn zQLa5qL1&kFA%^EA6&1#^|$fLJu&0NB=|l znv@Cv(QbnB+hmClwW)BEmA2E&#z*HkK#}}UEn^)Av9GZ!^;MC>`{^W9j<7Aj2d-${ zmGzG4W(wi|2r`+oY0t}l6KaqG14-m=xTf0AeSlMOPpr+}if@mCO`h`rCMCMDPUtz5AYN;JG<;**HNn-G9nR-|Gso zSt76+q-l9!P+|VIJ@Thek`H-n~9HEh||ITYy@s zhPdwncEoUAt{T`LaWw(cM6D<2W`E{iaV*CYWCc|#jjb2fQyXaE?gH$N`uBJ?FkjJ2 z1yt_16i0*^A6tr6lazB!CT7Ge9&A#aDqk97Xv2nI2pj~P1R0cI>u>vO-#po7;y4F8|OZcrU>sw3aa ze7gz?l@PR^j4XeYPxZsNIfp-8o?1a7%U*+2SZBtTWL)0Hu$mLn&r&izKCj^D%Y8tR zkhhkO!xC~9>)^2tpgV&{O)@Jf{W0QG!(@@#bc5rL`i3o4m8`x2Jn#Lf{w+$WHa5(F zXi!DoOBJG|2^=FQzxCK@bb6U*881vT(z23GR-x4w(&&>q(L+w=# z>FA~9ou}i?V@>p=;?HQ-@K$YaO}E;N=L>VB_PXik*;&C^I{nwuI@2a$?$pyM$PFc) z4fN7VXQ$lctALIUR3e_}%5$nrF7Dn#&f}JS>T=D!K=cO$3rhzi8H<2vfzPACnr%+x zXZe9U<%20^E%sh2?H4jJ>kPu|B@vqo%JrxwZfE)`n61UC%_A?);Cm)9JA8=a$+4RZ zT|$EkMe*EXM?4H@AzPsr&p${*!ZO#wV%T~u@eY;{KhZLgXO=D`I!}92oF*qN4bxvi zH_ELkQg#F~GHQVnCvmQcv?TI8mZoCaezG&A&^@4^3U>&7u%G}ZW``(VPTQM z(kP+ZuXWNSh0n^a#`2sThgstYTSpptZ#^y%%qA|UFv2Gj)%A2O#=Ub$^b1t*Z^R^8VC8|9-##K-!>97 z%P5YU@(~I$qnWLyt*Gd*uviBCWL|0ELQ?W?8`ei8O(<&x2YEG%)>Yi6Ac|*jLE?eccZcV&PZIhQz zITeGYvpXb9s==E6(dG}`PtJpEWcKsMFeMJqD^kz8dxsK;MFKC&msn0FCu1yDlAvw& zCz@!Z|64Mce7{9rpJU$LRbv3*F|RDUSVF7krRO4ASfhJ z&OA>NpQ108WjNfVdA4Yr6_kkefZ(5`?xkM=^r{nxKSyC&zq&_a@S?))o$^Sa+$@wJGt&dlil$2_e8tOQMvg;95~YL@=7MTuBZqPE4$oOjKoVqMmKY?1 zG-l$HQK%d;ZX%p{9J#L`k}IjwSIoSs5@D3$J-TeEaK_eT zK=rhb^XM*`@>eLSA(%$gtdlph&6YE@;;Osrvo=la*t_9l2RWcDi|*`qbl6{`!{|!8 zl5=~s-=A<#&A-iKhuB6u1T0oVxmQJH_U=CR*{7y#RMhFYe=19aq+8*iSJ~7|JG#Au z2gP`ruE1xP*}Vj!EA}u5g=PfoY&q&K&-ch_O6@B!OdMQn9~LqvB<493HPtQ@M{gnF z+H)Ihv$24)`E|ZXdLn-`RWy~CmX;o#=o{~Ti`Ih?YK@~;>bs_?8t>g4zrxnFEYoPK zo~<3-zE3kv30L;z*R50sKLlI4yn+@<0rT17{6bj>qIn}UftD7nZJK2swZlD13SyEq z8LcR+86xO3{UPn5_D?v>o0Gw>QC>+!S7qlawrXBm9DwR`Mg3O~`Gq{}1+e0R4xd47 zaUW@c*aXBpeT+L_j6Z{}HzHsOE~SG;_E+_zKJ$o@?1g)jAj>oAP>dwBcv2gZTJ;R=&FTlOwIjDjUpPf43OP(yx1A$>5G2;3y4>q!(#0)5g0?SBR-I3+d?QoTvOCMp-`@nj$vOgnMCi0=04==^~BsOJ8c=e(|0U&=9Ai+HSf zD)szWRa)W+9bqs+1x+1)<&3(CJN05Nc$=J$HWYh7|YL*zy zrCvEUnz@Ws&(g_(@ytTEU%1V!bmHRnw{?!xg;!6v&zz@JF5RF3b%u5c_aS^I6Jw9f z3Oc#UL?p#w$MSfFBfrF7aGmrQX{NuS`khV&Z=YB@ZG3Z*Zj0f^;+7BBlIGdE zlES*EixaLNyZxI%yIa6SYy0(280XXa0b@mHJ6)sqPC|8K$vnQIz0n z@{|m!vYG15qi#YJ&Q(y}yV z`kE(jU&gQaP4?Z|qE3JUk(ZFnY!+|GryjKB1_$@a>Tgk|WTUjQ;@>>zHov z^6!0%&x7VKC8d2%j4t@v#xcl1NspfP?6=4 zF>3H|RK11DS>Lj|p`-6n1O2;dm%Rim+6$_-TR<6VtAFC`wnAMqr!`_hRZ*v%&^5)q z=3#<79aU*KP$M8-vz(}Dt_r=ac$VH0>4%`dfCO&B^Xu^`eqM~!SV=l0z`CwnUae*P zgTr!~y+j;Bv>fKhNtC05swSj zFv-pVRefg-Q=4AJf`V3G7^fF}aX40W`DyGt!Pi(gkcHPNq#!X>C2z3~D!u-oR&2Cn4BP5Ap7 z`Zaqhcgr;u10z$JB^)w@IY30Bp^DypYo>synU7DUU`Deg36?N}L!(php4Ww?)x68G4{^IqAFWrN?>M9;`@1# zNOYWl#nVKO{8cQqa=wa1JNapz5O%dAq#w<#X&E#ppjb&i|XHcJ!LNz=@a z3YqTjK5rApyiUzW_-!f;5EX5IF4^8D0E1#{wZCGX`W$q6rst26gT~KK<5!obIFF#n z0r0d)(xBTh0xZ76oCB=lbScd8U>eR|C(&FyP%nA+IDS!eKI|sw>NrSLcpi;Wt?VVn zJ7VvPmmhi8vvr8)Bjw*L9qO}=FMv-5a!4lH4`t#j*_GqB*K0c*?*SY|g|Q!QfBLW! zm^cPmBMY(do{xcE!7GVvCTKH3T<9Hz7>ek49tG2ztfrc~ILXG$-j?K#wcYg7!s*YB zqjU_Xw*VyU*0j7C3yv(e?V%5ql4D4%Jcaq9nIG%dz%?fRC7ZqX#uX@U7I@j9*yq3ecJ2ES*9EAPhO4c<^Dw2xWMi|Ac zj^?Qb{4yRh`ER{=yen!rS#1j#0p7E#UeWL!$GBK;4*p$&`ma!Ke^(PBpcNigy^^ndh5O z(6nJIbERhzWlpCDfkw;Zc2kv4=~KFg6=GTZ+>NFRytC!UdB>$a8P+!z2C#4B>ITv> z6dRJ)p~A=BI?nJdx)mQ^M~yiR-`1n52#UK11{H@B%dQF@iv>b~kd?L>P|hPSr* z6O7VLyaf~mDP>SSa_%abP%wO))5ISM&;Ezp53`Nstu|hv%i*?d%OwW2kvHz)laq-Z0QWPRKHu=>CMm#?Kb%+8D&{zcwr1_ z4Yvw(nXq(HpXhl^+sX6UKM-6mVk0rz4~tOlDbV(zw7;k}qZRT# z@O8VW-GmV2>2^%S*OI# znNMk=I;Vju_MI;E9W?u<;wjdkjqnOuXE?oaf=MW-s#`k4h^&4~t#z9sk-t%@qg|?X z54ljqvg}%vy`S^`(WPXXdQoPqHMS-IhJTiR*%&gd+9p`tZnp!CBEpeb?duAD`OJ?d zbKYWJ9uCg;xo?7{)@t$qc?`d_)W@?=rJC(F6_G9Cp)vWbNzYOU8%+9=A}tSW9~@-w zd|^qd6M9<1Md_=`XSE9RHDE z+!lrxAvaCSwTL4^fRzG~WcNdju&sy!7hy0&5lZnnZvA05`w) zFLMLH+RehA&dJe;PEPW)o$%BhY)(R??B{^|c<9#w9`-BaJ!UCS4;#z3$ROEiZOOT1$^&g|@n5aRYQB zup&dry<|4IZg3cCHOBFIj|W`?@T95Y3pT3{Sr?-ZGRX0f@q8VLg90Br$Oi(#O8k6~ z-Jg74e1SlcX&UNoOXwjiXvg%y5Ak$@jOf@!BkCoAyJ$3g&P77NjYZqe^y8rWV)c>#Hzs+Hp|1Wc}{*QD1bK(EF7zDt7 zY<19fftfA%?^gf*7}5WIqJfLEorOKEd9%7jToOO}FIDGWl<&;;Vuk2F7Lmdw!ls;` zhnFCvoGXD5B1kOy-}Wg^EbgX?k)aV9=i|)d&L}%456&C~kKUy8UdV2>CY753ZkGCF za0%l-W)+ES#8jJ<+T+oVq1XulUQ8I#(rJk+lwGO!d%?x&qu`sJo^SsVOCqQDh(N)} z$Xs8=_E^62Q;Xr=S;hM)`zc1oQ%Xt^k_kFO9xDQ$gbB$sM-?W%$j9Uh$@r;qMVAbS z#)d=>ZQs&nO191kI@ANJXCn3f(7>s(Ud2 zvdJa248J1bNft?-BF*`01`2=p8EA|w#c5*NasBHJSp7_CG)eEG<|xRLv`T`y0IK6@tXrH0+cdp^|WkU65%NmdA!| zcU!RJcclATlWq{V(7RrTu{jLg?r}081VExEbuyH=!smdrIYnsejG(;lkq3I;!18Op#bpR1ch#7t)u>I2H6>ho2Tma zx@}5q-ga%WTlO>9Wcn8K0}n#0y0SERs8W9Wpm6n2Mr?JZsa#GYW(WY%;~s}oLL)FU z)#uJ?uKW3^D;4_u#yb*(K+hA}!&pnKcw)^gP+ggyg^UKjdq?=)~ z3DSd6A5D?f!8WVr8SU3a{ezD34?ibG&O9HHIA3=L5aO2x&g<(-*+vK5*B^I*(HdAz zLS^k{ajHH60Ff)vK2WoWAbeKgyd(>GobLy5Oe}7?vODN<+OO|wM)~cw`#1uEwg5mx zJ3`;JptI8moWL=xLRY`burc8ixd^Pjz~~QS-2t82V$i$auO3%Ebo{kQ=W+k3fU-gM zzX$s{tnwd~j0x*Ox1nZ$%=8%2HK7r4Q{s^2A=qZh3sVv^q+!u&0$5K3^3|X36n4UE zmb?2TM6?}T6i*2a5XV=iWp4U{ncJ(l!ENk?o4b+ ziA;`Jd}aXyl67$fY^QY?3rV%QW7n=-H1u0Why}^i)Np2GxgZfyRr|sTw<{aw&}pol zkL!0yD3o(#yTwMAM872}I-{AZz@7OTBOb>(s(RmQ_xb#jVATs%5OOFMVB|HHnT6jW zQ)q-wHr4XVGK(G_t*yq@#i6CgKCd+iYw^zsTrax@q?NL3H+YnV6DB1byjfs*_TZMx z`K}#?N67RWGPBS^sWrXGB-OzT#eqw_YG~ZS{BoP%XXt>pQ%%0|C(|E8?!%MK0C(9bVZ- zpb#TEU@&0m#0>BEZDqy`Zw&Z}BFLo{7#0(Z8h4jTsou_(oJxvmB+L^%gY+5V@$N!N z^zJYBX^G`a?y{wAaN7+4z;x-Tg3p6x&0=BFJYjI%&ALLN46N<`q|>!J2=bz1)nuRe zra5p6?SbOm-pdHNRPqxU^2c6%Za2Uhm$h1RINv4@5mxyCIvDZwwAl@fXV67EzVX*}0bZaO(M{Xi_q* zE>`Gd^nbh=(VYbrMTLiC4o)D0HY}C&g*C>dFK(CQVdwuwNRXou4!bnP_)HB53gvX4 z6|hhCsbTqKN=YghU&k!2DW~L3aSxE|B};P=Q05ncU6@9hZ?NWMj^6oCTRd`mEJzj{ zD&CS29Y*~j*kJ;gR=A=Gr~C=ekK7f=E}S-{Z+auNKOO=oaJSxT5P()H3rp@3jB&{f zAU>#_iqgE*Dq82?ob35GgO4*IqPalvV@<+9(DjE#h)I@0g}DF+_9R9)x!L7T9<`go z?%~!)WdB<*|E8wF_RjjYhq~h4x#3ffIP5Qt!V%nWmR&rQT z%&aZHdNJ5uf}-rMb)(5p_qW+xuBoK?f8dp6u4l5HZW!Heq(fi5ob#?6T~x|zp=I0_ zy`IkY2a~|x9)ky@GRi##Y!$4Ev1rP(fxEQ#n+xbw8pMzNQL4Df3gwkZtTevk*Zt`Y zcmXTVB&RW}Cjt`*3rkXqpeiOyB#SXJ$_dMB%ym^KJLJ+N>B_368m*aWCZ(rUGVAzv z!%0($QmRrVtup2-DE-P{=sXk5zY-889v>7@^eAYeq#5d2i;9=%@cS^yf_QcA6%Bg|Oag)AC3Nln*r`s$yA9I!^We${ z-xF#$emB*ysjH^88`fHow&U-qNi>X2RDjhPo|{BuS{bdloQi`@@&V);b;LB#o__q1 z>MT$7BvGP8lSe^Q7#2}%I#yi0LUTbuh}nu4yrupy2MxTt0p9^%MTE=o9Vx=M!i?$i z@A0k|l-_L@S{dp;Wr~pV#UF^LKi7RTLPJIkmerRbR15ZTBztkcXiIwJ&53C%G4pCM3d)t-5z-t5E_>t6Hqrmx+ab;$K7L>h)<%Ky+ukQ96U( z9F9^z${PxSf6V*L2HngGKKMrF2No zHB!Wm+zYabx+96{o;xzfjO48nM#VD2AO>H=USxLWkf{PcB|-#I;&bdC=fU*AOMrQ^ z47f?p_C(^I()8*#gBa{&Jr2J(6xZkWhp=)8R?v5l93Z#9HitIBLy$$d9+EE3w1wcm)U*021l?Q=zXl%d-+%UWd70)+^b$>d1mv8-ydom9y&Po? zc`4Hh?C)6cD4kNFg`8DUJb%`mqSMLy)t5X_xFr5&Re!blRX0R4HW^RME_oxZ-`68~ zyS1ra@RXlqtA49<)0&Qwo}q{x#na()y@uw)9d@{71ydn_9}ys5=n@F)PSLAauG2p6 zKUn!Wvs{^qgQ-->Hr8-4E{WH~0OMNvNUC`#Igyk55niM`OZAEJeYTwhB9pW`{Cf{0 zCG!-2$J8aqsFS?q@JI#Xj&mvv=)JYisA0uy>D0s`LXza1Fy-jM548*YuZX02HvJY> zc5WDu+1}rCLx2h!CPn%gP;!kZF89{m%fAn8E)d%3&haaz5o;D6- zw1}Apy`CCAMW_$&mb}n0wUVgLUpDt@@F!7)&0UV{vP`9aGNjEpsL)^r#VsGYop4L8xirW_S|4M{IBoJiai?l!$5dH8I8Nb3S0hsA|d>l z7}#{il8NRC8$(y$8Q%@MiA&OthJFsyheTAa+W6{phD?ZtiPIXFnX**3*hoiuTb?e} zXvGoN4!44b7D2Dxjj8-(H;5=;cZy7^YqIHzRV2eZGML#zt2g;dk ziQ1S}9gY`5UE>su4xO_Ms*#!P6OXExb}zbroU^O@z0<7%rBQY+ja`TZ4OpdC@7?49 zZ{1O6xOBB4t zGQ872gT!`_U2e+`e(poo*pcDOA4RoVqd#rGjl&)dq$FzF4aq6UP4nhX_E^GHG`9ME zIu$rvkFzTyd$FdLS4%9Z?7yd@1Q3449Kh&!(rL>WCmYoLQ4Q^zNVO=ph%{&#v~#{;~4B8i2sGA zjY(sXAWN|^$uzyH1I-lG=i&I-7#CS##SRU5D#CS>fG}xV%mO8RGrin2@ zC_+M}B>>}0KVz8t0csVh3+-wFjz)ZGt4_c;k)~@6{z?PY(7%UJ?Y~@QiYVKf%%r== zH;4-bQ&54ITj8oF%{z;Bk0#A=zz+93So6~2s!c#LJ*amV@FXD+aE7d83+AzX0TrsR zKm8H6&LnMr5fTaKli5KWCuOTs5RcvhJt6IC2~_v{6be;LT0A*87>kc{-wEl0;02vy`}$zMv`O6A0uo?rw$-ye@ARF0_c9GhJfJzyhfpddQqLqY zOQTuv+ZC8+)1zXE2fq27fsb2d3P+IGC4dO2OYpe*8}wnv*7NES6F5PPF5<_cJu*j| z!c#ApJOL8->%m_bNx3s0)^R8)d_nfz%^U+K__V>);Q@~^oHF1*qCY7?yCIl#;s=TFmxpdH2R0-JRq z@C6qAL7?eGOO{OLaMwaB^>SokhY_aHxRDY88_6~XI_?4Puv7sY(Qf+0~!NaQA zi|KD4-tb{&^I*cPtpA)8A&RQ@uJ3BQblKn(bW315jPk|r0zokF8f@uo;hQhwOs8U z;_ke0dwivTXH8%#iQj=Nv^MSXjgRyXeFh&)mGnPxhhrd2yykzu&C@``+g9|(46NG$ z-td_nwl3Q+E6tWdYdGO}gy2MS)7;xTz(;AnJ`$5<#dx(a9{nCyRy-0^WRs*Wp+Kcn zR@LL@E$pw{pGFS(Ab9J)@~*M@DJpG+$hBaa;bwS^NAGELj&D!8 zlNMP&3F%bD`Mhf$1o^AtRE##3NooSRiPV5PrdJ1pk->8a_G9@ICatK>DiN?y)ss-O zx`u`P-CD&PX?nUUgbj8LS`O%Aj{m@CWYVQD)gtFI4M(ni+t}ssdL?k}uDiTW^tb%f z#He5X1lz^VW#%-zrV7BFY|ii)G#QMpK;&A?u;3!uQ*^!v4mYTBQo=< zy3OU_i366cCfZ&O*dDE_DzE0v1 zfNS$Qr-#R*%F)0GPEm2`*~&-L**v&kGZRz^qnGQG?QVkNiM-@&!OTYFRu98B&R~+7 zQge2gKjiUn06I&4{V9trZ;kUFpE{0_&!K_*CX2I&kn`zuO* zOD67$Os1b389c%*=TC9^n7^PoNa-h}(iBY`kWW#GF^~FmqbD9NLdz3(aY)~qN2>>V zfU$@4mo0Kjc4B+8+gq2t3LIe$lNx+ic{9Ge-=O~${hVY?&fR~}FB0Lucj;_Rod3h6 z+k{)-NANkN5|u%QIp87PF|??(28pz}e+VwtaW=A$=yZ>`-{onfK{jXUfe1)#WHLLE zHly3>Sue~oKJCN{`FPS$;=`Tm=5o8)8CV5|>KPYK$&)ZHR`skUImSY_b8Dj^4^Npg z{j&_+*g}jdZs+6=Z8G?#7Wqi6 zaHWn}TD=q}(1-0NhSr{fpiTzb3NrGkD3lPZY^q-9@`EBY>S@xhT93_$q5IKDNdbzt z$ZVjoDmhF_3(#%Y_KSO)*Y@cqaW)|0UNhU(Gmv_^oQXk=%J;)Vt}9&oKhM zA!-hQQhZ#0cOrpts)QlB^^F+P*JwWZtyJ7IYGjg$m(5a5!Upm%Az><^n@mrg?wM71 zN;%z8g(QLSP8H3DUZb4)F6uW}$m1&2p2W}!t&PH_&@Ypya;=z}jkb(~AS=ut@XF|I z_D;L+yYFQea>&X2<1dg_Wx{^%{qZ&rMeltGrr`vh2Y=L~_hyTL05)vRfMRbTc=xu# zjciL#%+OjYB{ro8YtaQ`aTCIf!h|@${1htfXK%B`|F(cIt-YHI&@f_1IRH<3BZWA_ zaUuoMY;N$LUzesdSvtI+=N=$MJ%AX%(>yfgB02`3Fz$0XBP4_=U3LDXyt*bLx#E7o zNOl?6dAmVCw!5`n2Eq6rk=3@Az8C|i-OfhP0Y7v{6l*)&HoH{%U_g$QDNj(A?_RWk zOB*^LH&wH-i=bn62$41z9nWKrSPF-|54(_SFgf!J&=S$fJ{&?xa|inp0SEf2%+!EA zMh3h@c%5B6TEYEkaOV4+eDty9z)mB}i)jaj*^Ng&fAn<~lCTOlB(yg8KPQGE`F0Kx zfpciCYw3<~@rPk#o)$MfnZKmCEmw~vqY^hldvJG2LVtl2J(QoEkhRJ9!@=0${g*DT zuoI3%cZt+TRPLF6_khT7%D9r?mm*(~LZQ+}>Gd+@KQ*0Yb7Af2zDUqe*TXj2k~qV9 zqG2wZjEzqW8WK$;W_dmd>34EOU!DpTZP+Of9wNS-ZZb9v!nWqknLS8RC>MA&q?IbS znEWZ@sBmG_vajj}wI#btH?BR4g|ljO3hZuwEn6cKi}ny>wL)Ut&U=pJ==HjtKZDzGL;ZVZXu zN4B%?iT_l$dAo`}a`VGM*SsEn_o$`o&G4;$J(J}P&mDQ#CGPIDz>&?Ncpbx2_{Dgn z6V$JmxqBQw^ITO21QxIy2PVUUS!L5EsK*)#yJCVNJv7-NY^I)eKLkBMWE13)F;n#_ z0|vWdl@a@SiKGI%!pg0-tZy@!S^;K-rB`NI*J2S?;m}IiiI?{uFZ=Dk-?dtlS=2Y* z1XY5XWw?~rw=1%J9SbV@H$u%SXc?rt=a{{6C75Iyu)NWu7oNn_cDZQwVNJ&%kY=U( zEJ$krUy!Y=@8?a!)bGoki(S2UR~7Cd z+a}&t>wfeU;Ni;rczN5NyQ*As%!*v$DOqtxz?S&jaGZyh-%XabEtWVTq;BxmCnLWX z4$-T}E8(KdY(nz6P6wBa8p+MpY|3RxXXj$OveVe-MiKuFYaQMScDp%t3aIDMurb7Y zx}{{rM6<{~pT|+1W%iD1U0*oI^>z~LZotSd{V=>u_doySi8M?IqliN|w#?Uj#N|5` zrorPEO^KovH?5o1ufuXB-He8NxvOMg-$PsFnDK`hE3#|i-8XK%d+z6*b6;S6QEP_e zo!3-xZmES}9Ej)}^(bb*TIO#2jXK}zdE|b%w1=pyRcD}$3)1e{{ok;KmYyKsGc^;x z0}24p1q%Q`{@+9*e_>0{$lS`w#pV~iR5yPElK<(u@dp+KH-QEtu}~g zx4nd_6StVuVjq;hS!CF{I;Z@9yr5 z=NCt=UQS$na%7w$>r#z!%!Ez{%`63Vplniq!4%l69xqTlb$zA-XTqA znR9|6q9N!~Og>#UamlD!a!NQ|@W3?v;HdFzo^ru)T&U7@CmMr1(MsjIdwm9jXfKWg?f5(AQAG zif~FY1!3wOrJ;93s-<2stMY&i7M@y&K<_b3jnG_njzG#DiX_vjSPZ=Cr$J!bh7^$i z*F`AItP0}CWzDN}CMWt%< z!9HVJn5556Wzr&}fw&(RH4xKLq5q}_rxcuGOm(Uwi0`~14>3ZqQdD>ssfu1IG%Ey$ zwQ18c9T8Ksi8YjHRffCFbpRdDK#<+Z9;O~Z^Lg&OTW9!T&fc(t0;|fgJ$bwR>_E|b zywa-f0eYSO+>-V{01fX^pym8)(mh*DvPGNo_Zl4)Tpij|_ z+utnDvH;*_;3wMO6mr%WjlCRmI(!{UFnaL-Dn*r{*5iCxYWB{Q{*FL{Fhm3B@b=?Oh-JH3nBx+n?^_;t3Wz9Y8<{-X zc$@`WdY#G$4)2Az-oMo6gbFigbHg&SDDh>9KG*0ftKZ$xtXeq0r*ro6wJPmw zD>FOm-N`{UNG2}MaHxwT)DsC&aJ|={YD^HtSQd*D`bOR~=N_$jQ<&E_V!Lwoa1#kz zfp*a|ND4kr&EA{J3?4mI1lhyR_4x4*8w=+@mZHu~z%Uc)a0=u6LL7ioc{~6mAX`Am z@6&7;(W%qwBs{F(fO2!l)F%lQU;Kegn5poJ8I?B#E%3T!eJDE9|7YjXU^Eq5cvUkp z(iMwx>`mxnUhekbn8tZ~Li26gyZf&@ST^k6?c9FpdX>~{-eMB1&v*XoU7Zx2UV+~& zYiI6v5PjXc{?!BErVA*Fcv5+07`&j3?6AsCvb>YOXat9FnljqvvExB|kp0J9fVGI7 zC#Or=M%eMP=+gWl?KY7&iy{2|)SdLUZKbQ7lKqSPn(4Uv;oJ-9Y3PMS&an5w4x31K z^Z}!vBnn=$LI{(wvE0mg0jpbj#}s8F?Lm7apXzf%I|ed^Bu#{KlUeM0#e92$%W;km z)@XG{PJpc9Ij)MyR$<6Q$Iv8G^ywAVk=I1?y&fk7&Fj)54hME~jV*nCp^Ty(eb8U5 zD|*jnYuAEp%`eD|!R90^2X*&Gt&!n^nzz~lSZAxc(y4xTcb7}#8!*mw|1T43*uhWh$!R7s#modNZIWdw*pEZ6E!{o zG+HZ8wyuphge%)S%m zL31A)46#nC(+R2S(MU1g=UhRzNCny>ec(c(L+0y_XiPNfs3UXhTcmOa1L8(jtL^c@2`D6Uhu-5n zCb2_AFrZ0u>3#tK5+8bRHPVCy6)WgN^LNccyDPgJP#1Y#9sw$`=sG9{^Wr7Ydq>)& zH$ps!OBbeoU9N)^`yPdG%(w8wGazZ0J7(E(l8jJCW$+twqXst+ zEpUT$l>N{?DkcDA=JR(CvN$)%wT=`EZkb8tKISckRu_^ih)yIMCjO=xj_UmkN-ZV{TwoP>c zrY1&kq;}ay@8B^U5zMMB89DGAqE&;_N{7qBVhaUU9K}v}i)=Os>Z2k!6K!q62wjpg zvSq&w-k}=Qh@YV%S6NqV#un0=R*9lfTUlsw5tWsO)yk?IiQ&Z=1Tr`I!1CFL$bXT} zncei&xuBQm&b}m0`U2`Kwt~ah<+k7lNu3g#(!IzG04I>~tK6l||Je?gpPLG){?`CR z0I{artx&r^eK&}Yu(L6-U?&MZ?&alT!4=x*=~QXThq zSV4j#0+2nOG*7iffIfj6{q`)iS(7ugU4Ct<3lzOh1@u!{-;(x@#L!0b79V{@Vr+l; zT6(k%lz=#j+nG8AzaD3DE;}^Y+Mg?R@ga@o>9XCSnvOZgR3_2cYON!X9D^02$Vc(J z8fu#=>?tTVd(eoDON=mfs?G4?3HC^u>VO1+p$G>yc%urYziq-F&h|_v4-Yw6^GOu|LWl3EX>7 z+s)UCTIVaP{bmm|bRhjzQ~>*P9(VaU>Wo2JE~yFKu9qDhj4t%E@Z8hSnq69l4x)jG ziJOZR^N|qQam>-8El>0_`v>d`Ub!{hC*P<42fJ&Jp(VF}?+FC5Zk925_{@S>>Wueg zI2P=hoNEnb+x~DMCtnbs%;71xLv>m7@WT|c%u?Pzlwx7Q)dnYGEFB0iJ=F`)6^m}-?heGJDZ#*P z{d4V+pkSj`SWy`@CEm_MT0wsZw%xD>e1^<4GPy5Zjr4T$IsYc%v(wBrx&#Yn-S=2#mk zIU}-f!zPJC_Y#k@Il_2kX)-V*@HfyYph#GY-a0d&V%Js(1E?VVGPN{1sV79g^t8x< z*OFI0!QNVs$ews$@ACndY~t|C7OOC;J_Mx*ZA5!KK^nqAB)$+u#F{5OAxfg6x=lAk zPqZ;S)e99mpg_86#Ha{TNXk#T@vHT>vbtAK_P2n9KS)J9@c7B^DSv?j-d#`4uJS zQsA5K1;}3YfA%Dp5_~v*faZA~-OHZVX>dN7_Ej~W6&t*k6ef)=1L7Q)(C#!>(=N8$ z3)O&n(tvI_^!UhHB@D+C#ww1ddC_94V@c-V(T=o+nTBaFf26=l=ME zYbKH;8&9RC)II?K(^P;Qrkoh&?ah`-MqDd>SX*C4;jWvcZz%nq51(JpUn&X9NsZOq+}xBsx2kFEkf44fGr84<~q~C{)SbN zRM5Z7=|GV`^#-1)Aa&JSVqXMr(e;PMA)xF43b=^hXZ{|shrVo$HN#D899W2r18R-* zNZ}6ARsssL+GeTa4^?QQqPMuaPo9z$BF5^bf9cSB!zczZ{tv<`tb@)|o2$f#Rm~TA zmWPW=;YMxwlMQQ@%J|9gtFww?qvEz+;U%yW#vkjlCLnnwKGe~INIo52nOEtv{en!0v@8n2kawOKbN*Og@8BQwb z(?mJF>M#4|mI5}XU6^`)lqJ;r?`Nv|owZ7}tKxxWO$rO_AhV?-)x;w1`c(plXtYHT_klrElS zGbgqd+u=OXzqNIj0Ix_OFnGu>hj9RzJVuO)aQfE52!U0gWcPSN&HMQL8qhii>_Co# z0NxrwED3mGUHbrQiNylBYj@5F{;6al&`@3eLRDHO?%b5Hr7#eeL#6w^c5Rq|CPnIO zj>HAo39nEyEz89bPRc&Dl(Vh4&&A5yN8_@(LiBhs1DHyCKIF3s&h!;GbQ7=&+AeiT ziQ_1>Ncpa$Ekh5u5Q6q_waV|yGT<{oQ+fP971EReiSGFDXt;Ls_v3xCkVF^skYS`GWFiMWSWFLZ z+WRv?SOSeeJ@L?(1tbkeaPC63Xz04I#JC!|zSLMxL|~aLP{O$TreuJ>58VopdBA6j z*jQrE^-8=c5YSS2H6!Izz7;3At z&mrYsEL0I99*8DYA3UR#AS}Z+ZSaa{h42Sy)l*){bX9i&akr06@mvkp>BgW;SUrj@A9-N1_`M^t#t5| zO%LNJAM#;k6UB+ZI0cDt6$r=2G7LDjCZ>}_ml52kR6L+=UF2we2-rl13TMeuc58W; z(A=DM@D>fimq{qc|1{?x*KjXIDo59Pb&9I4$*a8F-J9a{$fmsaYVxSl z5lPGQYLsRO;fE$saE(kkdEs$(2p}~P=m`i6806f&XLT$~YaqwPjr@9KzsZeV&l+3? zGVmIRHAmslXq@<(4#iGH?im%V zoNqhb#nD_N^{^cS@jdSbwN8ZdFOl>J(^I*9vesRe*6C>gJElnM+VOSCDE5k4@Sw_H zxI4tu_N(Y6eZruF?j+EB2Y|+i7>YFmTMdwsIRmcgJgB`_Z7_jCP~wh40ZKbv-~5cB zC*?a58g(D&QFc-v!fyc%5%c*>rLYQbHw6^gbzzeAYX%VZV!5USz0Bz-+>6ewqA4Rh zh%48#mALzA!tdu|4nTq#B6LL|*dsV(7=^UWd%)|%Y$F&Wx}E@qv_Pa94&X$f)qNuK z(*uc<_Y;XTbckm<7^O{PX{+2egw5P>duY%FzRNUu)wSdg~y{HB@= z@c7uI|M_yy%OvG5w&B9Vbjv;9n-;**2(hV{!gvK)?4s*dTzOm8?~fS*A8yp)Z()`b z^PEzz9~miU#z(4!>ZUG8`Q8JBs&h`NZ z1NQjxgg#)UaL-}E%6xB9oXyRCY&5$VFV#j<8 zbe8bG&zzl~U|>Z{CzX|y)CfitC)g$e&Hl|okdX=U263p{S|I!7K{AR8h3LfW^dr_O z1H0+HIWZ5Vp&!p5fjJsvIkVAscP`BH1|WnJx~~WmxuvfRooRp;^TSgkRRX2LK2HWX zl*4;*KF5mBaSbk^z{DE_@~e}j^e+DOuuO1`M`Yw)DO5xu8jFT5dF~BL_m$-i<$|#g z-S62^Ir%2+v+#BI?ZfC%bIm?sqIahsnYxI9ze_1GH{WlU^1Cb)qO(18mfAUKN$JXFaYvv6CrAd zC(fb=$u%F3`+OX(sGxVrbeWy$ZDkYQRl1mcu!am}G5}QzIvAfhyR>)|{hB|< zdS)!3A9ep;V@`_aQ|h;=y2Ww_X-9}LY+{=_w;$z=3DJA^6ozBvNr51*xd^fQPuC3j zqUuoA)-+GnX8IH*OXJ=51pIF;KP^)u*~RhHvhS9H#mA28UO2X0>e?QxypM=xpjFr5S+2Tjq?rHAT|T;To9v$O9*02I7=j>TW$s9C0S; zMd0QvzV#4Swo$aiN;Rx`zUIEq|Haa|A`Xw?Yqw#Q%Tqt#wk0MeW#^ez#IclX!x>L% zP-(@J!z4KlO_FhWb9=>_;)=Cgu1R>34)W;HQ|L!Mjg_>$e(BwrM~Bq96E+Y+fgobR z`vOqZYZ-flY(c#X^l+kSno~{iUAtOr=RPQa1~2S!H(({2DtFO7b(4$ zYY_#*i3xQ#iPCaT?9=JKWWXU4oRxiAoFe>-Z3#z@7Cm$d9tsVY>lXUJJ|^sw{f7x8 z8D<{F5&ze;E7ktp}ro)<|7aA+5d%*Bl-#9X+aDha+JAxdESg}q&t ziK>veuy(o`x%ObPekfwqv>6-Z0>p$n4{N%R>_CJeccUEXZYka7F2`w2q#Li3S+dfS zvcSbb%}jYkS;w`2h?YM3Rdzn#i!l^+Gilj8#K5()aRE| zl{eI9x3RUa) z-FhHM^<`g*3bX_gxO2P?`jQFZ;y-qUHQq#6)@(Si&&shnYm+!6{O!{`V~9|hI}bpOyY&%t4nUL>HioAHz#P*Y)sJRDYz(+Zxz=kcdNJ{h*WY^oOjuzRbuAyz`=%^+E|5Gq#3A(s$a2-LHVSEJ0uH659$z;6QP70havEXmYh2bx#2; z%4F)#t}5&>2qg9!`wl14{g&6$H_>_~qe5#PjV|3J%Sjgfi4Nm0bDtfdnmP_+hBlLc1&i?; z9BpQ*!6ly>i)o}6k!<5-*fDpRpD#$B{kS)XrjPmct* zRz06L%gCe00~NE=AWhhRI*%kuL%d^bjfU#6redYTBR{D)6}MDnpLUR(Kdm4+))0R# zyS7pbTzXzq*AluW>9YwBrdy zWdap&`J}AdI-fVr&R+P)jhi0^JyY;Lls zzvT&f){tsOpzb$YiD;brp%BqzJrl|nv zN0R!Rx0s=}NI+X*Mzn0?6C{)^6p~b2;Ffc18yG25e82|t*2!f!?$A#VQZGAGkpfFR z3ZT~2KXQLEAb@lWiljhXOgEK(O0~_^OjL_E1ye^Bwh!ue5iu17cI6ZF0hALjdG1@3 zR^A;kTH4HjBk}2y0#8e2e4<(yr`%>TRTII1JXDA$t1OveutI4mr?j;i=R1WNg?Yp7 zF)vyqb*iU9H9PZAbtaQXL2Dwz%JvB;HXY_O9}BiYgpufq=J3QyW$__iqx$~s#SDdq zn#n^srp^z+pDmJ+1%K@DIGzxB&xm_#gAl?%O4_xgd)gcD?}5y4KM1dp+1<#d5!v}J zlaqzr*G#8I2GJCrO=y1;@eI)*Csr)#5a0q=`uf9=nJ z5{(&el-d($!?U5vcq9LoVdXt%fUf3+9en=@rT?42^Eku1quF_{+Ss>rb7p$}2WRKhC0N&`*@(!n zZQHhO+sLqO+qP}nwr$&H1~NL{>Z%&m-Sv&`(LdnaoQu8oTKk!ET@$$*I*8)=Fzy3n9ICCNd}h_2}lZ&@pk4vFGM_MrHUr>hFjschKev=AbfxrF^AY@(0!O z#l{BqgFJFqQDbemYs`3JCZECdzQ642t;Jk^@c&G`%=QCqNn zW&OI^jwg}Dw-hTQfR{y&Shw?7;reYu5~MyGzS5w6ygPoiLIFRMnDuIr?_gy(o~aJU zuPFvyDAI`E68H`%H*GlWU-Nj>c;lmyuy=piw#rqj+!BjbshIvj?P2F7V;E7Qq&;qGYyWML zQD?~|CI(mgQk|)_Ayd@dyBtl1+eZ&e1O~;5OFQcHO1s_g$b}Zq7E>6@z}K&YK$j=d zcvmMMLDWHMb@akwq;za15I|dFJXkBa6;sqCR>m^uIU`z(WpmIW&^w1MZe$+YJn7~c zDX{wd<)2<)6^PW#bQ&aog060j>Kx3l#2uN869{Pw_)TYk7neXN4!ad+p*GqXNJA;8arL@JpvnkomZ22 z^w^AW?%MC}%CAr7ZNUcG$um{Nss?JF3Z7@HjotgQd9e3z`fhmppJAl`)3ETblnJc= zAIbz)y8lg?@XutcdaWK<@~2cJ|CEY<#bEyXhyTuC{(IzU_8(lOOi*%CWGnd63QI}? z`wHf#PBgO_1=IC++LXh8&tP!L3i5mN!&AI?xSmXLH2xF{+@~|YEeB_%^I0jW*F-R< z&$Ib?A?+M_w`xV}lp~Z83oR{?W1x{gkb@Be!j*&yzeMdCqA-8{J!3_O;<;bl+~+UR z`sALfYFem>$RvwGaWtce4oPJu$MVRwj(ib~;}W^m4chXm3{MTMiAiNTCqyRxUchK7 z5h|7A4b9|*3d&li2!EXsR5Xx0YN}f2`}BkcaTczO5el^z5&-l=v%1k~{-3M=?R>mN$VN~C2|`p+vxtbcR}n{`#Tu}A@=8dZ)eEazN*v%!IGii(JU zvdy#0{w?mb$XM>EvPQa1gZqK=TS&4>Eoqb-0LRoM@y(W+L?M@KPwfD3-W#_xpCutDlzruOqa@dPZ-%5N~BNr$=&B# zt;Pb7!^#T>-$E$KLbAOYk0iY*Co9E%L>9ow;P8Li`m+XM#tLWRLmnmq-93lHwId7- zrteoq%o|p2#XlI&gnN6ziI8`c6$N70K-&g3kSy)PhV}PGD3gK#KQg_bl{PGI?J?B?Bb9cKAi~slZ50$1%vZ*_+D=zle{zfADPxkyak0NDp;+(M$ft0L(j={_&faZ;$b)OYsJL9D6I?*OXH z+Co7UE~!bX^0n-kw9aOoixq96w-pBH`56L9-abQmJF3vY>-coYE75fJQhXaGEC#=G z-a|;$=5StNy>GWwKxFfFMByJjQDII2=jV5bFH+9#cZ%%9cyVy}MiD0!#~XlWy@~Sr z&p>Llm~P(JWr!+DBRI*jk1ENlE5~-KkjoSfr?m^pK|(}6~6 z?#JNP-^+F}>7*PpS$62p2S3|pSGJO@)05V%aeeyUVprcP8#-XVneAruzl^NA%MNCL zd=!GnGifJRm^ldwF0&lad+$wBTCM?VB)$#QzmdHsVEJ^fP39`Pfh7?nIBXtP0X4EB zyeN$^$*SK|n3;e4RS{5y=_4zhiFQjKwk+_>ScMOhS0M;oMKtA=ilsCZI(wTJys+}v zZbKqcV3oYpx$T+^fSF*u?8OsnX4&hzUf=SJs5e@+CdkfFHukL+m)n-p8z8g`X6dRj zq?f1hBrTrHJZ4_v&2nP1cWKnUX`H*fmrh))7nTY=7hh|@Yw+JxpQED)YS_M-R{<^# ze_>AWFh^r+w5o2kp*Blg?An-mchNJKbN|;ndj(c%x<4=gfF8vE{UH9I0Az{aO6 zJAs+Pu?5{`k5{ZMl0Y982?wG;j7(Y3s4tkyu(TpW^hID7HeuNu5q3y z9x=YR-woFt-hFE&NiAQpK(?$G1AEuT7m+T4mf<=P@&su{3HXRRe+j}n` z4RnRlEDi{ekDF!F?o$qeg7S6B-U4`Q0o$ls(-AtVYMUK4#(Skf^N;?6Du5G_rEbUe zoSjy{95WCUFEel$e#zxE*hPYlPgxH~4bNlN;NtadqDuuTIWu93x_AQen$|v$kSj|| z2}JrgAR(+BI}|tC+b9!!pAM}B(gvOQ%KImC8h2`yS3^`Rw1JfqyT&rw3VJ5c8Rr=dA~&(748Tm@{k#k8~SFE zvx}dhZ`r?db(IXk^lwS+s!_i(8 z`nO(xV?bydH|7X+?t-?(Qr&<8{deL24hUQ+uf5eZj_<#nI?=xKBKk_jyaKZC%(DxM zy!9DU=6B+1)p5&qbW>=lNDO?$wVt@4RZ`)`+Z8%?HH}BsP9E;KylcG&WHIh0t}g45 z(0*28_wJafoE4|kg55o?>oiwOwHH%A(zzw&|0UEiUB99Ysz_-)vMYr>M<<6W3< zxMpC(d&=6yg(hlg!S}{M?n~q~Bap_dxok2_IrxA`F#`sy%T+nAkzB1!C z;KeRiTqD!iNzm*b-Li~*D#5w26Blz`{MhIVe0%EHkXe>nVM7M}r6+c^YF|Ton}~p? z?fdJ0J--Cw!u8I7$gheY?)hKEBmd(f`EM!@t=b>%%jZ;0`bmHx>{UuQx>(sbIh0=h#StwTFP*KZjRK>#qVjQ3u$h^lV#`p7d=En{D)Y7{cNmgnYtuOzlg#-C;?I-;s8H^LLmQ}N3a{OoO1WiL=NDb-Wga7&QHSo&o_m z+OV!_vN$ck8C?Y#fPNI$V&a-4@fs*dBXHzp zgP^Diak6MMuPIoWM~|}VxVkhtbgc!Ml%)SCeW2FNEioy3^rHBUNd9@}hbO+BTX+I3 z{89Q+{hM69e5P^2@Uw22T{Wc9UabQoLcMxctg67N6rKI`cr1{y=jSPjKwut9V zF6k4dv2hwyOa?EM4fs%Uyu5^JlDazm6R*%L3x}F9mN?KX81;_ewvmR(<^`7IrmIwX zWZEW3NkV4X9;t#%XA;S%h&33n)F#=kH%1o|cjR5y%U0{lfacGwI|&sdQ~%uK={#{? z$om=-qY~sVU);0LwMLJe{6_6+3=9$|aExgc(B=b~QLVITW1U(pDf2FHlfy5Et5p}j zVt+1!w;3n;Uwcw8Pa6+YB*G(GE?0YjFCPoAs#lLBS(r_%U45)W!UOW%FR1ZVBWLR#t-XN+&-3?Uf04&EEbWkw{@Z7Dx*vs6w+u=%W zWui&_l5v4+vvs5_;o49DN$>D)HsEgN59EYH7CL%(lXb?K@RblXthGnoF>Fcyo6Q~? zIb*T~c(G>Dz0}H>5hDQW$g$4 z^72%eXv<1DaR23F>7-(#LfC>FGQ;JGb6|@RQdkKuK_XkEUUkqka_&L$Mf#|vp)2F6 zCR~TuXp*RlUX@eJc|5hY&%!i4fD5Q@$SpjgVdlIT! zn;#o4GJE$WIui=~HuqeWD*}tyb8EKz77I6aq#&YbSq$Bc8QN(=hj+<)HS#_vuy_Tn10bo@lpz6P4Qy=di6W5X{c)tSHn{atW*n^a zteN%HAXg+&&!+w!P#J*Sp52ieI_5o{*oMrpm56y6PCM z6$(=~h)1Pgxqa)=p=9_Z%v4i^W#rlO#Xg9NA+h};IHSXnfYzO5UB$wqYPqr=MKrDO z{4I5tvALu9F|I}T_X@YQCB0H;=yk~gG;Gxs{{-Cj@FSc*O2-b6;qf}tfH^$7s+qwW zW+m?s`*2C`b|wNi9*@>K$Wu%GX9Ew-h8~#9kr(Np#fS zR#lB5ByZ@M80k5oO3z04E0O&w=}{v!(YIJ+mbKc$m|cYwAc}LufCQLVew} z2JBy*osK=4+YpxThTOW|ZvJr3b-+P)C? zNJ7~S;H6*u=hysy*R{rGZKz;bN6|>F+28*QAN|j`MGzx#I`n7U682*v{a2Iu|E!Y# z5hPMIkNpvZeC_BlPy%TpcWeg0A0V0^*wAc{9_b7CNoKTZMY4wfHiZKE%Vk)4YQsSp zW0vT4o&LImUGM2o3hLT7@h}V0nem&S@(#Y zx-XVP%5X&y{KN|uQ-Hr8n2J_o0Z4nUwN&1ypRD*u15zP_p91|3Sy&a7VUY^gTf%5#B1VE91tConG*e|O5Kh^1IRsI=K&bZ0ae0_9ynvRkwlIT ze`XUp`oYvkvv6eZJ+av^NP->>l zkK=$Mjix%{HiDEm`V>L0PO!ArQ3o9HrpSl}_)vNx?Td(}E`o9Vz@cBUd{Jkgq8Eu; zJmeCDn$QXWcY2ugzC&@toedgis~Z)VJy#TJnJ@VXak4_6mui{bpn^bN4U}4@K`_rC zKMxJ#MH{6NnTh~{QLo@0Ikl2pgf&@;`np6*c;@#q?b(D15=w={LWNF{e24xrpg`{X z9#{9?))V;N+H;oL5-F?G?j9i^6ZCrw7#?pLFYRs*%*oiu2Ta^*jhGjnT|DeIpa>dB z7<&!}B>6o|9+4&dhLe*CKO40E5iot85N4kF9y+AYb%(Q1Uk)fH;_Ss?(t7bP%&z$^ z9?U3YQ#c73I~lq>Rd#wFJE2);FCa?r%=eYPBB9@{@_-FM?joZ8pwAyC`gK@psd>bW zT=dYm;t}O^usmIVcvUPg~+#9gS|ISv3xmbBM51c8hv_>wyNKd z-W3Z)ck*8R+;mRAE}}B#TxS?C%9e#)wN95X_N7)g?sxF%D=HOZ6tZ6-W<0?Q>Xd{0 zO)HY#{KcyEEi0Jy*>&rX=%U8f{c_^tMV2ZG<7Ud`GSo?acE%Og7Vxpfb3r5XZItiX zwe4ny)DX?#roB)N)vu1wngpqGwoo*^S0Xm8WY_d0QRFi9x#FTYe9_FLE(P~F$lZ|` zA^TcYzgjE#7RUBU7l5o8zsK)`eG?CS=Rn~`rs&U7-X(6p@X8>u2H(5c$!;_JO>eo5 z{y4P12Az3K!qF6LWzI?cnOU4l<>VT*TTNeBcxd_$|LH=$sHvB0J1mlKy|^oO2`qNQ zUSgfIlujOBjPA75q#IE$pMxApo3mHJI9Rm-uyQLT%*mE^*lL(ikFTwF&F(ykim{Mi z2bdjINI)k4^+N8E1brpyUdxn{2fef7yX&R>(PG)?!LuVoM)ct}eARJ~!8_SXnH&O( zs%2Y!nXN-6oeO;VkeLI;p_(n>Jturt(fV1{7p;0dRxtGly-70Sh__h^zl@P-bZ!mN zc$QF2J{e$+&#kCgK^6md(K=D57d#U?G3Qf9Irw0G%C~B;nGENo#af|>4v&FE#EKY* zp>#Nq#=;PK2ckMT-8t*Dn$;6pN}s5~X{$WFWW`L_22z?^;>NN+j%3DXHlSuE-O@Nc zdRGHFs-xz%$<-D8hHvno2Eo-CbcMhFRExN?Nz%nG&b~?X2|9`4;&s@hQJD-knpuKX zDm@a}Wp6ChR+wY`3s%N8s`<@wGE&^jig$;M9Tn$`jw#3L6C`o<6N&W5*;QdkZM;2f zVHWIs-eG$i>oQ1YB9h_noTRZ(ER1@wcd5R|X{!Vq_hof7=5yxr>e_Didm$fIm(=Bm zjV-fc`t(WVhAnReDYs`yMHj_g&a6Oc^)=o7=ICK-Z2v8G>@ElB_s;#>S;I#?Hg{8R z_3O|wmh27o8%Ewt#DCIY|BplZ|7O;%EbxN0@N@7tQv(3}w_f9a`^Lb|{GagXxx>H@ zJ(gQ4znPB8m{c_C#3@4umNi5J7(rle!g+|P<)>xXnUWo(JG)~`@&|a~>4{ihYGd0L zu3DARw3O^B3Fg2k74%YOgi|-Q+t=ssPUqWO+`8Nr+)#){{8#|>EPJFHdY6n{CgUcQ z+tEF*J^etO1Z+UD_T5wbhj$3l4NU4s>M)`cQQk=qQ-LAjtWw-mnn`?zMI5c+ zbJeFcr8sN#tchFp*)`UeK$X4rp**tm4hmBUxmJM``&<(9PxQC8aaNlUI9O2wbUu*z z40rn@Fky1y`4rP!Kfrsp+T8)tygX14M!Z1Bc!9zx7{c*oosrlx%4?KijlFwZhQVZO zpnkzSBGzQ}h1y^U!R|Sj7VhK|PhUK6;1y{_0RJ4HoBMBYs71~9`czx@Bnd|kDDK`A+jgAPo^cDQ$|n3u6_#ZU4xjx9+mm!J$94iI3w;V3bmEJ$eS z@Ml)hDT-{SeE+w&&#-se5h4 zX4|OwvYORm2=S5QG2)yev@z2Yec8RrPC#lP;zHcU(v!Y{=pz#!%N<#QzxiUS=+YxC zf2M(cG5EnmYaL>4IO(zit$Ws`rMF@dnA_6PUbnO8P06_Mq(c{nTRXa#!bpDvM3c5O z%@448#xb&qv)B9E&&hDoSVc|=e**Z}%$WRO_Zd;0S0)Z{h5(g-5BW{!Mp1O&*qYnBX=b_p5ch;Ir%Zv;zh_NX^mSoKpyf?jYtJV~PM*g)SVw;)dXNpB?=(!) zb{Vas=iO1des*W}8e< zf^!VI9+YS>pbe5)PMiduWAq50c<{YMc3F>UyhAW~xlV?-KM{=veJ>3!rV`!>>)p+w zJT@k_2B;i8qBv&Fce6N0l^<`h&x~uCK@slQjNFYuIUcRD4VL0_L?%}Cx+i9+NyB1i zI-+|{&B(?_7P!U{Jm5cJbi~t=XI2L|=Q!j#7}lr2lhGr7!2nhWdr>mt(Z6TT_RAuM z?U~*fEtf%x4>cOcT((fU zAvWXYz`|IAQS*5E`1or(aQrF%j1*0}K%Um3IXH#41tKNW7#?)}CJudA_QQpd zY4YavwIejGBeigR&+_7LT`|Q9RTW+Ez!!?MGNj=Z#dNIP+9GIV*sTfeNv!;(%A};v z6iDzT<(R&ulN6s_8;n8of%$Ebb_P>VFx56QxGMnsAl}dq9+l_m;5(F&CjO2-$wlcO z*Dis0ff;7}18_4!sX`{8o#xY(MkJ+~>;00XgjYDP@g1u;;ym>Uak_$@j=%S-BCMTQ zQ1tc`+9J6VG(6!Q0epfqycH9kM-yw0B{LMu$Whdd{P;-t=%!L8b?{Geb95VgR;~}j z!0Xl$H?SXym1-Cvu8KRB2ScSNITxZB*QCI?BXe8%<;vbNC%&wngB4P&rgW3PbmlZp z;ts^+c+F1>F+UwBR>39T%v}%bkX&VbK$9gL<-%zk-(>R*g2bU7O9s2L**WnG@@*8e ztwGov9K{w(t#6kbC;`t1u@8w5)164b{nSVoNTrR=PY>vob?XBmO*~NXnqS=Jh7tIU zg>t))9gOW{&k}|9WeGivCF?djcTB^1P$)@*IPQWq7OLTiNN#(gY@K%BubV0%X$Ig! z@DxsIu{}oybrIHtutxUf<q0AzCWH-AJm22cV=_0wm zzWp}5qIJyF20#S%G$aFf9haez1eo{8j5%X&c1kuf{Hpjq#JxeZiMO|?i$x+$2uwpo zyTA+Y7-lxnTi%sd?Q(dQ=VNnsTXOboEAULzM@U~qJMG=zW8yAt(jQRw3`IeNHMl10 z6;ng$SqsE-o)j$Jb}o%Nu=tY7mB9KxBRS>f(gv3n+A=g4&e0+9#)ogX4IOppuU^H&dXli}M3F*KE6* zhhHw6*n{4on{bGEKG{>^p%uIhHMXU}qCSSre+gg-$&PM_Tvv{cWL@P#^}A&-CB0bc zM_?v1MsP4>)X2bdBr9r=#7SGU|90}e3O=-jwQAE9G5=Y<;AiWgCA0*i*tA0{4r{8^ zbyg6{2WTh9Wvcy?^)Y?A$qPm5CD|dATdvo9kdUY zr~;N)GfFPwhn(12S@P%uR2U02J?3dZiI=A~c-FWle~lgxHlbehTr^gLKd$IC$s%b# zS%{xvv1jp?S-*(iPQFPs+NiX}%;})#x+m(aoS(;OCxp|hKvHS1`V35Y&u*9!R1(w$7M5L5 zHj7>PI0XCBiNLZmD!2URS28WB{60~Q8!1wG1+@1X1C$_QU1BvAdBZ-h+g$V3^7dL4 zA{zxMw(Rp(7y%A)-G=i z4|vV#J#k^E<_$%@ew!$gAsB&9VJku%TD$$IIikv)HFCfSHglK?Pep$#<|3iv)xBK| zQj!FMG&{CXihQtp97VbIO^)*Yw)+O~4yafpE%ZQPu0zgaK_joGX3$;IqL?kT@O~`Z zjw>U_hJqj*K}oU50F{B-wJ%U+7n#EN_HPs?Om#3K%H0a#oCSNV`H4kgT!Co96=aJA zvEbR=A+Po}%7H0w*cOh22i6%P&iuF!wf-Uj?=gx(Wx$e+4rt(J3CAxy`H{tLM?TyD z;541@XjFOiY+1l3=B1BwMcsI^K^+~VNh2N@z(a<7m1F9Rt8hYSJK^f}5$jLjOb7Pl zqNE|uWJWdix{UM@`B4y6_~}h=r@%Vv{fUHSYK4zA8SDx6?Gf{Iq8*w7x#JgHpc<9) zTt*cGsNtBGfrwpQm$y~d(b3mYEaE!r821nxwj$_;M6K-}U=8d`aShonO$h1NZ!~TAhLD_lmSTTo$U27EoP(!P%?bIdOHU5Y$3(C>oZ3-OgH)GXoZIc$Nyvz= zfr!gaB$v;Ntd;Vj8G^a=BWpz!%f+}ob zLRto!!u2-V>B?!YVb-yruKl53g#Bx9ErxqfxMGxn@qvZs94;i;aeR_>D&Ib-%rjVf zm+CE!!7$flL?ljBM>^=zm0LFhBQUuU^R_Y)k@i|EwrOze23J{?8Bcz6l@}+885k4j z{gQ%O*Dor!u4lnfL{P$D_qrh}WS0gXQzMb{Wm}WC^DLsC+r53OmluNXMbI~^@Ob3e zo|KQ{{b`@R$DEwW`nD>rs)k;&BKte4f*r4dqIWE*wk(s`ep=VRwCnYr*k&>?c_>ZP z#bm%ZUX0*oGfbV%yx`?y&y{RB1xjxVUFJ7)l#Ip);?^+Q(i%L+5NDL8&hk>7wD6rA zZ@u{B=RU}UZ*k_V!y7x)C`(ZAKf$s}$R>IRpl+ojo%iv3e-T%pEA>kopp0Aw7HvFu zh#P;P5}}~cIizkG8L%+dMh%NcuNnb}^Gs%H$olVDcN zra@fA(%2m`!~dqXlUVCIe8*P0(|b+r;dRxvd|X;N0)U|)YkYD#-`QLFd=0}BmDi@Y z`{^dDJRQ();p_*>#g`W*C{;8jP+y-{Nc(hW2~fxye-T|yCEO{e%*6PF>J8f>rNPdG zEa{F{X)S|`F?*!z(y4f|#y@Xbl2xr8VeB9Z(@iU49v00$mtM7R^8TSx$K!eWc+6^= z9;D6-RjaaKVWfvvjfrUaViJKMl0`|lsXrW)Ox<7OZF;i$9Z%!>)*kj$5f@s&wx%?w zt6MEak)9COP4ADNeVDQ8}_)ZgZK4)y9Vt@A2+7JV+I)=jEa_f{wQ zG?obMb6Cxt?k#qW>gIdN-`U@HFxdGa1c|Cr`x{PGqqXV*EnD+cukCp+Uf0k?vFhBA z@y`HuEttX|yZ81i_7l#6dEyPn_wsC%i&D3>4Ce>~50_6F@JrGlRas9!!Pbc+=fW

0!$I`-~*D0rHRB<9mXf+xN+&J&tj#>E07~4!?_I& zP#Yy3NEt~VE27$Z8sRn6ZPpp-l-5nL@>i(oo^5q0QcmjCBgl#UdO%^MW*~J-1SxPE z3#RzO(a|h$D81|fNF;g?)+0pRQK1x*G%1cReiBHBCwpWzh_I|hd8k5d36Qwu@Dc5-#!Pxg$jrfNvWJ(t+3&Jd$Qut2yYl_2;Xwr z>W9WzVk#3%#e+JB@jK2|;xW$&#RQ1_LE%=vYF#C%Zaea`J9+eZZ%hp&|0pTd)>Q*H zlB`(uQxNn~nQ})yDhk#SpD~NgEb~&W!-pIEK?+J$ujx+uqi9{%Y~3;zAeKZckCG%z zLL#AB8ksZ{$%3($%Z2+`BKNhLV#%aEyLC=wY81Pc*s9)?&hk22O6&PL^HAq?4B1FZ z+ILXU$>V>Sm@SXL>9={t#v~ z<#7NPrVl_h{c9rU4ReXBb>vW|H)k!+hzDacNWw>8yE&9M{O*bYcf+)H<%Uovs2Vb&UPruF5w|?;GTZESB58SaQGenPOFY9?_>7)QB<~^9ufMU zg@AXFA!qiU*zNO@H-R>$b-UaPf!NHx10UCi2VVMPl18Cg9|p!g2I0XH zcLzM|Y$gqQnsjMm12Tl^8_j@XdSjYZ7RF;};u21h^Ct%e;gFdFS)&)8c%Ntv;NV*ZS- zBx^xi4w^+>k8o?MG?bhbo1<0P003#s}FNnE99W}e_U0Aesp z!j*J4ausOGz-OX9a}bK2JAP+H90Ubm1MF1%$45xI*zII3_oEv1;^FvB1A?ej=dl99 za$;}VyVRm3Aa8*6|guFj6_M{Ule%oUL}IEY zE1dc#Gw8pg1gkFwdh@1*XwCUZo+E};74Z1GL)A)HMBE{UfWD$M)evYvlYHq{jo3Zl zJU}XmU^_pN=vpmc_C1*W#7Bti1WlK}PMBiN>LAt|CJH)s_hT1`tOjY!%;vM<@JZkd zC3%9Ue|IA%3N)}>M|z<6W64P9hjc_h9xe0oAG&)Z+0gx2|5<3U#a{tju00>>4WfE& zk_wjD9JbQwQd>{I9;8LsH=lgVG(TJrLoGK5RGMLFQY8T2@T?zyG#}a_fhMvLr5&Q5 zOc6i#8;d4{xIb*nP$rY*-WEc)_!bPuF{8MGv9htHh94(oJqkU^wa~cE{sl;67u0SD zN|!94WK7EswILS8P|V?ujEQ2E!mMj$?>PasVPu7h6Xt+Bu1->k%Y-DA+vrR&5c1=@w zG`hNtaM+j0uDO2hPbfDek|9%6>}Jt?RBj!3C_}f;1jui^P)h2gdUHzGfkvFf_crQ8 zI}$u6oS{t69it;d>ZW=K~T97t{l!;-Km&?-dPb;V(!nOK$Ud0;afKLYDAJJ zT)Y~B`(eg4og?z|lRmJe$F!ET)Mf>t7w-n7(-;RPo;hH|D4f|=vVJ7XH!p5)7e-(x zXbOoQ#=i02Xm9YL)N$IB`43)$W~FkWW^W+|Mjv+`;E;StDPW&G}r{Q&a=7lO7T|9 z>kENNvvgen^26!33!p`(iVM_FC%e5@{CLJUX?wxC`S6C)p?!9C9K#aut#3yo45#Le z`FlyvMHwFuv%n{nH_UJf-V!U;Mb+4>(#hO*Y*3!t$IZ`1!snVjYkAWq^kFsF?9Y}! zIXpD#PMilrSUPq!&vVnbrME{9y@8(LJ;PY?rU%Fl+L>76q-_UoPR@yHauoN_+# zhMW41$~^SGhGtysUYsc$&^c$spVm5+X?<7YEUteGo7U#DfrrX`G7pr~cIv6K+zD)7 zEH9!?oUe~R*75D@Syv)YXyQJwk>1IO~v`Le-{ z^Cep2inHw7oZq1ULwx=hDC?i)gz<@xTxmakQ4SIS0PO$HA@M)2JPw9tKldGtAK*h2 z-siP8ZG)RQ)4@xe_lP(d639p)l7Diahz>R&UIZ0Acu-97&+U1R0f2v#dxYg`N?vbH zPp9e0(+AN5kHY#3Pi!t5$sgKJanT=f9A958)IrYzIW6nZSOg<&WddRg=z$Xyp5s9X z!?d7B0Co~FL6(q!!%x^JSd;)&RANB) z@G3osI`TI#Dt6MsgP6V__l%rJ14^Dg4RRkLeoX`-Gi4zAp>`mOr@vZsH>2tZ0gtH3 zos!K#0C6AOdedZq4^O)OJUzrg(#e)rVLpDH{wT2`{2Wt-;5*;Apal&Psw%~_q>W8K zoPFsYJm{@s0w_FyeH?Q1etRiHUOp}{4qLlI(TXUfBR2l zWoOGS+;X_Srl$J^)WkDwGW#y>gnruJdI?DN5r^!R< z?e^apI^89lVMWq1IPL|y0Ip8ULi?L?l<^n97~47TKJ_IYg`v>IwO1%{K%zbb@6bf5eA)~pYgA-dQgs-F z_|^&Ypm_58!Gb!xlvZwEP62d36-lENC8wAVkpxn)KxG{b65`ttVAqG{ppKp5j4t5M z`8?Y_XXIH1H&6QO$b*Fcns){t503XQxWg#e95#Ts4W?%@oC2A8;y*V^4!oFp*xo`+ zW`Hzy7F#b0*F+8sxY@4w8fnV%(|o}0Z5%LzKWUG`!o}Nua^~#@?1-ya;k&(IR8H`e zx+{#{c*4JtyvfA6hUFFGgjGpnrIno@nXk-=17Ws9c(Hrw@IhHVbU8p~uFi_qxsL$A zTXVn>OKL&or1+BZ0Q*`r^9cUAwc^k8=D`Pg;D78`JwE0jhjR&m83w}lS<4|meT8@P z7EF%<-~B&%?)nuK_;>_p-zr|2mu;g*PzKqq9R^*0UlYhVl^m`4?mS%fa*SDu=lDe9R#s(@pYP zv>|zyb3qaM&OkUc5}3GEj<}hH67FsEYp|xQy_*i%qY{ar*a)lm?L{19g^*0{y2jHI zTQ?rGMGmcCFBGg5v*k&$KA~mpjNwN-SVStK+=@sjA%aRQ46YY_wIjDFWdg(<^XTAm zHmPwTiae3PwzCQ#AOBhxl_$bHViBYK)0mbhIU+vLaO%H}>(neN%`WI$Xpo)xQItu! zQKfMhLR2C^T$QDA9`SOv+-_j8kZ-D(X@^7>&rE+^p1(yILP9_Y&TXf42kmH~_Zi$1 zmo#wgGHmH9x#(Ysg5ptCgj%D^DulGg8u?+sqU5!h7zR~-<#Q->o12kqu^}apS$7xd zq$&GdbUa&F|ewD?{@>Ctfp7qTf%s?8&WHpgb?BG&*W(`&f`FRSXP zip;l^Kw|$=Tq^~|(YuZm@N3y1t0GbE9i8$|eioB9aqW30>JIdM3phnmmpIX(h9v)nclbsN#Fzffm%fsadIU`QzihZM{3-pqB34df_>JC;deBSXMQ z^^^B@5^rVqvF-xVFQoFQGNwN7i|NCsw!p0hEBmM_^A76itKN@wHO_LZGg+sm4yn$K z>I=Emn`N5oPnw;Wk60xAUCLWP@R zMWW0YwKxz zW`yB8BN<`HT-1;c(!(|Q>|_v4dN(Qiqud)Vpz+7F8ArZSZyixbeqYd8#GJ}_cC=jp zj2a;kAIELkV?A8rI6z-Fh*>)`XMkJWE&Em;YDJKlRzM+8PG%)j8$pEMIT4*&fRI>? zvJSE<=@jZdH(;RcVca0?Wfe`BBW?a-YFTOHzRjp_8PSh3x0pJ%QOmd82Yto_$O5Im z0dlh~6$vLmIk|7Sf|G$`+GQqD77nFdRacW(X!ZZSo}k%+!d~!u9ygq~l4XBcH+;Yw zUv1<3!2?X0I0{Ulwk7<^5>n^&*~vsJdYWqyf6`4UF|$hm!NTOMvTEbh$vV=VFK*ntY&2V<#%jREC=k1dRP}WTNg@2y=lIae z?aFS1Rzrcc>-hJGY-U0u$S%KGu0+{+$AoV}y#{go>X-+%pGf=4qz_PViDB0Ko&u(i zq=m^s56u+;f@5vRzca%tHCd1l#L4)<2}Vr`m3i6yRaYCZ_RuDTqVXUIg!%K4Ne&NT zdfm#va&^pqYeK)VU_FehZ-mUMwb8(NOe}Gg6!jV~?pI|jDe7E7KUKQg$@xzcK!M#j z@vu9gl}*-WTlpdXz8KK?v4HZ{K_S1Hgye?BIf>vLBYpNf-R~oBB@61^%0{AScfh>r z(ms(0@FGz4L5t__ur?ClSv2B7{_RTLEvqWwfJL`(PKch>^ngMLl zgi9D{(P=F7ns3|<`%qx0M|-i__k!pZC{GCO)Xr6ZE9mYTM9|Pz>&Dk&Z12m}o5fOK z7oyhbQ5DE6yVFY=zhEej7Y%`TJ6gLl-lD6YiUu0(Z<^Wcl8B=#03?9hEi_^{1skuA zaV*OqExhBj$mQ4ZoHbq_jmv4ckWaPEX8NnDzz~r?HtRD4fSuy9UDTY zP@ElrQ%|=gMtj_6(aQcX=k`bP=?@9!=Rflz(bk}sD$TmT82HFIk|aYSrCRsiuT0R} z?2&#oQ+~KCj8z&qd#9m{91*bIY@OEQuS;{z6O)$c!wh@sIiO@#V1q&~rGjX$aJ)|) zL)*GY*~#{cuQ5m9NvPL01jBshlxsD5V=$kZdc!5#M`-9>KVL!LLbKm^ovpKgj?r4! zbm|Z-iS;?ECNW}wJ~3jkf3NHKc;V=dVnmWKyR!6!;9iSCmt!LUp0?w}+n~p+cKMz%;nI z^&It=D@SHKg{*^ZGveOaRq%4`BR=hQ4YAyv0JM*wGQ+fBfp*}|w79r)ukl&NgoQ%E zy^4g;*q>&nKh0T3zO1))&u9_`@v2op-(maB=7*habDD+p#>J6F@He$d=0~f2!9)V= z0psHnhTYUZuaeg&y}G~!Pp5Si1a+an`B>agY(ll}XK&;~&H9F%{k>)p{QfUt-hVo} z(V9yZ#UJEF>}S~#&cE#FjEsLf{};c;ts1mQ0B|t#zpaWO%^V>N52Q_yk-QY$4O%JF_}j)lU>^UaFnG%8E$34b7?e%0ffR^ukTC8$ z97;tu#9W@*sKBXBihG4iP*Cy8wCPR(ARh0O&3`q0VItGU>@=rkeAwfFuFXgC0%T!= ze)VTp1o6+Vh+^VI`e_Gn6XiDXyjxezF|KRJK8UqWvWSyjAb!^+V zZJQn2wr$(CZQHhO8-3DqE@tN9n?JBGSFOF?s(ON{?Md=2_Js?=Wc8W+-X2gy^DLsU z@A?ApfJ;pxBNbg2S~d4iIbxUBquJCkkAIZnIIJ`9j^K!J}PQ}Yj zn{r@hrzM!lX1bOv^f|iQ;#SBL_-y$~APj=IU+Q&+CyRQcOl~|3Y)qUf+@1H$6^I6U z2W=OqkaHC5!=m2{#h!wr4iOLCOAJeW&^wLBRIC^Xn260DkI#@MN(DLT&KS&tI zd$s0iAaJv1!NT9}CCWncX4zy--xyYU=LkEO;c({zAR<;h5`+^vNh1rS53abV2@j8y z!Z*85qM>?=^=X0XJouj&q!vvO&u||~QcyK+Tyf6YdP+?=pj|-}P#+RZRkKT&u`8M# zi`vDFamU(v2SyJs=opCvKXfBi5GY|J7iKtm^qBNi^Wfz2luiD=b^f*E`()pH|JXih>uvmMdfhm| zEo`~!wS4!?lu_aIcEi-wyBTRjo^;cE)f(Jk_A!>-jMx?~&x=pe(@oa&h;`x|hmzu8 z*+;N5QC+ld))KSEzFO3q2mg6;jJtYMLp05 zVb|g`(If%^1NMbg6)+=#_(J$DGgoO>BTvh6_Q1acK!>OuxiCi^dQADwU%{?nTd=^@ z8e>cW5n`9|OKUX)lrA=IO$HiU`VxEGW00W|{4Lnii5i3a=Y2yq*aUT-?pN9@uYv2a5Ze}w4acVOjxlKD1mwAyXkv*^O*z(kv774P>gpQ~mLbiUu|D z=sZoCn7V;1dql4nzzYQ9FkXd0XV{3GP~&KAg{@z*4P4?=?B_|<8KoqLd~%-5ct8N1 z+UN}lAkxmKcA$#S*Fu3VB3BEUnBeEIs9f4-_Kch_-929!DY#}r=Q%E{B?rV6Y_?_Z z$(gy!B<1f)?vT_C_93)uOGyj^KZvfJ_bIDoifxn_w4_j6B;gV@;tZx13w@uN3+N3b<$_b6UIRNOEDjPt&A}ih1U(YZJ(on281_Jm8eT-@R9w?k$kd|>#3)?}x zGEC_96M5Vr^nxtH@=vy&8S9clrQzri&_Zei*$IL8g*`dsvG4`t?QpPUwbx;mX*6D^ zEcQnhJpv)eCqN$F)XQ+QU=EKN&7jM5tZ~%s7vKKZB7C(Z97aN!S#Kbq-+^he33!Wa za8bthXl?X|Bj=kM{GxIOjD2XGnY zbn|GF)9x~Mrl+j3E69C3k>HAqbb9y#K(t=UFqi&&q*BghDF@DKK|qQ1JaV*z1OGNc z$C$Ae8x95_662iBvRRl;GN!vfQpL7^^Jdg%ttOCdyvPLnMAn5kMVPjBNc|qFKB7}A z(d{3reNNqjPdxmitvm`9E+J2{@}OSO)0!*n4?FUI(`FA(ql1q5r5fC82mEXDxPchC zE6LW=%b%vcEKKe-Bdma zxW~4w(rFlGu)v0rOrvJbI3Knbj-xVWnyCx>hgQ`@r-~3=v@mKL z&}5NJHV(evc&=Cuwl(}U zFDz;R2(|KsMuj?0Iir|8x)3U}IR**x`t8&q)gSCd5>}Uz2IaAa$-H8?>iF_q8`10n z*&;{99`PN{7Q=AC!Up^zGU>*bEr;_3;h55mtL&FkVkcU6Zg*iW*K$x!lHewT`%lOO z5@L!{P(B#lN9G8^_6^ME=e^^^SWt<^6W_o>jZrJ z!4Z1AijNq2)f&L|WK!d1MuE9*SAH^x86-x(s!H_^yB>JPzuyPevn2~SWFU{9?A&K_ zzoGjm$PaO$WmrM^5q}65)mF1uT#rd(k!EeA>y3V$B2oj)voz6!(UC6_(nBnq_taZQ znOR0}DR?vGO#24$GpX-`vbOh2C+s>5$!tRLxk@fjhUSVC5eO7nnzh!T(s;hd^cFUh zq#NU7(f0L4naOJc_%@(b_T1a@Dx(>FKS6D4dsV~(iG%YT<^qvQXbn5YcEc>KdKu>` zO*=;Ow@+(+q=_#IE~aP~iCYGT_4}Rnt%OF;nx?e`sgj1e5QnpHw~2<4Yv%W3=J$)Y zr*A%%X2PyIY_qO*pH0w|ds}rkK~LVv9+hoF3!Sx2gg5simSYS3{ZM7fb=dN3wj1sW z;i>}3{E*+b&BAKZjrq&wl8x1)JNJ9lh{bAH3ldYDef*DSJ8FT`s~+4FA^Y<#|q{zQ3<6L+^E zyvi^*2X_0jX>Hr#ksc_Fa<>7bYG_v9ZQG;=9^N`z&YCwG2JojVQc`=`8#Noh5PH@J z0z@zO30tpyoVivazcswr9;Hb>WJ#jnAKL9%twR>fEcAPRHGSNVNA%A$U7-w57YVC> z1O0DxfeOU2*!XEC(ZTt@9}}5NzQD=vy}7}z52i=w5v&A z0CJM7SY%&VRYq3_2NfrF&XG-rEV#N`>3H}@j7D<>%gedIZ2$7_NLJsD0}9HBw=A4d zk&^y3hIPbcI4&zsl4if?eGBiK2|2jiOeMoOgH1MC7r^XRVhe+|rm0v(6erl)zA~yn zCY3iQ-Yi~@LBXFaBVzbkZET&3mi8hF7bHB6w-|;9y9*Y2bdb2Sbr0a9xO#~U^mMrN zKp+q!OitoKCKLBH1xLig@d8YTOFWNr6fvzDCFfxPFErY%b9K7|-DGbF#q|mMJ#fbe zNEty}H^X+^1?XZF_xHnacTd}m^en*EmyEe*@t z#vj3B9h=V$uKp+#J!enADT&np56?Q@3O_w$Pz)=^*qnwa`iY!G2fKD$f{dZH6n#1I zK33w*>$Ffa7ssDEybktqp{97kPqMVjM^Kx+y9+E_nAwUGs8&o@uv^z}w<4C9#Y6l6 z4Z?;*t%F%ub2wnY-+UOkF_SRFf@qjWHr06lxFT_qq7IK3JAm>?*Z zwpdZyvDH)XFiMr=i7<38=YZ7l7f@0f++baUJ^5VDd4omrMee5?P^CW}zcQCUkNT4n z_msuaA(WYwG@xN^TkoxOj5k@+UW~enub?taWC;1+Fi^nri6a40O30N?INfHtzn-QV zIfk^MGl;8E3=Z9?G@EQ-XO@^bFru`PK|DIqjs{_ts!el->?$Z#P=SXZJ?QEim=&=F zb$f&tS|9zgi6-U4Ej*2cBa+;P@DEwK5w=#_Lef5@?zJHdbgWzllw098%pbL~%0>*` z@!QAT=ZD*R=PYYMk7U2JcqM-KzXEXY48hL2>F6mV;u@)S93R7pCez@*QiXiIfkk%k z8b$t1v>QN=2^w2xi2j|VcW^)-mwMtt@BgU+AS_=MQa~9X{get3It2~uD?dVia z{c6bA+J*FH=G{LWlb1R*06%PukrHAwmzaQuR~O=)fc&0B3AA;LxXbf62GQmiw)iLE zqYdB4T1AVT7g$Ny(8!K6kK;9ct)HSZ^>{+j6I0NqU%Pa}^SX9Q3W9Q800e5n{YuTP zWLr);5cel!J*`~=lY=UXa>o9RdgbL_oO@a)2U`L6v^uIWh!bp zL-Rs%cQv0LUo1FRC+;g8H-41-@6tAI+bH=5SKCMcXUU&ikOuEC{K!*OQZWOU5r0}z zU5M0SaBF3gGa|fDc(CbHt!LmcDQ~zp+bjH)CtuTvu|u3U@osB*MO6+`k3Z_GykAU~ z_TsBE#d~6rQ%6w=Yl4KARzRT**nW9D_G9^h>2V#19nLJ7ecQfca?L9r{Dbx`E(*aX zl_7h8L--K^z&@4)ER2B-I(<6#Tdb`9d$VQL)GYpLS7KrT~ z$Lo~Gm5OyvS2}#5)yYNx!lN#hT;ho7ZaN*mbZG(Y`CKj9E!c5V;N>!i-Mq==vz;>o z-Kn@rFH?1g!W)#_cGCAx&iq4tvKX$~zO9Q553PfOQPL!zDH_i#;}+hH)-|29$U4>Y z?+j#RI2Cau?Alw;$T^HbOSL=8m#&x(g zIDg=q_9um(P7E=2r-k)CgH@el&pifF3`qj%R@g-N-$+2bQna}#fMk`17h^V@X_2OC zftOWJd^R!6jJ9Y9H{T_McaDZ$v^_nNM_Nu-wcVSSQ8_AmsLW6+D?Vvet0oQ935Cab zM-`hJhUdhgT9hna9sle1%cpcd}+ zb+;pJCYfhg2rHO>aQXXDM3GkI@g$V5NDn%vjBpKA>|`U?r^96#_b~<0TX$uxH3~Oj zS0fcWuE8%QX7e+2rWp)&Y1mkB?DH)2vHc6jq}I$*I6Br>y1$IHRWcQj)MI1OJ#x)f ziX$p<=sv9YwASO!-_h7BHibi_eMbz-0&1;r)R)PgD~HB$IYAyP%CWGi zT2`zE{clk>Q5Qeq*_bB>R!p#1)Ap4Js25T0M+?RnBnSV^CDlyw&akp^GehuH>pjKL z&GeHsXUG0#PB^STe%MhFA^U|&uDg{Tyo%Ob)7lQ}n0d-!joSkQS;WvS`lT0ZK-X7z*RRx*x^wy=xA+L4ix#>4j|h>Z zwdIojoD5{ImUa8u?*O)$Ux9X90rOL4W6 z+TM*fZfNN{k6?OYV73^e{RxnOwPZsIsezcK)4p3(Zt!VGeV9UitqwLd0q&7YRi|KsFf?eNdQZI+PmUnhsTBIR_`$d@l+qDuY*I6v3qAYc+q za|l70+6(iy9WU-!hbYw~r7IfFpAGSeo||#A)457`g^XL${yc_TAwTx4Os)}5FOv6x z2)PTT0!_Is_8g*1Dwzr1D9uohJd9XKq&hzFdb9mWuHslBiJ-VGUb6gB{MUNKXyRL& zL^LXKQvvM7PMe>OONZg$Ui`bVGr@d57`TX?a3)fbgt2nkXk?ut3Zt zpJ3L4R=Lq!QA43ttkQc;rG$w3I9nR2{3x0>WKynHsgVLhpVrs{(eTefLh=)#S6tC8 z*>D7Dj7ny;6d=4=GyEQ+XXpA#o>FWYQ-&@gPaT;!lV*Tup>$6wTcFWCoB!6ZUW#BY zNJK#nk}G&kYU29JuD?(ogG4gVJ<{%k0A8vUIS%=s%RBB>R;%>6oW8cDG>0TS5FPa0`#kCp z{n-+10l!UJ{V;s3>E-^7BM=c;#%rtf{<(IG*X^DZX@|>uGv>}}M?GTzH+uDR93OzB ztEPXpnz)GPW(is7=JuW|I#JB|*`x(M3_s)^vSsx+-&rj_;x5WNI0KO8u80u#3@9-{ z5(3kAHvgfRaWLv$YgTh+y*4vm&-S`S@cC8(UUWy7F%IKqnT>e;*0Qw_*j^GxSA%Qo z)%)$WvTN(wZISUUl7QZey0T-R95u2Wk@wY)k%2AEhR`W<28mi4$MraC~e(DgnW7$MQ`ap%^0O`M{>4Bgd z01nDO+a6g*gy=C)nJsJ<1nL_0l90hb>k%P|5u_6C_<*4y?o|=QEq!BDbS=}?Yab0* zTRi3Y6^D6>)I%TK=xx2z?qp%WD+`SFenW}^&OAxemVfqG9alAhf9yW}OR z4bz8Yix|fjPP9=}&e)h|Ah$}xq=VhMOo*ot-)q?218zRz)Qz17EZMp5mX$FKmWugA zt(O_y?e2SLl%Xr;$uxjTagrGZ?P<11TQd=gu{NgPz0#g8VAs=-)+2pdBz>;13TLXBW#7=(Th=SBJs_g{l8xXE26ny6J|{P; zJZe>VOyc_s%FdG$Mm;@x123ID7PjlaR}LoaS0EM+y^QiW49qU$yVK2OXHnESwvANb zSJ(20iR$ID&EUeVlZx_-Er2`()l6H24X0R{F10&QtPilzBNZpyhTON_>yM!MyD-NF zf3bw0Pxnd$k3|Q{TGIY5r--&#*S*0%*MZ1f86{wPT~f!_=w~5L(H{IX>4h~^K)&%! zd5EKBIo2iRH%nw{4wa4Cu2!|^9b(pn$pAa+LFefdzjK5@!7Q<68+ROoCcL0%^Hi<) zGpZNSqrk#;G75PX3%TaoIPFo1xA8Yat%k#RURleZTN(zNDHS~t$SYH1>&lG?PH&X%Qi$!?@)AU75!W$@LM?l=S?(#R+}4OXn_{qtxhl znmSB}#+J?7$gM-$nSM&rQa0FK+%W}n4KJ0iQbr6YsRoDF(7Nm;$YhRY8{LS_%Fa^2 zu^dR^XFO6MOG{=0i?fL>>_)N_79D(e)h;4_&lgg=Y!s;j-##4l*7)>w23YcI1M2+- zo?t@@mz37L>L8S^I{p@u`KRnFgK-z*haX(U`exaZ(f$@>L6*BCH@kMt_}&0|q&Mg37}`LW6zgB}kW&{mnR8A8`m z#)Txx9y9IItuM2S?7Tq)+{M+PUp!}XUNbEC?V;dryuDSN6Fomgo$g;=OR}uD7a3d| zmccLGAhoyu1ONB$ZN(H=Mmy)Hwae}Y0r;O69V7c6>R*$}Mtu5zCDqzleyg`YAA8p* z!5KSIfP)5GK9AMXRV%?!p)ISGeR{Nm$*CrE4pGodKeBtZmz1RK3IC?)rC8oz=+dTO zi}|>HygML`xqZg+kCK`xMmG(Hlu#eLmmvY& z4ea*Rmp5`(tY{p?A4e>ugfN3umQSf$BxE(iNzzn9Ix5HLB~g|nllY=C2dN+sM>WHO z@8e4lDGF?&QY}+p@N-h%EQ07RH7dL%i6ff`mrmai&^i>C=#>aiQRor|+IQ8*GOM8L zRYB@UV5+7Jf-fVRVzzKp+}vBF(Q(V0SAz|O_AyUWiN(jAyWCRn6iuHs%M?D7Napa8 zl?}=r2uO4kpqnm?KJu9dvib>OuTZ8@W?cuz*a~XJ0-Z>z39A8^B`S9eUL?)$4$wK; z&OpPlWs6dl=ZLsRO-L|lD!{PDLjpM=<2@9TQ8H15xhv~VG1FI+Bgf~Sa5DYbbwo5$ zrdk9|aaN^X(im2v0hcZdm7s|4Bu^3+dv^(HhPt3I}ta!48gv~IzbzrFJ*<&n7l81J#41#e1brTYMAw>OjrqdS? zMDL;3UW&)4*$;A-vX*udIh`prHQE7fB{Yx7;gD{>uodo_Q8M=RD^Ts-z?zq7UXx!b&A5%09zz*8i79DOSfhj zyWUUQP5nMj+fKd{GU!!+F7Sj*L>LmV67piY-9(ao!8`vqZ#KkDhYz~DYPx?#U9D9P z=WVaE7FTa8Vv*oSu_f5p$KI zQmS0KURuOBx%>q+c0NY=H*&E)jRm{6Pu@2f$#Jy}K)XGkC1ZUCc;+PH8;9=N8>FKbNJNVI=PG%+Nbj1Nl(&3K5EXRH$6w=grs#@EunT+QjF)6 zd*K{{wA5;aXL?qTKz_CAZ{F_x_Im=^c=OuU_X5@reS~itI~;$-Ozv0}7;Z1%b)OrG zz=i&T7{nm(*W_AP^6B-a&&t|Kp-whQ>x^P(ji}ea@LBOZ3X0~o=ej`Ta(CKyQCvjF ziK+*3IU;9)e!lCrt}~90l~B-9^%yC+16`fk1pO!;FfNLWr%qC$F$fZE<$ea|>S4O` zu%-F1m1%ha%l!IiJ|0Ew5OCjQt8e@j9t%rvbaLj%|ErF+pL9gcYu>VAAIXB~dn45u2)4@maqrS{Ckpm; z?h04)zNY&3jl8H=PHYe0fB(SN=g09sN1CcX|8%a$LH%E^8fMmJj{gR`mCa8Jh-zn{F zzU9p`=G(oE<4-~+^IC;4-sHd(;pYk|xOf%gS_uVp zGKx!F`~dx}Czf`MWVYgvTlP%Z8KB6_Wi-_0@7)@^%gWv3<#TE0h-lHr0+?iQF}llo z;yWm$(CNr!+2!lSH?}F@pqpZ2;o#?!Cu#4pTDoNnHT7>wNm0@+5u)B;u6W4TD|FIz z0FD}|6@wcI_0t&)m8~DJVp_Bdnl-51~-jm*KA$mk0+k_Z`oB}970+~zDc*Z#} z99M6K-9B;LXaop;vc3~SnmMIlFMpl3>Mgk2RiG%fOBlN`?tPw=6P9cG6u=>_;anOa zYpS-CS8Hf_1kpTQJ_1lJ*X{{X%U!%*k&u^(AoKp=c^4lU?a^oo_A#C!sfAEm2FKzA zJ=t!l@P_*@KYphJwmQ>G7))Wb?@n3u+kU><6$p%cK2_XhHhyg$8I^8?+msD3sZ!*hhguZt);dZ3VezhLhZFEX1&6q{*1> z_`0M#yn22krmRGTj5KP$Wq(-7rf*GqGg^^ZV&O5)M6e}2DkeMGgtrE^U?ri9YUrY= z@Z0xlC9{|`F}>=_99xNDG)TJ+$;(scG$<)tKxe{WuXNJsUiK0QEt6Qu536i*1P#MOVb=2iR$ztupV8l ziwyzh%WSACW^VKSh7J1Grwj5qbt{RsTOF`F9IQ%Vf5ADj0ybLqq8`@XK7mEfL^}_l zloy8ngqsK9)lmYmaN%_Ia-hX*s=5+5Z%R@vo18=q%^&d^-022A=>`Rv%GT!5KJE+* zUM4OWN}r*nEtbob^^xS{Ut(ocpS4i`{u^mts<-WsIS}%j17P`AfZoo)bf^866PxEN zTsw>NrJh<&n_7bEcbi6Oe!BdN&QTxV3MXnM(Vv={-|+xOKa8NsH8(0%8s}4jwzX%6 zYMx3Mrvn`A9`~npBhSr3TT(>j%CVIo`C_K{dgMS>O|E04VTp4!ShPNI#d>g%qx#sl zI4RITm=9RAp~G`8Go@nj)4*|o_<1EmBOJ+&`#)xJKE=w(HsL&1iRy~U8#k3qjbjK+ z3U#`^-5|(qg;kTR<7jEKEHlwc{$LF#ptuM>+LQ#6;BM@Vxe3-8M3oSnyXS3lK!EkOtGgDLEdZx4Qcy zasBNmnA17qPY5I9bUAAl?zHUqyQ(4zr0Re8=uA$fgEK4iS%j~|fF?xY{^)gt*N>_g zhZI=V7p;z`E`XGWCy<>G%_+AdfqV!%feOif#rCg}x$gnv?787gW`79Uh{fpWEfAW( zb7z4(US}cdfAoXc7Ylak#J$+#xax_mK9WAv{YC}_mf4je+=2Qyl-;`1Kb6gSJi8;v zKcmX8k+ZK-#c2tAOR+=dknC@4=KElw2Tu`lLr}|KoP`#jcv)QN<8nG!;G3jynghLp>9CV`7Lh)xjv-AG@z4QI2&O?*Nq z42EtDCal;6@|W>sDOOtQk|5-OTLDw0apmXeAc?@~Y1z4XM~!nuo7j z4;_Rq=tYR*5rK;=#Ug4O)1}FX=eC69bqb4pLnY45RaVnz-rsdi|B;nB`^7T=kwOWi z`dV9>_w$cT%?FX(u;DG7+?R6{1v8^|?o&I_s65y7=wt?RaKK}KkIcBbENkahJDcML zKVuNhTz2~$p@|uXpx4LUSXT?DB*`|H0(HFa(lkyI?YFtn7RjcNlC!}Pr*-1+-%f0| za%bi;M=S@9&U}CqDh-(`Ma_B+u0tHE?}P=$aOD|pA>a#tL&1_5zS3bfUetvRaP%x} z;~}MTr?#hz^CCjJx!-W^9BLro!>Hq^NE5>4;UyE`8z;t@@|xJ{QH^Hfa;nK^NLrTpunJ`r(kxw2E7Kmz}KnD+p#k>;;&s zR9cPy99OucUG!%Mi&PXcSGThvSC>eqVKhmM zur|tWb*%}m^zo*>oKifhi!Z)QJ6{2R27oy>xKw^+2RF~8D^f4DEmYysV7K`8);yhZ zdEMY>c6(N}*r=1XQ4OBkfOC^!`GIL$Y4WrR$MP94sMGL_@;m93noxYRs39Id97T=t z>XzmixX9kMy+43(?dEQtC&*QF{qm){p_Lda*&{ktrU~id}7Jok~3RX(KrZU5B+IjV*e7uoJ^{RQUpQ3LfyC{+Yw7K8VY- z`)A=qWAI|y#$DDc%cskSk_!zPJ>oek_a##1`Mgi-PgXr^Dvx23SYY@6qu=PCQkH8< zA*=l;rOA&Q_dkdIf0Xi{UrNPn=AU2cM=DRj$O*FPhbfoqB@FUbQDV>(Ez}JS%*0!~ zy8d>|SZbEKddC5;8XTvYL}zVH6aYqzl0WB2JXveb(KVf}CsC@>?wx=J;T~$7QMa{K zD=DkShrR6$~W!oH+jqS{Oc#l$>{ zze$?n$A@dAe#d`wLq>hyq%Ulh==_8A0vK-PVBag=)0KoYw*X&h_ZL;pw+~3~q@J#I z3RV51M3H0wI#9AsA&ve6UNuer;@kr+FiS4YqLO~C{*nR)^}s(1?VWMT8vo%qY0$0+ zYup(ANwZ~jt#m<$Ag|S#r{M=IC0YpS&5%Mr>c$*yyFd)D%_iln&IxvpYGjxsHI}v^ z{>g+O6FoS|n}a7qcTvhYM9m~whgIsmLHA=?vi>>OSM=gD|Gkv|!f<5oSH4d`(I$3Z ztkr1zXHkWZ$w3hEOLWeG6E5(M;WnpDk-jK|wvK%Ck1!)|F00KY+y*L5Y**_3NBm%f z(Lbc#*>p-a)IX`zr6o`eG_XgFZb@&C7%^~f4L98rJ#2Ge^*23?LGM=NE(g4g15A(T zP176mK6ST#oL}`i6oG1f0~fKH<^{WrqnH z@(rY2xq0>AK+4tQy8F|w(UyYshoyen9pVw_?njYpL5>Xd=7yo_cL%`mRy@b9{ER`5+~248x$x}%9$H--aqKYx`$*pd00R1@}d9=_#;%~AZs zE5j^Vrs=?8o7YN|Pwi9DejgIT16LRwzC%SAe>?nyLaa(8 zE(1CWN7erf=Tyf(eidG9G_x1AjQt_yOkaNU2>a#3+IQ)vQkHG%)&tnXg_fzB;YrPk zG_vjBf<7aUen%Azc2ZYr@76vI>6X4^T6a?a+uWyZRW;#?Jz$}?@S}416MHnql!ZOZ zVR|m5&n@kM1Pz*o5W7fukk4p6i9B_$?4Ua3i3K>h6d`D&znLOos$5Ari@^8k>gC^F zOxY@JhLVI;MMdE=Xy%i)KljEq_u4=(dW5_WLG^yWtOIL3?if6}U!zRn@2+gn@z4RZ7 zF81D(vIg|mCKlZT&{@v-wO>$GFlUeK=`S2}i0p2Yp#2e>4=NC2hhxrwf{Cn=5#7cR zT{cUhs+~-P3zI35ibpVILcJzwbYS(K~G^PUDYHm-s*aU&}HRXc`o5Vz?$)|B6p>0o}R&q#r0I@u)j!b1Fgg#FZ@;&Hl^fY~1fQKN|Di%=%W# zYzDNn%-=3O4$sRDO9>fm7)mwklZF!^BUi^%j0SQY#&-MzW~Qr8Fa0}NC_8Z8X+0Rd z_8E5p`0Ku^-=^X1VdGG%8{d<-h;k{*gyWU7}ZOe-z0c82|w9KZX_mDUyzZ zqv1~jy_#l20v((;Z;$@bq^UgD_O_#EFG@@#^`bymmm!(7W+DP``SRUJ2WEd4_c=5nSB*E0X++Dd#hUlD;#1lN0SV;I2S@GYyaj=XQEG}E*n<1Ux@lLT-l2HnK z^c1NJWt_%QfADpO_F^BHE2C>qJeq&+s|CUlKVDE!N#~r>`P6x?F+hWpoWu{G*R~~K z#zHkh9SmSJNCm_Wh!~2cNrD_EV)qLi8QFlBF5Vc{qHxJxBgNj)hJaHd5s5nX50HiC zb6BQc917^zy~*z+iVr9bC#q_ix4`nE5r-m*69@kSTEA2H4Kxn<6i#ql z`(qGM64Wpw=@wC|<8*rr*zvPsDl#jYZY&Z_4CZ zJtD>j6)S@88sILYVkxjUG~`}*Uh$}`NU+VGO@QCOK@uR z19Ooz(~Y;C!-h8RY7peFdII}phblErNoKpBI}~ivb~&B9m7&Xl7!N$625h08r80%d zAUzb&MPX)SsC#mx#|$9Y1V5I_-c*BqyoOsPZvsw)u00ZWRzd#KUJb+~j5SX%jjBeL z#=K0J;)O&EG82zS6QMliW>$rgL1U(1!2EzbgBHUsEs%M79+gB*%p9hSQY1`-kmb2o zfI@xgSq5}iDOLIG1wzdkDxo2U3MhxT3DCVa4Ipwomb5Y35k_X{uJS^U0J4=lF4IOcj4VKp8NRea zoX|2Y+hppG6t82N*xTTvbiqg=pbSHpLaM`?XH%!YS zr>1+dsAPpr47!X%n0RsY(FSeWUz`;16L<45;oOX0Ym#=nAv^#BPN6}qnc>_d4RbJ6 zET$*7H;xy6rA))s2aXPWdHZV2Mjj>FQ0D%{5K1aMUzXrBPiZ@Q2UM#SGNtfiB!$}xk(ohBeZLhH- zO1+v)`8Fd#@VvrgPT;vkl`7=#VCm5dTrzjehPTA@^8tPI z`$N*X3Zg#VP4}5I5#4CL1bT%vU4J^?SYy%!l0kIozDIK+lA?-=R!yV1S!l&*C#D?M zG^{HYS(`p~s-iCR`i3ZSL|Lbz5UkV9-GGu^t@VhjsRG@e!}GAufY$(G7Bt-R3QT*e$=AO54~ApwL%c(V|%G$yD5P)KqL2iT5*~ zcr3GCwfbbi`=~K-4JX6Xb~26o`WSzSqRQFg8SoT5_{|i%Gi#;?q53|1rVe4^ZBtt; zgS}flDK|q2Vl99=D4w&s$<-{Hy5{drY;oBx6>0_n)rMjPSJOjV9C-W{uI1uhO?NPx zTfNz|n2%#;TnDbx{yVJ+mc0^=MZkOFIHKL^^|VgmF1pJWmP!o;E#ZYnt*pVfW9raD z2=xm=SPTlJ6*mq!;p+3B;~;91l>CB=49F?RKL5odq_?0{`;?D2&oq&BSn|5p&UM z`_9Jwdi_&kw!zZ)1>xv}cQ~lKw0to{dl{A`qyi!{m&swt85fiI{E*Ogh6N244Mu#K zj3(p$e)on()Memd#ROs1?dGIQ;~;+2?&IhG>nE}T@L%0(4)zALX4VFlPKHMRABFzI(baeQuRx?l%sd~` z&#|&~PDn4HmPbGG^*p(r323Of)mq=b3A+$pV_pU|=kJz72{o0RV^mz=6`jLO+sS6y z^klQFxubx4=X-i!&T;&?cK}Xi_I6JQZ_KEA1fJB1p-36D5edi;BQUM1Daqk$Ua04s zKB!e4-cYOpfkK>CSgtUdoKA+iA%gd$A)4r+FrZOcE?qv;G=ffPc8uO3v5pxE=|rRW zh1@i`%p&775%mFHW>EJCu(a?wvA+s|day#c?@wAB8Ps&Njr2~`*R(ElMei}}lMPY; zv>37x>7E=s^}yRgRueKHh^!X~*rY6w@GK}!|A}W<6>WWyGTi7if+S&&@I+4n>Xv?r zh5BP-A+YefA1Z}F{>a0Y3>cy&sSpV$hyOU@Z($H*3jd{vB)qutb!Lp6m6TZIU0^Z} z3g0R9y!76Z6#1}3KicCR&4vqY>&J( z&^+$usutsw)A==GP?&iV>z(?u0kEmQ+pUhmsP@-C@psmin9+i0Od$t;5a5XZBg-Py zW^B?7qVKx%%%UgK92u=l^;#IIf(yc>7R+hgf!2C>m*n|*dKX@fW+unIjJdDaIc99H+%&<04Syg*;)5!Bd*rf(70`f-?rCVT`Dsv4 zhkDvxD?u0a&*q{60yzfLct#dSM3^DtPR3w^!X8U|WJilbG#e6dApobQJZD(eryW$k ziz-=512r_{_O0!wn5QlL{aTl^P0Tc5 z2kXVx)`IH4E?2Ladzcue!H(PL=V5S~QqTGwBSDSF9N}UwCKhx|N4f3TdG}Yb(mN^| z%8uhEam=<_cF&Ug43q{Zoh&6wUn0m&lPI%x64hJb0#C*z4c};JmXA}lyf%jkld}J| zDPM1-yG!Q8qqs_*8_${ep?;@@=+w;5%4(Lm#wD~^v<#>tg`!KB1VA}(VWVHK6|!E* zmNadg!V=2U1IZoIGF;ZTpj_B4MXS~`_cZNvyr)i4v=1yTLiq=Zvbkk%=up=u_AuXp zU@8f;Fh}4yRD~DCEFUVO21k)Gz+dw6N7$SdQ$sHDH~>2Uc%}_c2M#4-Ja-Cwv*bEg8&G+U3F; z<550H7q(is&3M(mRwsykGqsM(T~%%cwwa~Jx<>N(-i`K~5V@wlEettwSDgC(e}tW5 zlPJ)VWy?12ty{Kj+qP}nwr$(CZQHhOPQ9L(iH`Zu^CwQm*_nGS%$JJtO@}>Dj`8WBK8SBb)IIwrhQ- zCQ)YoyxK4-?_jJdz8gI!r(f&o!8Y_I)f3P%FEXz;%B--GcvAV~;2q17gF7!t*Ni@m zJYw~DU)13c7`CT;NKZHI*xfy1K~kIv2(4I6X*BZB5}F6Xi^zawKQ70g4-nX zDG{n3#|R|Xk&?1NYHAYxcQkkKnM*VD=IR8GX7|3GVDb6PUmE&ny?_kVQK?xFD zD2*LSkJaZEj+&}K$Ac~%Rf`8{tBvEAJvWk9NO2X?$XAtBKDx9iG?Fp2#hdj52yPv9q5s#+98$-)El{&5ij-;5M)GZ*cn z47jgWR)kC%x)pxKfjF6m|C!oVoJQ3n}0~n>AHJE%^t5)$d5C8X0cv>GDkf(tRfQ(GW52 zM1;}F#2RF26o=l^Vm$-!whSzt&5x@u{%J6)eeU1YOW8lS%LlSdb;cI|(I#{SirhE+ z)Q>y?%)wRItFoi%%sU8}-K5NvXmqn#TYagL5IZhA-Z6K2r~fRj+;&$H6K--W4M8M} z1)xr%ulD&0*lM!YFt2xD*r1zlf~F%tQSx{VER4AX7+I))tMOJeKqkwyho=KW3AFYF zLWi>qJ2)38A=0<=Ok_>So=w9S&8&eTAddw=)nV#f7KQ7 zC!87WGng~Zs^<*z6fBO``Qp|PpaV0lK1O{n`1(Jy2fMefn^^){BKA4)Ox}>0b`_i= z!kPmGGI?BP;jRd>;ZtDOGLpcL4Ol&rb@|M+%uomPTxkBH={

vC&0;%>vlXwpPzMLKhVL64SBudlLu!=0x;*~=! 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 Te%MM_Bs$uxMb9)+jk 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%0D=QAP-?W$~`XT@|0 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

X`4wK z<2UodIza)-doi#ymz~6Apn5{2dEq^$5gv;o1;JnO``z0|M#@G^-b_A4OW{mQDcDSbjKm(bcz7Hr&--i@iuN_o@s zl)!3K&{FyTtF<$Ms_FY4_$wl%zM^DEgXU41L^RQ;l#*zW*PQ0Lh(uH*8l*I#(m<0) zl1fC9lq6}8XjWv168`7D-qpMJ-TU~p{(aY5r@m`BpSSnfd!MuSIrm%>t0za}tQ40o zlzm>99X=4$VAtCskOmhs8-hPfqcViSDH5mu)VhlNGn`ReBtqLa*g`T$-q1f2q_txmHNk zi7{hAz($6JTwj6|R~dxgSDG65-qJtSkTrEk!%+U0oIYXwi+P8B?o9c)AU(6+#fN3h z)VW{rAM`)w-pbiApjx%3$?8VhMaINacOL}lbS_&F>)h8EAf2+_Xa2TM*|5=Sog;mX z9;@5q*UNDkm$|aC%m)viu%5CSvj)FrD9eXkF5bZzEp)=0F3>DN$x`)_Py8^wOs2OL z=NYjSHfAr5*WY!cLO!?{Y$|>B(DH~g$7^2ZSiDb z4d!%h@V!4$|AE=Le(w4K@iVsy!n_L;*A&;!Wh*`&B3@*!X&BG8qn$C=W^Rl8kykQD zUMU=ze8sr$A>&XETbx~OknE_r{rj8s-`x`zRK2QRuN{0UBO&XU{3iC(gpDp9TaDU< zeN2N_k2XH$ z*rXwS%IyA}T_^Tto%vFrtxzfw(fwg^pZj{*$oK?$Er!yr4W(|?ie?K5gRNV8Dz})$ zSUs)EmA<^&y{+3}{A42Y>H~FmbCsu#C;PwWi8qZmyz!w{R6FC(L6?6z`0Q&-dGHw$ z$WfA|c?_I~zY3nCz$iLF|A6$cH~0nIl3?8KmIO}2zb;r7%c<(8{bS#D(Nmo#-|gC7 zHME(XkACx=#d{j}^yHrUeMgD;d6a8TjO21ZdvIL2Klx72rEL9(Zl@g^WbF>z8DG|( zH7x0#E_E>3WJ7E2nu5L8zmNUo+xo0sF68FAWqI~tO+Tk9{%hmVZPWhvOx{#AOKeei zCVl(b5Q{j~nkDBO&h{OnXP?-5D$~JSp20W5@ zr`K~iutuW5In9gi$2~$^{N+Z~AFgBce4Bdsb~JzH;K{0Yb7?KtO!G=#7JsE?H9@KA zS9UdPQNiFM|2OYqtE|elj}eJvZS_sR$B z75k)S{OT^$>n{1ABCMnMabV#Mv;3F|iQ5OKh8#Lleby3P&SYxsC03^Sid=0kzO2mg zBj&Bj+j^RD?DG`F44j(SPTFN53E&Resop&ln;~h5(?L52IGC<(sR~P@c z;)ewv*W}g3eVn>h@!!SEYnEs&o{ze+U|A=RJoLVS0&vFxD_o#7G1M|r+oH2gD|45t zJHPy*UtLy2iM^YC2t zvggiEH+~+kf7zbyXIP_pya9;G$!QsXz>;&0WAxLA8tI{vD}`}CoTDNQfsA9|5WwWl&n)oRSn z-qJG>N-h|B&TJ_p^H{7%i8)xxYGfhO%HfJ3uFzRf88*TWs!JM!9mNM$J^)B*V6Man+TkZ33O||D`@-aNP!RAFEQ|< z?8vZv#RYA{@7u?>cvLx9OBz_0pTAR`CU9`E`jh=BVi{u_eA%Vb;&slOXYn5DzOJ)= z$+l+^y4JFn7B2Xbru0I&Sa{Cn@uh`U5yv(~msi{kXSN=lAdz_qzRq$Z$Wi$Wme^>U6F}<+ZPi?l?%jSXs znf($GJGbcNs!LgIzvE%)oV(VgM`rVl$HOAT=c+GXeo>oHJ~ClYY;tY4(D0+v?QNYt z6S~Q@U-NX$J#BSvNyQb)f4TeKTeYgf;|!y~gP5T~gU3H6MusQ6KK=aaGu0VT!ub8N zz)!!x%2o1w+zyF#hi^A(a>{)0WYP1S)Omkb=I%gx&<@M8{ogfrCTa@trQ~c_UM;g* zg7a!Z?lRpcQen5)O&;3ce!;@XHc=(NZ9q|<(=MOMPUKfoZ}$_sYpGrCRW>(=wN=IM zUni!DoSu5(!W!~4^2fDr8ix;S4szULJ3fABRe|De?au=*nM(PU`OKTc_#U=YX=Gjv zGHy@jU*45c&UBKC&3P{q{fA5isZz;z`-Ysu2haKLZrd!#%scTs+MrNr^-GcLbah5m zrPhyk4Z}wlPPN)D{LHiH*c0N{;S1-J$Jj)Vxj#yT2?S_TSfGX_B8%wGX#QHEAgewr2Shy?d`i+VLGx_4&PQ z^TSx0=6;&HD zXX{12F+Dq)d2wK4+nTxN*PLt5(skv@ry0Es39Zcuv3bV-EcUVSDiO1RoEV9S#o_I- zy{Bsrx2-YeJ@v9oIig`;P;ozZ;nE$?d-J=Lw1W!*8(q@Xl|~fSeM%6_&P|ZfvR7ym-7oF%}n#@yXS=|q+A}}ARcWh1m0H8 z5@->7(~i57d#~P2_blhVZ-Vl-rY`5uXBiNAuWg=w>Z+-}x7>*hA~DA$rE>c7cZw_B zc`wTD->mfI{NTQFZg*mv*ZS9If>yM@su#(7vdY0dgJPLx(hxHPTHp#O2&gZ4&A3n%>t z6Lv|GQ#VW(L}p%@GxWPH%8)OI(csa_TB80DwLO*Uj*XWFcO>1>;D7$a!?UIDJd3hr z$LsAq9Tl2ck*0*pMv3&|7wey<=W}r;&9(H}XwW6Ku6@F#Sl>SB-FSb^cQ=KJMSDyq zI@F_dqLlpCk;2XTJHB}?x%XUUjuTI=>WUZf`*~s(e@$OIKb&aMd+WTAfPx@n zq+JT1xw-utCV^3Pzw9d>fkVxc?PI5n@9({JeywFk)u=*PnybZW&YMRctLh0`vKq); zH051uKA^Js9@nB``3E)hW#P#&m*w_lHxcKW&I_M3j5~MG*N(yX+vaSM4B^oO-%QlA zd**KsK3lbPzLm-`oA!b4(q@lkzdQ)(d23fM{&5|hv&8MK9=#SJyA{nc)K6$#DeiKq z_a6|Mx8%RGoZ;eCXF}MW-Q}Ay4XOp#ZhPCd_F%<|+YTEWN8cP+d(k>|;m6za7PEd^ zQa-pNXq7~O!|O!R{i6RRw=k=Hs}1mc7ab~YAI`@{FM5ILo8+#<9Ls}>s$cihxbWe@N!rXwDiHlP5G=^ZV^W`Pe_Zs9-kj^^R>GncWm#F z0~b>-xcY{e&$HtIhmC(&j$p?*@LJB5>mEzn3lICZ_Xa5UTSPZRc<@xS(wASkT5lA| z)~b9Cqbv-`u-?Z}fRjn-iAVZ&U?3Gz% zVt7*0xi$B$u5jb^pV}3==!1M;p|jp?j(x|3v$Z!pnOgbb;uD5ok2cM7@pJRmZn0Bj z6BJC^&QC z>$`T8E3I^G+y`Ai5iynGcPXkoA?s)B2iWlZ+( zp!sY^YgJ0E>QHachxz3@!8IDu`!NQgS?E1c`GWmj~@Je{O*@~ zTb;d+xr>V>2hHJ^)!msb&Zb)`qf9LCA;hlc3uFrUKBTu^Y+}%GeQFJn=hGSXxBgGm ze}9|9;qS|&ts)5Sw>A{G%3~YEk?nFSk$qU$;_aaC2cq_u1plsEi;4ZL)pO3}3XcRR z4;jg^PA<0R`OeL^TSg-E z_k7EPFGJ$GT-JPNDGt20;928wKQo6Hs}w2uu>_yipF z+P_?B-Ts``r&h$E&)NsaI1RVb(W?-ki{z-&CI*54>HiZ5VAGrQ13eVHhKayS`h$+J zjNl_z6TWs^16{`EQ{IWj4Rjk5vPpl>bjwJny%eohBvt1lol79Fte^)gQ@C5GpFh`o zY}QuWrlp~0phej~A!vo?(T*p7`o-!WO5SRAa{bZ;4>E6^M<6Uj^dAhUq_4f%z;HKM z1tWTY9XH@Zvv+ExEcnwqq?FHj0Fss7;W6ckMz zJq_d8^v_iCTx~zNd|c$bMlr zz}%AMX#om*2SODmLSap2)D$OsFhbbk&;pt3UsGQ>tl!G6NFW%o(V;A$eJ={+?QY|2 z2i@dBsWwIvGks`O;1;&<8DE^f?yBMI_VoE6R+$18a+=~#L~+0~Tuz`uN=YG*2dAsR z6i02;ZaFheL2hZ0O+g{uSWDUeif7d%H(%r!K=Mm_mI{>HPe1$^Grl0g3Jl9R5U!BZ zR5(@twsvR>Bagjm+%A%{U_qdzjycJ`zZk~K>48w-I7E( ztIJ?Rh`v7VRCY`@fu4Jrd!WI=fW95A-GiX7=R>*g0WLiJWX)aqM81PYDTy z=a^2B??&2J5D34W&?s94Y?K2Ys$**dO_X-R9=8~<#%=%;K2j>b?bs*~sIg6=?AQQJ zl+Q`;jcg#?#LE&uvOzgoDkiunaLbjmw=cND8q1&lMm+MaV4essfzTX`j@VJQ*hHKG zdpG%$rf5vrrHqvz{^S7X37U3HTm$A_0iqF-_3JjKKu*BqXUU3s+23^;7{(*8GFgU@YoHpN zHCw5|6{-n`=Mo4_V5?{qf^`2W9*Kqx!pei&X(fWb!4DLAZ`#zH76-pWA7tDJevXO5 zPZ?kY+)|Dggj$+xv2qYx$60TVo)zCvp-8vgBSHn)%Fic%$Ch6yIP6v&U(o&OcV3shDIl9ib$o);KIgesZ> ziUioA@Lq8wL8{!VP^-JYMW0s&Xoxq+-Z7((ZSZqa^r41KFCjIvm*p{mT8*$O+IN@@ zF(E{6x3yNbb~Y%P$clq8aEmtRZxgAE)*$N&TZhIOTH@pE+-8A;#wpS=>qL+efiRXt zhjP^sM@*cnleG*=GP2>p62UE6va4G=Bh`U@v-zN>_zM|$C@XItFJBvU4nrX85)KM* zizb$Q`5{^c-bxT~1-%61EypH$J6Jinp~U+K7^KPi?DnTVV7OCX~%`R`{JyZ zV3FXKQZ$Ix;}w379hAm0m!X5j-BBu<50OfPv8y1fr7;vgW?KT)~Avvh0+$El~jpM;$2YAt84r(Gb#oAy{FrHn@T&q#{IiPbYYn z?&e{1(YloO8;C%eP#6eQ2LASEtuanWtctD6OEQAv}uZ1}kZ(fk* zBlvGxqRiyA5T_lNL$!+ocfMEI#2-qc;lF2K)Bb<7^OA!b2s5MLP1O8<^u`Nd>`fSY zBMC)J6baxG+- ziIs4enQ<3zV>c-Y$D~#yD&Q!WI=CSt&nq@;Dl!jW2%gJ0hXk_lnbBQ5fv10``C6LHQPMY#T zH2{=HlFbzM2Rx+unFy;v5Cn2T+(G)q87|sL9KV2paEq2veR=GYFre0OuyR0JXbJyc zfHeF9rortD^=}p$EQ&#;G8)(-y)L(t=Eh$~ucItG+h-{ru_gBT92U9;D?P30~yb&->EigYJYeq*6@MyMn z*1l-r$haWul{9fr4}4S-1h_T86OcoHa z61X&IwiEV`dRYi)UL5G!h;%qD8mN!hqU0mbJbJ!TBqAI-XF~FHsBF^Dj$QzWKY)DP zhy@b&X*?pB=AeQgQlDg=Or1N)<*;~=K9}|-lz#*~Nw7hV3@0{cY4E^)JQ7D9KF8mh zq>W`P9Hh|Cr={!0pba@`G%hNc1`ZTekvOt+s$+gMrMu1Zb(;?GIyazASSgIW&mdmz2bFfDGXxFc z!AP}ZOl3w&c;PA&8avUIZm*XBQ-SV}Mf!Qp7d#qNL&k)`nID!OA-nARVy>kFVBu6j z$!j)yD)sU$k!f$b@kcn#TRmrXf#ol;u zItI1&6T_vFkK-VLnZY5YlxbmUn*&StEAgS()iAyLH#dY}g;FM8J z-nnN5AbduHN+!|;Z))MZg1Yh1QW7~1fHTP&l2lxeJJT-*ZO?;O}(L&DN_;=!Og zFaidjaG@2cAy~V*PF^6WXt9Br7C8^)InaQCgCUr>ZOabP9JgKhS0s%9>Z1YLA&BlY za8^#P9xm9#a_cT!(}ZHotJR~Mp$zX8SO6j?_OVc0;&go&DIwVv=sS>OZIdFZxo|R9&)7vXlN?ko zzo83uw1vTg!AJ*Bzz31v3XLh5h@=B)*x)aKj-0#n<89Xg-~}omPb#it9v&W6?sh0u zlEDzP_2>3Kv*)kossZwW49q61L)!I?G!+B z?5Hd8(?#ouy^&vp!Lg;4U|L6dfIB`2meABvH(fwdxHW>?QZaX z47_;)|2+ek&PMXr&+!ZdbIqkX^sd<@Y5@H5b;RBRIe=V_%pzGm9_Yp#xf`}%VjBhv zl$o*O1(FyJP)Pznc3vc*P+P)e7z}}1N~xewywEsN>Ku6Wh5~Ri5HS#D2m6qab2lj-;)!x4misNIFgVSA5`Cnn9~%NTfE-a;Bgcu47I~!d z7Tlt>#xbYOH3L|84Oq4!PY=oS&7ZOGX=8)rA)$~#_a9NAtRhmqU|O z649r7{t@Nqw=0ewq)^adC8SgmYWS#GNtI>1Zg3PRZ$uJ(hRseF2j$_4-W~o&u{w%# za^iq_9|E%o^1R$hGa9T}$>lYqU$P0TrQ*Rw49N3xrh742_TK2Tq5mkA^s*4XjbJi9 z4jxTFlInbMNwbnkng8lKHvtgN!D%d{S!_IvNpkX_Izax9LS3DgmGK>{d>??k1&Ml- zfsdM%RG-Dpe#(<05E9;?^|vSw6Xh~np(?bR%-Vokod#Zv9I4N5a7nY0>1?e}!C_$O z^;DKl{~nX%N_23-Ih6&6KDb4Pz{${2IYYo&PQ@x4qrsY$T-kY5!mOauG6kXqQiJN> zuvxb9vkUB=K`R@|z|tiFNQERFpUa39*j)i>Rx;(M?TGY$1?m2o(H~BqAR+$pbxAk(Vv7)xj;=`r1A? z{ayja=ofg(07*)>!X^FBGC>QZ`|g}_Zeai56^OOSWc>3!JQ9sPCRiZ2MGF>b*Ob5w z2C8!{8kg*jhr`Om$pIH$JHag)XYgp~Brn)uk~)fBYkm#E#esAVd93#zVTP4AcO3yK z{}%9$H{?XT?E)sui|A&HGd;or!7W;_&Z6YieIPt-06Zj%F^>id(?nnf+@e`W855#n zpi`qd=*&Q<7?b6_%DE&+zI;fYSaL#=L2ENt2Mne(;B*SEZl2AhNcRv8Cfdu#-WgI zgu{K30OrE&jM}EN_YQ#=Gq8FkID-$8*EL9`Hj-3-c$l^ZbKrJ{M?Fl)qd|T{RJ`fD z8j&8t{mRAk)6}DELO81um**(54ULfM>i`Z}t1$XTB_D(WNA&D$oUxZoFa&NXVNg`^z0qfs17ImoZRt;mhZm^!!~`}B za&1VR=**EEonR2$&H$-R6Ir(K_(25(<$g@N9N77uWS7*C>Cr;I+g<=j1O4!V&qZtq zbo3j3(>-O_`qwc-zHOBfc$i_q^cok^*&0$@gruSX&dMHtmVB_U z!R^ebP5T`3MJ<##!KJiuvyu+^0v1YKIc?nZ>sV$ZA@Z72O5`J9ni7(b|D%+Da|I_6 zDkOB(B&A%i>CH&SOclZy wxJBcT7hzK3EXB#VKi6VXY7c&t2<{hd4Yx9Y5+t}-6Z|IxmY%8dAl?)H4`o{7vH$=8 diff --git a/ext/readme.txt b/ext/readme.txt deleted file mode 100644 index 04b45625d..000000000 --- a/ext/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** External Libraries. ** -***************************************************************************** - -The libraries under this directory are not part of ChibiOS/RT but are used by -some of the demo applications. -Please note that each item is covered by its own license, please read the -instructions contained in the various distributions. - -The currently included items are: - -1. uip-1.0, a minimal TCP/IP implementation: http://www.sics.se/~adam/uip/ -2. lwip-1.4.0, lightweight TCP/IP stack: http://savannah.nongnu.org/projects/lwip/ -3. FatFS 0.9 (patched), the original version is available from - http://elm-chan.org/fsw/ff/00index_e.html - -The above files are included packed as downloaded from the original repository -and without any modification, in order to use the libraries unpack them -under ./ext as: - -./ext/uip-1.0 -./ext/lwip -./ext/fatfs -./ext/stm32lib (you also need to copy stm32f10x_conf.h in your project) - -Some patches are also present: - -1. uip-1.0 patches, small fixes to the uIP required to make it work with - ChibiOS/RT, unpack the archive over the uIP distribution and replace the - files. diff --git a/ext/uip-1.0.patches.zip b/ext/uip-1.0.patches.zip deleted file mode 100644 index bdff1db6bc1ac302b7fbe9e9f3f54d137b8efb05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21462 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 z 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 _zr6X=a8lClFBrS)V%V*14f3i>VB4~C`}j7T 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 z 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�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 z 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

    hKYO)_m7ZFHal)TvJe_Dhnw>_2<< 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 diff --git a/license.txt b/license.txt deleted file mode 100644 index 94a9ed024..000000000 --- a/license.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/readme.txt b/readme.txt deleted file mode 100644 index 89b08a66a..000000000 --- a/readme.txt +++ /dev/null @@ -1,2661 +0,0 @@ -***************************************************************************** -*** Files Organization *** -***************************************************************************** - ---{root} - ChibiOS/RT directory. - +--readme.txt - This file. - +--documentation.html - Shortcut to the web documentation page. - +--todo.txt - Current plan (development/unstable versions only). - +--license.txt - GPL license text. - +--exception.txt - GPL exception text (stable releases only). - +--boards/ - Board support files. - +--demos/ - Demo projects. - +--docs/ - Documentation. - | +--html/ - Local HTML documentation (after rebuild). - | +--reports/ - Test reports. - | +--src/ - Documentation source files (required for rebuild). - | +--rsc/ - Documentation resource files (required for rebuild). - | +--Doxyfile - Doxygen project file (required for rebuild). - | +--index.html - Local documentation access (after rebuild). - +--ext/ - External libraries, not part of ChibiOS/RT. - +--os/ - ChibiOS/RT files. - | +--hal/ - Hardware Abstraction Layer. - | | +--include/ - HAL high level headers. - | | +--src/ - HAL high level source. - | | +--platforms/ - HAL low level drivers implementations. - | | | +--AT91SAM7/ - Drivers for AT91SAM7 platform. - | | | +--AVR/ - Drivers for AVR platform. - | | | +--LPC11Uxx/ - Drivers for LPC11Uxx platform. - | | | +--LPC11xx/ - Drivers for LPC11xx platform. - | | | +--LPC13xx/ - Drivers for LPC13xx platform. - | | | +--LPC214x/ - Drivers for LPC214x platform. - | | | +--LPC8xx/ - Drivers for LPC8xx platform. - | | | +--MSP430/ - Drivers for MSP430 platform. - | | | +--SPC5xx/ - Drivers for all SPC5xx platform (common). - | | | +--SPC560BCxx/ - Drivers for SPC560BCxx platform. - | | | +--SPC560Pxx/ - Drivers for SPC560Pxx platform. - | | | +--SPC563Mxx/ - Drivers for SPC563Mxx platform. - | | | +--SPC564Axx/ - Drivers for SPC564Axx platform. - | | | +--SPC5ELxx/ - Drivers for SPC56ELxx platform. - | | | +--STM32/ - Drivers for STM32 platform (common). - | | | +--STM32F0xx/ - Drivers for STM32F0xx platform. - | | | +--STM32F1xx/ - Drivers for STM32F1xx platform. - | | | +--STM32F30x/ - Drivers for STM32F30x platform. - | | | +--STM32F37x/ - Drivers for STM32F37x platform. - | | | +--STM32F4xx/ - Drivers for STM32F4xx/STM32F2xx platforms. - | | | +--STM32L1xx/ - Drivers for STM32L1xx platform. - | | | +--STM8L/ - Drivers for STM8L platform. - | | | +--STM8S/ - Drivers for STM8S platform. - | | | +--Posix/ - Drivers for x86 Linux/OSX simulator platform. - | | | +--Win32/ - Drivers for x86 Win32 simulator platform. - | | +--templates/ - Driver template files. - | | +--meta/ - Driver meta templates. - | +--ports/ - Port files for the various architectures. - | | +--GCC/ - Ports for the GCC compiler. - | | | +--ARM/ - Port files for ARM7 and ARM9 architectures. - | | | +--ARMCMx/ - Port files for ARMCMx architectures (ARMv6/7-M). - | | | +--PPC/ - Port files for PowerPC architecture. - | | | +--AVR/ - Port files for AVR architecture. - | | | +--MSP430/ - Port files for MSP430 architecture. - | | | +--SIMIA32/ - Port files for SIMIA32 simulator architecture. - | | +--IAR/ - Ports for the IAR compiler. - | | | +--ARMCMx/ - Port files for ARMCMx architectures (ARMv6/7-M). - | | | +--STM8/ - Port files for STM8 architecture. - | | +--RVCT/ - Ports for the Keil RVCT compiler. - | | | +--ARMCMx/ - Port files for ARMCMx architectures (ARMv6/7-M). - | | +--cosmic/ - Ports for the Cosmic compiler. - | | | +--STM8/ - Port files for STM8 architecture. - | | +--RC/ - Ports for the Raisonance compiler. - | | +--STM8/ - Port files for STM8 architecture. - | +--kernel/ - Kernel portable files. - | | +--include/ - Kernel headers. - | | +--src/ - Kernel source. - | | +--templates/ - Kernel port template files. - | +--various/ - Various portable support files. - +--test/ - Kernel test suite source code. - | +--coverage/ - Code coverage project. - +--testhal/ - HAL integration test demos. - | +--LPC11xx/ - LPC11xx HAL demos. - | +--LPC13xx/ - LPC11xx HAL demos. - | +--STM32F1xx/ - STM32F1xx HAL demos. - | +--STM32F4xx/ - STM32F4xx HAL demos (valid for STM32F2xx too). - | +--STM32L1xx/ - STM32L1xx HAL demos. - | +--STM8S/ - STM8S HAL demos. - +--tools - Various tools. - +--eclipse - Eclipse enhancements. - -***************************************************************************** -*** Releases *** -***************************************************************************** - -*** 2.7.0 *** -- FIX: Fixed STM32 Serial (v2) driver invalid CR registers size (bug #416) - (backported to 2.6.0). -- FIX: Fixed MS2ST() and US2ST() macros error (bug #415)(backported to 2.6.0, - 2.4.4, 2.2.10, NilRTOS). -- NEW: SPI driver for SPC560Pxx, SPC563Mxx, SPC564Axx, SPC56ELAxx, SPC560Dxx. -- NEW: Support for SPC560Dxx devices. -- NEW: DMA-MUX support for SPC5xx devices. - -*** 2.5.2 *** -- FIX: Fixed lwipthread.h should explicitly include lwip/opts.h (bug #414). -- FIX: Fixed STM32_PLLI2SCLKOUT miscalculated (bug #413)(backported to 2.4.4). -- FIX: Fixed wrong RTC vector name in STM32F1/F4/L1 EXT drivers (bug #412). -- FIX: Fixed fill character error in chprintf (bug #411). -- FIX: Fixed wrong STM32 USBv1 driver behavior (bug #410). -- FIX: Fixed STM32 wrong peripherals reset procedure (bug #409)(backported - to 2.4.4). -- FIX: Fixed STM32 SPIv2 polled exchange (bug #372). -- FIX: Fixed wrong macro in PWM driver (bug #407)(backported to 2.4.4). -- FIX: Fixed USB driver possible deadlock under certain configurations (bug - #406)(backported to 2.4.4). -- FIX: Fixed USB driver cannot be stopped (bug #405)(backported to 2.4.4). -- FIX: Fixed several spelling errors (bug #404). -- FIX: Fixed serial port in STM32F3 discovery test case (bug #402). -- FIX: Fixed add %i to chprintf (bug #401). -- FIX: Fixed STM32F051 various (bug #400). -- FIX: Fixed STM32F103 HSI configuration (bug #399). -- FIX: Fixed patch to allow simulator to be restarted quicker (bug #398). -- FIX: Fixed blkDisconnect macro typo (bug #397). -- FIX: Fixed STM32 SPI (V2) driver hangs (bug 3608241). -- FIX: Fixed fixed I2C malfunction after fixing bug 3607518 (bug 3607549) - (backported to 2.4.4). -- FIX: Fixed spurious interrupt disabling an STM32 DMA stream (bug 3607518) - (backported to 2.4.4). -- FIX: Fixed start of any ADC disables VREF and VBAT (bug 3607467) - (backported to 2.4.4). -- FIX: Fixed surprising non-CRLF lines in source (bug 3607380). -- FIX: Fixed no entry point defined at link time (bug 3607319). -- FIX: Fixed sdc_lld_collect_errors does not collect errors (bug 3606743). -- FIX: Fixed STM32 CAN broadcast typo (bug 3606675). -- FIX: Fixed STM32 CAN mailbox receive for second fifo (bug 3606673). -- FIX: Fixed CAN_USE_SLEEP_MODE compilation problem (bug 3606616)(backported - to 2.4.4)(backported to 2.2.10). -- FIX: Fixed missing HSE bypass option for STM32F103 (bug 3606274). -- FIX: Fixed misplaced brace in icu_lld.c (bug 3605832)(backported to 2.4.4). -- FIX: Fixed errors in MMC_SPI driver state machine (bug 3605794). -- FIX: Fixed deadlock in Serial_USB driver (bug 3605793). -- FIX: Fixed compile Error OLIMEX_SAM7_EX256/board.c (bug 3605058). -- FIX: Fixed bug prevents calling adcStartConversionI() within ISR (bug - 3605053)(backported to 2.4.4). -- FIX: Fixed typo in platforms/STM32/can_lld.c (bug 3604657)(backported - to 2.4.4). -- FIX: Added board files and demo for "WaveShare Open STM32F4 207I-C / 407I-C". - Added ULPI support to the STM32 USB (OTG-HS) driver. - Contributed by Dave Camarillo (bug 3603362). -- FIX: Fixed adcSTM32EnableTSVREFE must be called AFTER adcStart (bug - 3602950). -- FIX: Fixed duplicated code in hal_lld.h (STM32F4xx) (bug 3602544) - (backported to 2.4.4). -- FIX: Fixed #define typo in usb_lld.h (OTGv1) (bug 3602306). -- FIX: Fixed STM32F0 RCC enable/disable/reset functions for CRC and WWDG - (bug 3602150). -- FIX: Fixed missing parenthesis in use of macro arguments (bug 3601638). -- FIX: Fixed compile errors in Posix-GCC demo (bug 3601621)(backported - to 2.4.4). -- FIX: Fixed state checker error in MSP430 port (bug 3601460)(backported - to 2.4.4). -- FIX: Fixed wrong assertion in UART driver (bug 3600789)(backported - to 2.4.4). -- FIX: Fixed small bug in shell argument parsing code in shell_thread (bug - 3599328)(backported to 2.4.4). -- FIX: Fixed wrong condition in checksum offload of STM32 MAC driver (bug - 3598720)(backported to 2.4.4). -- FIX: Fixed error in STM32 MAC driver degrades performance (bug 3598719) - (backported to 2.4.4). -- FIX: Fixed warning in STM32 ICU driver using IAR compiler (bug 3598177) - (backported to 2.4.3). -- FIX: Fixed wrong SPI path in platform_f105_f107.mk (bug 3598151). -- FIX: Fixed PHY powerdown issues not fixed (bug 3596911). -- NEW: Added new pwmIsChannelEnabledI() API to the PWM driver, implemented - in the STM32 driver. -- NEW: Added support for timers 6, 7, 9, 11, 12, 14 to the STM32 GPT driver. -- NEW: Added support for timer 9 to the STM32 PWM and ICU drivers. -- NEW: Relicensed parts of the distribution tree under the Apache 2.0 - license in order to make specific parts of the code more accessible - to the open source community and adopters. -- NEW: Added ADC(EQADC), HAL, ICU, PAL, PWM, Serial drivers for SPC5xx - platforms, tests to be added on the various sub-families. -- NEW: Added support for SPC56ELxx, SPC560BCxx, SPC560Pxx, SPC560Mxx and - SPC564Axx platforms. -- NEW: Added ADC/SDADC driver for the STM32F37x family. -- NEW: Added support for the STM32F37x family. -- NEW: Now the general documentation includes data extracted from the low - level driver templates. Per-platform/architecture documents are no more - required and will be replaced with technical articles and examples for - each specific driver. -- NEW: Added a build test project for low level device driver templates. -- NEW: Enhanced CAN driver model, support for mailboxes has been added. STM32 - driver implementation upgraded. -- NEW: Added ADC and PWM drivers for the AT91SAM7 platform, both donated - by Andrew Hannam. -- NEW: Added kernel support for the SAM4L, an Atmel Studio 6 demo for the - SAM4L-EK board has been added. -- NEW: Added an abstract file system interface written in C++, no - implementations yet. - TODO: Create a descendant interface for hierarchical file systems. - TODO: Create a FatFS wrapper implementing the interface and using a server - thread for synchronization. - TODO: Create an implementation over a read-only file system in code space. -- NEW: CAN2 support for STM32 added. -- NEW: Updated STM32L1xx header to the latest version. -- NEW: Added an option to lwipthread to change the link status poll interval. -- NEW: Added new C++ demo for the STM32F4-Discovery. -- NEW: Updated C++ wrapper with a much more logical classes structure. - TODO: Opdate older C++ demos. -- NEW: ADC driver implementation for the STM32F3xx, the driver supports also - the dual-ADC mode allowing for a very high combined bandwidth. -- NEW: Added zero-copy capability to the STM32 MAC driver (experimental and - not tested yet). -- NEW: Added an optional zero-copy mode API to the MAC driver model. -- NEW: Added EXT driver to the STM32F3xx platform. -- NEW: Improved the STM32 EXT driver to support more than 32 channels. -- NEW: Added support for Olimex board STM32-LCD. -- CHANGE: Removed dependency between crt0.c (GCC-ARMCMx) and the kernel - header ch.h. - -*** 2.5.1 *** -- FIX: Fixed typo in chOQGetEmptyI() macro (bug 3595910)(backported to 2.2.10 - and 2.4.3). -- FIX: Fixed possible false detect of loaded prescaler in RTCv1 driver (bug - 3595489)(backported to 2.4.3). -- FIX: Fixed unneeded RTC initialization when HAL_USE_RTC disabled - (bug 3594620)(backported to 2.4.3). -- FIX: Fixed compilation issue with HAL_USE_RTC disabled (bug 3594083) - (backported to 2.4.3). -- FIX: Fixed wasting of BKP registers in RTCv1 driver (bug 3594005)(backported - to 2.4.3). -- FIX: Fixed potential problem with RTC_CRL_RSF bit (bug 3593972)(backported - to 2.4.3). -- FIX: Fixed STM32F1x rtc_lld_init not functional (bug 3592817)(backported - to 2.4.3). -- FIX: Fixed DMA reconfiguration problem in STM32 SPI driver (bug 3592809) - (backported to 2.4.3). -- FIX: Fixed STM32 UART driver redundant initialization (bug 3592764) - (backported to 2.4.3). -- FIX: Fixed wrong stack initializations in GCC STM32L1xx port files (bug - 3591321)(backported to 2.4.3). -- FIX: Fixed different redefinition for __main_stack_end__ symbol (bug - 3591317)(backported to 2.4.3). -- FIX: Fixed errors in STM32F0xx UART driver (bug 3589412)(backported - to 2.4.3). -- FIX: Fixed MSP430 port_switch code for MSPGCC issue (bug 3587633)(backported - to 2.4.3). -- FIX: Fixed workaround for errata in STM32F4-A devices (bug 3586425) - (backported to 2.4.3). -- FIX: Fixed error in palWritePad() macro (bug 3586230)(backported to 2.2.10 - and 2.4.3). -- FIX: Fixed missing ; in testmbox.c (bug 3585979)(backported to 2.4.3). -- FIX: Fixed STM32F4xx: Wrong CAN1 SCE interrupt number definition (bug - 3581571). -- FIX: Fixed STM32_P407: implement mmc_lld_is_card_inserted (bug 3581929) - (backported to 2.4.3). -- FIX: Fixed double chSysInit() call in MSP430F1611 demo (bug 3581304) - (backported to 2.2.10 and 2.4.3). -- FIX: Fixed patch for various demos (bug 3579734). -- FIX: Fixed bug in abstract file interface (bug 3579660)(backported to - 2.2.10 and 2.4.3). -- FIX: Fixed wrong type for UART config registers (bug 3579434). -- FIX: Fixed various typos and wrong limits in the STM32F4/F2 HAL driver - (bug 3578944)(backported to 2.4.3). -- FIX: Fixed ARM CMx crt0.c fails at low optimization levels (bug 3578927) - (backported to 2.4.3). -- FIX: Fixed compilation issue in chregistry.c (bug 3576776). -- FIX: Fixed compilation issue in syscalls.c (bug 3576771)(backported - to 2.4.3). -- FIX: Fixed Typos in STM32F0xx EXT driver (bug 3576193). -- FIX: Fixed STM32F10X_CL: Wrong CAN1 interrupt number definitions (bug - 3575766). -- FIX: Fixed superfluous pack #defines cause nasty warning (bug 3575662) - (backported to 2.4.3). -- FIX: Fixed mac.c won't compile due to misplaced declarations (bug 3575657) - (backported to 2.4.3). -- FIX: Fixed STM32F4 ADC prescaler incorrectly initialized (bug 3575297) - (backported to 2.4.3). -- FIX: Fixed RCC_APB2ENR_IOPEEN undeclared on STM32F10X_LD_VL devices (bug - 3575098)(backported to 2.4.3). -- FIX: Fixed misplaced declarations in lwip_bindings sys_arch.c (bug 3571053) - (backported to 2.4.3). -- FIX: Fixed double definition of sd1fel and sd2fel breaks Posix simulator - (bug 3570532). -- FIX: Fixed Ethernet PHY power down scheme prevents using LAN8720A (bug - 3570335). -- FIX: Fixed FatFS won't compile with _FS_REENTRANT enabled (bug 3570135) - (backported to 2.4.3). -- FIX: Fixed mmc_spi.c won't compile due to misplaced declaration (bug - 3570035)(backported to 2.4.3). -- FIX: Fixed problem in STM32F1xx USB driver after revision 4598 (bug 3569374). -- FIX: Fixed GPIO glitch during PAL initialization (bug 3569347)(backported - to 2.4.3). -- FIX: Fixed FatFS timestamp incorrect (bug 3568626). -- FIX: Fixed Data available event not generated in serial_usb driver (bug - 3567992). -- FIX: Fixed STM32F1x rtc_lld_init glitches rtc on hard reset (bug 3567597) - (backported to 2.4.3). -- FIX: Fixed STM8L, cosmic compiler: c_lreg not saved (bug 3566342)(backported - to 2.2.10 and 2.4.3). -- NEW: Initial support for STM32F30x (HAL, PAL, CAN, GPT, ICU, PWM, Serial, - SPI, UART, USB). -- NEW: AT91SAM7A3 I2C support. -- NEW: AT91SAM7A3 basic support. -- NEW: Unified the STM32F4xx and STM32F2xx platform code. The STM32F2xx now is - only supported as an STM32F4xx variant and not tested separately. -- NEW: Updated STM32F1, F2, F4, L1 ADC drivers to allow HW triggering. -- NEW: Added a new option STM32_ETH1_CHANGE_PHY_STATE to the STM32 MAC driver, - this change is connected to bug 3570335. -- NEW: Modified the CAN drivers to use the new event flags mechanism, the - previous flags handling has been removed. -- NEW: Modified serial and serial_usb drivers to use the new event flags - mechanism, the previous flags handling in BaseAsynchronousChannel has - been removed. -- NEW: Improved the kernel events subsystem, now event sources can associate - source-specific flags to the listener, the flags can then be retrieved - using the new APIs chEvtGetAndClearFlags() and chEvtGetAndClearFlagsI(). - Some old APIs have been renamed to increase consistency of the module. -- NEW: Added VLE support to the Power Architecture GCC port. -- NEW: Reorganized the Power Architecture GCC port along the lines of the - ARMCMx port, now it can support multiple core types. -- NEW: Updated the Power Architecture rules.mk file to put object and listing - files into a ./build directory like ARM ports already do. -- CHANGE: The STM32 Serial driver has been split in two distinct versions, - one for older devices up the STM32F4xx, the other for new devices starting - from the STM32F0xx. - (TODO: Update IAR and Keil projects because different paths, update - documentation projects). - -*** 2.5.0 *** -- FIX: Fixed anomaly in USB enumeration (bug 3565325)(backported to 2.4.3). -- FIX: Fixed problem with lwIP statistics (bug 3564134)(backported to 2.4.3). -- FIX: Fixed packed structures macros not functional in IAR and RVCT port - (bug 3561279)(backported to 2.4.3 and 2.2.10). -- FIX: Fixed Problem in FatFs demos related to LFN (bug 3560980)(backported - to 2.4.3 and 2.2.10). -- FIX: Fixed problem in STM32 DMA1 stream1 IRQ handler (bug 3538468) - (backported to 2.4.2). -- FIX: Fixed TIM8 not working in STM32 GPT driver (bug 3536523)( -- FIX: Fixed wrong priority assigned to TIM8 in STM32 ICU driver (bug 3536950) - (backported to 2.4.2). -- FIX: Fixed TIM8 not working in STM32 GPT driver (bug 3536523)(backported - to 2.4.2). -- FIX: Fixed timer overflow not working in STM32 ICU driver for TIM1/TIM8 (bug - 3536522)(backported to 2.4.2). -- FIX: Fixed wrong DMA channels on USART2 in STM32F10X_MD_VL devices (bug - 3536070)(backported to 2.4.2). -- FIX: Fixed issue with DMA channel init in STM32 ADC and SPI drivers (bug - 3535938)(backported to 2.2.10 and 2.4.2). -- FIX: Fixed issue debugging mmc_spi (bug 3535887)(trunk only). -- FIX: Fixed unreliable PHY initialization (bug 3534819)(backported to 2.4.2). -- FIX: Fixed wrong ADC callback buffer pointer in ADC driver (bug 3534767) - (backported to 2.2.10 and 2.4.2). -- FIX: Fixed STM32F2 RTC subseconds (bug 3533414)(trunk only). -- FIX: Fixed problem with arm-v6m and state checker (bug 3532591)(backported - to 2.4.2). -- FIX: Fixed wrong MAC divider setting in STM32 MAC driver (bug 3531290) - (backported to 2.4.2). -- FIX: Fixed wrong MCO1 divider in STM32F2/F4 HAL (bug 3531289)(backported - to 2.4.2). -- FIX: Fixed missing "break" in AVR PAL driver (bug 3530924)(backported - to 2.4.2). -- FIX: Fixed timeout related race condition in STM32 I2C driver (bug 3530043) - (backported to 2.4.2). -- FIX: Fixed wrong macro check in STM32 MAC driver (bug 3527179)(backported - to 2.4.2). -- FIX: Fixed error in STM32L-Discovery board.h file (bug 3526918)(backported - to 2.4.2). -- FIX: Fixed inconsistent LPCxxx Internal RC oscillator names (bug 3524138) - (backported to 2.2.10 and 2.4.1). -- FIX: Fixed wrong frequency limit checks vs VDD in STM32F2xx HAL (bug 3524094) - (backported to 2.4.1). -- FIX: Fixed STM32 I2C1 wrong alternate TX DMA setting (bug 3524088) - (backported to 2.4.1). -- FIX: Fixed system state check problem related to FatFS (bug 3523769). -- FIX: Fixed three testhal builds fail (bug 3523322)(backported to 2.4.1). -- FIX: Fixed MAC driver functions with invalid name (bug 3522808)(backported - to 2.2.10 and 2.4.1). -- FIX: Fixed code coverage crashes with Linux/gcc-4.4.5 (bug 3522301) - (backported to 2.4.1). -- FIX: Fixed macro dmaWaitCompletion() fails to compile in STM32 HAL (bug - 3519202)(backported to 2.4.1). -- FIX: Fixed ARM addresses generated in vectors table (bug 3519037)(backported - to 2.2.10 and 2.4.1). -- FIX: Fixed missing serial driver functionality for SAM7S64, SAM7S128 and - SAM7S512 (bug 3517648)(backported to 2.2.10 and 2.4.1). -- FIX: Fixed a few more spelling fixes (bug 3515531)(backported to 2.4.1). -- FIX: Fixed spurious ) char in STM32 serial_lld.h (bug 3514138)(backported - to 2.2.10 and 2.4.1). -- FIX: Fixed problem with FPU initialization in GCC Cortex-M4 port (bug - 3513897)(backported to 2.4.1). -- FIX: Spelling fixes (bug 3510812)(backported to 2.4.1). -- FIX: Fixed STM32 ICUD8 not functional because wrong initialization (bug - 3508758)(backported to 2.4.1). -- FIX: Fixed chMBFetchI does not decrement mb_fullsem (bug 3504450)(backported - to 2.2.9 and 2.4.1). -- FIX: Fixed STM32 PLLI2S initialization error (bug 3503490)(backported - to 2.4.1). -- FIX: Fixed USART3 not working on STM32F2/F4 UART driver (bug 3496981) - (backported to 2.4.1). -- FIX: Fixed stack misalignment on Posix-MacOSX (bug 3495487)(backported - to 2.4.1). -- FIX: Fixed STM8S HSI clock initialization error (bug 3489727)(backported to - 2.2.9 and 2.4.1). -- FIX: Fixed MMC over SPI driver performs an unnecessary SPI read (bug - 3486930)(backported to 2.2.9 and 2.4.1). -- FIX: Fixed Realtime counter initialization in STM32 HALs (bug 3485500) - (backported to 2.4.1). -- FIX: Fixed PPC port broken when CH_DBG_SYSTEM_STATE_CHECK is activated - (bug 3485667)(backported to 2.4.1). -- FIX: Fixed missing PLL3 check in STM32F107 HAL (bug 3485278)(backported - to 2.4.1). -- FIX: Fixed ADC maximum frequency limit in STM32F2/F4 ADC drivers (bug - 3484947)(backported to 2.4.1). -- FIX: Fixed various minor documentation errors (bug 3484942)(backported - to 2.4.1). -- NEW: Added Eclipse project files to most demos. The project are setup to - have paths relative to a variable named CHIBIOS that must point to the - ChibiOS/RT installation path. The variable must be defined under - Window->Preferences->General->Workspace->Linked_Resources and must contain - a path without the trailing slash character. -- NEW: Added memory signature record to the registry in order to simplify - the implementation of ad-hoc debuggers. -- NEW: Small andjustment in chcore.h files under ./os/ports/GCC required by a - difference in GCC 4.7.x. -- NEW: Added another STM32F4-Discovery demo using the on-board MEMS, SPI - and PWM. Removed MEMS handling from the old demo because code size limits - on non-free compilers. -- NEW: Added configuration wizard plugin under ./tools/eclipse/plugins. This - first version is able to configure the board files for STM32F0xx, STM32F4xx - and STM32L1xx. -- NEW: Added USART6 support to the STM32 UARTv1 driver, contributed by Erik - van der Zalm. -- NEW: Added demo for Arduino Mega, contributed by Fabio Utzig. -- NEW: Added support for ATmega1280, contributed by Fabio Utzig. -- NEW: Added I2C driver for AVR, contributed by Fabio Utzig. -- NEW: Added FatFs demo for the Olimex STM32-P107 board. -- NEW: Added support for the Olimex STM32-E407 board. Added an integrated - demo including USB-CDC, lwIP with web server, FatFs and shell, all running - together. -- NEW: Added an experimental and unsupported STM8 port for the IAR compiler, - contributed by "king2". -- NEW: Updated STM8 header files to latest versions from ST. -- NEW: Reorganized the STM32 EXT driver to have a sub-platform specific - part containing all the ISR related code, this has been necessary because - the significant differences among the various sub-families. -- NEW: Validated CAN driver on STM32F2/F4 (backported to 2.4.2). -- NEW: USB implementation for STM32F105/F107/2xx/F4xx devices. -- NEW: Improved SerialUSB driver using the new queued mode, much smaller - than the previous driver. -- NEW: Improved USB driver model supporting also queues for endpoint I/O, - packet mode removed. -- NEW: Added an application-defined field to I/O queues (a void pointer). -- NEW: Added board files for Maple Mini STM32F103, contributed by Wagner - Sartori Junior. -- NEW: Added SSP1 capability to the LPC13xx SPI driver. -- NEW: Updated vendor headers for LPC11xx and LPC13xx, the new headers - support several new devices. -- NEW: Demo for STM32F0-Discovery board. -- NEW: Initial support for STM32F0xx devices, added a specific ADC driver. - Validated EXT, GPT, ICU, PAL, PWM, Serial, SPI, UART drivers. -- NEW: Added a common ancestor class to the SDC and MMC_SPI drivers. This - allows to share code and definitions. -- NEW: Modified the SDC driver to implement the new block devices abstract - interface. -- NEW: Added two new functions to the MMC_SPI driver: mmcSync() and - mmcGetInfo(). Also implemented the new block devices abstract - interface. Moved the configuration parameters from mmcObjectInit() to - the configuration structure saving some RAM space. Updated demos. -- NEW: Added an abstract interface for block devices in the HAL. This - abstraction layer is meant to unify the access protocol to the SDC and - MMC_SPI (and potentially others) device drivers. -- NEW: Added an abstract interface for serial devices in the HAL. This - interface is meant to replace the equivalent class already present in the - kernel. access macros are similar except for the prefix, "chn" instead - of "chIO". -- NEW: Updated the MSP port to work with the latest MSPGCC compiler (4.6.3 - LTS 20120406 unpatched), now the old MSPGCC 3.2.3 is no more supported - (backported to 2.4.1). -- NEW: EXT driver improved, now it is possible to reprogram channels at - runtime without necessarily specifying a new configuration. - TODO: Update AT91SAM7 EXT driver. -- NEW: Integrated FatFS 0.9, now the FatFS integration files are centralized - under ./os/various/fatfs_bindings and shared among all demos. The FatFS - file ffconf.h is now application-specific like all the other configuration - files. -- NEW: Added an new option CORTEX_PRIGROUP_INIT to the Cortex-Mx ports in - order to make priority organization configurable, the default is to - assign all the available priority bits to preemption priority with no - sub-priorities. -- NEW: Added a new function chPoolLoadArray() to the Memory Pools subsystem, - it allows to load an entire array element's into a pool with a single - operation. -- NEW: Addes support for .S patch in the GCC ARM ports, by Ayman El-Khashab. -- NEW: Added a switch to the STM32F4 Makefile files in order to enable or - disable the FPU support in a single place. -- NEW: Added float support (optional) to chprintf(), by Fabio Utzig. -- NEW: Added overflow handling in the ICU driver (contributed by Xo). -- NEW: Updated debug plugin 1.0.8 (backported to 2.4.0). -- NEW: Added more accurate UBRR calculation in AVR serial driver (backported - to 2.4.0). -- NEW: Revision of the round-robin scheduling, now threads do not lose their - time slice when preempted. Each thread has its own time slices counter. - TODO: Seek optimizations. -- NEW: Modified the Virtual Timers management, now the callback is invoked - not in lock mode. This change reduces the interrupt jitter caused by - multiple timers used at same time. -- NEW: Added board files and demo for Olimex LPC-P1343 (contributed by - Johnny Halfmoon). -- NEW: Added handling of input 2 to the STM32 ICU driver (contributed by - Fabio). -- NEW: STM32 Ethernet driver completed. Added STM32F107 and STM32F407 - lwIP demos (backported to 2.4.1). -- NEW: lwIP related code is not centralized into a single place, no need to - duplicate the code in each application or demo (backported to 2.4.1). -- CHANGE: Added two new methods to the BaseSequentialStream interface: - chSequentialStreamPut() and chSequentialStreamGet(). -- CHANGE: Removed the chioch.h header from the kernel, now channels interface - is exported by the HAL. Removed functions chPutWouldBlock() and - chGetWouldBlock(). -- CHANGE: Removed macro chMsgGetS(), chMsgGet() is still available. -- CHANGE: chprintf() now takes a BaseSequentialStream as parameter instead - of a BaseChannel making it more generic. -- CHANGE: Now the shell requires a BaseSequentialStream instead of a - BaseChannel for communications making it more generic. -- CHANGE: Kernel memory pools now do not check the alignment of the inserted - objects, it is responsibility of the application to insert properly - aligned objects. -- CHANGE: The PORT_INT_REQUIRED_STACK parameter for the Cortex-Mx ports has - been increased to 32 from 16 because the stack frame sizes are increased - when compiling with optimizations disabled, which is common during - debugging. In order to save RAM trim back this value when compiling with - optimizations enabled (backported to 2.4.1). -- CHANGE: Renamed Ethernet driver in AT91 HAL ETHD1 (backported to 2.4.1). -- CHANGE: Macros icuGetWidthI() and icuGetPeriodI() renamed to icuGetWidth() - and icuGetPeriod(). -- Various documentation fixes and improvements. - -*** 2.3.5 *** -- FIX: Fixed RTC compile problem on STM32F103 (bug 3468445). -- FIX: Fixed PWM with TIM1 and TIM8 broken in STM32 HAL (bug 3458947). -- FIX: Fixed SYSCFG clock not started in STM32L1/F4 HALs (bug 3449139). -- FIX: Fixed wrong definitions in STM32L-Discovery board file (bug 3449076). -- OPT: Improved the exception exit code in the GCC Cortex-Mx ports. -- NEW: Added a DMA stress test application for the STM32F4 in order to assess - robustness of the whole HAL. -- NEW: Added a Time Measurement driver to the HAL, this generic driver uses - the realtime counters abstracted in the HAL driver. -- NEW: Improved the STM32F1xx HAL driver, it now has the same features and - configuration options of the newer STM32s. -- NEW: MMC over SPI driver improved to handle high capacity cards, by - Matthias Blaicher. -- NEW: Added PVD support to the HAL of all STM32s, by Barthess. -- NEW: Added to the HAL driver the handling of an abstract realtime free - running counter, added the capability to all the STM32 HALs. -- NEW: Modified ARM and ARMCMx build rules to allow parallel build. Now the - log outputs one dummy compilation command in order to allow paths discovery - by Eclipse. -- NEW: Added an utility module to access LIS302DL MEMS using a SPI. -- NEW: Updated STM32F2xx support by inheriting the work done on the STM32F4xx, - the whole thing is untested because lack of hardware. -- NEW: Files nvic.c and nvic.h moved under ./os/ports/common/ARMCMx, removed - the duplicated instances under the GCC, IAR and Keil ports. Function names - prefixes changed from "NVIC" to "nvic" because style conventions. -- NEW: Added voltage regulator initialization to the STM32F4xx HAL. -- NEW: Added a linker script that demonstrates how to put stacks and other - critical structures in the CCM RAM instead normal RAM. -- NEW: Added experimental support for the Cortex-M4 FPU (default when the - FPU is present but can be disabled). -- NEW: Improved I2C driver model and STM32 implementation by Barthess. -- CHANGE: Removed the option to change the stack alignment in the GCC - Cortex-Mx ports, now alignment is always 64 bits. -- CHANGE: Modified the function palSetGroupMode() to have an offset parameter - in order to make it similar to other functions operating on groups. -- CHANGE: Increased main and process default stack sizes from 0x100 to 0x200 - in LPC1114 and LPC1343 linker scripts. - -*** 2.3.4 *** -- FIX: Fixed Extra initialization in STM32 SPI driver (bug 3436127) - (backported to 2.2.8). -- FIX: Fixed DMA priority setting error in STM32 UART driver (bug 3436125) - (backported to 2.2.8). -- FIX: Fixed DMA priority setting error in STM32 SPI driver (bug 3436124) - (backported to 2.2.8). -- FIX: Fixed broken support for UART5 in STM32 serial driver (bug 3434094) - (backported to 2.2.8). -- FIX: Fixed broken TIM8 support in STM32 PWM driver (bug 3418620). -- FIX: Fixed halconf.h file corrupted in some STM32 demos (bug 3418626). -- NEW: Added an unified registers file for STM32: stm32.h. This file includes - the appropriate vendor file then adds its own additional definitions. -- NEW: Added demo for the ST STM32F4-Discovery kit. -- NEW: STM32F4xx ADC driver implementation. -- NEW: Added initialization of the NVIC VTOR register to all Cortex-Mx (v7M) - ports. Also added a port option CORTEX_VTOR_INIT to enforce a different - default value into the register. -- NEW: Removed the warning about the "untested M4 platform", now it is - tested and officially supported. -- NEW: Reorganized the STM32F1xx hal_lld_xxx.h files in order to distribute - the capability macros into the appropriate file (previously those were all - in the common hal_lld.h). -- NEW: Added HAL, Serial, ADC, EXT, GPT, ICU, PWM, SPI and UART support for - the STM32F4xx sub-family. - TODO: Add CAN and SDC, the drivers need to be ported and tested. -- NEW: Added handling of USART6 to the STM32 serial driver. -- NEW: Added USE_COPT setting to all makefiles, contributed by Mabl. -- NEW: Added EXT driver implementation for AT91SAM7x, contributed by Florian. - TODO: Test application missing. -- NEW: Updated USB driver model and STM32 implementation and fixed several - problems. - - Changed the API to move buffer copy operations out of critical zones. - - Added usbConnectBus() and usbDisconnectBus() functions. - - Fixed problems with incorrect assertions. -- NEW Updated the SERIAL_USB driver to match the new USB API, also fixed - some problems. - - Fixed incorrect use of input queues, the change required a change in - input queues too. -- NEW: Added a macro THD_STATE_NAMES to chthreads.h. This macro is an - initializer for string arrays containing thread state names. -- NEW: Added memory copy functionality to the STM32 DMA driver. -- NEW: Implemented new makefile system for ARM GCC ports, now objects, - listings and output files are generated into a "build" directory and not - together with sources, also implemented a simplified output log mode. - Now makefiles and load script files are requirements and trigger a - rebuild if touched. -- NEW: Updated AVR demos to use the new PAL driver. -- NEW: Added Keil build files to the STM32L-Discovery demo. -- CHANGE: Now the callback associated to input queues is invoked before - reading each character. Previously it was invoked only before going - to sleep into the THD_STATE_WTQUEUE state. -- CHANGE: Moved the STM32 DMA helper drivers files under the sub-family - specific directories because documentation issues. - -*** 2.3.3 *** -- FIX: Fixed missing UART5 definition in STM32 HAL (bug 3411774)(backported - to 2.2.8). -- FIX: Fixed uninitialized variable in STM32 PWM and ICU drivers (bug 3413558). -- FIX: Fixed wrong parameter passed to the DMA error hook in STM32 ADC driver, - the DMA error hook has been removed entirely in the new ADC driver model - (bug 3413214). -- FIX: The function chThdExit() triggers an error on shell return when the - system state checker is enabled (bug 3411207)(backported to 2.2.8). -- FIX: Some ARMCMx makefiles refer the file rules.mk in the ARM7 port (bug - 3411180)(backported to 2.2.8). -- FIX: Fixed wrong check on CH_DBG_ENABLE_STACK_CHECK setting (bug 3387671) - (backported to 2.2.7). -- FIX: Fixed wrong APB1 frequency check (bug 3361039)(backported to 2.2.7). -- FIX: Fixed missing state in shell demos (bug 3351556)(backported to 2.2.7). -- FIX: Fixed race condition in Cortex-Mx ports (bug 3317500)(backported - to 2.2.6). -- FIX: Fixed wrong macro check in STM32 UART driver (bug 3311999)(backported - to 2.2.6). -- FIX: Fixed wrong macro definition in ARMv6-M architecture files (bug - 3310084). -- FIX: Fixed race condition in output queues (bug 3303908)(backported - to 2.2.4). -- FIX: Fixed CH_USE_HEAP and CH_USE_MALLOC_HEAP conflict (bug 3303841) - (backported to 2.2.4). -- FIX: Fixed timeout problem in the lwIP interface layer (bug 3302420) - (backported to 2.2.4). -- NEW: Added AVR implementation of the PAL driver contributed by Leszek. -- NEW: STM32L ADC driver implementation. -- NEW: Improved ADC driver model, now it is possible to handle error - conditions during the conversion process. -- NEW: STM32L1xx sub-family support, all STM32 drivers adapted and re-tested - on the new platform except ADC that will need a specific implementation. -- NEW: Added new API chThdExitS() in order to allow atomic operations on - thread exit (backported to 2.2.8). -- NEW: New EXT driver model and STM32 implementation. -- NEW: New I2C driver model and STM32 implementation. - (evaluate the option to change the API to a synchronous model) -- NEW: New RTC driver model and STM32 implementation. - (API and functionality review) -- NEW: Improved MAC driver model, it now follows the same template of other - drivers. - TODO: implement macStop() in AT91SAM7X implementation. -- NEW: New RCC helper driver for STM32F1xx and STM32L1xx, it simplifies - the use of the RCC resources and hides most differences found among the - various STM32 sub-families. -- NEW: New DMA helper driver for STM32, it simplifies the use of the DMA - resources and hides most differences with the new enhanced DMA units - found in the STM32F2xx sub-family. -- NEW: Now an error is generated at compile time when trying to enable the - options CH_DBG_ENABLE_STACK_CHECK on ports that do not support it. -- NEW: Added a kernel-only Cortex-Mx demo as reference project for users not - interested in the HAL but just want to use the ChibiOS/RT kernel. - The demo is named ARMCM3-GENERIC-KERNEL and is defaulted to the STM32, in - order to use it on other families or on the ARM Cortex-M0 just change the - inclusion paths in the makefile. -- NEW: Integrated new FatFs version 0.8b. -- NEW: Added a new hook THREAD_CONTEXT_SWITCH_HOOK() that allows to insert - code just before a context switch. For example this hook could be used - in oder to implement advanced power management schemes. -- NEW: Added a new debug option CH_DBG_SYSTEM_STATE_CHECK that ensures the - correct API call protocol. If an API is invoked out of the correct context - then the kernel panics with a debug message. -- NEW: The ARMCMx startup file (crt0.c) now is able to fill the stack areas - with a filler (default behavior). This is required in order to easily assess - the stack usage at runtime. -- NEW: Added the new CMSIS 2.1 headers, now CMSIS resides into a shared - location: ./os/ports/common/ARMCMx/CMSIS. Old CMSIS files have been - removed from the various platforms. -- NEW: Removed all the ch.ld files from the ARMCMx demos, now the makefiles - point to common ld files under the various ports. Less duplication and - easier maintenance. -- NEW: Improved stack checking and reorganized memory map for the Cortex-Mx - demos. Now stacks are allocated at the start of the RAM, an overflow of the - exception stack now triggers an exception (it could go unnoticed before). - The process stack is organized to be checked on context switch like other - threads. Now all threads have an explicit stack boundary pointer. -- NEW: Added debug plugin for Eclipse under ./tools/eclipse (backported to - 2.2.7). -- NEW: The debug macros chDbgCheck() and chDbgAssert() now can be externally - redefined. The macro chDbgCheck() no more includes the line number in the - description because incompatibility with the Cosmic compiler (backported to - 2.2.7). -- NEW: Added provisional support for STM32F2xx. Because of this some - directories related to the STM32 have been renamed, your makefiles may - require adjustments. -- NEW: Added a custom rule to the various rules.mk files, now it is possible - to add an user rule into the Makefiles. -- NEW: Improvements to the trace buffer, now it stores a full thread pointer - and event time, changed names to debug variables by adding the "dbg_" - prefix (backported to 2.2.7). -- NEW: Added a new functionality to the registry subsystem, now it is possible - to associate a name to the threads using chRegSetThreadName. The main and - idle threads have their name assigned by default (backported to 2.2.7). -- NEW: Added TIM8 support to the STM32 GPT, ICU and PWM drivers. -- NEW: Updated the STM32 header file to the latest version 3.5.0 and fixed - it in order to correct several bugs related to the XL family. -- NEW: Added a chprintf() function to ./os/various, it can print on any - BaseChannel. -- NEW: Improved the mini shell, enhanced info command, optimizations and - removed the shellPrint() and shellPrintLine() functions, now it uses - chprintf() for output. -- NEW: lwIP 1.4.0 has been integrated, this new version does not require - custom hooks into the Thread structure and is thus much lighter. -- NEW: FatFs demo for the STM32F103ZG using the SDC driver. -- NEW: Now the STM32 SDC driver supports unaligned buffers transparently. - Optimized the driver for single block read and write operations. Optimized - the driver state machine. -- NEW: Finished the reorganization of the Cortex-Mx ports, now also the - IAR and RVCT ports support the new Compact mode. -- NEW: Added to the ARMv6-M sub-port an option to use the PendSV exception - instead of NMI for preemption (backported to 2.2.5). -- NEW: Reorganization of the Cortex-Mx ports in order to reduced code and - comments duplication in the various headers (backported to 2.2.5). -- NEW: Improved the ARMv7-M sub-port now there are two modes: Compact and - Advanced. - The advanced mode is equivalent to the previous versions, the compact mode - is new and makes the kernel *much* smaller and generally faster but does - not support fast interrupts (backported to 2.2.5). -- NEW: Now the port layer exports info regarding the compiler and the port - options. The info are printed into the test reports. Date and time also - added. -- CHANGE: Removed the option CH_USE_NESTED_LOCK, lwIP no more requires it and - it would have conflicted with CH_DBG_SYSTEM_STATE_CHECK which is far more - useful. -- CHANGE: Renamed the scheduler functions chSchIsRescRequiredExI() to - chSchIsPreemptionRequired(), chSchDoRescheduleI() to chSchDoReschedule(), - chSysSwitchI() to chSysSwitch(). All those functions were special cases - and not regular I-class APIs. -- CHANGE: Renamed the macros IDLE_THREAD_STACK_SIZE and INT_REQUIRED_STACK - to PORT_IDLE_THREAD_STACK_SIZE and PORT_INT_REQUIRED_STACK for consistency. -- CHANGE: Removed the "old" Cortex-M3 port from the code, the current port - has no drawbacks and the old port is now just a maintenance cost. -- CHANGE: Removed the CH_CURRP_REGISTER_CACHE option, it is GCC-specific so - it does not belong to the kernel options. The feature will be eventually - reimplemented as a port-specific option. -- CHANGE: chiQGetFullI() and chOQGetFullI() become macros. The queues - subsystem has been optimized and is no more dependent on semaphores. - Note that the queues callbacks invocation policy has been slightly - changed, see the documentation (backported to 2.2.4). - -*** 2.3.2 *** -- FIX: Fixed invalid BRR() macro in AVR serial driver (bug 3299306)(backported - to 2.2.4). -- FIX: Fixed missing IRQ vectors amicable names for STM32 XL devices (bug - 3298889)(backported to 2.2.4). -- FIX: Fixed wrong identifier in AVR serial driver (bug 3292084)(backported - to 2.2.4). -- FIX: Fixed wrong macro check for STM32 XL devices (bug 3291898)(backported - to 2.2.4). -- FIX: Fixed SPI driver restart in STM32 SPI driver implementation, also - applied the same fix to the STM8S SPI driver (bug 3288758)(backported to - 2.2.4). -- FIX: Fixed missing state transition in ADC driver (bug 3288149)(backported - to 2.2.4). -- FIX: Fixed missing state transition in SPI driver (bug 3288112)(backported - to 2.2.4). -- FIX: Fixed spurious characters generated by Serial over USB driver (bug - 3276379). -- NEW: Added an option to the kernel to not spawn the Idle Thread from within - chSysInit(), this way the application can spawn a custom idle thread or - even use the main() thread as idle thread (backported to 2.2.4). -- NEW: Added new SDC driver model, Secure Digital Card. -- NEW: SDC driver implementation for STM32. -- NEW: Updated the STM32 header file to the latest version 3.4.0, had to - fix a bug regarding the STM32 XL sub-family. -- NEW: New unified GCC startup file for Cortex-Mx processors, it is written - in C instead of asm and supports constructors/destructors. Improved the - Cortex-Mx linker scripts in all the GCC demos. -- NEW: Now it is possible to share DMA channels in the STM32 HAL thanks - to a centralized manager. Channels are allocated when the driver is - started and released when it is stopped. -- NEW: Added an STM32 C++ demo for the GNU compiler. -- NEW: Added an STM32F103ZG demo for the STM3210E-EVAL evaluation board. -- OPT: STM32 PWM driver implementation simplified. -- CHANGE: Now pwmChangePeriod() does not implicitly disable the active - PWM channels. -- CHANGE: Renamed the chSemSetCounterI() function to chSemAddCounterI() and - changed its behavior. -- CHANGE: Modified the STM32 USB-CDC test demo to spawn a shell over the USB - serial connection. - -*** 2.3.1 *** -- FIX: Fixed insufficient idle thread stack in Cortex-M0-GCC port (bug 3226671) - (backported to 2.2.3). -- FIX: Fixed stack checking in Cortex-M0-GCC port (bug 3226657)(backported - to 2.2.3). -- FIX: Fixed wrong checks in PAL driver (bug 3224681)(backported to 2.2.3). -- FIX: Fixed wrong checks in I/O Queues (bug 3219197)(backported to 2.2.3). -- FIX: Fixed invalid assertion in adcConvert() (bug 3205410)(backported - to 2.2.3). -- NEW: Improvements to the PWM driver model: - - Easier configuration similar to the GPT driver initializations, macros - are no more required. - - Added a new function that allows to change the PWM period on the fly, - even from within callbacks. Formerly it was required to stop and restart - the driver. - - Improved driver documentation. -- NEW: Added advanced mode to the STM32 PWM driver (TIM1 only). -- NEW: Added new ICU driver model, Input Capture Unit. -- NEW: ICU driver implementation for STM32. -- NEW: Implemented stack checking in the Cortex-Mx RVCT port (backported - to 2.2.3). -- NEW: Added support for PLL3 in STM32 HAL driver. Note, the format of the - mcuconf.h file is changed for STM32F105/STM32F107 devices. -- NEW: Added board files for the Olimex STM32-P107. -- NEW: Improved setup packets handling in the USB driver through a specific - callback. -- NEW: Improvements to the PAL driver and various implementation in order - to make them more parenthesis friendly. -- OPT: Simplified Serial over USB driver configuration. -- CHANGE: Renamed the demo ARMCM3-STM32F107-GCC in ARMCM3-STM32F107 and added - IAR and Keil projects. -- CHANGE: Now the ARMCM3-STM32F107 demo targets the board Olimex STM32-P107 - as default. -- CHANGE: Removed all the prefixes from the structure/union field names - in the HAL subsystem. -- CHANGE: Updated the documentation to use Doxygen 1.7.4 which produces a much - more readable output. Also modified the documentation layout to put functions - and variables ahead of everything else in the group pages. - Doxygen version below 1.7.4 cannot be used anymore because differences in - templates. Note that now there are two Doxygen projects, one for generating - the CHM file the other for plain HTML. - -*** 2.3.0 *** -- FIX: Fixed race condition in CM0 ports, the fix also improves the - ISR latency (bug 3193062)(backported to 2.2.2). -- FIX: Fixed Cortex-Mx linker scripts alignment of __heap_base__, the - correct alignment is now enforced at runtime into core_init() in order - to make the OS integration easier (bug 3191112)(backported to 2.2.2). -- FIX: Fixed error in function chCoreAllocI() function documentation (bug - 3191107)(backported to 2.2.2). -- FIX: Fixed minor problem with memory pools (bug 3190512)(backported to - 2.2.2). -- FIX: Stack overflow in CM0 ports when nearing interrupts saturation (bug - 3187105)(backported to 2.2.1). -- FIX: Fixed error in _BSEMAPHORE_DATA macro (bug 3184139)(backported to - 2.2.1). -- FIX: Error in MAC driver (bug 3179783)(backported to 2.2.1). -- FIX: Fixed wrong serial driver macros (bug 3173336)(backported to 2.2.1). -- NEW: Improved preemption implementation for the Cortex-M0, now it uses - the NMI vector in order to restore the original context. The change makes - IRQ handling faster and also saves some RAM/ROM space. The GCC port code - now does not inline the epilogue code in each ISR saving significant ROM - space for each interrupt handler in the system (backported to 2.2.3). -- NEW: Added "IRQ STORM" long duration tests for the STM32, LPC11xx and - LPC11xx. The test demonstrates the system stability in a thread-intensive, - progressively CPU-saturating, IRQ-intensive long duration test. -- NEW: Added two new functions to the events subsystem: chEvtBroadcastFlags() - and chEvtBroadcastFlagsI(). The old chEvtBroadcast() and chEvtBroadcastI() - become macros. The new functions allow to add the same flags to all the - registered listener threads. -- NEW: Added I-Class functions to the MailBoxes subsystem, now it is - possible to use them as a transport layer between ISRs and Threads - (backported to 2.2.2). -- NEW: Added new USB driver model, probably it will evolve in next - releases. -- NEW: USB driver implementation for STM32. -- NEW: Added "serial over USB" driver, it implements a Communication - Device Class exposing it as a normal serial driver to applications, - probably it will evolve in next releases. -- NEW: Added STM32 USB CDC loopback test application. -- NEW: Added new GPT driver model, General Purpose Timer. The driver - allows to access the available timers in an abstract way. -- NEW: GTP driver implementation for STM32, LPC13xx and LPC11xx. -- NEW: Added STM32 GPT test application. -- NEW: Implemented new event IO_TRANSMISSION_END in the generic serial - driver. This event marks the physical transmission end of a data stream. -- NEW: Implemented the new IO_TRANSMISSION_END event in the STM32 serial - driver. -- NEW: Added explicit reset of all peripherals inside the STM32 HAL driver. - Removed the separate resets on initialization from the various other - drivers saving significant space. -- OPT: Removed TIMx reset on system startup in the STM32 PWM driver, the - timers are already reset on driver startup. -- CHANGE: The functions chEvtSignal() and chEvtSignalI() have been renamed - to chEvtSignalFlags() and chEvtSignalFlagsI() for consistency. -- CHANGE: Swapped the numeric values of the TIME_IMMEDIATE and TIME_INFINITE - constants. Fixed the relative documentation in various places (backported - to 2.2.2). -- Many documentation improvements. - -*** 2.1.8 *** -- FIX: Fixed error in STM32 ADC driver macro names (bug 3160306)(backported - to 2.0.11). -- FIX: Fixed IAR Cortex-Mx port memory organization problem (bug 3158776). -- FIX: Fixed STM32F103 demo's incorrect clock settings (bug 3153746). -- NEW: Added OTG clock setting to the STM32 HAL. -- NEW: Added stack check support to the IAR Cortex-Mx port. -- CHANGE: Removed .uvopt files from the Keil projects. - -*** 2.1.7 *** -- FIX: Fixed various errors in the HAL documentation (bug 3153591). -- FIX: Fixed error in chIOGetxxxxxEventSource() macros (bug 3153550) - (backported to 2.0.10) -- FIX: Fixed error in STM32 unbuffered UART driver (bug 3153437). -- FIX: Fixed wrong macro check in LPC214x driver (bug 3152510). -- FIX: Fixed switch condition error in STM32 PWM driver (bug 3152482) - (backported to 2.0.10). -- FIX: Fixed error in output queues static initializer (bug 3149141) - (backported to 2.0.9). -- FIX: Fixed extra notifications in input queues (bug 3148525)(backported - to 2.0.9). -- NEW: New ARM Cortex-Mx port for RVCT compiler. -- NEW: Integrated the various Cortex-Mx GCC, IAR and RVCT demos in unified - demos with multiple project files, the code is exactly the same. Renamed - the directories removing the compiler suffix. -- NEW: Added an USB clock configuration in the STM32 HAL driver (LD, MD, HD). -- NEW: New semaphore API chSemSetCounterI(). -- NEW: New queue APIs chIQGetFullI() and chOQGetFullI(). -- CHANGE: Serial drivers now have a single event source instead of three, - the event source is located in the superclass, this allows to create - alternative implementations of the serial driver while keeping compatibility, - the change also allowed to save 8/4 RAM bytes per serial driver. -- CHANGE: Modified the ADC and CAN drivers to allow a NULL pointer for - the configuration structure if it is not required by the implementation. -- CHANGE: Modified the MMC_SPI driver to *require* a NULL as pointer to - the configuration. -- CHANGE: Removed enforced inlining for the chSchReadyI() function when - the CH_OPTIMIZE_SPEED is enabled. Now the matter is left to the compiler - specific settings. This change is meant to increase compatibility with - compilers that have a different inlining semantic than GCC when not in - C99 mode. -- CHANGE: Changed the declaration of the main() function in all demos - without arguments. Removed the clearing of arguments from the startup - files and saved some space. -- CHANGE: Queues callbacks now have as parameter a pointer to the queue, - there were no parameters previously. -- Documentation related fixes. - -*** 2.1.6 *** -- FIX: Fixed error in sdPutTimeout() macro (bug 3138763)(backported in 2.0.9). -- NEW: New ARM Cortex-Mx port for IAR compiler. -- NEW: Now the STM32 CAN driver puts the lower half word of the ESR - register in the upper half word of the can status word for easier - debug. -- CHANGE: Changes in the board files organization, now the board - initialization is invoked from within halInit() after all the device - drivers have been initialized. Now applications are required to - explicitly invoke halInit() and chSysInit() from within their main(). -- CHANGE: Removed the CMSIS files from the ARMCMx port, added the headers - into the various HAL platforms requiring them. The change is required - because the port layer must not have vendor specific dependencies and - there is the possibility that the various vendors would use different - CMSIS versions now that CMSIS 2.x has been released. -- CHANGE: Modified the start of the ADC in the STM32 ADC driver, now it is - no more required to specify ADC_CR2_EXTSEL_SWSTART and ADC_CR2_CONT - in the CR2 register configuration. Also reordered the start sequence - in order to allows a longer stabilization time for the ADC. -- Documentation improvements. - -*** 2.1.5 *** -- FIX: Fixed references to non-existing SSP1 device in LPC13xx SPI device - driver (bug 3127926). -- FIX: Fixed broken SPI synchronous API (bug 3127921). -- FIX: Fixed missing vector.c files in LPC11xx and LPC13xx ports (bug 3124849). -- FIX: Fixed pwmDisableChannel() now working in STM32 PWM driver (bug 3121246). -- FIX: Fixed problem with PWM channel callbacks (bug 3120785). -- NEW: Added support for TIM5 in the STM32 PWM driver. -- NEW: Added to the ARM port the option to externally redefine the port IRQ - macros in order to accomodate different implementations without have to - change the port layer. -- CHANGE: Modified the STM32_PWM_PWMx_IRQ_PRIORITY macros in the STM32 - PWM driver (and all the STM32 mcuconf.h files) and renamed them in - STM32_PWM_TIMx_IRQ_PRIORITY for consistency. -- Documentation related fixes. - -*** 2.1.4 *** -- FIX: Fixed failed memory recovery by registry scan, improved the related - test case (bug 3116888)(backported to 2.0.8). -- FIX: Fixed failure in STM32 ADC driver when a linear buffer mode is used - (bug 3114696). -- FIX: Fixed PWM channels going to ACTIVE state when the pulse width is - set to zero in the STM32 PWM driver (bug 3114481)(backported to 2.0.8). -- FIX: Fixed PWM channels return to IDLE state in STM32 PWM driver (bug - 3114467)(backported to 2.0.8). -- FIX: Fixed wrong initializer macros in STM32 PWM driver (bug 3114319). -- FIX: Fixed syntax error in STM32 PWM driver(bug 3114266). -- FIX: Fixed typo in board name (bug 3113574)(backported to 2.0.7). -- FIX: Fixed defective event wait functions with timeout (bug 3113443) - (backported to 2.0.7). -- NEW: More improvements to the ADC and SPI drivers, now synchronous - operations can also have callbacks, optimized ISR code paths. -- NEW: Added to the STM32 ADC driver the macros for easy handling of the - sampling time for each channel. -- NEW: Greatly simplified the STM32 PWM driver implementation. -- NEW: Added new macro PWM_FRACTION_TO_WIDTH() to the PWM driver model. -- NEW: ARM7 port reorganization following the same pattern of the ARMCMx - one, on now the port is also supports the ARM9 architecture (but not - tested yet hardware). Removed the dependencies between the port layer - and the vendors-provided headers. -- NEW: Initial STM8L support: HAL, PAL and Serial drivers. -- NEW: Added demo for the ST STM8L-Discovery kit. -- NEW: Added support for the STM32 Value Line to the HAL. -- NEW: Added demo for the ST STM32VL-Discovery kit. -- OPT: STM32 SPI driver implementation improved, reduced latency when - starting a transfer. -- CHANGE: Improved the STM32 HAL to support multiple sub-families, at compile - time now it is possible to test the presence of any single peripheral into - the specified STM32 device. -- CHANGE: Separated dynamic threads code into dedicated files: chdynamic.c - and chdynamic.h. -- CHANGE: Moved the declaration of the variable pal_default_config from - hal_lld.c to the various board.c. That structure is more meaningful in - the board layer because it is related to the board initialization. -- CHANGE: Removed the various assembler files for the STM32 interrupt - vectors, now it is a single vectors.c file. -- CHANGE: Deleted ./os/ports/GCC/ARM. -- CHANGE: Renamed ./os/ports/GCC/ARM7 in ./os/ports/GCC/ARM. -- CHANGE: Renamed ./os/hal/platforms/STM8 in ./os/hal/platforms/STM8S. -- CHANGE: Renamed ./testhal/STM8 in ./testhal/STM8S. -- Added SPI driver to the STM8S documentation, it was missing. -- Improved documentation for the ARM and ARMCMx ports. - -*** 2.1.3 *** -- FIX: Fixed broken STM32 synchronous UART driver (bug 3100946). -- FIX: Broken C++ wrapper (bug 3100925). -- FIX: Broken lwIP/uIP demos (bug 3100901). -- FIX: DMA not initialized under some conditions (bug 3099701). -- FIX: Restored the RIDE7 build files in the STM32F103 demo, note the RIDE7 - build files are not supported so this has not been tracked as a bug. -- NEW: Added an SPI driver to the STM8 platform support. -- NEW: Added a simple STM8 SPI demo under ./testhal/STM8/SPI. -- NEW: Divided the file STM32/vectors.s in several files, one for each - STM32 sub-family. This has been done in order to remove the preprocessor - directives from assembler files and to support all the various STM32 - sub-families. -- CHANGE: Renamed ./os/ports/GCC/ARMCMx/STM32F10x in STM32. -- CHANGE: Divided the file ARMCMx/crt0.s in crt0_v6m.s and crt0_v7m.s in - order to remove the preprocessor directives from assembler files. -- CHANGE: Renamed the HAL settings macro names, removed the CH_ prefix - because it is reserved for the kernel namespace. - NOTE: ****** Make sure to use a mcuconf.h file taken from ****** - ****** this version in your project. ****** - -*** 2.1.2 *** -- FIX: Fixed typo in memstreams.h (bug 3089567)(backported to 2.0.6). -- FIX: Fixed wrong macro check in LPC214x and AT91SAM7 serial drivers (bug - 3088776)(backported to 2.0.6). -- FIX: Fixed non functioning option SPI_USE_MUTUAL_EXCLUSION=FALSE (bug - 3084764)(backported to 2.0.6). -- FIX: Fixed wrong macro check in STM32 serial support (bug 3078891)(backported - to 2.0.6). -- FIX: Fixed non functioning option CH_USE_NESTED_LOCKS (bug 3075544) - (backported to 2.0.6). -- FIX: Incorrect AT91SAM7X initialization, thanks Leszek (bug 3075354) - (backported to 2.0.5). -- FIX: Fixed race condition in function chSchGoSleepTimeoutS(), thanks Bal�zs - (bug 3074984)(backported to 2.0.5). -- FIX: Fixed race condition in threads creation (bug 3069854)(backported - to 2.0.5). -- FIX: Fixed broken CH_DBG_ENABLE_STACK_CHECK option in legacy CM3 port (bug - 3064274)(backported to 2.0.5). -- FIX: Fixed CAN_USE_SLEEP_MODE setting (bug 3064204)(backported to 2.0.5). -- FIX: Fixed potential issue with GCC reorganizing instructions around "asm - volatile" statements (bug 3058731)(backported in 2.0.4). -- FIX: Fixed reduced ARM7 performance with GCC 4.5.x (bug 3056866)(backported - to 2.0.4). -- FIX: Fixed crash of the Posix simulator under Ubuntu 10.4 (bug 3055329) - (backported to 2.0.3). -- FIX: Fixed incorrect PLL2 setting in STM32 HAL (bug 3044770)(backported - in 2.0.3). -- FIX: Fixed wrong check on STM32_HCLK (bug 3044758)(backported to 2.0.3). -- FIX: Fixed wrong condition check in STM32 PWM driver (bug 3041414) - (backported in 2.0.3). -- FIX: Corrupted IRQ stack in Cortex-Mx port (bug 3041117)(backported to - 2.0.3). -- FIX: Fixed a documentation error regarding the ADC driver function - adcStartConversion() (bug 3039890)(backported to 2.0.3). -- NEW: New I2C driver model (not complete and no implementations yet). -- NEW: New SPI driver model, the new model supports both synchronous and - asynchronous operations and, in general, simplifies the implementation of the - low level driver. The new driver also specifies a simplified polled exchange - API, useful for efficiently sending small amount of data over high speed - connections. The driver state diagram changed slightly changed so be careful. -- NEW: New ADC driver model, the new model supports both synchronous and - asynchronous operations and, in general, simplifies the implementation of the - low level driver. The driver state diagram changed slightly changed so be - careful. -- NEW: Improved PWM driver model, added several macros that helps to setup - configuration structures and to specify pulse widths also as percentages or - degrees using a fixed point notation. Added new pwmEnableChannelI() and - pwmDisableChannelI() APIs in order to allow channel reprogramming from - within callbacks or interrupt handlers, the new APIs are implemented as - macros so there is no footprint overhead. -- NEW: Added driver fields and initialization hooks for the callback-based - drivers. The hooks are named XXX_DRIVER_EXT_FIELDS and - XXX_DRIVER_EXT_INIT_HOOK(). -- NEW: Added to the UART driver the capability to return the number of - not yet transferred frames when stopping an operation. -- NEW: Added more compile-time checks to the various STM32 device drivers. -- NEW: Improved LPC214x SPI driver, now it uses IRQs, it implements the - new SPI device driver model. -- NEW: Improved AT91SAM7 SPI driver, now it uses IRQs and DMAs, it implements - the new SPI device driver model. -- NEW: New LPC11xx SPI driver, updated the LPCXpresso demo to use the SPI. -- NEW: New LPC13xx SPI driver, updated the LPCXpresso demo to use the SPI. -- NEW: Added a simple STM32 ADC demo under ./testhal/STM32/ADC. -- NEW: Added a simple STM32 CAN demo under ./testhal/STM32/CAN. -- NEW: Added a simple STM32 PWM demo under ./testhal/STM32/PWM. -- NEW: Added a simple STM32 SPI demo under ./testhal/STM32/SPI. -- NEW: More assertions added to the kernel for improved bug fixing. -- NEW: New kernel hooks: SYSTEM_TICK_EVENT_HOOK(), SYSTEM_HALT_HOOK(). -- NEW: Added board files for the Olimex STM32-H103. -- NEW: New kernel APIs chSysGetIdleThread() and chThdGetTicks(), the new - APIs are simple macros so there is no footprint overhead. -- NEW: Added a generic BaseFileStream interface for future File System - implementations or integrations (untested and not sure if it will stay or - change). -- NEW: Added to the documentation more notes about interrupt handlers in - the ARM7 port. -- NEW: Modified some tests in order to bring back code coverage to 100% - in all modules except chdebug.c. Added a test case covering binary - semaphores. -- OPT: The fix to the bug 3075544 considerably improved the threads creation - benchmarks score. -- OPT: Speed optimizations to the STM32 SPI driver, greatly improved latency. -- OPT: Speed optimizations to the STM32 ADC driver. -- CHANGE: The API chThdInit() has been renamed to chThdCreateI() in order to - make clear it is usable from interrupt handlers. -- CHANGE: The mailboxes macros chMBSize(), chMBGetEmpty(), chMBGetFull(), - chMBPeek() have been renamed to chMBSizeI(), chMBGetFreeCountI(), - chMBGetUsedCountI(), chMBPeekI(). -- CHANGE: The queue APIs chQSize(), chQSpace(), chIQIsEmpty(), chIQIsFull(), - chOQIsEmpty(), chOQIsFull() have been renamed to chQSizeI(), chQSpaceI(), - chIQIsEmptyI(), chIQIsFullI(), chOQIsEmptyI(), chOQIsFullI(). -- CHANGE: The event APIs chEvtPend() and chEvtClear() have been renamed - to chEvtAddFlags() and chEvtClearFlags() for consistency and correct - English. Changed the macro chEvtIsListening() in chEvtIsListeningI(). -- CHANGE: Added a parameter to the PWM driver callbacks, the pointer to the - driver itself. -- CHANGE: Added a parameter to the UART driver callbacks, the pointer to the - driver itself. -- CHANGE: In the UART driver now an error does not automatically brings the - receiver in UART_RX_IDLE state, the receive operation continues unless - explicitly stopped in the error callback handler. This considerably - simplifies the low level driver code. -- CHANGE: Removed a spurious trailing ; after the WORKING_AREA() macro - declaration in several ports. The ; should go after the macro invocation. -- CHANGE: Modified the STM32 ADC driver to use the new DMA infrastructure. -- CHANGE: Modified the STM32 SPI driver to use the new DMA infrastructure. -- CHANGE: Added DMA cleanup code to the STM32 dmaInit() function. -- CHANGE: Simplified preprocessor conditions in the STM32 serial driver. -- CHANGE: Renamed most of the STM32 HAL settings macro names in order to - make names more consistent. - NOTE: ****** Make sure to use a mcuconf.h file taken from ****** - ****** this version in your project. ****** -- CHANGE: Renamed the existing system hooks by adding the _HOOK suffix to - the name in order to make names more consistent. - NOTE: ****** Make sure to use a chconf.h file taken from ****** - ****** this version in your project. ****** -- CHANGE: Extensive documentation improvements, fixed terminology in the - events related documentation and articles. -- CHANGE: The documentation is no more included in the distribution, the - file ./documentation.html redirects to the online documentation page - that contains *much* better documents. - Note that it is still possible to generate the local documentation using - Doxygen, the procedure is very simple and described in ./docs/readme.txt. - -*** 2.1.1 *** -- FIX: Fixed insufficient stack size for idle thread (bug 3033624)(backported - to 2.0.3). -- FIX: Fixed misspelled word in some chioch.h and chstreams.h macros (bug - 3031534)(backported to 2.0.3). -- FIX: Fixed wrong macro check in the STM32 SPI driver (bug 3028562)(backported - to 2.0.3). -- FIX: Fixed invalid context restore in MSP430 port (bug 3027975)(backported - to 2.0.2). -- FIX: Fixed STM32 vectors file (bug 3026528)(backported to 2.0.2). -- FIX: Fixed race condition in STM32 SPI driver (bug 3025854)(backported to - 2.0.2). -- FIX: Fixed H_LOCK and H_UNLOCK redefined with CH_USE_MALLOC_HEAP (bug - 3025549)(backported to 2.0.2). -- FIX: Added option to enforce the stack alignment to 32 or 64 bits in the - Cortex-Mx port (bug 3025133)(backported to 2.0.2). -- NEW: Centralized DMA macros in the STM32 HAL. -- NEW: New UART device driver model, this device driver allows unbuffered, - callback driven access to UART-type devices. -- NEW: UART device driver for STM32 and UART demo application under - ./testhal/STM32/UART. -- NEW: Added friendly interrupt vectors names to the STM32 HAL (change request - 3023944). -- NEW: Added support for SPI3 in the STM32 HAL. -- CHANGE: Redeclared the IRQ handlers in the various STM32 drivers using the - new friendly vector names. -- CHANGE: Moved the STM32 HAL stess test application under - ./testhal/STM32/_stress_test. -- CHANGE: Removed the option -mabi=apcs-gnu from all the Cortex-Mx demos. The - option is not compatible with the 64 bits stack alignment now default in - the Cortex-Mx port. Note that the 64 bits alignment has a cost both as - performance and as space but it is the "standard". -- OPT: Small speed optimization in the STM32 SPI driver. -- OPT: Optimized DMA clearing in STM32 ADC and SPI drivers, there was no need - to read/modify/write the IFCR DMA register, it is write only. -- Fixed various documentation errors. - -*** 2.1.0 *** -- FIX: Fixed notification order in input queues (bug 3020708)(backported in - 2.0.1). -- FIX: Fixed non functional CH_CURRP_REGISTER_CACHE option in the Cortex-M3 - port (bug 3020702)(backported in 2.0.1). -- FIX: Fixed non functional CH_DBG_ENABLE_STACK_CHECK option in the Cortex-M3 - caused by GCC 4.5.0, the fix also improves the context switch performance - because GCC 4.5.0 apparently was generating useless instructions within the - very critical context switch code (bug 3019738)(backported in 2.0.1). -- FIX: Fixed insufficient stack space assigned to the idle thread in - Cortex-M3 port (bug 3019594)(backported in 2.0.1). -- FIX: Fixed missing check in chIQReadTimeout() and chIQWriteTimeout() (bug - 3019158)(backported in 2.0.1). -- FIX: Fixed instability in Mutexes subsystem (bug 3019099)(backported - in 2.0.1). -- FIX: Fixed broken AVR port (bug 3016619)(backported in 2.0.0). -- FIX: Fixed assertion in adcStop() (bug 3015109)(backported in 2.0.0). -- NEW: Merged the new unified STM8 port, now the port supports both the - Cosmic and Raisonance compilers. -- NEW: Added an STM8-DISCOVERY demo, the demo can be compiled with both the - Cosmic and Raisonance compilers under the STDV IDE. Performance reports - have been added for both compilers. - NOTE: The Raisonance compiler seems to have problems in debugging under - the STDV IDE, if you need to debug using the Raisonance compiler - consider using the RIDE7 IDE instead. - Compiling and executing using the "release" mode under STDV works fine. -- NEW: Added timers clock macros to the STM32 clock tree HAL driver (backported - in 2.0.1). -- NEW: Added Binary Semaphores among the synchronization primitives. The new - subsystem is entirely implemented as macros over the existing and proven - Counting Semaphores thus takes no space (experimental). -- NEW: Added a simplified SPI driver for AT91SAM7 devices, contributed by - Alexander (experimental). -- NEW: Added FatFs demos for AT91SAM7S and AT91SAM7X, contributed by - Alexander (experimental). -- OPT: Simplified the test suite code, now it is smaller. -- Reorganized the documentation, now the description of the device drivers - implementation is under the HAL module instead of the Ports module. - -*** 1.5.9 *** -- FIX: Fixed STM8 baud rate setup error (bug 3010990). -- FIX: Fixed STM8 UART3 driver (bug 3009145). -- NEW: Added a STM8_ENABLE_WFI_IDLE option to the STM8 port, the default - is FALSE. -- OPT: Small size optimization in the semaphores subsystem. -- OPT: Improvements in the STM8 port, the code is now smaller and generally - faster, also saved few bytes of RAM. -- Added explicit casts in chevents.h, chqueues.h, chqueues.c in order to - silence some warnings on a specific compiler. -- Added a section in chconf.h where redefine the port-related configuration - parameters, also added notes into the documentation about this. - -*** 1.5.8 *** -- FIX: Fixed missing files from ST library zip file (bug 3006629). -- NEW: Added a demo for the AT91SAM7S256 and board files for the Olimex - SAM7-P256. The demo has been contributed by Alexander Kozaruk. -- Fixed some wrong paths into the demos readme files. -- Formatting fixes to the port templates. -- Added notes about copyright assignment to the documentation. Fixed some - problems in the licensing FAQ page. -- Added documentation article about events in ChibiOS/RT. - -*** 1.5.7 *** -- FIX: Fixed missing SPI driver reinitialization in the MMC driver (bug - 3005628)(backported in 1.4.4). -- FIX: Fixed wrong inclusion order of board.h and halconf.h into hal.h - (bug 3005041)(backported in 1.4.4). -- FIX: Fixed wrong GPIO ports size in the STM8 PAL driver (bug 3001528). -- NEW: Improved clock initialization for the STM32, now it is possible to - configure the clock using any clock source and any HSE frequency. -- NEW: The STM32 clock tree parameters and checks are now calculated into - a separate file in order to support multiple clock trees for different - sub-families of the STM32 platform. -- NEW: Added separated clock trees for the STM32 LD/MD/HD sub-family and - the CL sub-family. Now the selection of the sub-family is done in the - board.h file, there is no more the need to put -DSTM32F10X_xx into - the makefile. -- NEW: Added the palSetBusMode() capability to the STM8 PAL driver. -- NEW: Added the palSetBusMode() capability to the LPC11xx and LPC13xx - PAL drivers. -- NEW: Updated the STM32 FW Library files to latest version 3.3.0. -- CHANGE: Renamed the STM32, STM8, LPC214x, AT91SAM7x, MSP430 and simulators - PAL configuration structures to PALConfig, it is better to have the same - name for this structure in all ports (like for all the other drivers). -- CHANGE: Modified the linker scripts in the ARM demos in order to increase - compatibility with the CodeSourcery toolchain. -- Tested the STM8 port with the latest RKit-STM8_2.28.10.0092. It works but - the new compiler shows a slight performance regression except in one - test case. -- Added credits page to the documentation, improved the article regarding - timings. -- Performed another documentation revision cycle, fixed more bad English and - few errors. - -*** 1.5.6 *** -- FIX: Fixed centralized ARM makefile (bug 2992747)(backported in 1.4.3). -- FIX: Fixed write problems in MMC_SPI driver (bug 2991714)(backported in - 1.4.3). -- FIX: Fixed wrong macros in chioch.h (bug 2989468). -- FIX: Fixed wrong macro check in serial.h (bug 2989459)(backported in 1.4.3). -- NEW: Added a ROMCONST macro in chtypes.h, this macro must be used for - constant that must be placed in code space, it should not be assumed that - the "const" keyword does that. Note that this macro is not used to place - constants in different address spaces (AVR) because it is assumed that a - pointer to a ROMCONST variable is compatible with a normal pointer. -- NEW: AT91SAM7 HAL support for the DGBU UART peripheral, as SD3. -- NEW: Introduced a new macro CH_FAST_IRQ_HANDLER() for the declaration of - fast interrupt handlers on those architectures that support them. -- OPT: Internal optimization in the serial driver, it now is a bit smaller - and uses less RAM (all architectures). -- CHANGE: Modified the STM32 FatFs demo, now it spawns a command shell or - the serial port SD2, type "help" for the available commands. More commands - can be easily added. -- CHANGE: Renamed the chCoreFree() function in chCoreStatus() because it - might be mistaken for a function that frees memory. -- CHANGE: All ARM demos makefiles now defaults to arm-none-eabi- GNU - toolchains because the latest YAGARTO now uses that setting. It is still - possible to use arm-elf- toolchains by editing the TRGT variable in the - makefiles. -- Various documentation fixes, added new articles covering debugging under - ChibiOS/RT, OS integration, OS stop and restart. Updated the article about - interrupt handlers to cover also fast interrupt sources, updated the article - about the OS porting. -- Long overdue test code cleanup and documentation. -- Added new test cases, now the coverage is again up to 100% except for the - debug module that would require triggering system terminating tests (panics), - the uncovered code is minimal, extremely simple and working anyway. -- ChibiOS/RT has been successfully verified with the latest GCC 4.5.0. - -*** 1.5.5 *** -- FIX: Removed some "dead" code in the old ARMv7-M files (there are new - ones, see below). -- NEW: LPC13xx support, drivers (Serial, PAL, HAL), demo and reports. -- NEW: Added statistic info to the lwIP demo. -- CHANGE: Renamed LPC111x port and platform in LPC11xx, minor fixes to the - platform header files. -- CHANGE: Small documentation fixes and improvements. -- OPT: New Cortex-M3 port code, *huge* performance improvements in all the - context switching related benchmarks (up to 18% depending on the benchmark). - The new code does no more require the use of the PendSV vector that is - thus available to the user, it also saves four RAM bytes for each thread - in the system. The old code is still available as a fall back option while - the new one is being hardened by peer review and time, the two ports are - perfectly interchangeable. - -*** 1.5.4 *** -- FIX: Fixed broken CH_CURRP_REGISTER_CACHE option in the ARM7 port (bug - 2973365). -- FIX: Fixed missing memory recovery on thread reference release in - chRegNextThread() (bug 2971878). -- FIX: Fixed wrong thread state macro in STM32/spi_lld.c (bug 2968142). -- NEW: New unified ARM Cortex-Mx port, this port supports both the ARMv6M - and ARMv7-M architecture (Cortex-M0/M1/M3/M4 so far). The new port also - allow to easily add to new Cortex-M implementations by simply adding a - parameters file (cmparams.h). -- NEW: Embedded Artists LPCxpresso Base Board support files added. -- NEW: LPC111x support, drivers (Serial, PAL, HAL) and demo. -- NEW: The port layer now can "capture" the implementation of individual - scheduler API functions in order to provide architecture-optimized - versions. This is done because further scheduler optimizations are - becoming increasingly pointless without considering architecture and - compiler related constraints. -- NEW: Added support for the STM8 large memory model to the STM8 port. Now - the assembler port code is totally inlined and the chcoreasm.asm file has - been removed. -- NEW: Added RIDE7 project files to the STM32 demo under a ./ride7 - subdirectory, this should make things easier for RIDE7 users. The normal - makefile is still available of course. -- NEW: New articles and guides in the documentation. -- NEW: Documentation improvements, now the description goes on top of each - page, doxygen defaulted it in the middle, not exactly the best for - readability. Improved many descriptions of the various subsystems. Fixed - a misplaced page (STM8 port). -- OPT: Optimization on the interface between scheduler and port layer, now - the kernel is even smaller and the context switch performance improved - quite a bit on all the supported architectures. -- OPT: Simplified the implementation of chSchYieldS() and made it a macro. - The previous implementation was probably overkill and took too much space - even if a bit faster. -- CHANGE: Modified the Cortex-M3 port to be a more generic Cortex-Mx port, - changes were required to the startup code and the port code because the - reduced instruction set of the Cortex-M0 (there are two code paths now, - both optimized). -- CHANGE: Modified the SysTick initialization for STM32 to use the system - clock rather than the external clock. -- CHANGE: Exiting from a chCondWaitTimeout() because a timeout now does not - re-acquire the mutex, ownership is lost. -- CHANGE: The module documentation has been moved from the kernel.dox file - to the various source code files in order to make it easier to maintain - and double as source comments. -- CHANGE: Updated CMSIS files to version 1.3 and fixed the warnings in there, - again... - -*** 1.5.3 *** -- FIX: Removed C99-style variables declarations (bug 2964418)(backported - in 1.4.2). -- FIX: Fixed missing reschedule in chEvtSignal() (bug 2961208)(backported - in 1.4.2). -- NEW: Added STM8 port and demo, the demo targets the Raisonance REva board - with STM8S208RB piggyback. -- NEW: Enhanced the kernel size report to cover more cases. -- NEW: Improvements to the documentation. -- OPT: Minor optimizations in the "compact" code path. - -*** 1.5.2 *** -- FIX: Fixed wrong UART deinitialization sequence in LPC214x serial driver - (bug 2953985)(backported in 1.4.1). -- FIX: Fixed wrong PINSEL2 offset into lpc214x.h (bug 2953981)(backported - in 1.4.1). -- FIX: Fixed invalid UART-related macro in the LPC214x HAL (bug 2953195) - (backported in 1.4.1). -- FIX: Impossible to enforce alignment greater of a pointer size for heap/core - objects (bug 2952961). -- FIX: Wrong prototype in template file chcore.c (bug 2951529)(backported - in 1.4.1). -- NEW: Added an experimental PowerPC port targeting the SPC563M/MPC563xM - ST/Freescale automotive SOCs. The port passed the whole test suite but it - will be developed further in next releases. -- NEW: Added core variant name macro in chcore.h and platform name in - hal_lld.h, the info are printed in the test report and from the "info" - shell command. -- NEW: Added BOARD_NAME macro to the various board.h files. -- NEW: Added a MemoryStream class under ./os/various. -- CHANGE: Removed an instance of a structure without name from test.h for - increased portability of the test suite. -- NEW: Added Mac OS-X support for the simulator. The Linux simulator has - been renamed to Posix simulator in order to include this change in a - single project. -- NEW: New articles, sections and various improvements to the documentation. -- CHANGE: Renamed the kernel header files to match the names of their source - files. The change was also required in order to make the names less - "generic" and less likely to match names in external libraries. - -*** 1.5.1 *** -- FIX: Fixed insufficient stack space for the idle thread in the ARMCM3 port - when compiling without optimizations (bug 2946233)(backported in 1.4.1). -- FIX: Fixed wrong notes on function chThdResume() (bug 2943160)(backported - in 1.4.1). -- NEW: Implemented the concept of thread references, this mechanism ensures - that a dynamic thread's memory is not freed while some other thread still - owns a reference to the thread. Static threads are not affected by the new - mechanism. Two new APIs have been added: chThdAddRef() and chThdRelease(). -- NEW: Now more than one thread can be waiting in chThdWait() as long they - own a reference. -- NEW: Implemented a new threads registry subsystem, the registry allows to - enumerate the active threads at runtime and/or from a debugger. This is - a preparatory step for a dedicated ChibiOS/RT debugger. -- NEW: New chCoreFree() API that returns the core memory left. -- NEW: Added to the simulators shell demos two new commands: threads and mem, - that show the currently active threads (using the new registry) and the - memory allocators state. -- CHANGE: Doxygen tags cleanup in all the system code, comments are better - looking now. -- CHANGE: Documentation improvements. - -*** 1.5.0 *** -- FIX: Fixed missing dependencies check for CH_USE_DYNAMIC (bug 2942757) - (backported in 1.4.1). -- FIX: Fixed swapped thread states descriptions (bug 2938445)(backported in - 1.4.1). -- FIX_ Fixed C99-style variable declaration (bug 2938444)(backported in 1.4.1). -- FIX: Fixed parameter check in sdStart() function (bug 2932922)(backported in - 1.4.0). -- FIX: Fixed missing platform.mk file in MSP430 port (bug 2933735)(backported - in 1.4.0). -- CHANGE: Removed the unnamed union from the thread and heaps structures, - some compilers do not support this non standard construct. -- CHANGE: Removed the empty structures from the streams/channels headers. -- CHANGE: Modified the thread-related constant macros to have a THD_ prefix. -- CHANGE: Modified NULL assignments to function pointers to use an explicit - cast because some compilers issue warnings without the cast. -- OPT: Speed/size optimization to the events subsystem. -- OPT: Speed/size optimization to the mutexes subsystem. -- OPT: Speed/size optimization to the condvars subsystem. -- OPT: Speed/size optimization to the synchronous messages subsystem. -- NEW: Added support for STM32/HD/CL UART4 and UART5, thanks Egon for the - patch. - -*** 1.3.8 *** -- FIX: Fixed dequeuing in lifo_remove() function (bug 2928142). -- FIX: Fixed spurious character generation in MSP430 serial driver (bug - 2926838). -- NEW: Introduced an abstract streams interface BaseSequentialStream. -- NEW: Added timeout specification to the I/O queues read/write primitives. -- NEW: Added support for HD and CL STM32 devices in the vectors table. -- CHANGE: Modified the BaseChannel interface in order to make it a - BaseSequentialStream descendant. -- CHANGE: Updated the serial driver model in order to expose the - BaseSequentialStream methods. -- CHANGE: The behavior of the read/write primitives is changed, now the - functions are synchronous and do not return until the specified number of - bytes have been transferred or a timeout occurs, the old behavior can be - replicated by specifying TIME_IMMEDIATE as timeout. Another difference is - that specifying zero as bytes number is like specifying the largest size_t - plus one, zero was an illegal value before. -- CHANGE: Simplified the LPC214x driver by removing the option to not use the - FIFO preload feature. Setting LPC214x_UART_FIFO_PRELOAD to 1 results in - the same behavior. -- Documentation fixes and improvements, testing strategy explained. -- Added article about waking up threads from IRQ handlers. - -*** 1.3.7 *** -- FIX: Fixed duplicated definition of SPI_USE_MUTUAL_EXCLUSION (bug 2922495). -- FIX: Fixed coverage tool hanging during execution (bug 2921120). -- FIX: Fixed Linux simulator startup message (bug 2921012). -- FIX: Fixed section separators comments into the HAL-related files. Now all - the files should use the same style. -- NEW: Improved HAL configuration file. -- NEW: Introduced a new, per-project, MCU configuration file mcuconf.h that - contains all the drivers related settings. -- NEW: Readability improvements to the channels code. -- NEW: Serial driver model improvements, added states management and checks, - added a new SD_NOISE_ERROR error event. -- NEW: Improvements and optimizations in the various serial driver - implementations. -- Documentation fixes and improvements. - -*** 1.3.6 *** -- FIX: Fixed missing STM32 PWM low level driver error in platform.mk by - adding the driver files (bug 2913560). -- NEW: The Linux simulator now works again, also supports the serial - drivers over TCP/IP and has a command line interface like the Win32 - simulator. -- NEW: STM32 PWM driver implementation. -- NEW: LPC214x SPI driver implementation (SSP only, polled mode, no IRQ), this - driver replaces the old, not HAL compatible, SSP driver. -- NEW: LPC214x FatFS demo added, LPC214x minimal demo removed, LPC214x "normal" - demo reduced to work like all the other generic demos. -- NEW: Added custom mode settings to the STM32 PAL driver: - - PAL_MODE_STM32_ALTERNATE_PUSHPULL - - PAL_MODE_STM32_ALTERNATE_OPENDRAIN -- NEW: Included all the board-specific files into a new directories structure - under ./boards, this allows to not duplicate the board files into each demo. -- CHANGE: Changes to the PWM driver model, made it simpler. -- CHANGE: The STM32 device drivers now no more configure the I/O pins on - initialization. Pins must be configured in board.h, the change was required - in order to support the STM32 AFIO remapping feature. -- CHANGE: Removed the mmcsd.c driver, it is replaced by the generic MMC_SPI - driver present into the HAL. -- CHANGE: Updated the GPL exception text in the documentation, this should be - the final text for the stable version 1.4.x. - -*** 1.3.5 *** -- FIX: Fixed problem with memory core allocator (bug 2912528). -- FIX: Fixed problem with CH_USE_MEMCORE option (bug 2912522). -- FIX: Fixed some problems in the MMC_SPI driver (bugs 2901084 and 2901172). -- NEW: Added a command line shell component, modified the Win32 simulator - in order to use the new shell. The shell can be used under any architecture, - it just requires an I/O channel. Custom commands can be easily added. -- NEW: Unified the initialization of the various drivers from a single HAL - driver. The single drivers can be enabled or disabled from a HAL - configuration file halconf.h. -- NEW: New CAN driver model. -- NEW: New PWM driver model. -- NEW: STM32 ADC driver implementation with DMA support. -- NEW: STM32 CAN driver implementation. -- NEW: Extended the support to all the SAM7X and SAM7S devices thanks to - code contributed by Liam Staskawicz. -- NEW: Improvements to the AT91SAM7 startup code contributed by Liam. -- NEW: Added test report for MSP430 running from the external high speed - oscillator. -- NEW: HAL stress test for STM32 added, the demo is located under - ./testhal/STM32. The demo code also shows how to use the ADC, CAN and SPI - drivers. -- CHANGE: Removed the MII from the standard drivers, now it is part of the - AT91SAM7 support, the header mii.h is still part of the HAL. -- CHANGE: In the STM32 drivers now the DMA errors are handled by hook macros - rather than by events. The default action is to halt the system but users - are able to override this and define custom handling. -- CHANGE: In the Cortex-M3 port, modified the NVICEnableVector() function - to make it clear pending interrupts. -- CHANGE: Minor changes to the ADC driver model. - -*** 1.3.4 *** -- FIX: Fixed bug in STM32 PAL port driver (bug 2897636). -- FIX: Fixed problem with ARM-CM3 context switch when compiled at level - -O0 (bug 2890382). -- FIX: Fixed wrong conditional in chschd.c (bug 2888836). -- FIX: Fixed wrong macro in chheap.c (bug 2888833). -- FIX: Fixed AIC initialization in AT91SAM7X support (bug 2888583). -- NEW: New SPI (master) driver model. -- NEW: SPI driver for STM32 implementing the new SPI driver model. -- NEW: New ADC (streaming capable) driver model. -- NEW: Generic MMC (over SPI) driver. -- NEW: Added a STM32 demo that integrates the MMC driver and the FatFs - file system. -- NEW: Implemented I/O redirection on a serial driver into syscalls.c, now - it is possible (but not recommended) to use printf()/scanf() etc. An usage - example is in the new MMC/FatFs demo. Note the extra -D... into the Makefile. -- CHANGE: Moved the STM32 firmware library under ./ext, this way there is no - need to duplicate it in each demo program. -- CHANGE: Moved the file stm32f10x.h from the demos to the platforms support - directory. - -*** 1.3.3 *** -- FIX: Fixed bug in the LPC2148 PAL driver (bug 2881380). -- FIX: Fixed bug in the AT91SAM7X PAL driver (bug 2879933). -- NEW: New MAC and MII driver models and implementations for the AT91SAM7X. - Removed the old EMAC driver, updated the uIP WEB demo to use the new - driver model. -- NEW: Added a simple lwIP demo (web server) for the AT91SAM7X. -- NEW: Centralized core memory manager. This simple allocator implements a - sbrk()-like API: chCoreAlloc(). The other allocators now use this manager - in order to get memory blocks. -- NEW: The heap allocator has been modified, now it is possible to have - multiple heaps. The default heap gets its memory from the new core memory - manager. -- NEW: Now memory pools can optionally get new objects automatically from the - core memory manager. -- NEW: Added newlib interface file syscalls.c under ./os/various for use with - the newest YAGARTO releases. The file provides bindings between the C - runtime and the core memory manager. -- CHANGE: Because the changes in the allocators some API prototypes changed: - chHeapAlloc(), chHeapStatus(), chThdCreateFromHeap(). -- CHANGE: Because the changes in the allocators some configuration options - changed and some were removed, see the new template chconf.h file. -- CHANGE: renamed ./demos/ARM7-AT91SAM7X-WEB-GCC in ARM7-AT91SAM7X-UIP-GCC. -- FIX: Added the most restrictive GCC warning option to the makefiles (-Wextra) - and fixed some warnings in the code, mostly unused function parameters. - -*** 1.3.2 *** -- FIX: Fixed GCC 4.4.x aliasing warnings (bug 2846336)(backported in stable - branch). -- FIX: Modified linker scripts for GCC 4.4.x (bug 2846302)(backported in stable - branch). -- FIX: Fixed the CH_OPTIMIZE_SPEED option in the CM3 port (bug 2846278) - (backported in stable branch). -- FIX: Fixed GCC 4.4.x related problems in CM3 port (bug 2846162)(backported - in stable branch). -- FIX: Fixed LPC214x UART problem (bug 2841088)(backported in stable branch). -- NEW: Improved the Cortex-M3 preemption code, now less interrupt-related - jitter is generated and all benchmarks scores improved a bit. -- NEW: Added new APIs chSchDoYieldS() and chThdYield(). -- MEW: Added new benchmark about RAM footprint. -- MEW: Added new benchmark about round robin rescheduling. -- NEW: Reorganized and rationalized the distribution tree and the - documentation. -- NEW: Enhanced serial driver. The driver now supports speed change at runtime - and low power stop mode. -- NEW: Serial driver removed from the kernel and added to the I/O subsystems - together with PAL. Note that the related API names changed their prefix from - chFDDxxx to sdxxx because of this. -- NEW: Added standard CMSIS 1.2.0 support to the Cortex-M3 port. The kernel - does not use it (the OS uses its own optimized code) but the functionality - is available to the applications. The CMSIS files were patched in order - to correct some warnings. -- NEW: Updated the STM32 port to use the newest ST firmware library files - (version 3.1.0). Note that now the ST drivers are included in the STM32 - demo directory. -- NEW: Improved makefiles and makefile fragments, now the paths are not fixed, - the fragments can be included also from projects outside the ChibiOS/RT files - structure by simply defining the variable ${CHIBIOS}. -- CHANGE: Removed the CH_USE_SERIAL_FULLDUPLEX configuration option because - the serial driver is no more part of the kernel. -- CHANGE: Reorganized the PAL and Serial identifiers now IOPORT1..N and - SD1..N rather than IOPORT_A..Z and COM1..N, some of the old names were - conflicting with some AVR libraries. - -*** 1.3.1 *** -- FIX: Removed mention of an obsolete option from the documentation (bug - 2799507). -- NEW: Abstract digital I/O ports driver (PAL), this driver defines a common - interface for digital I/O operations, this should help to create more - portable applications and, in general, make easier to work with ChibiOS/RT - on multiple architectures. -- NEW: Port drivers for STM32, LPC214x, AT91SAM7X and MSP430, cleaned up the - initialization code in board.c. All the demos now use PAL for I/O. AVR is - not supported because its "sparse" registers layout, it would not be - efficient enough for my taste. -- Modified the STM32 demo to use the bit definitions in the ST header file, - removed the bit definitions in board.h and stm32_serial.h. -- Documentation section reorganization and fixes. -- Changed the STM32 demo stack sizes, it was incorrectly adjusted in version - 1.3.0 but it did not create problems (not a bug). - -*** 1.3.0 *** -- FIX: Fixed regression in MinGW demo (bug 2745153)(backported in stable - branch). -- FIX: Fixed problem with the timeout constant TIME_IMMEDIATE, added a - specific test in the test suite (bug 2755170)(backported in stable branch). -- FIX: Fixed a problem in semaphores test case #2 (bug 2755195)(backported - in stable branch). -- FIX: Removed unused list functions (bug 2755230)(backported in stable - branch). -- FIX: Added license notice to several files (bug 2772160)(backported in - stable branch). -- FIX: Found new instances of the obsolete function chSysGetTime() in the - C++ wrapper and in the WEB demo (bug 2772237)(backported in stable branch). -- FIX: Fixed macro in test.h (bug 2781176)(backported in stable branch). -- FIX: Fixed sequence assertion in test.c (bug 2789377)(backported in stable - branch). -- FIX: Fixed test_cpu_pulse() incorrect behavior (bug 2789383)(backported in - stable branch). -- FIX: Fixed missing volatile modifier for p_time field in Thread structure - (bug 2789501)(backported in stable branch). -- FIX: Fixed C99-style variable declarations (bug 2792919)(backported in - stable branch). -- FIX: Fixed instance of obsolete CH_USE_TERMINATE option in the C++ wrapper - (bug 2796065)(backported in stable branch). -- FIX: Insufficient stack allocated to the C++ LPC2148 demo (bug 2796069) - (backported in stable branch). -- FIX: Fixed errors in events test case (bug 2796081)(backported in stable - branch). -- NEW: Abstract I/O Channels mechanism introduced. This mechanism allows to - access I/O resources through a standard interface and hides implementation - details. The existing serial drivers were modified to offer a standard - channel interface to the applications (the old APIs are retained as macros). -- NEW: The I/O queues code was improved, now there are 2 separate structures: - InputQueue and OutputQueue. There are some changes in the queue APIs - in order to make them more symmetrical and functional. Improved the queues - documentation. Some of the changes were needed in order to support the new - channels mechanism as a backend for queued serial drivers. -- NEW: Static initializers macros introduced for most kernel objects. The - static initializers allow to not have to chXXXInit() any object and save some - code space. The initialization functions are retained in order to allow - initialization of dynamic objects and re-initializations. -- NEW: Added more test cases in order to improve the test suite code coverage - (it was 74% in version 1.2.0, it is now close to 100%). -- NEW: Added test cases for the improved queues and serial drivers. -- NEW: Added a code coverage analysis application under ./tests/coverage. -- NEW: Added the test suite documentation to the general documentation. -- NEW: Added a new "naked" context switch benchmark that better defines the - real context switch time, previous benchmarks introduced too much overhead - to the measurement. The STM32 performs the context switch in under 1.48uS. -- NEW: Improved priority inheritance test cases. -- NEW: Added architecture name strings to the port code. -- NEW: Linux x86 simulator demo added. It is still work in progress. -- CHANGE: Removed the half duplex queues and half duplex serial drivers because - it was never extensively tested. The code is still available but not as part - of the kernel. -- CHANGE: Removed the chMsgSendWithEvent() function. It is rarely used and - the functionality can be re-created with a compound atomic operation. Also - removed the CH_USE_MESSAGES_EVENT configuration option. -- CHANGE: Modified the test suite assertions in order to save RAM on the AVR - targets. The test suite now uses much less string space. -- CHANGE: Removed the CH_USE_SERIAL_HALFDUPLEX, CH_USE_QUEUES_TIMEOUT, - CH_USE_QUEUES_HALFDUPLEX, CH_USE_SEMAPHORES_TIMEOUT configuration options. -- CHANGE: Made CH_DBG_THREADS_PROFILING default to TRUE in all demos because - the changes to the function test_cpu_pulse(). -- CHANGE: Increased main stack size to 1KiB for all the ARMx demos, 2KiB for - the C++ LPC2148 demo. This should make things easier for unexperienced - users. - -*** 1.2.0 *** -- Added license exception text to the 1.2.0 branch. -- FIX: Fixed serious AVR regression (bug 2731578). -- FIX: Fixed build failure when CH_USE_MUTEXES=FALSE (bug 2730706). -- FIX: Removed reference to an obsolete function (bug 2731661). -- Full test cycle and test reports updated. -- Small fixes to the documentation. - -*** 1.1.3unstable *** -- FIX: Fixed makefile in STM32 demo, this bug was reported fixed in - version 1.1.2 but it was still there (bug 2686451). -- FIX: Fixed makefile in MSP430 demo (bug 2700690). -- FIX: Fixed thumb mode build error in AT91SAM7X demos (bug 2700695). - -*** 1.1.2unstable *** -- FIX: Fixed priority inheritance problem with condvars (bug 2674756) and - added a specific test case to the test suite (backported in stable branch). -- FIX: Fixed a problem in time ranges (bug 2680425)(backported in stable - branch). -- FIX: Build error with option CH_DBG_FILL_THREADS (bug 2683965). -- FIX: Fixed a wrong parameter check in chVTSetI() and chThdSleep() - (bug 2679155). -- FIX: Build error with options CH_USE_NESTED_LOCKS && !CH_OPTIMIZE_SPEED - (bug 2678928). -- FIX: Removed unused chSysPuts() macro (bug 2672678). -- FIX: Renamed function chSysInTimeWindow() as chTimeIsWithin() and renamed - the macro chSysGetTime() in chTimeNow(), the old names are still recognized - but marked as deprecated (fixes the bug 2678953 but goes a bit further by - introducing a new API category "Time"). -- FIX: Fixed makefile problems in the AT91SAM7X256 and STM32 demos (bugs - 2686347 and 2686451). -- FIX: Fixed AT91SAM7X256 EMAC driver (bug 2686349). -- FIX: Fixed small some errors in the documentation (bug 2692510). -- OPT: Small optimization to the Cortex-M3 thread startup code, improved thread - related performance scores and smaller code. -- OPT: Alternative, non-inlined and more compact, implementations for - port_lock() and port_unlock() in the Cortex-M3 port when CH_OPTIMIZE_SPEED - is FALSE. -- OPT: Improved ready list and priority ordered lists code, some space saved, - better context switch performance. -- Modified the test thread function to return the global test result flag. -- Removed testcond.c|h and moved the test cases into testmtx.c. Mutexes and - condvars have to be tested together. -- Added architecture diagram to the documentation. -- Removed from the documentation some references to long gone functions... - -*** 1.1.1unstable *** -- FIX: Fixed a problem into the STACK_ALIGN() macro (backported in stable - branch). -- FIX: Fixed a problem with a wrong declaration of the PLL structure in the - file lpc214x.h (backported in stable branch). -- FIX: Fixed build problem with the C++ demo (bug 2687489). -- FIX: Removed EMAC driver from the AT91SAM7X256 demo makefile (bug 2686347). -- FIX: Removed C++ wrapper from the STM32 demo makefile (bug 2686451). -- FIX: Fixed a problem with some event APIs not showing in the documentation - (backported in stable branch). -- FIX: Fixed wrong assertions in chThdWait() and chHeapFree() (backported in - stable branch). -- FIX: Fixed @file tag in sam7x_serial.c (bug 2788573) (backported in stable - branch). -- FIX: Fixed a small problem in the chcore.c template file. -- NEW: Mailboxes (asynchronous messages) subsystem and test cases added. -- NEW: Most APIs with a timeout specification now accept the constant - TIME_IMMEDIATE (-1) that triggers an immediate timeout when trying to enter - a sleep state. -- NEW: Mode flexible debug configuration options, removed the old CH_USE_DEBUG - and CH_USE_TRACE. Replaced with CH_DBG_ENABLE_CHECKS, SCH_DBG_ENABLE_ASSERTS, - CH_DBG_ENABLE_TRACE and CH_DBG_FILL_THREADS. -- NEW: Added a debug option CH_DBG_THREADS_PROFILING for threads profiling. - A field into the Thread structure counts the consumed time. The information - is not used into the kernel, it is meant for debugging. -- NEW: Added a debug option CH_DBG_ENABLE_STACK_CHECK for stack overflow - checking. The check is not performed in the kernel but in the port code. - Currently only the ARM7 and ARMCM3 ports implements it. -- NEW: Unified makefiles for ARM7, ARMCM3 MSP430 projects, the new makefiles - share a common part making them easier to maintain. Also reorganized the - demo-specific part of the makefile, now it is easier to configure and the - option can be overridden from outside. -- CHANGE: Changed the chSemFastWaitS() macro in chSemFastWaitI() and - chSemGetCounter() in chSemGetCounterI(). -- CHANGE: Removed the port_puts() function from the port templates. It was not - implemented on all ports. -- Improvements to the test suite, added a new level of indirection that allows - to make tests depend on the configuration options without have to put #ifs - into the test main module. New benchmarks about semaphores and mutexes. - -*** 1.1.0unstable *** -- FIX: Modified the default value for the STM32 HSI setup it was 1, it should - be 0x10 (backported in stable branch). -- FIX: Removed an obsolete constant (P_SUSPENDED) from thread.h (backported in - stable branch). -- FIX: Removed unused field mp_grow in the MemoryPool structure (backported in - stable branch). -- NEW: Added to the STM32 demo makefile an option to build ChibiOS/RT with the - full STM32 FWLib 2.03. **NOTE**, except for the makefile option, the - library is not used by the OS nor required (backported in stable branch). -- NEW: Better separation between the port code and the system APIs, now an - architecture-specific "driver" contains all the port related code. - Port functions/macros are no more directly exposed as APIs to the user code. -- NEW: Added a configuration option to enable nested system locks/unlocks. -- NEW: Improved the interrupt handlers related code. Now interrupts are - handled in a very similar way in every architecture. See the "Concepts" - section and the "Writing interrupt handlers under ChibiOS/RT" article in the - documentation. -- NEW: Added the chEvtSignal() and chEvtSignalI() APIs that allows direct - thread signaling, much more efficient that chEvtBroadcast() when the target - is a known single thread. -- NEW: Added a configuration option that enables the priority enqueuing on - semaphores. It is defaulted to off because usually semaphores are used for - I/O related tasks without hard realtime requirements. -- NEW: Now the all the options in chconf.h and the various driver headers - can be overridden externally, for example from within the Makefile. - The options are no mode a simple define but a define with an assigned - TRUE/FALSE value within an #ifndef block. -- NEW: Idle thread hook macro added to the configuration file. -- NEW: Changed the ARM7 and Cortex-M3 startup files, now the action when - the main() function returns can be overridden by redefining the symbol - MainExitHandler. -- OPT: Improved ARM7 thumb port code, thanks to some GCC tricks involving - registers usage now the kernel is much smaller, faster and most OS APIs - use less RAM in stack frames (note, this is an ARM7 thumb mode specific - optimization). -- CHANGE: Now the API chThdSetPriority() returns the old priority instead - of void. -- CHANGE: Modified the signature of the chMsgSendWithEvent() API, it now uses - a more efficient event signaling method. -- CHANGE: Removed the field p_tid from the Thread structure and the related - code, this improved the thread creation scores (~2%) and saves some RAM. - The trace buffer field cse_tid is now populated with a simple hash of the - thread pointer as thread identifier. -- CHANGE: Renamed the macros chSysIRQEnter() and chSysIRQExit() in - CH_IRQ_PROLOGUE() and CH_IRQ_EPILOGUE() in order to make very clear that - those are not functions but inlined code. Also introduced a new macro - CH_IRQ_HANDLER that should be used when declaring an interrupt handler. -- CHANGE: Renamed several internal initialization functions by removing the - "ch" prefix because could not be considered system APIs. -- Improved ARM7 and Cortex-M3 support, new configuration options. -- Introduced the concept of interrupt classes, see the documentation. -- Introduced the concept of system states, see the documentation. -- Huge improvements to the documentation. -- Articles and notes previously in the wiki now merged in the general - documentation and updated, the wiki entries are obsolete and will be removed. -- New application notes and articles added. -- Added kernel size metrics to the test reports. -- Removed the inclusion graph from the documentation because the little - info they add and the size of all the images. It is possible to configure - Doxygen to have them again (and more graph types). - -*** 1.0.0 *** -- License switch, added GPL exception, see exception.txt. -- Full test cycle and test reports updated. -- Renamed some occurrences of "Conditional Variable" in "Condition Variable" in - the documentation. -- FIX: Fixed some images in the documentation because problems when seen in - Internet Explorer. - -*** 1.0.0rc3 *** -- FIX: Fixed a nasty regression to the timeout unified code that affected - some APIs since version 0.5.3. See the bug tracker for more details. - Added a test case about this. -- FIX: Removed the API chThdSuspend() there was a conceptual flaw and I want - to think about the whole concept again before introducing something similar - in future. Anyway, it is possible to replicate the functionality using - chSchGoSleepS(). -- Fixed typos here and there. -- Updated the states diagram in the documentation. - -*** 1.0.0rc2 *** -- FIX: Removed unused variable "retaddr" from the Cortex-M3 port. -- FIX: The macro THD_WA_SIZE was defined wrongly in the file - ./src/templates/chcore.h. -- Fixed some errors in the documentation. - -*** 1.0.0rc1 *** -- NEW: Added new macros CH_KERNEL_VERSION set to "1.0.0rc1", CH_KERNEL_MAJOR - set to 1, CH_KERNEL_MINOR set to 0, CH_KERNEL_PATCH set to 0. - The macros will be updated to reflect the actual kernel version number. -- NEW: Made all the port-specific configuration settings externally - configurable, see the documentation. -- FIX: Disabled the configuration option CH_USE_MESSAGES_PRIORITY from the - MSP430 demo, the default for this option should be off. -- FIX: Fixed a bug that prevented the THREAD_EXT_FIELDS to be compiled into - the Thread structure. -- FIX: Removed some references to deprecated APIs from the test suite. -- FIX: Set the INT_REQUIRED_STACK configuration value for the ARM7 port to a - safer 0x10, it was previously 0 (correct but trimmed to specific compiler - settings). -- FIX: Set the INT_REQUIRED_STACK configuration value for the AVR port to a - safer 32. -- FIX: Fixed the MinGW demo in order to not use any deprecated construct. -- Removed deprecated threads APIs: chThdCreate() and chThdCreateFast(). -- Removed deprecated events APIs: chEvtWait(), chEvtWaitTimeout(), chEvtSend(), - chEvtSendI(), EventMask(). -- Removed deprecated configuration feature CH_USE_EXIT_EVENT and the related - API chThdGetExitEventSource(). The feature can be reimplemented in user code - as shown by the MinGW demo. -- Removed deprecated macros: WorkingArea(), UserStackSize(), StackAlign(). -- Added usage note into the readme of the MinGW demo. -- Added usage notes for programmers to the ARM7 port documentation about - interrupt handlers. -- Port-specific settings added to the documentation. -- Added source browser to the documentation. -- Fixes and improvements through the documentation. - -*** 0.8.3 *** -- NEW: Introduced new API chThdSleepS() as a macro, no real changes in the - kernel code. -- FIX: The MinGW simulated demo now works again after breaking in 0.8.2 - because the changes to the macro names. -- FIX: Adjusted the test suite stack sizes for the MinGW simulated demo, now - the demo passes all the tests. -- FIX: Added fflush(stdout) to the MinGW simulation code output in order to - make the Eclipse console work correctly. -- FIX: Renamed the MinGW demo main source from demo.c to main.c in order to - follow the pattern of all the other demos. -- FIX: Added debug switches to the MinGW simulated demo, not it is possible to - debug the demo (and the kernel) inside Eclipse without a physical board. -- Removed lots of old deprecated constructs from the MinGW simulated demo. - There are still some, the demo will need some rework before version 1.0.0. -- Updated the C++ wrapper with the latest APIs changes and fixed some bugs. -- Small fixes to the documentation. - -*** 0.8.2 *** -- FIX: Included the files that were missing from version 0.8.1 distribution. -- FIX: Duplicated sections in the documentation removed. -- FIX: Minor problem in Cortex-M3 and AVR ports when the kernel is compiled - using G++. -- NEW: Added chPoolAllocI() and chPoolFreeI() APIs in order to allow the use - of memory pools from interrupt handlers and timer callbacks. -- CHANGE: Simplified the code for chThdWait(), it is now both smaller and - faster. Added an important usage note to the documentation of this API. -- CHANGE: The macros WorkingArea(), UserStackSize() and StackAlign() are now - deprecated and will be removed in version 1.0.0. Use the new equivalents - WORKING_AREA(), THD_WA_SIZE() and STACK_ALIGN() instead. -- CHANGE: Renamed the default idle thread function from _IdleThread() to - _idle(). -- Added to the LPC2148 and STM32 load scripts the options "ALIGN(16) - SUBALIGN(16)" to the flash loading section in order to enforce the alignment - for both the code and read only data. This is done in order to obtain more - accurate timings from benchmarks, those families have 16 bytes - prefetch buffers and are very sensitive to alignment changes. - You can remove those options in order to save some flash space if accurate - response time is not on top of your priorities, it mainly depends on your - requirements. - -*** 0.8.1 *** -- FIX: Fixed a regression in version 0.8.0, the configuration switch - CH_USE_EVENTS_TIMEOUT was redefined as CH_USE_EVENT_TIMEOUT and this broke - the code using events timeouts (the LPC2148 C++ demo). - -*** 0.8.0 *** -- NEW: Added condvars mechanism on top of the mutexes subsystem. -- NEW: Improved events subsystems, now it is also possible to use it just as - "event flags" without have to use event handler callbacks. - Some new APIs were introduced: - * chEvtWaitOne() - Wait for a single event. - * chEvtWaitAny() - Wait with OR condition. - * chEvtWaitAll() - Wait with AND condition. - * chEvtDispatch() - Invokes the event handlers associated to a mask. - * chEvtPend() - Quickly self-pends some events. - * chEvtRegisterMask() - Registers a set of flags on a single source. - * EVENT_MASK() - Replaces the old EventMask() macro. - All the "wait"-type APIs have a timeout-capable variant. -- CHANGE: The old EventMask(), chEvtWait() and chEvtWaitTimeout() APIs are - now deprecated and will be removed in version 1.0.0. -- CHANGE: Modified chDbgAssert() to syntax check the condition even when the - CH_USE_DEBUG is disabled, it produces no code but allows to check the - optional code without have to compile twice. -- FIX: Fixed a warning generated by the chEvtIsListening() macro. -- Added new test cases to the test suite about condvars and the new events - APIs. -- Added a new benchmark to the test suite (timers set/reset performance). -- Renamed the macro fifo_init() to queue_init() because it is used to init - both FIFO queues and priority queues. -- Fixes and improvements to the documentation. -- Cleaned demo applications of old events code. - -*** 0.7.3 *** -- FIX: Fixed a bug in chThdSleepUntil(), this API is no more a macro now. -- NEW: New chThdSleepSeconds(), chThdSleepMilliseconds() and - chThdSleepMicroseconds() utility macros. -- CHANGE: Zero is no more a valid time specification for the chVTSetI() API. -- CHANGE: Removed the files chsleep.c and sleep.h. -- CHANGE: Renamed the files chdelta.c and delta.h to chvt.c and vt.h. All the - system time related functions and macros are now there. -- CHANGE: Renamed the structure DeltaList to VTList, it includes the system - time counter too now. -- CHANGE: Removed the CH_USE_SYSTEMTIME and CH_USE_VIRTUAL_TIMER configuration - options in order to make the chconf.h file simpler. The related subsystems - are almost always required and are now always included. -- Small optimization to the MSP430 serial driver. -- Improvements to the test code, now a failed assert terminates the test case. -- Added dependency informations handling to the MSP430 demo Makefile. -- Removed the performance spreadsheet (it was *very* old) and added a - directory containing the test reports ./docs/reports. Each report shows the - results from the latest test run on each target. -- Small fixes to the documentation. - -*** 0.7.2 *** -- NEW: Added a serial driver to the MSP430 port, the MSP430 port now has been - tested on hardware and passes the test suite. -- NEW: Added to the MSP demo program the option to run from the internal DCO - or from an external xtal. The default is the internal DCO. -- NEW: Added macros to convert from seconds, milliseconds and microseconds to - system ticks. This improves application code portability among different - ports. -- CHANGE: Modified the test suite to use the new time conversion macros. -- CHANGE: Modified the CM3 startup file in order to implement an early - initialization phase: hwinit0, the late initialization phase is now named - hwinit1. The demo now initializes the PLL before initializing the BSS and - DATA segments, this greatly optimizes the system start up time. -- NEW: Unified ARM7 startup file, it is shared by the LPC and SAM7 demo - projects. The new startup file implements early and late initialization - phases as described above for the CM3 startup file. - The architecture specific vector tables are now encapsulated into the - vectors.s files. -- Modified the STM32 demo makefile to use the latest YAGARTO toolchain as - default (arm-elf-gcc). -- Documentation improvements, added collaboration diagrams and call graphs. - Added a documentation-related readme under ./docs. - -*** 0.7.1 *** -- NEW: New chThdInit() and chThdCreateStatic() APIs now replace the old - chThdCreate() and chThdCreateFast() that are thus marked as deprecated. - The new APIs use one less parameter and are faster. -- NEW: New dynamic chThdCreateFromHeap() and chthdCreateFromMemoryPool() APIs. - The dynamic APIs are only included if the CH_USE_DYNAMIC option is specified - into the project configuration file. -- NEW: Added an THREAD_EXT_EXIT macro in chconf.h to add finalization code to - the chThdExit() API. -- CHANGE: chThdCreateFast() is now a macro that uses chThdCreateStatic(). -- CHANGE: chThdWait() now releases the memory allocated by - chThdCreateFromHeap() and chthdCreateFromMemoryPool(). Threads created - through the static APIs are not affected thus the behavior is backward - compatible. -- CHANGE: Modified the chThdResume() API to return the resumed thread pointer - instead of void. This allowed few optimization into the threads creation - code. -- CHANGE: The chThdGetExitEventSource() API and the CH_USE_EXIT_EVENT - configuration option and the are now deprecated. Use the THREAD_EXT_EXIT - finalization macro in order to implement a similar functionality if needed. -- FIX: The chThdCreate() had a regression in 0.7.0, the mode parameter was - ignored. -- FIX: Removed duplicated call to chHeapInit() into chSysInit(). -- FIX: Fixed a syntax error in chheap.c triggered by the CH_USE_DEBUG option. -- Added new test cases to the test suite for the new dynamic APIs. -- Documentation fixes. - -*** 0.7.0 *** -- NEW: Memory Heap Allocator functionality added. The allocator implements a - first-fit strategy but there is an option that allow it to wrap the compiler - provided malloc() that may implement a different strategy. The heap - allocator is thread-safe and can use both a mutex or a semaphore as - internal synchronization primitive. -- NEW: Memory Pools functionality added, this mechanism allows constant-time - allocation/freeing of constant-size objects. It can be used to dynamically - allocate kernel objects like Semaphores, Mutexes, Threads etc fully in real - time, of course it is also possible to manage application-defined objects. - The pool allocator is thread-safe. - It is worth remembering that the kernel is still entirely static, it does - not use the allocation services internally, it is up to the application - code to use the allocators in order to use dynamic system objects. - Both the allocators can be disabled and removed from the memory image. -- NEW: Added option macros in chconf.h to add custom fields and initialization - code to the Thread structure. -- FIX: Corrected the wrong definition of the chThdResumeI() macro. -- FIX: The API chSemWaitTimeout() was missing in the documentation. -- CHANGE: Modified the chMtxUnlock() and chMtxUnlockS() APIs to return the - pointer to the released mutex instead of void. -- CHANGE: Now the chThdResume() API asserts that the thread is in PRSUSPEND - state rather than test it. -- CHANGE: Removed the CH_USE_TERMINATE, CH_USE_SLEEP, CH_USE_SUSPEND and - CH_USE_RESUME configuration options in order to make the chconf.h file - simpler. The related functions are very small and almost always required. -- CHANGE: The P_MSGBYPRIO thread option has been removed, now the threads - always serve messages in priority order if the CH_USE_MESSAGES_PRIORITY - configuration option is active. -- Added new test cases to the test suite. - -*** 0.6.10 *** -- FIX: Fixed a case-sensitiveness error in lpc214x_ssp.c, it affected only - linux/unix users. -- FIX: Fixed a regression introduced in version 0.6.9, the queues benchmark - test case was missing from the tests list. -- NEW: Added an option to the ARM7 ports, by specifying -DREENTRANT_LOCKS in - the makefile options makes the chSysLock() and chSysUnlock() become - reentrant. The code becomes a bit larger and slower, use it only if your - application really needs to invoke system API under lock. -- NEW: Added an option to the ARM7 and CM3 makefiles to strip any unused code - and data from the binary file (the default is on). - -*** 0.6.9 *** -- NEW: Added an option to exclude the support for the round robin scheduling, - this can save some extra program space and makes the context switch a bit - faster if the feature is not required. Threads at the same priority level - are still supported when the feature is disabled but the scheduling among - them becomes cooperative. -- OPT: Improved reschedule time by reordering the sequence of operations, - now during enqueuing the ready list contains one less element. This change - also slightly improves the interrupt latency. -- OPT: Optimization to the chSemReset(), reversed the order of dequeuing. -- FIX: Fixed a bug in the chThdSetPriority() API. -- FIX: Modified the structure names into nvic.h in order to not make them - collide with external libraries. -- Added a benchmark to the test suit that measures the mass reschedule - performance. -- Added a test_terminate_threads() function to the test framework. -- Made the Cortex-M3 port preemption code more readable. -- Added a ENABLE_WFI_IDLE option to the chcore.h file in the Cortex-M3 port, - setting this option to 1 enables the kernel to enter a low power mode when - executing the idle thread. Be careful however, this option can be not - compatible with some JTAG probes, it is better to enable it only on final - builds and not when debugging. - -*** 0.6.8 *** -- FIX: Fixed a bug in the priority inheritance mechanism, the bug was only a - problems when the CH_USE_MESSAGES_PRIORITY was enabled, this option is - disabled by default in ChibiOS/RT so it should not affect any user. -- CHANGE: The function chEvtSend() and chEvtSendI() are now renamed in - chEvtBroadcast() and chEvtBroadcastI(), the old names are still available - but are deprecated. -- Made the default BASEPRI levels (CM3 port) configurable into chcore.h. -- Many improvements to the documentation. -- All the fixes and changes in this release were suggested/submitted by - Leon Woestenberg (thank you). - -*** 0.6.7 *** -- NEW: New chThdCreateFast() API, it is a simplified form of chThdCreate() - that allows even faster threads creation. The new API does not support - the "mode" and "arg" parameters (still available in the old API). -- OPT: Removed an unrequired initialization and made other small optimizations - to the chThdCreate(). -- OPT: Improvements to the test framework, now a virtual timer is used instead - of software loops into the benchmarks in order to have more stable results. -- New benchmark added to the test suite. -- Added the C++ wrapper entries to the documentation. -- Fixed the documentation entry for the chThdCreate() API. -- Removed redundant ifdefs from the ch.h header. - -*** 0.6.6 *** -- NEW: Improved test suite, now the suite is divided in modules and the code - is much easier to understand. The new framework simplifies the inclusion of - new test cases and makes possible to verify the exact sequence and the - timing of test events. -- NEW: New API chSysInTimeWindow() that checks if the current system time is - within the specified time window. -- FIX: Mutex test #1 in the test suite corrected, it failed to... fail. -- FIX: Fixed a problem in the STM32 port USART1 driver. -- FIX: Fixed a problem in the MMC/SD driver in the LPC2148 demo. -- Added the definitions for packed structures to the chtypes.h files. -- Improvements to the makefiles, now each source group has its own .mk include - file. Now it is no more required to rewrite everything in each makefile. - -*** 0.6.5 *** -- NEW: Web server demo for the AT91SAM7X256, the demo integrates the uIP - stack and its demo applications. -- NEW: EMAC driver added to the AT91SAM7X port. -- FIX: Small fix to the ARM7 startup files. It used a short jump in the reset - vector and that could fail in some memory configurations. -- Documentation improvements. - -*** 0.6.4 *** -- NEW: MSP430 port, the port code compiles correctly but it is not tested yet. - The port requires the MSPGCC toolchain. -- NEW: Added a CH_ARCHITECTURE_xxx define to the various chcore.h files, it - allows to write port-dependent code. -- NEW: Added to the documentation the technical notes about the currently - supported ports. -- FIX: In the ARM7 and ARMCM3 ports chanced the bool_t base type from int8_t - to int32_t, this produces a bit faster and smaller code. - It is nowhere required the bool_t type to be one byte sized. -- FIX: Small fixes to the template files, there were some leftovers of the old - type names. -- FIX: Modified the ARM demos makefiles in order to make them more compatible - with GCC 4.3.0, it seems the new GCC assumes -mthumb-interworking and - -mabi=apcs by default, at least the builds I tested did so, now the makefiles - explicitly assert -mno-thumb-interworking and -mabi=apcs-gnu in order to - produce better code. -- Added an Ethernet driver for AT91SAM7X EMAC, not complete yet, it will be - required by a uIP web server demo under ChibiOS/RT coming in some next - release. - -*** 0.6.3 *** -- NEW: ARM Cortex-M3 port completed. The demo program targets the STM32F103 - chip from ST Microelectronics on an Olimex STM32-P103 board. -- FIX: Fixed a minor error in ./ports/ARM7-LPC214x/vic.h, it should not affect - anything. -- FIX: Minor fix: in chThdCreate() a working area size equal to - UserStackSize(0) was asserted as an error when in debug mode. It is now - allowed. -- FIX: Increased the stack size for the threads in the test suite to 128 bytes - because THUMB/THUMB2 modes seem to use a lot more stack than ARM mode. - -*** 0.6.2 *** -- NEW: Added C++ wrapper around the ChibiOS/RT core APIs, now it is possible - to use the OS in a fully object oriented application. The wrapper offers - classes that encapsulate threads, semaphores, mutexes, timers etc. Normal C - APIs are still accessible from C++ code as usual. -- NEW: Added a new LPC2148 demo using the new C++ wrapper, it is a good - example of C++ used for an embedded application. The demo does not use RTTI - nor standard libraries so the resulting code is very compact. -- Enhanced the chSemSignalWait() API to return the wakeup message just like - the other "Wait" semaphore functions do. -- Fixed a minor problem in the ARM7 port, the extctx structure definition was - missing one field, the effect was to allocate stacks 4 bytes shorter than - the declared size. -- Fixed a compile time error into the chThdSleepUntil() macro. -- Fixes in various headers to make some macros compatible with both C and C++. -- Fixed a regression in the LPC214x minimal demo that broke interrupt - handling. -- Some fixes to the doxygen documentation. -- More work done on the ARM-CM3 port but it is still not complete. - -*** 0.6.1 *** -- Removed some redundant checks from the scheduler code: improved threads - flyback time, reduced interrupts service time. -- Nice scheduler speed improvement obtained by removing the 2nd parameter to - the chSchReadyI() API and manually assigning the message value only where - is really needed (very few points in the code). -- More space savings and speed improvements obtained by removing the - -fno-strict-aliasing option from the makefiles, now the kernel compiles - without any warning even without this option. -- Removed the -falign-functions=16 option from the AT91SAM7X demo makefiles, - the Atmel chip does not require it, the option is still present on the - LPC21xx demos. This saves significant program space. -- Started work on ARM Cortex-M3 architecture. The target chip is the STM32F103 - on a Olimex STM32-P103 board. -- Added a threads state diagram to the documentation. -- Various fixes to the doxygen documentation. - -*** 0.6.0 *** -- Code refactory, all the old sized-integer definitions like LONG32, UWORD16 - etc are now replaced by the proper definitions provided by the compiler - into stdint.h. -- Code refactory, the previous system types style using a t_ in front of the - name has been replaced with the standard trailing _t. The system now uses - the size_t type defined into stddef.h. Some type names were modified in - order to not match commonly used type names. -- The above changes have an impact on some API prototypes but we can't help - it, the changes were required because the type names were a concern for - some users. -- Implemented a serial driver in the AVR port. -- Implemented a simple HD44780 LCD driver into the AVRmega128 demo. -- Reworked the AVR AT90CAN128 port to share the common AVR code. -- Modified the test suite to be compatible with 8 bit micros. -- MSVC demo dropped, it is still possible to use the MinGW demo as simulator - in Win32. -- Fixed a minor error in sam7x_serial.h and lpc214x_serial.h. -- The kernel is *unchanged* compared to version 0.5.3 except for the type - names but the change is important enough to make this a recommended update. - -*** 0.5.5 *** -- Added an AVRmega128 port. The previous AT90CANx port is still present but - it will be redone after the AVRmega128 port is complete because it will - share most of it. The demo is very simple, it will be expanded in next - releases. -- Reorganized the code of the two ARM7 ports, now all the common ARM7 code - is in ./ports/ARM7. This will make maintenance and new ARM7 ports much much - easier. -- Simplified the directory structure under ./ports. -- Added to the readme a section with our future plans/ideas. -- The kernel is *unchanged* compared to version 0.5.3, just the new port and - the new demo were added. - -*** 0.5.4 *** -- Port for Atmel AT91SAM7X256 introduced, the port should be usable also on - SAM7S and SAM7XC but no tests were performed. Other SAM7 processors should - also be usable with limited changes. - The demo currently just performs basic operations, will be enhanced in next - ChibiOS/RT releases, see the demo readme.txt file. -- Small fix to the thumb mode IRQ code on the LPC214x port, removed some extra - code. -- The kernel is *unchanged* compared to version 0.5.3, just the new port and - the new demo were added. - -*** 0.5.3 *** -- Removed the chMsgSendTimeout() API, it was conceptually flawed because, - after sending a message, the sender *has* to wait for the answer or - the next sender in queue would receive it instead (the messages server has - no way to know that the sender is gone because a timeout). - A workaround would make the messages subsystem much heavier and this is - not acceptable. -- Removed the test case for chMsgSendTimeout() from the test suite. -- Space saved by reorganizing the timeout code into a single scheduler - function chSchGoSleepTimeoutS(). -- Space optimizations in the semaphores code. -- The API chThdSleepUntil() become a macro saving some more code space. -- Because all the above changes the kernel code (ARM) is over 700 bytes - smaller. - -*** 0.5.2 *** -- Fixed a small problem in the main header file ch.h. -- Small reordering in the fields of the Thread structure in order to optimize - the space when messages are not used. - -*** 0.5.1 *** -- NEW: Priority enqueing for messages can be optionally enabled by specifying - the P_MSGBYPRIO option when creating a message server thread. - This change allows the implementation of a priority ceiling protocol into - message servers threads. Threads serving messages by priority and threads - serving messages in FIFO order can exist at the same time in the system. - This feature can be enabled or disabled by toggling the option - CH_USE_MESSAGES_PRIORITY into the chconf.h file (disabled by default, old - behavior). - Note: This option brings a small overhead when sending a message regardless - if in FIFO or priority order, if you don't need priority ordering for your - messages it is better to keep the feature disabled in chconf.h. -- Added to the ARM demos load scripts the capability to load code in RAM - instead flash, the function must be marked as: - __attribute__((section(".ramtext"))) - The option -mlong-calls should be specified in the makefile too or the - function declared with the "long-call" attribute. -- Fixed the MSVC demo project files. -- Fixed some syntax incompatibilities between GCC and MSVC into chmtx.c. - -*** 0.5.0 *** -- NEW: Mutexes, the new mechanism provides a complete implementation of the - "priority inheritance" algorithm as a tool for work around the priority - inversion problem. - The Mutexes are not meant to replace the Semaphores that still are the best - synchronization mechanism between interrupt handlers and high level - code, something that Mutexes cannot do. - Soon an article will be added to the wiki describing pro and cons of the - various mechanisms and the correct use cases. -- RT Semaphores subsystem removed, the Mutexes implements a better solution - for the same problem. -- Fixed a bug in the round robin scheduling mode, see the bug tracker for - details and a fix for previous versions. -- More performance improvements to the scheduler. The ready list insertion - sequence is now reversed, it is scanned starting from the highest priority - end. This has an important side effect into the chSchWakeupS() that makes - most of the ready list insertions happen in constant time (extraction is - done always in constant time). - The worst case is always proportional to the number of threads in the ready - list but the normal case is much more often constant than linear. See the - new benchmarks added to the test suite. -- Added mutexes test cases and new benchmarks to the test suite. -- Modified the test suite in order to have each test case to have the same - alignment enforced on functions. This is done to reduce MAM/Cache alignment - effects on the measurement. -- IRQ entry/exit code is now encapsulated into two new macros, see chcore.h - for details. -- All the asm code previously in chcore2.s is now inline asm code in chcore.c - (ARM port), chcore2.s removed. -- Moved all the board specific definitions/code into two new files: board.c - and board.h. Moved all the files no more board-dependent under ports/ - (ARM port). -- Improved the kernel performance in THUMB mode by better exploiting MAM - locality in some critical functions. The context switch benchmark shows - 5% improved speed. - -*** 0.4.5 *** -- Moved the serial IRQ handlers and VIC vectors initialization inside the - serial drivers. Now the serial-related code is all inside the driver. -- Moved all the other interrupt handlers from chcore2.s into chcore.c as - inline asm code. The interrupt code now is faster because one less call - level. -- Fixed a minor problem in chSysHalt() now it disables FIQ too and makes sure - to keep the processor in the state it had when it was halted. - Note: This is not a kernel bug but something specific with the ARM port, the - other ports are not affected. -- Fixed the macro chThdResumeI(), it had a regression. - -*** 0.4.4 *** -- Fixed a very important bug in the preemption ARM code, important enough to - make this update *mandatory*. - Note: This is not a kernel bug but something specific with the ARM port, the - other ports are not affected. -- Fixed a nasty bug in the pure THUMB mode threads trampoline code (chcore2.s, - threadstart), it failed on THUMB threads returning with a "bx" instruction. - The bug did not affect ARM mode or THUMB with interworking mode. - Note: This is not a kernel bug but something specific with the ARM port, the - other ports are not affected. -- Fixed a bug in chIQGetTimeout(), interrupts were not re-enabled when exiting - the function because a timeout. The problem affected that API only. -- Fixed a potential problem in chSysInit(), it should not affect any past - application. -- Added a chDbgAssert() API to the debug subsystem. -- Cleaned up the kernel source code using chDbgAssert() instead of a lot of - "#ifdef CH_USE_DEBUG", it is much more readable now. -- Now the threads working area is filled with a 0x55 when in debug mode, this - will make easier to track stack usage using a JTAG probe. -- Added an I/O Queues benchmark to the test suite. -- Removed the chSchTimerHandlerI() routine from chschd.c and moved it into - chinit.c renaming it chSysTimerHandlerI() because it is not part of the - scheduler. - -*** 0.4.3 *** -- Size optimization in the events code, now the chEvtWait() reuses the - chEvtWaitTimeout() code if it is enabled. -- Size optimization in the semaphores code, now the chSemWaitTimeout() just - invokes the chSemWaitTimeoutS() inside its system mutex zone. Same thing - done with chSemWait() and chSemWaitS(). -- Size optimization in the queues code. -- Modified the return type of chSemWait() and chSemWaitS() from void to t_msg, - this allows to understand if the semaphore was signaled or reset without - have to access the Thread structure. -- Added a threads create/exit/wait benchmark to the test suite, the system - is capable of 81712 threads started/terminated per second on the reference - LPC2148 board. The figure is inclusive of two context switch operations - for each thread. -- Minor improvement in the LPC214x serial driver, unneeded events were - generated in some rare cases. -- Fixed a chSysInit() documentation error. -- Fixed a chEvtWaitTimeout() documentation error. -- Added a new debug switch: CH_USE_TRACE, previously the trace functionality - was associated to the CH_USE_DEBUG switch. - -*** 0.4.2 *** -- Added a minimal ARM7-LPC demo, you can use this one as template in order to - create your application. It is easier to add subsystems back to the small - demo than remove stuff from the large one. -- Introduced support for "pure" THUMB mode, it is activated when all the - source files are compiled in THUMB mode, the option -mthumb-interworking is - not used in this scenario and this greatly improves both code size and - speed. - It is recommended to either use ARM mode or THUMB mode and not mix them - unless you know exactly what you are doing. Mixing modes is still supported - anyway. -- More optimizations in the scheduler, updated the performance spreadsheet. -- Fixed a problem with the thread working area declarations, the alignment to - 4 bytes boundary was not enforced. Now it is defined a new macro - WorkingArea(name, length) that takes care of both the allocation and the - alignment. - Example: - static WorkingArea(waThread1, 32); - It is expanded as: - ULONG32 waThread1[UserStackSpace(32) >> 2]; - Now the demos use the new declaration style. -- Fixed a small problem in sleep functions introduced in 0.4.1. - -*** 0.4.1 *** -- Modified the initialization code in order to have a dedicated idle thread in - the system, now the main() function behaves like a normal thread after - executing chSysInit() and can use all the ChibiOS/RT APIs (it was required - to run the idle loop in previous versions). - Now it is also possible to use ChibiOS/RT with a single main() thread and - just use it for the I/O capabilities, Virtual Timers and events. Now you - don't have to use multiple threads if you don't really need to. -- Added a spreadsheet in the documentation that describes the advantages - and disadvantages of the various optimization options (both GCC options and - ChibiOS/RT options), very interesting read IMO. -- The GCC option -falign-functions=16 is now default in the Makefile, it is - required because of the MAM unit into the LPC chips, without this option - the code performance is less predictable and can change of some % points - depending on how the code is aligned in the flash memory, unpredictability - is bad for a RTOS. This option however increases the code size slightly - because of the alignment gaps. -- Fine tuning in the scheduler code for improved performance, deeper - inlining and other small changes, about 5% better scheduler performance. -- Increased the default system-mode stack size from 128 to 256 bytes because - some optimizations and the THUMB mode seem to eat more stack space. -- Included a Makefile in the LPC2148 demo that builds in THUMB mode. -- Const-ified a parameter in the chEvtWait() and chEvtWaitTimeout() APIs. -- Removed the CPU register clearing on thread start, it was not really useful, - it is better to maximize performance instead. -- Cleaned up the ARM port code. Now it is easier to understand. -- Cleaned up the LPC2148 demo in main.c, it is now well documented and - explains everything, I assumed too much stuff to be "obvious". - -*** 0.4.0 *** -- NEW, added a benchmark functionality to the test suite. The benchmark - measures the kernel throughput as messages per second and context switches - per second. The benchmark will be useful for fine tuning the compiler - options and the kernel itself. -- NEW, implemented a debug subsystem, it supports debug messages and a context - switch circular trace buffer. The debug code can be enabled/disabled by - using the CH_USE_DEBUG in chconf.h. - The trace buffer is meant to be fetched and decoded by an external tool - (coming soon, it can be accessed using JTAG in the meanwhile). -- Added new API chThdGetPriority() as a macro. -- Implemented panic messages when CH_USE_DEBUG is enabled. -- Added a thread identifier field to the Thread structure, it is used only - for debug. -- Global variable stime modified as volatile. -- API chSysGetTime() reimplemented as a macro. -- Fixed a regression with the CH_CURRP_REGISTER_CACHE option. -- Fixed a problem in the LPC2148 interrupt handling code, a spurious - interrupts fix recommended on the NXP data sheet proved to be a very bad - idea and not about real spurious interrupts also... -- Fixed an harmless warning message in buzzer.c. - -*** 0.3.6 *** -- Added SSP (SPI1) and ext.interrupts definitions to the lpc214x.h file. -- Added SSP driver for the LPC2148. -- Added experimental MMC/SD block driver to the LPC2148 demo in order to - support file systems. The driver features also events generation on card - insert/remove, hot plugging supported. -- Added missing chThdSuspend() declaration in threads.h. - -*** 0.3.5 *** -- Space optimization in events code. -- Changed the behavior of chEvtWaitTimeout() when the timeout parameter is - set to zero, now it is consistent with all the other syscalls that have a - timeout option. -- Reorganized all the kernel inline definitions into a single file (inline.h). -- Fixed a minor problem in the interrupt initialization code for the LPC214x - demo, regrouped the VIC-specific code into vic.c/vic.h. -- Fixed a bug into the LPC2148 serial driver (limited to the serial port 2). -- Implemented HW transmit FIFO preloading in the LPC2148 serial driver in - order to minimize the number of interrupts generated, it is possible to - disable the feature and return to the old code which is a bit smaller, see - the configuration parameters in ./ARM7-LPC214x/GCC/lpc214x_serial.h. -- Some more work done on the AVR port, it is almost complete but not tested - yet because my JTAG probe broke... - -*** 0.3.4 *** -- Fixed a problem in chVTSetI(). -- New API, chVTIsArmedI(), it is a macro in delta.h. -- New API, chThdResumeI(), it is a macro in threads.h. This function is just - an alias for chSchReadyI() but makes the code more readable. -- New API, chThdSuspend(). New switch CH_USE_SUSPEND added to chconf.h. - -*** 0.3.3 *** -- Modified the chVTSetI(), now for the "time" parameter can have value zero - with meaning "infinite". This allows all the APIs with timeout parameters - to be invoked with no timeout. -- Fixes in the documentation. -- Renamed some APIs in the "Sch" group to have an S suffix instead of I. - -*** 0.3.2 *** -- Modified the chSysInit() to give the idle thread absolute priority, the - priority is then lowered to the minimum value into the chSysPause(). This - is done in order to ensure that the initializations performed into the - main() procedure are finished before any thread starts. -- Added chThdSetPriority() new API. -- Added a generic events generator timer module to the library code. -- Modified the ARM7-LPC214x-GCC demo to show the use of the event timer. -- Added the "#ifdef __cplusplus" stuff to the header files. -- Removed an obsolete definition in ./src/templates/chtypes.h. - -*** 0.3.1 *** -- Test program added to the demos. Telnet the MinGW and MSVS demos and type - "test" at the "ch>" prompt. On the LPC214x demo the test is activated by - pressing both the board buttons. The test performs tests on the ChibiOS/RT - functionalities. - The test code is also a good example of APIs usage and ChibiOS/RT behavior. -- Fixed bug in chEvtWaitTimeout(), the timeout code performed an useless - dequeue operation. -- Fixed a bug in chSemWaitTimeoutS() and chSemWaitTimeout(), the semaphore - counter was not atomically updated on a timeout condition. -- Fixed bug on RT semaphores, the priority queuing was broken. -- Fixed a bug in the MinGW demo, the chThdExit() code was not correctly - reported to the thread waiting in chThdWait(). -- Fixed a function declaration in semaphores.h. -- Lists code moved into chlists.c from various other places optimized and - reorganized. -- The list of the threads waiting in chThdWait() is now a single link list, - this saves some space. -- Cleaned the template files code, the files contained some obsolete - declarations. -- Code optimization in chSemWaitTimeoutS(), chSemWaitTimeout() and - chSemSignalWait(). -- Code optimization in chEvtSend(). -- Code optimization in chVTDoTickI(). -- Added a Semaphore pointer to the Thread structure, this allows to know on - which semaphore a thread is waiting on. It takes no space because it is - located in the union inside the Thread structure. This also allowed a minor - optimization inside chSemWaitTimeout() and chSemWaitTimeoutS(). -- Changed the priority type to unsigned in order to make it compatible - with a byte value, this is very important for 8 bits architectures. -- Modified the MinGW and MSVS demos to use 1ms ticks instead of 10ms as - before. - -*** 0.3.0 *** -- ChibiOS/RT goes beta. -- Diet for the threads code, some simple APIs become macros. -- Thread Local Storage implemented as a single API: chThdLS(). - The API simply returns a pointer into the thread working area, see the - documentation on the web site. -- Moved some documentation and images from the web site into the Doxygen - generated HTMLs. - -*** 0.2.1 *** -- Optimizations in the RT semaphores subsystem. The support for this - subsystem should still be considered experimental and further changes may - happen in future versions. -- Bug fix in the virtual timers handling code, now the timers can be re-armed - from within the callback code in order to create periodic virtual timers. -- Modified the t_prio type in the demos to be 32bits wide instead of 16bits, - this results in a better code in critical sections of the kernel. - -*** 0.2.0 *** -- Introduced support for ARM in thumb mode. -- Optimized context switching when thumb-interworking is not required, one - less instruction. -- Minor fixes to the ARM demo. - -*** 0.1.1 *** -- Some fixes into the documentation -- Renamed the makefiles to Makefile, upper case M. - -*** 0.1.0 *** -- First alpha release diff --git a/testhal/LPC11xx/EXT/Makefile b/testhal/LPC11xx/EXT/Makefile deleted file mode 100644 index 2ad18e131..000000000 --- a/testhal/LPC11xx/EXT/Makefile +++ /dev/null @@ -1,194 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/EA_LPCXPRESSO_11C24/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC11xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC11xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC11C24.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1114 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC11xx/EXT/chconf.h b/testhal/LPC11xx/EXT/chconf.h deleted file mode 100644 index fe07600ff..000000000 --- a/testhal/LPC11xx/EXT/chconf.h +++ /dev/null @@ -1,533 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC11xx EXT driver - Copyright (C) 2013 Marcin Jokel - - Copyright (C) 2013 mike brown - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC11xx/EXT/halconf.h b/testhal/LPC11xx/EXT/halconf.h deleted file mode 100644 index 06b4df2cc..000000000 --- a/testhal/LPC11xx/EXT/halconf.h +++ /dev/null @@ -1,314 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC11xx EXT driver - Copyright (C) 2013 Marcin Jokel - - Copyright (C) 2013 mike brown - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC11xx/EXT/main.c b/testhal/LPC11xx/EXT/main.c deleted file mode 100644 index bb2ef5aa6..000000000 --- a/testhal/LPC11xx/EXT/main.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - EXT haltest - Copyright (C) 2013 Marcin Jokel - - Copyright (C) 2013 mike brown - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void ledoff(void *arg) { - - (void)arg; - palClearPad(GPIO0, GPIO0_LED); -} - -/* Triggered when the button is pressed or released. The LED is set to ON.*/ -static void ext_cb0(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - - palSetPad(GPIO0, GPIO0_LED); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - - /* LED set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART, ext_cb0}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 0. - */ - extStart(&EXTD0, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD0, GPIO0_SW_ISP); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD0, GPIO0_SW_ISP); - } -} diff --git a/testhal/LPC11xx/EXT/mcuconf.h b/testhal/LPC11xx/EXT/mcuconf.h deleted file mode 100644 index b5493dbb7..000000000 --- a/testhal/LPC11xx/EXT/mcuconf.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC11xx EXT driver - Copyright (C) 2013 Marcin Jokel - - Copyright (C) 2013 mike brown - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * LPC1114 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC11xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC11xx_SYSPLL_MUL 4 -#define LPC11xx_SYSPLL_DIV 4 -#define LPC11xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC11xx_SYSABHCLK_DIV 1 - -/* - * GPT driver system settings. - */ -#define LPC11xx_GPT_USE_CT16B0 FALSE -#define LPC11xx_GPT_USE_CT16B1 FALSE -#define LPC11xx_GPT_USE_CT32B0 FALSE -#define LPC11xx_GPT_USE_CT32B1 FALSE -#define LPC11xx_GPT_CT16B0_IRQ_PRIORITY 1 -#define LPC11xx_GPT_CT16B1_IRQ_PRIORITY 3 -#define LPC11xx_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC11xx_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * SERIAL driver system settings. - */ -#define LPC11xx_SERIAL_USE_UART0 TRUE -#define LPC11xx_SERIAL_FIFO_PRELOAD 16 -#define LPC11xx_SERIAL_UART0CLKDIV 1 -#define LPC11xx_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC11xx_SPI_USE_SSP0 TRUE -#define LPC11xx_SPI_USE_SSP1 FALSE -#define LPC11xx_SPI_SSP0CLKDIV 1 -#define LPC11xx_SPI_SSP1CLKDIV 1 -#define LPC11xx_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP1_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#define LPC11xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 - -/* - * EXT driver system settings. - */ -#define LPC11xx_EXT_USE_EXT0 TRUE -#define LPC11xx_EXT_USE_EXT1 FALSE -#define LPC11xx_EXT_USE_EXT2 FALSE -#define LPC11xx_EXT_USE_EXT3 FALSE -#define LPC11xx_EXT_EXTI0_IRQ_PRIORITY 3 -#define LPC11xx_EXT_EXTI1_IRQ_PRIORITY 3 -#define LPC11xx_EXT_EXTI2_IRQ_PRIORITY 3 -#define LPC11xx_EXT_EXTI3_IRQ_PRIORITY 3 - -/* - * I2C driver system settings. - */ -#define LPC11xx_I2C_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define LPC11xx_PWM_USE_CT16B0 FALSE -#define LPC11xx_PWM_USE_CT16B1 TRUE -#define LPC11xx_PWM_USE_CT32B0 FALSE -#define LPC11xx_PWM_USE_CT32B1 FALSE -#define LPC11xx_PWM_USE_CT16B0_CH0 FALSE -#define LPC11xx_PWM_USE_CT16B0_CH1 FALSE -#define LPC11xx_PWM_USE_CT16B1_CH0 TRUE -#define LPC11xx_PWM_USE_CT16B1_CH1 TRUE -#define LPC11xx_PWM_USE_CT32B0_CH0 FALSE -#define LPC11xx_PWM_USE_CT32B0_CH1 FALSE -#define LPC11xx_PWM_USE_CT32B1_CH0 FALSE -#define LPC11xx_PWM_USE_CT32B1_CH1 FALSE -#define LPC11xx_PWM_CT16B0_IRQ_PRIORITY 3 -#define LPC11xx_PWM_CT16B1_IRQ_PRIORITY 3 -#define LPC11xx_PWM_CT32B0_IRQ_PRIORITY 3 -#define LPC11xx_PWM_CT32B1_IRQ_PRIORITY 3 diff --git a/testhal/LPC11xx/IRQ_STORM/Makefile b/testhal/LPC11xx/IRQ_STORM/Makefile deleted file mode 100644 index 2dd75ef71..000000000 --- a/testhal/LPC11xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,196 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/EA_LPCXPRESSO_BB_1114/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC11xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC11xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1114.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1114 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC11xx/IRQ_STORM/chconf.h b/testhal/LPC11xx/IRQ_STORM/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/LPC11xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC11xx/IRQ_STORM/halconf.h b/testhal/LPC11xx/IRQ_STORM/halconf.h deleted file mode 100644 index d91a792b4..000000000 --- a/testhal/LPC11xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC11xx/IRQ_STORM/main.c b/testhal/LPC11xx/IRQ_STORM/main.c deleted file mode 100644 index 9930abfb1..000000000 --- a/testhal/LPC11xx/IRQ_STORM/main.c +++ /dev/null @@ -1,324 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIO0, GPIO0_LED2); - } - } - } -} - -/* - * GPT1 callback. - */ -static void gpt1cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT1 configuration. - */ -static const GPTConfig gpt1cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt1cb /* Timer callback.*/ -}; - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 1 and 2. - */ - sdStart(&SD1, NULL); /* Default is 38400-8-N-1.*/ - gptStart(&GPTD1, &gpt1cfg); - gptStart(&GPTD2, &gpt2cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(LPC11xx_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD1, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD2, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/LPC11xx/IRQ_STORM/mcuconf.h b/testhal/LPC11xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index 6db2e6fd2..000000000 --- a/testhal/LPC11xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * LPC1114 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC11xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC11xx_SYSPLL_MUL 4 -#define LPC11xx_SYSPLL_DIV 4 -#define LPC11xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC11xx_SYSABHCLK_DIV 1 - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * GPT driver system settings. - */ -#define LPC11xx_GPT_USE_CT16B0 TRUE -#define LPC11xx_GPT_USE_CT16B1 TRUE -#define LPC11xx_GPT_USE_CT32B0 TRUE -#define LPC11xx_GPT_USE_CT32B1 TRUE -#define LPC11xx_GPT_CT16B0_IRQ_PRIORITY 1 -#define LPC11xx_GPT_CT16B1_IRQ_PRIORITY 3 -#define LPC11xx_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC11xx_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define LPC11xx_SERIAL_USE_UART0 TRUE -#define LPC11xx_SERIAL_FIFO_PRELOAD 16 -#define LPC11xx_SERIAL_UART0CLKDIV 1 -#define LPC11xx_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC11xx_SPI_USE_SSP0 TRUE -#define LPC11xx_SPI_USE_SSP1 FALSE -#define LPC11xx_SPI_SSP0CLKDIV 1 -#define LPC11xx_SPI_SSP1CLKDIV 1 -#define LPC11xx_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP1_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#define LPC11xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 diff --git a/testhal/LPC11xx/IRQ_STORM/readme.txt b/testhal/LPC11xx/IRQ_STORM/readme.txt deleted file mode 100644 index aa22b8f39..000000000 --- a/testhal/LPC11xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ-STORM demo for LPC11xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an LPCXpresso LPC1114 board. - -** The Demo ** - -The application demonstrates the use of the LPC11xx GPT, PAL and Serial drivers -in order to implement a system stress demo. - -** Build Procedure ** - -The demo has been tested using the free LPCXpresso toolchain but also with -Codesourcery and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -NXP and are licensed under a different license. - - http://www.nxp.com diff --git a/testhal/LPC11xx/PWM/Makefile b/testhal/LPC11xx/PWM/Makefile deleted file mode 100644 index 2ad18e131..000000000 --- a/testhal/LPC11xx/PWM/Makefile +++ /dev/null @@ -1,194 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/EA_LPCXPRESSO_11C24/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC11xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC11xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC11C24.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1114 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC11xx/PWM/chconf.h b/testhal/LPC11xx/PWM/chconf.h deleted file mode 100644 index feb364424..000000000 --- a/testhal/LPC11xx/PWM/chconf.h +++ /dev/null @@ -1,532 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC11xx EXT driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC11xx/PWM/halconf.h b/testhal/LPC11xx/PWM/halconf.h deleted file mode 100644 index 78b61cf6a..000000000 --- a/testhal/LPC11xx/PWM/halconf.h +++ /dev/null @@ -1,314 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC11xx EXT driver - Copyright (C) 2013 Marcin Jokel - - Copyright (C) 2013 mike brown - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC11xx/PWM/main.c b/testhal/LPC11xx/PWM/main.c deleted file mode 100644 index 1ce05966f..000000000 --- a/testhal/LPC11xx/PWM/main.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC11xx EXT driver - Copyright (C) 2013 Marcin Jokel - - Copyright (C) 2013 mike brown - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwm2pcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIO0, GPIO0_LED); -} - -static void pwm2c0cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIO0, GPIO0_LED); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 1000, /* Initial PWM period 4,8us */ - pwm2pcb, - { - {PWM_OUTPUT_ACTIVE_LOW, pwm2c0cb}, - {PWM_OUTPUT_ACTIVE_LOW, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 2. - */ - pwmStart(&PWMD2, &pwmcfg); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 1 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, 250); - pwmEnableChannel(&PWMD2, 1, 250); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 1 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, 500); - pwmEnableChannel(&PWMD2, 1, 500); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, 250); - pwmEnableChannel(&PWMD2, 1, 250); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD2, 500); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 1. - */ - pwmDisableChannel(&PWMD2, 1); - chThdSleepMilliseconds(5000); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/LPC11xx/PWM/mcuconf.h b/testhal/LPC11xx/PWM/mcuconf.h deleted file mode 100644 index 21f8c6693..000000000 --- a/testhal/LPC11xx/PWM/mcuconf.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC11xx EXT driver - Copyright (C) 2013 Marcin Jokel - - Copyright (C) 2013 mike brown - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * LPC1114 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC11xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC11xx_SYSPLL_MUL 4 -#define LPC11xx_SYSPLL_DIV 4 -#define LPC11xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC11xx_SYSABHCLK_DIV 1 - -/* - * GPT driver system settings. - */ -#define LPC11xx_GPT_USE_CT16B0 FALSE -#define LPC11xx_GPT_USE_CT16B1 FALSE -#define LPC11xx_GPT_USE_CT32B0 FALSE -#define LPC11xx_GPT_USE_CT32B1 FALSE -#define LPC11xx_GPT_CT16B0_IRQ_PRIORITY 1 -#define LPC11xx_GPT_CT16B1_IRQ_PRIORITY 3 -#define LPC11xx_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC11xx_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * SERIAL driver system settings. - */ -#define LPC11xx_SERIAL_USE_UART0 TRUE -#define LPC11xx_SERIAL_FIFO_PRELOAD 16 -#define LPC11xx_SERIAL_UART0CLKDIV 1 -#define LPC11xx_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC11xx_SPI_USE_SSP0 TRUE -#define LPC11xx_SPI_USE_SSP1 FALSE -#define LPC11xx_SPI_SSP0CLKDIV 1 -#define LPC11xx_SPI_SSP1CLKDIV 1 -#define LPC11xx_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP1_IRQ_PRIORITY 1 -#define LPC11xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#define LPC11xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 - -/* - * EXT driver system settings. - */ -#define LPC11xx_EXT_USE_EXT0 FALSE -#define LPC11xx_EXT_USE_EXT1 FALSE -#define LPC11xx_EXT_USE_EXT2 FALSE -#define LPC11xx_EXT_USE_EXT3 FALSE -#define LPC11xx_EXT_EXTI0_IRQ_PRIORITY 3 -#define LPC11xx_EXT_EXTI1_IRQ_PRIORITY 3 -#define LPC11xx_EXT_EXTI2_IRQ_PRIORITY 3 -#define LPC11xx_EXT_EXTI3_IRQ_PRIORITY 3 - -/* - * I2C driver system settings. - */ -#define LPC11xx_I2C_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define LPC11xx_PWM_USE_CT16B0 FALSE -#define LPC11xx_PWM_USE_CT16B1 TRUE -#define LPC11xx_PWM_USE_CT32B0 FALSE -#define LPC11xx_PWM_USE_CT32B1 FALSE -#define LPC11xx_PWM_USE_CT16B0_CH0 FALSE -#define LPC11xx_PWM_USE_CT16B0_CH1 FALSE -#define LPC11xx_PWM_USE_CT16B1_CH0 TRUE -#define LPC11xx_PWM_USE_CT16B1_CH1 TRUE -#define LPC11xx_PWM_USE_CT32B0_CH0 FALSE -#define LPC11xx_PWM_USE_CT32B0_CH1 FALSE -#define LPC11xx_PWM_USE_CT32B1_CH0 FALSE -#define LPC11xx_PWM_USE_CT32B1_CH1 FALSE -#define LPC11xx_PWM_CT16B0_IRQ_PRIORITY 3 -#define LPC11xx_PWM_CT16B1_IRQ_PRIORITY 3 -#define LPC11xx_PWM_CT32B0_IRQ_PRIORITY 3 -#define LPC11xx_PWM_CT32B1_IRQ_PRIORITY 3 diff --git a/testhal/LPC122x/EXT/Makefile b/testhal/LPC122x/EXT/Makefile deleted file mode 100644 index 507fe3f00..000000000 --- a/testhal/LPC122x/EXT/Makefile +++ /dev/null @@ -1,196 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_LPC-P1227/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC122x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC122x/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1227.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1227 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC122x/EXT/chconf.h b/testhal/LPC122x/EXT/chconf.h deleted file mode 100644 index 04ff997d1..000000000 --- a/testhal/LPC122x/EXT/chconf.h +++ /dev/null @@ -1,532 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x EXT driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC122x/EXT/halconf.h b/testhal/LPC122x/EXT/halconf.h deleted file mode 100644 index 8cb1fcc41..000000000 --- a/testhal/LPC122x/EXT/halconf.h +++ /dev/null @@ -1,313 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x EXT driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC122x/EXT/main.c b/testhal/LPC122x/EXT/main.c deleted file mode 100644 index 76cafce0e..000000000 --- a/testhal/LPC122x/EXT/main.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x EXT driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void led1off(void *arg) { - - (void)arg; - palSetPad(GPIO1, GPIO1_LED1); -} - -/* Triggered when the button is pressed or released. The LED1 is set to ON.*/ -static void ext2cb12(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - - palClearPad(GPIO1, GPIO1_LED1); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - - /* LED1 set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), led1off, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART, ext2cb12}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD2, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD2, GPIO2_SW_USER1); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD2, GPIO2_SW_USER1); - } -} diff --git a/testhal/LPC122x/EXT/mcuconf.h b/testhal/LPC122x/EXT/mcuconf.h deleted file mode 100644 index 608abf226..000000000 --- a/testhal/LPC122x/EXT/mcuconf.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x EXT driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * LPC1227 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC122x_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC122x_SYSPLL_MUL 3 -#define LPC122x_SYSPLL_DIV 8 -#define LPC122x_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC122x_SYSABHCLK_DIV 1 - -/* - * GPT driver system settings. - */ -#define LPC122x_GPT_USE_CT16B0 TRUE -#define LPC122x_GPT_USE_CT16B1 TRUE -#define LPC122x_GPT_USE_CT32B0 TRUE -#define LPC122x_GPT_USE_CT32B1 TRUE -#define LPC122x_GPT_CT16B0_IRQ_PRIORITY 2 -#define LPC122x_GPT_CT16B1_IRQ_PRIORITY 2 -#define LPC122x_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC122x_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * SERIAL driver system settings. - */ -#define LPC122x_SERIAL_USE_UART0 TRUE -#define LPC122x_SERIAL_FIFO_PRELOAD 16 -#define LPC122x_SERIAL_UART0CLKDIV 1 -#define LPC122x_SERIAL_UART0_IRQ_PRIORITY 3 -#define LPC122x_SERIAL_TXD0_SELECTOR TXD0_IS_PIO0_2 -#define LPC122x_SERIAL_RXD0_SELECTOR RXD0_IS_PIO0_1 - -#define LPC122x_SERIAL_USE_UART1 FALSE -#define LPC122x_SERIAL_FIFO_PRELOAD 16 -#define LPC122x_SERIAL_UART1CLKDIV 1 -#define LPC122x_SERIAL_UART1_IRQ_PRIORITY 3 -#define LPC122x_SERIAL_RXD1_SELECTOR RXD1_IS_PIO0_8 -#define LPC122x_SERIAL_TXD1_SELECTOR TXD1_IS_PIO0_9 - -/* - * SPI driver system settings. - */ -#define LPC122x_SPI_USE_SSP0 TRUE -#define LPC122x_SPI_SSP0CLKDIV 1 -#define LPC122x_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC122x_SPI_SSP_ERROR_HOOK(spip) chSysHalt() - -/* - * EXT driver system settings. - */ -#define LPC122x_EXT_USE_EXT0 FALSE -#define LPC122x_EXT_USE_EXT1 FALSE -#define LPC122x_EXT_USE_EXT2 TRUE -#define LPC122x_EXT_EXTI0_IRQ_PRIORITY 3 -#define LPC122x_EXT_EXTI1_IRQ_PRIORITY 3 -#define LPC122x_EXT_EXTI2_IRQ_PRIORITY 3 - -/* - * RTC driver system settings. - */ -#define LPC122x_RTCCLK SYSCFG_RTCCLK_1Hz -#define LPC122x_RTC_CLKDIV 0 -#define LPC122x_RTC_USE_ALARM TRUE -#define LPC122x_RTC_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define LPC122x_PWM_USE_CT16B0 FALSE -#define LPC122x_PWM_USE_CT16B1 TRUE -#define LPC122x_PWM_USE_CT32B0 FALSE -#define LPC122x_PWM_USE_CT32B1 FALSE -#define LPC122x_PWM_USE_CT16B0_CH0 FALSE -#define LPC122x_PWM_USE_CT16B0_CH1 FALSE -#define LPC122x_PWM_USE_CT16B1_CH0 TRUE -#define LPC122x_PWM_USE_CT16B1_CH1 TRUE -#define LPC122x_PWM_USE_CT32B0_CH0 FALSE -#define LPC122x_PWM_USE_CT32B0_CH1 FALSE -#define LPC122x_PWM_USE_CT32B1_CH0 FALSE -#define LPC122x_PWM_USE_CT32B1_CH1 FALSE -#define LPC122x_PWM_CT16B0_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT16B1_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT32B0_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT32B1_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT16B0_CH0_SELECTOR PWM_CT16B0_CH0_IS_PIO0_28 -#define LPC122x_PWM_CT16B0_CH1_SELECTOR PWM_CT16B0_CH1_IS_PIO0_29 -#define LPC122x_PWM_CT16B1_CH0_SELECTOR PWM_CT16B1_CH0_IS_PIO1_5 -#define LPC122x_PWM_CT16B1_CH1_SELECTOR PWM_CT16B1_CH1_IS_PIO1_6 -#define LPC122x_PWM_CT32B0_CH0_SELECTOR PWM_CT32B0_CH0_IS_PIO2_4 -#define LPC122x_PWM_CT32B0_CH1_SELECTOR PWM_CT32B0_CH1_IS_PIO0_2 -#define LPC122x_PWM_CT32B1_CH0_SELECTOR PWM_CT32B1_CH0_IS_PIO0_6 -#define LPC122x_PWM_CT32B1_CH1_SELECTOR PWM_CT32B1_CH1_IS_PIO0_7 - -/* - * I2C driver system settings. - */ -#define LPC122x_I2C_IRQ_PRIORITY 3 diff --git a/testhal/LPC122x/IRQ_STORM/Makefile b/testhal/LPC122x/IRQ_STORM/Makefile deleted file mode 100644 index 507fe3f00..000000000 --- a/testhal/LPC122x/IRQ_STORM/Makefile +++ /dev/null @@ -1,196 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_LPC-P1227/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC122x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC122x/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1227.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1227 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC122x/IRQ_STORM/chconf.h b/testhal/LPC122x/IRQ_STORM/chconf.h deleted file mode 100644 index 01463a470..000000000 --- a/testhal/LPC122x/IRQ_STORM/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - LPC122x - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC122x/IRQ_STORM/halconf.h b/testhal/LPC122x/IRQ_STORM/halconf.h deleted file mode 100644 index 1f2b374a7..000000000 --- a/testhal/LPC122x/IRQ_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - LPC122x - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC122x/IRQ_STORM/main.c b/testhal/LPC122x/IRQ_STORM/main.c deleted file mode 100644 index ac1c51945..000000000 --- a/testhal/LPC122x/IRQ_STORM/main.c +++ /dev/null @@ -1,324 +0,0 @@ -/* - LPC122x - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIO1, GPIO1_LED1); - } - } - } -} - -/* - * GPT1 callback. - */ -static void gpt1cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT1 configuration. - */ -static const GPTConfig gpt1cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt1cb /* Timer callback.*/ -}; - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 1 and 2. - */ - sdStart(&SD1, NULL); /* Default is 38400-8-N-1.*/ - gptStart(&GPTD1, &gpt1cfg); - gptStart(&GPTD2, &gpt2cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(LPC122x_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD1, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD2, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/LPC122x/IRQ_STORM/mcuconf.h b/testhal/LPC122x/IRQ_STORM/mcuconf.h deleted file mode 100644 index 4aa37b83c..000000000 --- a/testhal/LPC122x/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - LPC122x - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * LPC1227 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC122x_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC122x_SYSPLL_MUL 3 -#define LPC122x_SYSPLL_DIV 8 -#define LPC122x_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC122x_SYSABHCLK_DIV 1 - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * GPT driver system settings. - */ -#define LPC122x_GPT_USE_CT16B0 TRUE -#define LPC122x_GPT_USE_CT16B1 TRUE -#define LPC122x_GPT_USE_CT32B0 TRUE -#define LPC122x_GPT_USE_CT32B1 TRUE -#define LPC122x_GPT_CT16B0_IRQ_PRIORITY 1 -#define LPC122x_GPT_CT16B1_IRQ_PRIORITY 3 -#define LPC122x_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC122x_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define LPC122x_SERIAL_USE_UART0 TRUE -#define LPC122x_SERIAL_FIFO_PRELOAD 16 -#define LPC122x_SERIAL_UART0CLKDIV 1 -#define LPC122x_SERIAL_UART0_IRQ_PRIORITY 3 -#define LPC122x_SERIAL_TXD0_SELECTOR TXD0_IS_PIO0_2 -#define LPC122x_SERIAL_RXD0_SELECTOR RXD0_IS_PIO0_1 - -#define LPC122x_SERIAL_USE_UART1 FALSE -#define LPC122x_SERIAL_FIFO_PRELOAD 16 -#define LPC122x_SERIAL_UART1CLKDIV 1 -#define LPC122x_SERIAL_UART1_IRQ_PRIORITY 3 -#define LPC122x_SERIAL_RXD1_SELECTOR RXD1_IS_PIO0_8 -#define LPC122x_SERIAL_TXD1_SELECTOR TXD1_IS_PIO0_9 - -/* - * SPI driver system settings. - */ -#define LPC122x_SPI_USE_SSP0 TRUE -#define LPC122x_SPI_SSP0CLKDIV 1 -#define LPC122x_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC122x_SPI_SSP_ERROR_HOOK(spip) chSysHalt() diff --git a/testhal/LPC122x/IRQ_STORM/readme.txt b/testhal/LPC122x/IRQ_STORM/readme.txt deleted file mode 100644 index 58f143f05..000000000 --- a/testhal/LPC122x/IRQ_STORM/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ-STORM demo for LPC122x. ** -***************************************************************************** - -** TARGET ** - -The demo will on an LPCXpresso LPC1114 board. - -** The Demo ** - -The application demonstrates the use of the LPC11xx GPT, PAL and Serial drivers -in order to implement a system stress demo. - -** Build Procedure ** - -The demo has been tested using the free LPCXpresso toolchain but also with -Codesourcery and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -NXP and are licensed under a different license. - - http://www.nxp.com diff --git a/testhal/LPC122x/PWM/Makefile b/testhal/LPC122x/PWM/Makefile deleted file mode 100644 index 16eff2811..000000000 --- a/testhal/LPC122x/PWM/Makefile +++ /dev/null @@ -1,196 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_LPC-P1227/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC122x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC122x/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1227.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1227 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC122x/PWM/chconf.h b/testhal/LPC122x/PWM/chconf.h deleted file mode 100644 index b5126732f..000000000 --- a/testhal/LPC122x/PWM/chconf.h +++ /dev/null @@ -1,532 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x PWM driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC122x/PWM/halconf.h b/testhal/LPC122x/PWM/halconf.h deleted file mode 100644 index 945da9669..000000000 --- a/testhal/LPC122x/PWM/halconf.h +++ /dev/null @@ -1,313 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x PWM driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC122x/PWM/main.c b/testhal/LPC122x/PWM/main.c deleted file mode 100644 index eb8abb951..000000000 --- a/testhal/LPC122x/PWM/main.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x PWM driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwm2pcb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIO1, GPIO1_LED2); -} - -static void pwm2c0cb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIO1, GPIO1_LED2); -} - -static PWMConfig pwmcfg = { - 10000, /* 100kHz PWM clock frequency. */ - 1000, /* PWM 10 Hz */ - pwm2pcb, - { - {PWM_OUTPUT_ACTIVE_LOW, pwm2c0cb}, - {PWM_OUTPUT_ACTIVE_LOW, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 2. - */ - pwmStart(&PWMD2, &pwmcfg); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 1 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, 250); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 1 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, 500); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, 250); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD2, 500); - chThdSleepMilliseconds(5000); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/LPC122x/PWM/mcuconf.h b/testhal/LPC122x/PWM/mcuconf.h deleted file mode 100644 index b4a308c7a..000000000 --- a/testhal/LPC122x/PWM/mcuconf.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x PWM driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * LPC1227 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC122x_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC122x_SYSPLL_MUL 3 -#define LPC122x_SYSPLL_DIV 8 -#define LPC122x_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC122x_SYSABHCLK_DIV 1 - -/* - * GPT driver system settings. - */ -#define LPC122x_GPT_USE_CT16B0 TRUE -#define LPC122x_GPT_USE_CT16B1 TRUE -#define LPC122x_GPT_USE_CT32B0 TRUE -#define LPC122x_GPT_USE_CT32B1 TRUE -#define LPC122x_GPT_CT16B0_IRQ_PRIORITY 2 -#define LPC122x_GPT_CT16B1_IRQ_PRIORITY 2 -#define LPC122x_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC122x_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * SERIAL driver system settings. - */ -#define LPC122x_SERIAL_USE_UART0 TRUE -#define LPC122x_SERIAL_FIFO_PRELOAD 16 -#define LPC122x_SERIAL_UART0CLKDIV 1 -#define LPC122x_SERIAL_UART0_IRQ_PRIORITY 3 -#define LPC122x_SERIAL_TXD0_SELECTOR TXD0_IS_PIO0_2 -#define LPC122x_SERIAL_RXD0_SELECTOR RXD0_IS_PIO0_1 - -#define LPC122x_SERIAL_USE_UART1 FALSE -#define LPC122x_SERIAL_FIFO_PRELOAD 16 -#define LPC122x_SERIAL_UART1CLKDIV 1 -#define LPC122x_SERIAL_UART1_IRQ_PRIORITY 3 -#define LPC122x_SERIAL_RXD1_SELECTOR RXD1_IS_PIO0_8 -#define LPC122x_SERIAL_TXD1_SELECTOR TXD1_IS_PIO0_9 - -/* - * SPI driver system settings. - */ -#define LPC122x_SPI_USE_SSP0 TRUE -#define LPC122x_SPI_SSP0CLKDIV 1 -#define LPC122x_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC122x_SPI_SSP_ERROR_HOOK(spip) chSysHalt() - -/* - * EXT driver system settings. - */ -#define LPC122x_EXT_USE_EXT0 FALSE -#define LPC122x_EXT_USE_EXT1 FALSE -#define LPC122x_EXT_USE_EXT2 TRUE -#define LPC122x_EXT_EXTI0_IRQ_PRIORITY 3 -#define LPC122x_EXT_EXTI1_IRQ_PRIORITY 3 -#define LPC122x_EXT_EXTI2_IRQ_PRIORITY 3 - -/* - * RTC driver system settings. - */ -#define LPC122x_RTCCLK SYSCFG_RTCCLK_1Hz -#define LPC122x_RTC_CLKDIV 0 -#define LPC122x_RTC_USE_ALARM TRUE -#define LPC122x_RTC_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define LPC122x_PWM_USE_CT16B0 FALSE -#define LPC122x_PWM_USE_CT16B1 TRUE -#define LPC122x_PWM_USE_CT32B0 FALSE -#define LPC122x_PWM_USE_CT32B1 FALSE -#define LPC122x_PWM_USE_CT16B0_CH0 FALSE -#define LPC122x_PWM_USE_CT16B0_CH1 FALSE -#define LPC122x_PWM_USE_CT16B1_CH0 TRUE -#define LPC122x_PWM_USE_CT16B1_CH1 TRUE -#define LPC122x_PWM_USE_CT32B0_CH0 FALSE -#define LPC122x_PWM_USE_CT32B0_CH1 FALSE -#define LPC122x_PWM_USE_CT32B1_CH0 FALSE -#define LPC122x_PWM_USE_CT32B1_CH1 FALSE -#define LPC122x_PWM_CT16B0_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT16B1_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT32B0_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT32B1_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT16B0_CH0_SELECTOR PWM_CT16B0_CH0_IS_PIO0_28 -#define LPC122x_PWM_CT16B0_CH1_SELECTOR PWM_CT16B0_CH1_IS_PIO0_29 -#define LPC122x_PWM_CT16B1_CH0_SELECTOR PWM_CT16B1_CH0_IS_PIO2_2 -#define LPC122x_PWM_CT16B1_CH1_SELECTOR PWM_CT16B1_CH1_IS_PIO1_6 -#define LPC122x_PWM_CT32B0_CH0_SELECTOR PWM_CT32B0_CH0_IS_PIO2_4 -#define LPC122x_PWM_CT32B0_CH1_SELECTOR PWM_CT32B0_CH1_IS_PIO0_2 -#define LPC122x_PWM_CT32B1_CH0_SELECTOR PWM_CT32B1_CH0_IS_PIO0_6 -#define LPC122x_PWM_CT32B1_CH1_SELECTOR PWM_CT32B1_CH1_IS_PIO0_7 - -/* - * I2C driver system settings. - */ -#define LPC122x_I2C_IRQ_PRIORITY 3 diff --git a/testhal/LPC122x/RTC/Makefile b/testhal/LPC122x/RTC/Makefile deleted file mode 100644 index 7b0b90b17..000000000 --- a/testhal/LPC122x/RTC/Makefile +++ /dev/null @@ -1,199 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_LPC-P1227/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC122x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC122x/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1227.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/chrtclib.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC122X -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC122x/RTC/chconf.h b/testhal/LPC122x/RTC/chconf.h deleted file mode 100644 index 120d2b7d5..000000000 --- a/testhal/LPC122x/RTC/chconf.h +++ /dev/null @@ -1,532 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x RTC driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC122x/RTC/halconf.h b/testhal/LPC122x/RTC/halconf.h deleted file mode 100644 index b9195a6dc..000000000 --- a/testhal/LPC122x/RTC/halconf.h +++ /dev/null @@ -1,313 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x RTC driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC122x/RTC/main.c b/testhal/LPC122x/RTC/main.c deleted file mode 100644 index c9cf9dab0..000000000 --- a/testhal/LPC122x/RTC/main.c +++ /dev/null @@ -1,286 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x RTC driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* -This structure is used to hold the values representing a calendar time. -It contains the following members, with the meanings as shown. - -int tm_sec seconds after minute [0-61] (61 allows for 2 leap-seconds) -int tm_min minutes after hour [0-59] -int tm_hour hours after midnight [0-23] -int tm_mday day of the month [1-31] -int tm_mon month of year [0-11] -int tm_year current year-1900 -int tm_wday days since Sunday [0-6] -int tm_yday days since January 1st [0-365] -int tm_isdst daylight savings indicator (1 = yes, 0 = no, -1 = unknown) -*/ - -#include -#include -#include - -#include "ch.h" -#include "hal.h" - -#include "shell.h" -#include "chprintf.h" -#include "chrtclib.h" - -static RTCAlarm alarmspec; -static time_t unix_time; - -/* libc stub */ -int _getpid(void) {return 1;} -/* libc stub */ -void _exit(int i) {(void)i;} -/* libc stub */ -#include -#undef errno -extern int errno; -int _kill(int pid, int sig) { - (void)pid; - (void)sig; - errno = EINVAL; - return -1; -} - - -/* sleep indicator thread */ -static WORKING_AREA(blinkWA, 128); -static msg_t blink_thd(void *arg){ - (void)arg; - while (TRUE) { - chThdSleepMilliseconds(100); - palTogglePad(GPIO1, GPIO1_LED1); - } - return 0; -} - -static void wakeup_cb(RTCDriver *rtcp, rtcevent_t event) { - - (void)rtcp; - - if (event == RTC_EVENT_ALARM) { - palTogglePad(GPIO1, GPIO1_LED2); - } -} - -/* Wake-up from Deep-sleep mode with rtc alarm (must be set first) */ -static void func_sleep(void) { - - chSysLock(); - - /* Deep sleep-mode configuration */ - LPC_PMU->PCON = 0; /* DPDEN bit set to 0 */ - LPC_SYSCON->PDSLEEPCFG = 0x0000FFBF; /* BOD off, wdt osc on */ - LPC_SYSCON->PDAWAKECFG &= ~(1 << 6); /* WDT osc powered after woke */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; /* Deep sleep mode */ - - /* WDT osc config and run */ - LPC_SYSCON->PDRUNCFG |= (1 << 6); /* WDT oscillator power-down */ - LPC_SYSCON->WDTOSCCTRL = (0x01 << 5 ) | 0; /* wdt_osc_clk = Fclkana/(2 * (1 + DIVSEL)) */ - LPC_SYSCON->PDRUNCFG &= ~(1 << 6); /* WDT oscillator power-up */ - __NOP(); - - /* Set WDT osc as Main Clock*/ - LPC_SYSCON->MAINCLKSEL = SYSMAINCLKSEL_WDGOSC; - LPC_SYSCON->MAINCLKUEN = 1; /* Really required? */ - LPC_SYSCON->MAINCLKUEN = 0; - LPC_SYSCON->MAINCLKUEN = 1; - while ((LPC_SYSCON->MAINCLKUEN & 1) == 0) /* Wait switch completion. */ - ; - - /* Set RTC start logic */ - LPC_SYSCON->STARTAPRP1 = (1UL << 18); /* Rising edge */ - LPC_SYSCON->STARTERP1 = (1UL << 18); /* Enable Start Logic for RTC interrupt */ - - __WFI(); - - NVIC_SystemReset(); -} - -/* Wake-up from Deep power-down with wake-up pin or rtc alarm (must be set first) */ -static void func_pwrdown(void) { - - chSysLock(); - - LPC_PMU->PCON |= (1UL << 1); /* DPDEN bit set to 1. */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; /* Deep sleep mode. */ - LPC_SYSCON->PDRUNCFG &= ~((1UL << 1) | 1UL); /* IRC osc powered. */ - - __WFI(); -} - -static void cmd_pwrdown(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argv; - - if (argc > 0) { - chprintf(chp, "Usage: pwrdown\r\n"); - return; - } - chprintf(chp, "Going to power down.\r\n"); - - chThdSleepMilliseconds(200); - - func_pwrdown(); - -} - -static void cmd_sleep(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: sleep\r\n"); - return; - } - chprintf(chp, "Going to sleep.\r\n"); - - chThdSleepMilliseconds(200); - - /* going to anabiosis */ - func_sleep(); -} - -/* - * - */ -static void cmd_alarm(BaseSequentialStream *chp, int argc, char *argv[]){ - - (void)argv; - if (argc < 1) { - goto ERROR; - } - - if ((argc == 1) && (strcmp(argv[0], "get") == 0)){ - rtcGetAlarm(&RTCD1, 0, &alarmspec); - chprintf(chp, "%D%s",alarmspec.tv_sec," - alarm in seconds\r\n"); - return; - } - - if ((argc == 2) && (strcmp(argv[0], "set") == 0)){ - alarmspec.tv_sec = (uint32_t)atol(argv[1]); - rtcSetAlarm(&RTCD1, 0, &alarmspec); - rtcSetCallback(&RTCD1, wakeup_cb); - return; - } - else{ - goto ERROR; - } - -ERROR: - chprintf(chp, "Usage: alarm get\r\n"); - chprintf(chp, " alarm set N\r\n"); - chprintf(chp, "where N is alarm time in seconds\r\n"); -} - -/* - * - */ -static void cmd_date(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argv; - struct tm timp; - - if (argc == 0) { - goto ERROR; - } - - if ((argc == 1) && (strcmp(argv[0], "get") == 0)){ - unix_time = rtcGetTimeUnixSec(&RTCD1); - - if (unix_time == -1){ - chprintf(chp, "incorrect time in RTC cell\r\n"); - } - else{ - chprintf(chp, "%D%s",unix_time," - unix time\r\n"); - rtcGetTimeTm(&RTCD1, &timp); - chprintf(chp, "%s%s",asctime(&timp)," - formatted time string\r\n"); - } - return; - } - - if ((argc == 2) && (strcmp(argv[0], "set") == 0)){ - unix_time = atol(argv[1]); - if (unix_time > 0){ - rtcSetTimeUnixSec(&RTCD1, unix_time); - return; - } - else{ - goto ERROR; - } - } - else{ - goto ERROR; - } - -ERROR: - chprintf(chp, "Usage: date get\r\n"); - chprintf(chp, " date set N\r\n"); - chprintf(chp, "where N is time in seconds sins Unix epoch\r\n"); - chprintf(chp, "you can get current N value from unix console by the command\r\n"); - chprintf(chp, "%s", "date +\%s\r\n"); - return; -} - -static const ShellCommand commands[] = { - {"alarm", cmd_alarm}, - {"date", cmd_date}, - {"sleep", cmd_sleep}, - {"pwrdown", cmd_pwrdown}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD1, - commands -}; - -BaseSequentialStream * chp1 = (BaseSequentialStream *)&SD1; - -/** - * Main function. - */ -int main(void){ - - halInit(); - chSysInit(); - chThdCreateStatic(blinkWA, sizeof(blinkWA), NORMALPRIO, blink_thd, NULL); - - sdStart(&SD1, NULL); /* Default is 38400-8-N-1.*/ - - if (LPC_PMU->PCON & (1UL << 11)) { - chprintf(chp1, "Woke from Deep power-down\r\n"); - LPC_PMU->PCON |= (1 << 11); - } - - if (LPC_PMU->PCON & (1UL << 8)) { - chprintf(chp1, "Woke from Deep-sleep mode\r\n"); - LPC_PMU->PCON |= (1 << 8); - } - - /* Shell initialization.*/ - shellInit(); - static WORKING_AREA(waShell, 1024); - shellCreateStatic(&shell_cfg1, waShell, sizeof(waShell), NORMALPRIO); - - /* wait until user do not want to test wakeup */ - while (TRUE){ - chThdSleepMilliseconds(200); - } - return 0; -} - - diff --git a/testhal/LPC122x/RTC/mcuconf.h b/testhal/LPC122x/RTC/mcuconf.h deleted file mode 100644 index 16519cb51..000000000 --- a/testhal/LPC122x/RTC/mcuconf.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - LPC122x RTC driver - Copyright (C) 2013 Marcin Jokel - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * LPC1227 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC122x_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC122x_SYSPLL_MUL 3 -#define LPC122x_SYSPLL_DIV 8 -#define LPC122x_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC122x_SYSABHCLK_DIV 1 - -/* - * GPT driver system settings. - */ -#define LPC122x_GPT_USE_CT16B0 TRUE -#define LPC122x_GPT_USE_CT16B1 TRUE -#define LPC122x_GPT_USE_CT32B0 TRUE -#define LPC122x_GPT_USE_CT32B1 TRUE -#define LPC122x_GPT_CT16B0_IRQ_PRIORITY 1 -#define LPC122x_GPT_CT16B1_IRQ_PRIORITY 3 -#define LPC122x_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC122x_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * SERIAL driver system settings. - */ -#define LPC122x_SERIAL_USE_UART0 TRUE -#define LPC122x_SERIAL_FIFO_PRELOAD 16 -#define LPC122x_SERIAL_UART0CLKDIV 1 -#define LPC122x_SERIAL_UART0_IRQ_PRIORITY 3 -#define LPC122x_SERIAL_TXD0_SELECTOR TXD0_IS_PIO0_2 -#define LPC122x_SERIAL_RXD0_SELECTOR RXD0_IS_PIO0_1 - -#define LPC122x_SERIAL_USE_UART1 FALSE -#define LPC122x_SERIAL_FIFO_PRELOAD 16 -#define LPC122x_SERIAL_UART1CLKDIV 1 -#define LPC122x_SERIAL_UART1_IRQ_PRIORITY 3 -#define LPC122x_SERIAL_RXD1_SELECTOR RXD1_IS_PIO0_8 -#define LPC122x_SERIAL_TXD1_SELECTOR TXD1_IS_PIO0_9 - -/* - * SPI driver system settings. - */ -#define LPC122x_SPI_USE_SSP0 TRUE -#define LPC122x_SPI_SSP0CLKDIV 1 -#define LPC122x_SPI_SSP0_IRQ_PRIORITY 1 -#define LPC122x_SPI_SSP_ERROR_HOOK(spip) chSysHalt() - -/* - * EXT driver system settings. - */ -#define LPC122x_EXT_USE_EXT0 FALSE -#define LPC122x_EXT_USE_EXT1 FALSE -#define LPC122x_EXT_USE_EXT2 TRUE -#define LPC122x_EXT_EXTI0_IRQ_PRIORITY 3 -#define LPC122x_EXT_EXTI1_IRQ_PRIORITY 3 -#define LPC122x_EXT_EXTI2_IRQ_PRIORITY 3 - -/* - * RTC driver system settings. - */ -#define LPC122x_RTCCLK SYSCFG_RTCCLK_1Hz -#define LPC122x_RTC_CLKDIV 0 -#define LPC122x_RTC_USE_ALARM TRUE -#define LPC122x_RTC_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define LPC122x_PWM_USE_CT16B0 FALSE -#define LPC122x_PWM_USE_CT16B1 TRUE -#define LPC122x_PWM_USE_CT32B0 FALSE -#define LPC122x_PWM_USE_CT32B1 FALSE -#define LPC122x_PWM_USE_CT16B0_CH0 FALSE -#define LPC122x_PWM_USE_CT16B0_CH1 FALSE -#define LPC122x_PWM_USE_CT16B1_CH0 TRUE -#define LPC122x_PWM_USE_CT16B1_CH1 TRUE -#define LPC122x_PWM_USE_CT32B0_CH0 FALSE -#define LPC122x_PWM_USE_CT32B0_CH1 FALSE -#define LPC122x_PWM_USE_CT32B1_CH0 FALSE -#define LPC122x_PWM_USE_CT32B1_CH1 FALSE -#define LPC122x_PWM_CT16B0_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT16B1_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT32B0_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT32B1_IRQ_PRIORITY 3 -#define LPC122x_PWM_CT16B0_CH0_SELECTOR PWM_CT16B0_CH0_IS_PIO0_28 -#define LPC122x_PWM_CT16B0_CH1_SELECTOR PWM_CT16B0_CH1_IS_PIO0_29 -#define LPC122x_PWM_CT16B1_CH0_SELECTOR PWM_CT16B1_CH0_IS_PIO1_5 -#define LPC122x_PWM_CT16B1_CH1_SELECTOR PWM_CT16B1_CH1_IS_PIO1_6 -#define LPC122x_PWM_CT32B0_CH0_SELECTOR PWM_CT32B0_CH0_IS_PIO2_4 -#define LPC122x_PWM_CT32B0_CH1_SELECTOR PWM_CT32B0_CH1_IS_PIO0_2 -#define LPC122x_PWM_CT32B1_CH0_SELECTOR PWM_CT32B1_CH0_IS_PIO0_6 -#define LPC122x_PWM_CT32B1_CH1_SELECTOR PWM_CT32B1_CH1_IS_PIO0_7 - -/* - * I2C driver system settings. - */ -#define LPC122x_I2C_IRQ_PRIORITY 3 diff --git a/testhal/LPC13xx/IRQ_STORM/Makefile b/testhal/LPC13xx/IRQ_STORM/Makefile deleted file mode 100644 index 081579754..000000000 --- a/testhal/LPC13xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,197 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/EA_LPCXPRESSO_BB_1343/board.mk -include $(CHIBIOS)/os/hal/platforms/LPC13xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/LPC13xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC1343.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DLPC1348 -D__NEWLIB__ - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/LPC13xx/IRQ_STORM/chconf.h b/testhal/LPC13xx/IRQ_STORM/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/LPC13xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC13xx/IRQ_STORM/halconf.h b/testhal/LPC13xx/IRQ_STORM/halconf.h deleted file mode 100644 index d91a792b4..000000000 --- a/testhal/LPC13xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/LPC13xx/IRQ_STORM/main.c b/testhal/LPC13xx/IRQ_STORM/main.c deleted file mode 100644 index b9c2f0274..000000000 --- a/testhal/LPC13xx/IRQ_STORM/main.c +++ /dev/null @@ -1,324 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIO0, GPIO0_LED2); - } - } - } -} - -/* - * GPT1 callback. - */ -static void gpt1cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT1 configuration. - */ -static const GPTConfig gpt1cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt1cb /* Timer callback.*/ -}; - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 1 and 2. - */ - sdStart(&SD1, NULL); /* Default is 38400-8-N-1.*/ - gptStart(&GPTD1, &gpt1cfg); - gptStart(&GPTD2, &gpt2cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(LPC13xx_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD1, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD2, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/LPC13xx/IRQ_STORM/mcuconf.h b/testhal/LPC13xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index 98da38735..000000000 --- a/testhal/LPC13xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * LPC13xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - * - * IRQ priorities: - * 7...0 Lowest...highest. - */ - -/* - * HAL driver system settings. - */ -#define LPC13xx_PLLCLK_SOURCE SYSPLLCLKSEL_SYSOSC -#define LPC13xx_SYSPLL_MUL 6 -#define LPC13xx_SYSPLL_DIV 4 -#define LPC13xx_MAINCLK_SOURCE SYSMAINCLKSEL_PLLOUT -#define LPC13xx_SYSABHCLK_DIV 1 - -/* - * ADC driver system settings. - */ - -/* - * CAN driver system settings. - */ - -/* - * GPT driver system settings. - */ -#define LPC13xx_GPT_USE_CT16B0 TRUE -#define LPC13xx_GPT_USE_CT16B1 TRUE -#define LPC13xx_GPT_USE_CT32B0 TRUE -#define LPC13xx_GPT_USE_CT32B1 TRUE -#define LPC13xx_GPT_CT16B0_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT16B1_IRQ_PRIORITY 6 -#define LPC13xx_GPT_CT32B0_IRQ_PRIORITY 2 -#define LPC13xx_GPT_CT32B1_IRQ_PRIORITY 2 - -/* - * PWM driver system settings. - */ - -/* - * SERIAL driver system settings. - */ -#define LPC13xx_SERIAL_USE_UART0 TRUE -#define LPC13xx_SERIAL_FIFO_PRELOAD 16 -#define LPC13xx_SERIAL_UART0CLKDIV 1 -#define LPC13xx_SERIAL_UART0_IRQ_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define LPC13xx_SPI_USE_SSP0 TRUE -#define LPC13xx_SPI_SSP0CLKDIV 1 -#define LPC13xx_SPI_SSP0_IRQ_PRIORITY 5 -#define LPC13xx_SPI_SSP_ERROR_HOOK(spip) chSysHalt() -#define LPC13xx_SPI_SCK0_SELECTOR SCK0_IS_PIO2_11 diff --git a/testhal/LPC13xx/IRQ_STORM/readme.txt b/testhal/LPC13xx/IRQ_STORM/readme.txt deleted file mode 100644 index 85a4cee82..000000000 --- a/testhal/LPC13xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ-STORM demo for LPC13xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an LPCXpresso LPC1114 board. - -** The Demo ** - -The application demonstrates the use of the LPC13xx GPT, PAL and Serial drivers -in order to implement a system stress demo. - -** Build Procedure ** - -The demo has been tested using the free LPCXpresso toolchain but also with -Codesourcery and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -NXP and are licensed under a different license. - - http://www.nxp.com diff --git a/testhal/SPC560BCxx/CAN/Makefile b/testhal/SPC560BCxx/CAN/Makefile deleted file mode 100644 index 97618eebb..000000000 --- a/testhal/SPC560BCxx/CAN/Makefile +++ /dev/null @@ -1,140 +0,0 @@ -############################################################################## -# This file is automatically generated and can be overwritten, do no change -# this file manually. -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = out - -# Imported source files -include components/components.mak - -# Checks if there is a user mak file in the project directory. -ifneq ($(wildcard user.mak),) - include user.mak -endif - -# Define linker script file here -LDSCRIPT= application.ld - -# C sources here. -CSRC = $(LIB_C_SRC) \ - $(APP_C_SRC) \ - $(U_C_SRC) \ - ./components/components.c \ - ./main.c - -# C++ sources here. -CPPSRC = $(LIB_CPP_SRC) \ - $(APP_CPP_SRC) \ - $(U_CPP_SRC) - -# List ASM source files here -ASMSRC = $(LIB_ASM_SRC) \ - $(APP_ASM_SRC) \ - $(U_ASM_SRC) - -INCDIR = $(LIB_INCLUDES) \ - $(APP_INCLUDES) \ - ./components - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSPC560B50L5 - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -include C:/SPC5Studio/eclipse/plugins/com.st.tools.spc5.components.platform.spc560bcxx_1.0.0.201302201417/component/lib/rsc/rules.mk diff --git a/testhal/SPC560BCxx/CAN/chconf.h b/testhal/SPC560BCxx/CAN/chconf.h deleted file mode 100644 index 8800269d4..000000000 --- a/testhal/SPC560BCxx/CAN/chconf.h +++ /dev/null @@ -1,529 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560BCxx/CAN/halconf.h b/testhal/SPC560BCxx/CAN/halconf.h deleted file mode 100644 index c316bb385..000000000 --- a/testhal/SPC560BCxx/CAN/halconf.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @name Drivers enable switches - */ -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name ADC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name CAN driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name I2C driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MAC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MMC_SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SDC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 1 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL_USB driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 64 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560BCxx/CAN/main.c b/testhal/SPC560BCxx/CAN/main.c deleted file mode 100644 index 8525d7ddd..000000000 --- a/testhal/SPC560BCxx/CAN/main.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -struct can_instance { - CANDriver *canp; - uint32_t led; -}; - -static const struct can_instance can1 = {&CAND5, PE_LED1}; - -/* - * Internal loopback mode, 500kBaud. - * See chapter 25 on the SPC5 reference manual. - */ -static const CANConfig cancfg = { - CAN_MCR_WRN_EN, - CAN_CTRL_LPB | CAN_CTRL_PROPSEG(2) | CAN_CTRL_PSEG2(7) | - CAN_CTRL_PSEG1(3) | CAN_CTRL_PRESDIV(3) -#if SPC5_CAN_USE_FILTERS - , - { - {0, 0x00000001}, - {1, 0x01234567}, - {0, 0x00000000}, - {0, 0x00000003}, - {0, 0x00000004}, - {0, 0x00000005}, - {0, 0x00000006}, - {0, 0x00000007} - } -#endif -}; - -#if SPC5_CAN_USE_FILTERS -flagsmask_t rxFlag; -#endif - -/* - * Receiver thread. - */ -static WORKING_AREA(can_rx_wa, 256); -static msg_t can_rx(void *p) { - struct can_instance *cip = p; - EventListener el; - CANRxFrame rxmsg; - (void)p; - chRegSetThreadName("receiver"); - chEvtRegister(&cip->canp->rxfull_event, &el, 0); -#if SPC5_CAN_USE_FILTERS - rxFlag = chEvtGetAndClearFlagsI(&el); -#endif - while(!chThdShouldTerminate()) { - if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) - continue; -#if !SPC5_CAN_USE_FILTERS - while (canReceive(cip->canp, CAN_ANY_MAILBOX, - &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(PORT_E, cip->led); - } -#else - while (canReceive(cip->canp, rxFlag, - &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(PORT_E, cip->led); - } -#endif - } - chEvtUnregister(&CAND5.rxfull_event, &el); - return 0; -} - -/* - * Transmitter thread. - */ -static WORKING_AREA(can_tx_wa, 256); -static msg_t can_tx(void * p) { - CANTxFrame txmsg; - - (void)p; - chRegSetThreadName("transmitter"); - txmsg.IDE = CAN_IDE_EXT; - txmsg.EID = 0x01234567; - txmsg.RTR = CAN_RTR_DATA; - txmsg.LENGTH = 8; - txmsg.data32[0] = 0x55AA55AA; - txmsg.data32[1] = 0x00FF00FF; - - while (!chThdShouldTerminate()) { - canTransmit(&CAND5, 1, &txmsg, MS2ST(100)); - palTogglePad(PORT_E, PE_LED2); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the CAN driver 1. - */ - canStart(&CAND5, &cancfg); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(can_rx_wa, sizeof(can_rx_wa), NORMALPRIO + 7, - can_rx, (void *)&can1); - chThdCreateStatic(can_tx_wa, sizeof(can_tx_wa), NORMALPRIO + 7, - can_tx, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} - diff --git a/testhal/SPC560BCxx/CAN/mcuconf.h b/testhal/SPC560BCxx/CAN/mcuconf.h deleted file mode 100644 index dc667bb74..000000000 --- a/testhal/SPC560BCxx/CAN/mcuconf.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Licensed under ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * SPC560B/Cxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - */ - -#define SPC560BCxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_DISABLE_WATCHDOG TRUE -#define SPC5_FMPLL0_IDF_VALUE 1 -#define SPC5_FMPLL0_NDIV_VALUE 32 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_XOSCDIV_VALUE 1 -#define SPC5_IRCDIV_VALUE 1 -#define SPC5_PERIPHERAL1_CLK_DIV_VALUE 2 -#define SPC5_PERIPHERAL2_CLK_DIV_VALUE 2 -#define SPC5_PERIPHERAL3_CLK_DIV_VALUE 2 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0 | \ - SPC5_ME_ME_STANDBY0) -#define SPC5_ME_TEST_MC_BITS (SPC5_ME_MC_SYSCLK_IRC | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STANDBY0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC0_BITS 0 -#define SPC5_ME_RUN_PC1_BITS (SPC5_ME_RUN_PC_TEST | \ - SPC5_ME_RUN_PC_SAFE | \ - SPC5_ME_RUN_PC_DRUN | \ - SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC2_BITS (SPC5_ME_RUN_PC_DRUN | \ - SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC0_BITS 0 -#define SPC5_ME_LP_PC1_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0 | \ - SPC5_ME_LP_PC_STANDBY0) -#define SPC5_ME_LP_PC2_BITS (SPC5_ME_LP_PC_HALT0) -#define SPC5_ME_LP_PC3_BITS (SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_PIT0_IRQ_PRIORITY 4 -#define SPC5_CLOCK_FAILURE_HOOK() chSysHalt() - -/* - * SERIAL driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * CAN driver system settings. - */ -#define SPC5_CAN_USE_FILTERS TRUE - -#define SPC5_CAN_USE_FLEXCAN0 FALSE -#define SPC5_CAN_FLEXCAN0_PRIORITY 11 -#define SPC5_CAN_FLEXCAN0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_CAN_FLEXCAN0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_CAN_USE_FLEXCAN1 FALSE -#define SPC5_CAN_FLEXCAN1_PRIORITY 11 -#define SPC5_CAN_FLEXCAN1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_CAN_FLEXCAN1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_CAN_USE_FLEXCAN2 FALSE -#define SPC5_CAN_FLEXCAN2_PRIORITY 11 -#define SPC5_CAN_FLEXCAN2_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_CAN_FLEXCAN2_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_CAN_USE_FLEXCAN3 FALSE -#define SPC5_CAN_FLEXCAN3_PRIORITY 11 -#define SPC5_CAN_FLEXCAN3_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_CAN_FLEXCAN3_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_CAN_USE_FLEXCAN4 TRUE -#define SPC5_CAN_FLEXCAN4_PRIORITY 11 -#define SPC5_CAN_FLEXCAN4_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_CAN_FLEXCAN4_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_CAN_USE_FLEXCAN5 FALSE -#define SPC5_CAN_FLEXCAN5_PRIORITY 11 -#define SPC5_CAN_FLEXCAN5_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_CAN_FLEXCAN5_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/testhal/SPC560BCxx/CAN/readme.txt b/testhal/SPC560BCxx/CAN/readme.txt deleted file mode 100644 index 78f7e7cd5..000000000 --- a/testhal/SPC560BCxx/CAN/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - CAN drivers demo for SPC560BCxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC560BCxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC560BCxx CAN drivers. - -** Board Setup ** - -- Enable LED1 and LED2. - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC560BCxx/ICU-PWM/Makefile b/testhal/SPC560BCxx/ICU-PWM/Makefile deleted file mode 100644 index 9e39b8301..000000000 --- a/testhal/SPC560BCxx/ICU-PWM/Makefile +++ /dev/null @@ -1,121 +0,0 @@ -############################################################################## -# This file is automatically generated and can be overwritten, do no change -# this file manually. -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = out - -# Imported source files -include components/components.mak - -# Checks if there is a user mak file in the project directory. -ifneq ($(wildcard user.mak),) - include user.mak -endif - -# Define linker script file here -LDSCRIPT= application.ld - -# C sources here. -CSRC = $(LIB_C_SRC) \ - $(APP_C_SRC) \ - $(U_C_SRC) \ - ./components/components.c \ - ./main.c - -# C++ sources here. -CPPSRC = $(LIB_CPP_SRC) \ - $(APP_CPP_SRC) \ - $(U_CPP_SRC) - -# List ASM source files here -ASMSRC = $(LIB_ASM_SRC) \ - $(APP_ASM_SRC) \ - $(U_ASM_SRC) - -INCDIR = $(LIB_INCLUDES) \ - $(APP_INCLUDES) \ - ./components - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -include C:/SPC5Studio/eclipse/plugins/com.st.tools.spc5.components.platform.spc560bcxx_1.0.0.201305101230/component/lib/rsc/rules.mk diff --git a/testhal/SPC560BCxx/ICU-PWM/chconf.h b/testhal/SPC560BCxx/ICU-PWM/chconf.h deleted file mode 100644 index db0d97427..000000000 --- a/testhal/SPC560BCxx/ICU-PWM/chconf.h +++ /dev/null @@ -1,536 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - --- - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes ChibiOS/RT, without being obliged to provide - the source code for any proprietary components. See the file exception.txt - for full details of how and when the exception can be applied. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES FALSE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560BCxx/ICU-PWM/halconf.h b/testhal/SPC560BCxx/ICU-PWM/halconf.h deleted file mode 100644 index 24462dafd..000000000 --- a/testhal/SPC560BCxx/ICU-PWM/halconf.h +++ /dev/null @@ -1,367 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @name Drivers enable switches - */ -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name ADC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name CAN driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name I2C driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MAC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MMC_SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SDC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 1 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL_USB driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 64 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560BCxx/ICU-PWM/main.c b/testhal/SPC560BCxx/ICU-PWM/main.c deleted file mode 100644 index 11b4a8a23..000000000 --- a/testhal/SPC560BCxx/ICU-PWM/main.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(PORT_E, PE_LED1); - -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(PORT_E, PE_LED1); -} - -static PWMConfig pwmcfg = { - 40000, /* 40kHz PWM clock frequency.*/ - 20000, /* Initial PWM period 0.5s.*/ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_LOW, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - PWM_ALIGN_EDGE -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(PORT_E, PE_LED2); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(PORT_E, PE_LED2); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_LOW, - 40000, /* 40kHz ICU clock frequency.*/ - icuwidthcb, - icuperiodcb, - NULL -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - palClearPad(PORT_E, PE_LED4); - - /* - * Initializes the PWM driver 1 and ICU driver 1. - * GPIOA9 is the PWM channel 0 output. - * GPIOA0 is the ICU input. - * The two pins have to be externally connected together. - */ - icuStart(&ICUD1, &icucfg); - icuEnable(&ICUD1); - - /* Sets A0 alternative function.*/ - SIU.PCR[0].R = 0b0000010100000100; - - /* Sets A9 alternative function.*/ - SIU.PCR[9U].R = 0b0000011000000100; - - pwmStart(&PWMD1, &pwmcfg); - - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period and the PWM channel 0 to 50% duty cycle. - */ - pwmChangePeriod(&PWMD1, 30000); - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD1, 0); - pwmStop(&PWMD1); - - icuDisable(&ICUD1); - icuStop(&ICUD1); - - palClearPad(PORT_E, PE_LED3); - palClearPad(PORT_E, PE_LED4); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/SPC560BCxx/ICU-PWM/mcuconf.h b/testhal/SPC560BCxx/ICU-PWM/mcuconf.h deleted file mode 100644 index 010a16b16..000000000 --- a/testhal/SPC560BCxx/ICU-PWM/mcuconf.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC560B/Cxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - */ - -#define SPC560BCxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_DISABLE_WATCHDOG TRUE -#define SPC5_FMPLL0_IDF_VALUE 1 -#define SPC5_FMPLL0_NDIV_VALUE 32 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_XOSCDIV_VALUE 1 -#define SPC5_IRCDIV_VALUE 1 -#define SPC5_PERIPHERAL1_CLK_DIV_VALUE 2 -#define SPC5_PERIPHERAL2_CLK_DIV_VALUE 2 -#define SPC5_PERIPHERAL3_CLK_DIV_VALUE 2 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0 | \ - SPC5_ME_ME_STANDBY0) -#define SPC5_ME_TEST_MC_BITS (SPC5_ME_MC_SYSCLK_IRC | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STANDBY0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC0_BITS 0 -#define SPC5_ME_RUN_PC1_BITS (SPC5_ME_RUN_PC_TEST | \ - SPC5_ME_RUN_PC_SAFE | \ - SPC5_ME_RUN_PC_DRUN | \ - SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC2_BITS (SPC5_ME_RUN_PC_DRUN | \ - SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC0_BITS 0 -#define SPC5_ME_LP_PC1_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0 | \ - SPC5_ME_LP_PC_STANDBY0) -#define SPC5_ME_LP_PC2_BITS (SPC5_ME_LP_PC_HALT0) -#define SPC5_ME_LP_PC3_BITS (SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_PIT0_IRQ_PRIORITY 4 -#define SPC5_CLOCK_FAILURE_HOOK() chSysHalt() - -/* - * SERIAL driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 FALSE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * ICU-PWM driver system settings. - */ -#define SPC5_EMIOS0_GLOBAL_PRESCALER 200 /* 8-bit GPRE*/ - -#define SPC5_ICU_USE_EMIOS0_CH0 TRUE -#define SPC5_ICU_USE_EMIOS0_CH1 TRUE -#define SPC5_ICU_USE_EMIOS0_CH2 TRUE -#define SPC5_ICU_USE_EMIOS0_CH3 TRUE -#define SPC5_ICU_USE_EMIOS0_CH4 TRUE -#define SPC5_ICU_USE_EMIOS0_CH5 TRUE -#define SPC5_ICU_USE_EMIOS0_CH6 TRUE -#define SPC5_ICU_USE_EMIOS0_CH7 TRUE -#define SPC5_ICU_USE_EMIOS0_CH24 TRUE - -#define SPC5_PWM_USE_EMIOS0_GROUP0 TRUE -#define SPC5_PWM_USE_EMIOS0_GROUP1 TRUE - -#define SPC5_EMIOS0_GFR_F0F1_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F2F3_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F4F5_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F6F7_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F8F9_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F10F11_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F12F13_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F14F15_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F16F17_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F18F19_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F20F21_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F22F23_PRIORITY 7 -#define SPC5_EMIOS0_GFR_F24F25_PRIORITY 7 - -#define SPC5_EMIOS0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_EMIOS0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_EMIOS1_GLOBAL_PRESCALER 200 /* 8-bit GPRE*/ - -#define SPC5_ICU_USE_EMIOS1_CH24 TRUE - -#define SPC5_PWM_USE_EMIOS1_GROUP0 TRUE -#define SPC5_PWM_USE_EMIOS1_GROUP1 TRUE -#define SPC5_PWM_USE_EMIOS1_GROUP2 TRUE - -#define SPC5_EMIOS1_GFR_F0F1_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F2F3_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F4F5_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F6F7_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F8F9_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F10F11_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F12F13_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F14F15_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F16F17_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F18F19_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F20F21_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F22F23_PRIORITY 7 -#define SPC5_EMIOS1_GFR_F24F25_PRIORITY 7 - -#define SPC5_EMIOS1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_EMIOS1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/testhal/SPC560BCxx/ICU-PWM/readme.txt b/testhal/SPC560BCxx/ICU-PWM/readme.txt deleted file mode 100644 index 6c64a8d21..000000000 --- a/testhal/SPC560BCxx/ICU-PWM/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ICU-PWM driver demo for SPC560BCxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC560BCxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC560BCxx ICU and PWM drivers. - -** Board Setup ** - -Connect PINA0 and PINA9 together. - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC560Dxx/SPI/.cproject b/testhal/SPC560Dxx/SPI/.cproject deleted file mode 100644 index a4ae17c6d..000000000 --- a/testhal/SPC560Dxx/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC560Dxx/SPI/.project b/testhal/SPC560Dxx/SPI/.project deleted file mode 100644 index 7000648ab..000000000 --- a/testhal/SPC560Dxx/SPI/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC560Dxx-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC560D - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC560Dxx/SPI/Makefile b/testhal/SPC560Dxx/SPI/Makefile deleted file mode 100644 index 833d3878a..000000000 --- a/testhal/SPC560Dxx/SPI/Makefile +++ /dev/null @@ -1,168 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_EVB_SPC560D/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC560Dxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC560Dxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC560D40.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -D_SPC560P50L5_ - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/testhal/SPC560Dxx/SPI/UDE/debug .wsx b/testhal/SPC560Dxx/SPI/UDE/debug .wsx deleted file mode 100644 index 8a1dc048c..000000000 --- a/testhal/SPC560Dxx/SPI/UDE/debug .wsx +++ /dev/null @@ -1,273 +0,0 @@ - - - debug .wsx002vQTv/gAAAQAXAAIA6AkIAAAABAAAAAAAPwAAAAAAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAA==4.019.11.2012 16:18:08:999MCAAAAAAAAAAAAAABAAAAAAAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHHAAAAAAPBAAAAAADGFAAAAABCDAAAAAFalseTrue1416801050593930FalseFalse1000000000000000UDEStatusBarFor Help, press F10594191105964705939959398593975940359401594065940200FalseFalse0000000000CUDEDockBar05942230911000FalseFalse0000000000CUDEDockBar05942030910000FalseFalse0000000000CUDEDockBar059647381True59419-1-11251268196-21474836480908FalseFalse1000000381271252277651106144014947UDEMDIMenuBarMenu bar0Menu barBAAAAAAIAACAAAAAAIAADAAAAAAIAAEAAAAAAIAAFAAAAAAIAAGAAAAAAIAAHAAAAAAIAAIAAAAAAIAAJAAAAAAIAAKAAAAAAIAA5939850326True050326614568196-21474836480780FalseFalse1562500111300006144014946CUdeCustomToolBarEdit0Edit2DCBOAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAACCBOAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAFCBOAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAIABOAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAA5939761426True061426794568196-21474836480780FalseFalse1562500180300006144014946CUdeCustomToolBarFile0File3AHHBAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAABHHBAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAACHHBAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAADHHBAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAEHHBAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAFHHBAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAOKHBAAAAAABAAAAAAALGLJALHCJPMBOILEPIDADGENFBIDFOCNAAAAAAAAPPPPPPPPAAAAAAAA5940379426True079426928568196-21474836481181049967780FalseFalse3125000134300006144014946CUdeCustomToolBarConfig0Config2GJHBAAAAAADAAAAAAADBGGJPINFFOGHPIEPKKCPFOMBDBNDAKPAAAAAAAAPPPPPPPPAAAAAAAAMMHBAAAAAAOPAAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAANMHBAAAAAAAABAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAAFNHBAAAAAAGAAAAAAAKBDLFIMBFCNFHJBEGJFDMJNFCMOIPKHNAAAAAAAAPPPPPPPPAAAAAAAAINHBAAAAAACBAAAAAADBGGJPINFFOGHPIEPKKCPFOMBDBNDAKPAAAAAAAAPPPPPPPPAAAAAAAA5940192826True0928261407568196-2147483648151587341780FalseFalse6250000479300006144014946CUdeCustomToolBarViews0Views6JJHBAAAAAAFBAAAAAADBGGJPINFFOGHPIEPKKCPFOMBDBNDAKPAAAAAAAAPPPPPPPPAAAAAAAAKJHBAAAAAAPAAAAAAADBGGJPINFFOGHPIEPKKCPFOMBDBNDAKPAAAAAAAAPPPPPPPPAAAAAAAAMJHBAAAAAAGBAAAAAADBGGJPINFFOGHPIEPKKCPFOMBDBNDAKPAAAAAAAAPPPPPPPPAAAAAAAANKHBAAAAAAAAAAAAAAAGKBFNONHLAOENBBBJCBAABADAJECGGLAAAAAAAAPPPPPPPPAAAAAAAAALHBAAAAAAKAAAAAAALGLJALHCJPMBOILEPIDADGENFBIDFOCNAAAAAAAAPPPPPPPPAAAAAAAACLHBAAAAAAMFAAAAAALGLJALHCJPMBOILEPIDADGENFBIDFOCNAAAAAAAAPPPPPPPPAAAAAAAADLHBAAAAAAKFAAAAAALGLJALHCJPMBOILEPIDADGENFBIDFOCNAAAAAAAAPPPPPPPPAAAAAAAAFLHBAAAAAANCAAAAAALGLJALHCJPMBOILEPIDADGENFBIDFOCNAAAAAAAAPPPPPPPPAAAAAAAAGLHBAAAAAAMDAAAAAALGLJALHCJPMBOILEPIDADGENFBIDFOCNAAAAAAAAPPPPPPPPAAAAAAAAHLHBAAAAAAGEAAAAAALGLJALHCJPMBOILEPIDADGENFBIDFOCNAAAAAAAAPPPPPPPPAAAAAAAAAMHBAAAAAAKAAAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAABMHBAAAAAAEBAAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAACMHBAAAAAAJBAAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAADMHBAAAAAALBAAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAAEMHBAAAAAAAFAAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAAFMHBAAAAAAICAAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAAHMHBAAAAAANEEAAAAAJEOEILFFBLMIPBEEPLLMEDEOPKHPBGJHAAAAAAAAPPPPPPPPAAAAAAAAIMHBAAAAAAGFEAAAAAJEOEILFFBLMIPBEEPLLMEDEOPKHPBGJHAAAAAAAAPPPPPPPPAAAAAAAAJMHBAAAAAAAGEAAAAAJEOEILFFBLMIPBEEPLLMEDEOPKHPBGJHAAAAAAAAPPPPPPPPAAAAAAAALMHBAAAAAAGEAAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAA59406140726True01407261653568196-21474836480780FalseFalse12500000246300006144014946CUdeCustomToolBarMacro0Macro2DKHBAAAAAALDAAAAAAGDHJMPFPDOOJLAGELLAIHGBMMEFJBIPLAAAAAAAAPPPPPPPPAAAAAAAAEKHBAAAAAAAEAAAAAAGDHJMPFPDOOJLAGELLAIHGBMMEFJBIPLAAAAAAAAPPPPPPPPAAAAAAAAGKHBAAAAAAMDAAAAAAGDHJMPFPDOOJLAGELLAIHGBMMEFJBIPLAAAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAMKHBAAAACAGJAAAAAAAAAANMAJBFNENHHACJPEILAJFEFEECLCDPKCBAAAAAAAKAAAAAAANAAAAAAAFFEEFEHFPGCHLGDHAHBGDGFGAA5939926504True59419-126503568196-21474836480780FalseFalse25000050430504301239006144014946CUdeCustomToolBarDebug0Debug5BLHBAAAAAAIBAAAAAALGLJALHCJPMBOILEPIDADGENFBIDFOCNAAAAAAAAPPPPPPPPAAAAAAAAELHBAAAAAAOFAAAAAALGLJALHCJPMBOILEPIDADGENFBIDFOCNAAAAAAAAPPPPPPPPAAAAAAAAILHBAAAAAAHAAAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAAJLHBAAAAAAJAAAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAAKLHBAAAAAAKAAAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAALLHBAAAAAALAAAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAAMLHBAAAAAAIAAAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAANLHBAAAAAABCDAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAAOLHBAAAAAANAAAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAAPLHBAAAAAAMAAAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAANHBAAAAAADAAAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAABNHBAAAAAAGAAAAAAABINLNCJGPDKECNBBCLNMAAAKECHFPLPAAAAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPPPPPPPAAAAAAAACNHBAAAACAKKAAAAAAAAAADHHMLHLPEKIIOMOEJLGLBHJIBGLAHAFDBAAAAAAADAAAAAAAFAAAAAAADEPGCHFGAAENHBAAAAAADAAAAAAAKBDLFIMBFCNFHJBEGJFDMJNFCMOIPKHNAAAAAAAAPPPPPPPPAAAAAAAA59402165326True01653261795568196-21474836480780FalseFalse50000000142300006144014946CUdeCustomToolBarTools0ToolsDNHBAAAACAEGAAAAAAAAAAGEAOMHHDMDCIFAKEIIICDBCMNFEDNFHHBAAAAAAAGAAAAAAAFAAAAAAADEPGCHFGAAHNHBAAAAAABOAAAAAAKEMNADOLNFNPBMHEJJNEMIOMIMCHOAOGAAAAAAAAPPPPPPPPAAAAAAAA911015True594221512521554-214748364803889FalseFalse1000000300180125115030018006144014948CTabWndControlBarTab Window Bar 00-1FalseUDEDesktop Standard BarsTab Window Bar 0UDEDesktop0015019100False00True000004-214748364803889FalseFalse100000030018030018015018006144014948CUdeProjectWspBarProject Workspace Bar0-1FalseUDEDesktop Standard BarsProject Workspace BarUDEDesktop0001TrueTrueFalse21.11.2012 14:43:52:278487782411WorkspaceManager11019.11.2012 16:28:52:057MgAAAA==AQAAAA==ZAAAAA==AQAAAA==lgAAAA==AQAAAA==6AMAAA==AQAAAA==139011201WorkspaceManager110000110010\\napnt002.nap.st.com\NAPPRT0001000WorkspaceManagerWorkspaceManager01Core1Target0.Controller0.CoreTarget0.Controller0.Core102200701438312957781279740NormalfalseTop1271falseBottom0000falsefalse00DockPaneltrue417falseLeft0000falsefalse00DockPaneltrue417falseLeft0000falsefalse10DockPanelfalse0falseTop0000falsefalse0-1TabbedDocumenttrue417falseLeft0000falsefalse20DockPanelfalse417falseLeft0000falsefalse30DockPanelfalsetrue556false200false200true200true100truetrue0012797400127924Platform Main Menufalsetrue4249525Edit ToolbarfalsetrueUDE_Workspace_0x1779trueCutImagetrueUDE_Workspace_0x177AtrueCopyImagetrueUDE_Workspace_0x177BtruePasteImagetrue992427625Macro ToolbarfalsetrueUDE_0x3B_{F5FC9736-9EE3-460B-BB80-67C14C9581BF}trueRun MacroImagetrueUDE_0x40_{F5FC9736-9EE3-460B-BB80-67C14C9581BF}trueDebug MacroImagetrueUDE_0x3_{F5FC9736-9EE3-460B-BB80-67C14C9581BF}trueBreak MacroImagetrueUDE_0x3C_{F5FC9736-9EE3-460B-BB80-67C14C9581BF}trueReload MacroImagetrueUDE_Ctrl_{4D5190CD-077D-4F92-B890-4545242BF32A}_UDEWorkspacetrueImageAndTextfalse3752421025File ToolbarfalsetrueUDE_Workspace_0x1770trueNew WorkspaceImagetrueUDE_Workspace_0x1771trueOpen workspaceImagetrueUDE_Workspace_0x1772trueSave workspace asImagetrueUDE_Workspace_0x1773trueSave workspaceImagetrueUDE_Workspace_0x1774trueClose workspaceImagetrueUDE_Workspace_0x177FtrueExport view contentImagetrueUDE_Workspace_0x1778truePrintImagetrueUDE_0x1_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueLoad ProgramImagetrue5852444025Views ToolbarfalsetrueUDE_0x4_{D8F96613-6E55-48F7-AF2A-5FCE31D103FA}trueTarget BrowserImagetrueUDE_0x15_{D8F96613-6E55-48F7-AF2A-5FCE31D103FA}trueDiagnostic Message ViewerImagetrueUDE_0xF_{D8F96613-6E55-48F7-AF2A-5FCE31D103FA}trueConsoleImagetrueUDE_0x0_{DED51A60-E0B7-11D4-9112-0001034962B6}trueCPU WindowImagetrueUDE_0x1E_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueExplore SymbolsImagetrueUDE_0xA_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueProgramImagetrueUDE_0x5C_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueSingle Program WindowImagetrueUDE_0x5A_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueDisassembly WindowImagetrueUDE_0x2D_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueShow Special Function RegisterImagetrueUDE_0x3C_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueLocalsImagetrueUDE_0x46_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueWatchImagetrueUDE_0xA_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueSimulated I/OImagetrueUDE_0x14_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueUDE HTMLImagetrueUDE_0x19_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueArray ChartImagetrueUDE_0x1B_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueTime Traced Signal ChartImagetrueUDE_0x50_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueIP Trace ProfilingImagetrueUDE_0x28_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueMemoryImagetrueUDE_0x46_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueCall StackImagetrue34950925Debug ToolbarfalsetrueUDE_0x18_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueShow IPImagetrueUDE_0x5E_{27B09B6B-1CF9-4B8E-8F03-63D41538E5D2}trueShow program codeImagetrueUDE_0x7_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueStart ProgramImagetrueUDE_0x9_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueStep OverImagetrueUDE_0xA_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueStep IntoImagetrueUDE_0xB_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueStep OutImagetrueUDE_0x8_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueRun CursorImagetrueUDE_0x321_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueBreak ProgramImagetrueUDE_0xD_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueResetImagetrueUDE_0xC_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueRestart ProgramImagetrueUDE_0x3_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueBreakpointsImagetrueUDE_0x6_{692DBD81-4A3F-11D2-B2CD-00A02457BF0F}trueToggle BreakImagetrueUDE_Ctrl_{FB7BC773-88A4-4ECE-B9B6-7189610B0735}_CoretrueImageAndTextfalseUDE_0x3_{1C85B31A-5D25-4197-9635-9C5DC28EAFD7}trueTrigger setupImagetrue5124914125Config ToolbarfalsetrueUDE_0x3_{D8F96613-6E55-48F7-AF2A-5FCE31D103FA}trueTarget ConfigurationImagetrueUDE_0xFE_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueConnect TargetImagetrueUDE_0x100_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueDisconnect TargetImagetrueUDE_0x6_{1C85B31A-5D25-4197-9635-9C5DC28EAFD7}trueSetup Target InterfaceImagetrueUDE_0x12_{D8F96613-6E55-48F7-AF2A-5FCE31D103FA}trueMCU Run ControlImagetrue6534915125Tools ToolbarfalsetrueUDE_Ctrl_{377CE046-823C-4A05-8828-13C25D345D77}_CoretrueImageAndTextfalseUDE_0xE1_{BE30DC4A-FD5D-47C1-994D-8CCEC8720E6E}trueExecution Time SetupImagetrue01002625Show Toolbarfalsefalse02002625Window Toolbarfalsefalse02252625Workspace Toolbarfalsefalse02752625Help Toolbarfalsefalse071712792300127923Platform Status Barfalsetrue07406431279740643..\..\..\..\..\Program Files\pls\UDE 4.0\StdLibrary.mso{866f82d3-fac5-43cd-8a82-0af01e46e2c5}669,1006,350,6610..\..\..\..\..\Documents and Settings\disiriog\My Documents\pls\UDE 4.0The script contains a collection of macros to save memory content into different file formats -and fill target memory rangesV:\UDE\AddOns\Macro\MacroLibrary\StdMacros1.dsm' -' $Header: /Ude/AddOns/Macro/MacroLibrary/StdMacros.dsm 3 30.04.04 9:34 Weisses $ -'_______________________________________________________ -' -' universal debug engine -' -' Standard command line macros - part 1 -' -' pls Development Tools 1999-2004 -' -' 28.04.04 SW correction for UDE 1.10 -' 03.06.03 SW initial version -'_______________________________________________________ - -'_______________________________________________________ -' -' UnAss command line function -' -' generates disassembly file -' -' command line UnAss output-file range1 [range2] [range3] ..... -' range description: -' C:<startaddress>,<length> or - code -' DB:<startaddress>,<length> or - data byte -' DW:<startaddress>,<length> or - data word -' DD:<startaddress>,<length> or - data dword -'_______________________________________________________ - -Sub UnAss(File,ParameterObj) - - set debugger = workspace.Coredebugger(0) - set DisASMObj = debugger.DisASMObj - If Not IsObject(ParameterObj) Then - MsgBox "Number of parameters wrong" - Exit Sub - End If - If IsNumeric(File) Then - MsgBox "File parameter wrong - " & File - Exit Sub - End If - DisASMObj.OutputPath = CStr(File) - bRetVal = DisASMObj.CreateStream(True,"UDE Disassembler output of current Program",False) - If bRetVal = True Then - ParmeterCnt = ParameterObj.ParameterCount - If ParmeterCnt = 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - If ( ParmeterCnt Mod 3 ) <> 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - RangeCnt = ParmeterCnt/3 - ParamIndex = 0 - For Range = 0 To RangeCnt -1 - KindOfRange = CStr(ParameterObj.Parameter(ParamIndex)) - KindOfRange = UCase(KindOfRange) - Address = CLng(ParameterObj.Parameter(ParamIndex +1)) - Length = CLng(ParameterObj.Parameter(ParamIndex +2)) - ParamIndex = ParamIndex +3 - If IsNumeric(KindOfRange) Then - If KindOfRange = 12 Then - DisASMObj.AddRange Address,Length,1 - ElseIf KindOfRange = 219 Then - DisASMObj.AddRange Address,Length,2 - ElseIf KindOfRange = 221 Then - DisASMObj.AddRange Address,Length,4 - Else - MsgBox "Invalid range type " & KindOfRange & "of range " & Range +1 - Exit Sub - End If - Else - If KindOfRange = "C" Then - DisASMObj.AddRange Address,Length,1 - ElseIf KindOfRange = "DB" Then - DisASMObj.AddRange Address,Length,2 - ElseIf KindOfRange = "DW" Then - DisASMObj.AddRange Address,Length,3 - ElseIf KindOfRange = "DD" Then - DisASMObj.AddRange Address,Length,4 - Else - MsgBox "Invalid range type " & KindOfRange & "of range " & Range +1 - Exit Sub - End If - End If - Next - DisASMObj.HexFileModeFlag = False - DisASMObj.ListModeFlag = False - DisASMObj.WriteAllRanges(False) - End If - -End Sub - -'_______________________________________________________ -' -' SaveHEX command line function -' -' generates intel-HEX file -' -' command line SaveHex output-file range1 [range2] [range3] ..... -' range description: -' <startaddress>,<length> -'_______________________________________________________ - -Sub SaveHEX(File,ParameterObj) - - set debugger = workspace.Coredebugger(0) - set DisASMObj = debugger.DisASMObj - If Not IsObject(ParameterObj) Then - MsgBox "Number of parameters wrong" - Exit Sub - End If - If IsNumeric(File) Then - MsgBox "File parameter wrong - " & File - Exit Sub - End If - DisASMObj.OutputPath = CStr(File) - bRetVal = DisASMObj.CreateStream(True,"UDE generated intel-Hex file of current Program",False) - If bRetVal = True Then - ParmeterCnt = ParameterObj.ParameterCount - If ParmeterCnt = 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - If ( ParmeterCnt Mod 2 ) <> 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - RangeCnt = ParmeterCnt/2 - ParamIndex = 0 - For Range = 0 To RangeCnt -1 - Address = CLng(ParameterObj.Parameter(ParamIndex)) - Length = CLng(ParameterObj.Parameter(ParamIndex +1)) - ParamIndex = ParamIndex +2 - DisASMObj.AddRange Address,Length,0 - Next - DisASMObj.HexFileModeFlag = True - DisASMObj.WriteAllRanges(False) - End If - -End Sub - -'_______________________________________________________ -' -' FillByte command line function -' -' fills memory range with byte pattern -' -' command line FillByte range1,pattern1 [range2,pattern2] [range3,pattern3] ..... -' range description: -' <startaddress>,<length> -'_______________________________________________________ - -Sub FillByte(ParameterObj) - - set debugger = workspace.Coredebugger(0) - set DisASMObj = debugger.DisASMObj - If Not IsObject(ParameterObj) Then - MsgBox "Number of parameters wrong" - Exit Sub - End If - ParmeterCnt = ParameterObj.ParameterCount - If ParmeterCnt = 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - If ( ParmeterCnt Mod 3 ) <> 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - RangeCnt = ParmeterCnt/3 - ParamIndex = 0 - set udearrayobj = debugger.ByteArrayObj(1) - For Range = 0 To RangeCnt -1 - Address = CLng(ParameterObj.Parameter(ParamIndex)) - Length = CLng(ParameterObj.Parameter(ParamIndex +1)) - Pattern = CLng(ParameterObj.Parameter(ParamIndex +2)) - ParamIndex = ParamIndex +3 - udearrayobj.Resize(Length) - udearrayobj.Fill(Pattern) - debugger.Write Address,udearrayobj - Next - -End Sub - -'_______________________________________________________ -' -' FillWord command line function -' -' fills memory range with word pattern -' -' command line FillWord range1,pattern1 [range2,pattern2] [range3,pattern3] ..... -' range description: -' <startaddress>,<length> -'_______________________________________________________ - -Sub FillWord(ParameterObj) - - set debugger = workspace.Coredebugger(0) - set DisASMObj = debugger.DisASMObj - If Not IsObject(ParameterObj) Then - MsgBox "Number of parameters wrong" - Exit Sub - End If - ParmeterCnt = ParameterObj.ParameterCount - If ParmeterCnt = 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - If ( ParmeterCnt Mod 3 ) <> 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - RangeCnt = ParmeterCnt/3 - ParamIndex = 0 - set udearrayobj = debugger.WordArrayObj(1) - For Range = 0 To RangeCnt -1 - Address = CLng(ParameterObj.Parameter(ParamIndex)) - Length = CLng(ParameterObj.Parameter(ParamIndex +1)/2) - Pattern = CLng(ParameterObj.Parameter(ParamIndex +2)) - ParamIndex = ParamIndex +3 - udearrayobj.Resize(Length) - udearrayobj.Fill(Pattern) - debugger.Write Address,udearrayobj - Next - -End Sub - -'_______________________________________________________ -' -' FillDWord command line function -' -' fills memory range with dword pattern -' -' command line FillDWord range1,pattern1 [range2,pattern2] [range3,pattern3] ..... -' range description: -' <startaddress>,<length> -'_______________________________________________________ - -Sub FillDWord(ParameterObj) - - set debugger = workspace.Coredebugger(0) - set DisASMObj = debugger.DisASMObj - If Not IsObject(ParameterObj) Then - MsgBox "Number of parameters wrong" - Exit Sub - End If - ParmeterCnt = ParameterObj.ParameterCount - If ParmeterCnt = 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - If ( ParmeterCnt Mod 3 ) <> 0 Then - MsgBox "Number of parameters wrong " & ParmeterCnt - Exit Sub - End If - RangeCnt = ParmeterCnt/3 - ParamIndex = 0 - set udearrayobj = debugger.DWordArrayObj(1) - For Range = 0 To RangeCnt -1 - Address = CLng(ParameterObj.Parameter(ParamIndex)) - Length = CLng(ParameterObj.Parameter(ParamIndex +1)/4) - Pattern = CLng(ParameterObj.Parameter(ParamIndex +2)) - ParamIndex = ParamIndex +3 - udearrayobj.Resize(Length) - udearrayobj.Fill(Pattern) - debugger.Write Address,udearrayobj - Next - -End Sub63VBScript24.11.2006 14:43:20:0001WS_CORE_DUOMacro_14_06_13_14_48_10_010Execute UnAss ..Macro UnAssExecute macro UnAss0210Execute SaveHEX ..Macro SaveHEXExecute macro SaveHEX0210Execute FillByte ..Macro FillByteExecute macro FillByte0110Execute FillWord ..Macro FillWordExecute macro FillWord0110Execute FillDWord ..Macro FillDWordExecute macro FillDWord0150121.11.2012 14:17:23:6457782750Target0.Controller0.Core1020.11.2012 16:19:48:3447782640Target0.Controller0.Core11021.11.2012 12:22:49:573..\main.c1,0,0,353,10940017372830Target0.Controller0.Core1114.06.2013 14:25:28:960..\..\..\os\hal\src\hal.c1,49,63,402,11570017372860Target0.Controller0.Core110214.06.2013 14:27:53:872..\..\..\os\hal\platforms\SPC5xx\SIUL_v1\pal_lld.c7372880Target0.Controller0.Core1121.11.2012 14:44:22:506..\..\..\os\kernel\src\chsys.c7372860Target0.Controller0.Core13121.11.2012 14:14:46:537AwAAAA==AQAAAA==kAAAAA==YAAAAA==TgAAAA==jQAAAA==TgAAAA==jQAAAA==TgAAAA==jgAAAA==AAAAAA==AAAAAA==AAAAAA==AAAAAA==7782520Target0.Controller0.Core10021.11.2012 14:10:10:4245380360007372850Target0.Controller0.Core10000000013.06.2013 16:10:26:035000013.06.2013 16:20:21:757<_ExtentX type="bin" size="8">UEoAAA==<_ExtentY type="bin" size="8">gysAAA==<_StockProps type="bin" size="8">AAAAAA==AgAAAA==UABDAAAAUABDAAAAAAAAAA==YAAAAA==RgB1AG4AYwB0AGkAbwBuAAAARgB1AG4AYwB0AGkAbwBuAAAAAAAAAA==QAYAAA==7372890Target0.Controller0.Core1OFF0..\build11..\build\ch.elf<Section>C:\ChibiStudio\chibios\os\kernel\src\chevents.c1Software;enabled;0;disabled;'main {C:\ChibiStudio\chibios\demos\PPC-SPC560D-GCC\main.c} .164';main.c;1;0;;$disabled; ;disabled; ;100111100verify.txt0000000004..\..\..\..\os\ports\GCC\PPC\chcore.c..\..\..\..\os\kernel\src\chsys.c..\..\..\..\os\hal\platforms\SPC5xx\DSPI_v1\spi_lld.c..\main.cstm_xpc560b_spc560d40_minimodule_debug_jtag.cfg14.06.2013 14:48:09:999 diff --git a/testhal/SPC560Dxx/SPI/UDE/stm_xpc560b_spc560d40_minimodule_debug_jtag.cfg b/testhal/SPC560Dxx/SPI/UDE/stm_xpc560b_spc560d40_minimodule_debug_jtag.cfg deleted file mode 100644 index ca4a75aa0..000000000 --- a/testhal/SPC560Dxx/SPI/UDE/stm_xpc560b_spc560d40_minimodule_debug_jtag.cfg +++ /dev/null @@ -1,160 +0,0 @@ -[Main] -Signature=UDE_TARGINFO_2.0 -Description=STM XPC560B Mini Module with SPC560D40 (Jtag) -Description1=PLL set for 48MHz -Description2=FLASH programming prepared but not enabled -Description3=Write Filter for BAM Module -MCUs=Controller0 -Architecture=PowerPC -Vendor=STM -Board=XPC560B Mini Module - -[Controller0] -Family=PowerPC -Type=SPC560D40 -Enabled=1 -IntClock=48000 -MemDevs=BAMWriteFilter -ExtClock=8000 - -[Controller0.Core] -Protocol=PPCJTAG -Enabled=1 - -[Controller0.Core.LoadedAddOn] -UDEMemtool=1 - -[Controller0.Core.PpcJtagTargIntf] -PortType=FTDI -ResetWaitTime=50 -MaxJtagClk=2500 -DoSramInit=1 -UseNexus=1 -AdaptiveJtagPhaseShift=1 -ConnOption=Default -ChangeJtagClk=10000 -HaltAfterReset=1 -SimioAddr=g_JtagSimioAccess -FreezeTimers=1 -InvalidTlbOnReset=0 -InvalidateCache=0 -ForceCacheFlush=0 -IgnoreLockedLines=0 -ExecInitCmds=1 -JtagTapNumber=0 -JtagNumOfTaps=1 -JtagNumIrBefore=0 -JtagNumIrAfter=0 - -SimioAddr=g_JtagSimioAccess - -FlushCache=0 -AllowMmuSetup=1 -UseExtReset=1 -HandleWdtBug=0 -ForceEndOfReset=0 -JtagViaPod=0 -AllowResetOnCheck=0 -ChangeMsr=0 -ChangeMsrValue=0x0 -ExecOnStartCmds=0 -ExecOnHaltCmds=0 -TargetPort=Default -EnableProgramTimeMeasurement=0 -UseHwResetMode=0 -HandleNexusAccessBug=0 -DoNotEnableTrapSwBrp=0 -CommDevSel=PortType=USB,Type=FTDI -BootPasswd0=0xFEEDFACE -BootPasswd1=0xCAFEBEEF -BootPasswd2=0xFFFFFFFF -BootPasswd3=0xFFFFFFFF -BootPasswd4=0xFFFFFFFF -BootPasswd5=0xFFFFFFFF -BootPasswd6=0xFFFFFFFF -BootPasswd7=0xFFFFFFFF -JtagIoType=Jtag -ExecOnHaltCmdsWhileHalted=0 -TimerForPTM=Default -AllowBreakOnUpdateBreakpoints=0 -ClearDebugStatusOnHalt=1 -HwResetMode=Simulate -UseMasterNexusIfResetState=1 -UseLocalAddressTranslation=1 -Use64BitNexus=0 -InitSramOnlyWhenNotInitialized=0 -AllowHarrForUpdateDebugRegs=0 -DisableE2EECC=0 -UseCore0ForNexusMemoryAccessWhileRunning=0 - -[Controller0.Core.PpcJtagTargIntf.InitScript] -// setup IVOPR -// points to internal memory at 0x40000000 -SETSPR 0x3F 0x40000000 0xFFFFFFFF - -// disable watchdog -SET SWT_SR 0xC520 -SET SWT_SR 0xD928 -SET SWT_CR 0xFF00000A - -// Oscillator select -SET CGM_OCDS_SC 0x1000000 -SET CGM_OC_EN 0x1 - -// enable all modes -SET ME_MER 0x5FF - -// run mode -SET ME_DRUN_MC 0x1F0032 -SET ME_RUN_PC0 0xFE - -// enable peripherals in run and low power modes -SET ME_LP_PC0 0x500 - -// enable clocks -SET8 CGM_SC_DC0 0x80 -SET8 CGM_SC_DC1 0x80 -SET8 CGM_SC_DC2 0x80 - -// setup clock monitor -SET CMU_CSR 0x6 -SET CMU_LFREFR 0x1 -SET CMU_HFREFR 0xFFE - -// Make DRUN configuration active -SET ME_MCTL 0x30005AF0 -SET ME_MCTL 0x3000A50F -WAIT 0x5 - -// setup pll to 48MHz -SET FMPLL_CR 0x5300041 0xFFFFFFFF -// run mode -SET ME_DRUN_MC 0x1F00F4 - -// Make DRUN configuration active -SET ME_MCTL 0x30005AF0 -SET ME_MCTL 0x3000A50F -WAIT 0x5 - -// setup SSCM erro cfg for debug -SET16 SSCM_ERROR 0x3 0x3 - -[Controller0.BAMWriteFilter] -Description=BAM WriteAccess Filter -Range0Start=0xFFFFC000 -Range0Size=0x4000 -Enabled=1 -Handler=AccessFilter -Mode=ReadOnly - -[Controller0.PFLASH] -Enabled=1 -EnableMemtoolByDefault=1 - -[Controller0.DFLASH] -Enabled=1 -EnableMemtoolByDefault=1 - -[Controller0.Core.PpcJtagTargIntf.OnStartScript] - -[Controller0.Core.PpcJtagTargIntf.OnHaltScript] diff --git a/testhal/SPC560Dxx/SPI/chconf.h b/testhal/SPC560Dxx/SPI/chconf.h deleted file mode 100644 index dc956ef13..000000000 --- a/testhal/SPC560Dxx/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560Dxx/SPI/halconf.h b/testhal/SPC560Dxx/SPI/halconf.h deleted file mode 100644 index fdc079aef..000000000 --- a/testhal/SPC560Dxx/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560Dxx/SPI/main.c b/testhal/SPC560Dxx/SPI/main.c deleted file mode 100644 index f6aa96abe..000000000 --- a/testhal/SPC560Dxx/SPI/main.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration. - */ -static const SPIConfig hs_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV2 | SPC5_CTAR_ASC_DIV2 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV2, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(1) /* PUSHR. */ -}; - -/* - * Low speed SPI configuration. - */ -static const SPIConfig ls_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV64 | SPC5_CTAR_ASC_DIV64 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV256, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(0) /* PUSHR. */ -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palClearPad(PORT_E, PE_LED1); /* LED ON. */ - spiStart(&SPID1, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palSetPad(PORT_E, PE_LED1); /* LED OFF. */ - spiStart(&SPID1, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* Starting driver for test, DSPI_1 I/O pins setup.*/ - spiStart(&SPID1, &ls_spicfg); - SIU.PCR[14].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SCK */ - SIU.PCR[13].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SOUT */ - SIU.PCR[15].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* CS[0] */ - SIU.PCR[28].R = PAL_MODE_OUTPUT_ALTERNATE(3); /* CS[1] */ - - /* Testing sending and receiving at the same time.*/ - spiExchange(&SPID1, 4, txbuf, rxbuf); - spiExchange(&SPID1, 32, txbuf, rxbuf); - spiExchange(&SPID1, 512, txbuf, rxbuf); - - /* Testing clock pulses without data buffering.*/ - spiIgnore(&SPID1, 4); - spiIgnore(&SPID1, 32); - - /* Testing sending data ignoring incoming data.*/ - spiSend(&SPID1, 4, txbuf); - spiSend(&SPID1, 32, txbuf); - - /* Testing receiving data while sending idle bits (high level).*/ - spiReceive(&SPID1, 4, rxbuf); - spiReceive(&SPID1, 32, rxbuf); - - /* Testing stop procedure.*/ - spiStop(&SPID1); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - palTogglePad(PORT_E, PE_LED2); - } - return 0; -} diff --git a/testhal/SPC560Dxx/SPI/mcuconf.h b/testhal/SPC560Dxx/SPI/mcuconf.h deleted file mode 100644 index 166be874b..000000000 --- a/testhal/SPC560Dxx/SPI/mcuconf.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC560B/Cxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - * DMA priorities: - * 0...15 Highest...Lowest. - */ - -#define SPC560Dxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_DISABLE_WATCHDOG TRUE -#define SPC5_FMPLL0_IDF_VALUE 1 -#define SPC5_FMPLL0_NDIV_VALUE 48 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV8 -#define SPC5_XOSCDIV_VALUE 1 -#define SPC5_IRCDIV_VALUE 1 -#define SPC5_PERIPHERAL1_CLK_DIV_VALUE 2 -#define SPC5_PERIPHERAL2_CLK_DIV_VALUE 2 -#define SPC5_PERIPHERAL3_CLK_DIV_VALUE 2 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0 | \ - SPC5_ME_ME_STANDBY0) -#define SPC5_ME_TEST_MC_BITS (SPC5_ME_MC_SYSCLK_IRC | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STANDBY0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC0_BITS 0 -#define SPC5_ME_RUN_PC1_BITS (SPC5_ME_RUN_PC_TEST | \ - SPC5_ME_RUN_PC_SAFE | \ - SPC5_ME_RUN_PC_DRUN | \ - SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC2_BITS (SPC5_ME_RUN_PC_DRUN | \ - SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC0_BITS 0 -#define SPC5_ME_LP_PC1_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0 | \ - SPC5_ME_LP_PC_STANDBY0) -#define SPC5_ME_LP_PC2_BITS (SPC5_ME_LP_PC_HALT0) -#define SPC5_ME_LP_PC3_BITS (SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_PIT0_IRQ_PRIORITY 4 -#define SPC5_CLOCK_FAILURE_HOOK() chSysHalt() - -/* - * EDMA driver settings. - */ -#define SPC5_EDMA_CR_SETTING 0 -#define SPC5_EDMA_GROUP0_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_ERROR_IRQ_PRIO 2 -#define SPC5_EDMA_ERROR_HANDLER() chSysHalt() - -/* - * SERIAL driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#define SPC5_SERIAL_USE_LINFLEX2 TRUE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX2_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX2_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX2_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * SPI driver system settings. - */ -#define SPC5_SPI_USE_DSPI0 TRUE -#define SPC5_SPI_USE_DSPI1 TRUE -#define SPC5_SPI_DSPI0_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI1_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI0_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI0_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_IRQ_PRIO 10 -#define SPC5_SPI_DMA_ERROR_HOOK(spip) chSysHalt() -#define SPC5_SPI_DSPI0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/testhal/SPC560Dxx/SPI/readme.txt b/testhal/SPC560Dxx/SPI/readme.txt deleted file mode 100644 index baa32f272..000000000 --- a/testhal/SPC560Dxx/SPI/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for SPC560Dxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC560Dxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC560Dxx SPI driver. - -** Board Setup ** - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC560Pxx/CAN/.cproject b/testhal/SPC560Pxx/CAN/.cproject deleted file mode 100644 index 18c26cafe..000000000 --- a/testhal/SPC560Pxx/CAN/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC560Pxx/CAN/.project b/testhal/SPC560Pxx/CAN/.project deleted file mode 100644 index 4c2d806c5..000000000 --- a/testhal/SPC560Pxx/CAN/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC560Pxx-PWM-ICU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC560P - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC560Pxx/CAN/Makefile b/testhal/SPC560Pxx/CAN/Makefile deleted file mode 100644 index 33ab47686..000000000 --- a/testhal/SPC560Pxx/CAN/Makefile +++ /dev/null @@ -1,140 +0,0 @@ -############################################################################## -# This file is automatically generated and can be overwritten, do no change -# this file manually. -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = out - -# Imported source files -include components/components.mak - -# Checks if there is a user mak file in the project directory. -ifneq ($(wildcard user.mak),) - include user.mak -endif - -# Define linker script file here -LDSCRIPT= application.ld - -# C sources here. -CSRC = $(LIB_C_SRC) \ - $(APP_C_SRC) \ - $(U_C_SRC) \ - ./components/components.c \ - ./main.c - -# C++ sources here. -CPPSRC = $(LIB_CPP_SRC) \ - $(APP_CPP_SRC) \ - $(U_CPP_SRC) - -# List ASM source files here -ASMSRC = $(LIB_ASM_SRC) \ - $(APP_ASM_SRC) \ - $(U_ASM_SRC) - -INCDIR = $(LIB_INCLUDES) \ - $(APP_INCLUDES) \ - ./components - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSPC560P50L5 - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -include C:/SPC5Studio/eclipse/plugins/com.st.tools.spc5.components.platform.spc560pxx_1.0.0.201302201417/component/lib/rsc/rules.mk diff --git a/testhal/SPC560Pxx/CAN/chconf.h b/testhal/SPC560Pxx/CAN/chconf.h deleted file mode 100644 index 8800269d4..000000000 --- a/testhal/SPC560Pxx/CAN/chconf.h +++ /dev/null @@ -1,529 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560Pxx/CAN/halconf.h b/testhal/SPC560Pxx/CAN/halconf.h deleted file mode 100644 index c316bb385..000000000 --- a/testhal/SPC560Pxx/CAN/halconf.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @name Drivers enable switches - */ -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name ADC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name CAN driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name I2C driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MAC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MMC_SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SDC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 1 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL_USB driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 64 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560Pxx/CAN/main.c b/testhal/SPC560Pxx/CAN/main.c deleted file mode 100644 index b60729765..000000000 --- a/testhal/SPC560Pxx/CAN/main.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -struct can_instance { - CANDriver *canp; - uint32_t led; -}; - -static const struct can_instance can1 = {&CAND1, PD_LED1}; - -/* - * Internal loopback mode, 500kBaud. - * See chapter 25 on the SPC5 reference manual. - */ -static const CANConfig cancfg = { - CAN_MCR_WRN_EN, - CAN_CTRL_LPB | CAN_CTRL_PROPSEG(2) | CAN_CTRL_PSEG2(7) | - CAN_CTRL_PSEG1(3) | CAN_CTRL_PRESDIV(3) -#if SPC5_CAN_USE_FILTERS - , - { - {0, 0x00000001}, - {1, 0x01234567}, - {0, 0x00000000}, - {0, 0x00000003}, - {0, 0x00000004}, - {0, 0x00000005}, - {0, 0x00000006}, - {0, 0x00000007} - } -#endif -}; - -#if SPC5_CAN_USE_FILTERS -flagsmask_t rxFlag; -#endif - -/* - * Receiver thread. - */ -static WORKING_AREA(can_rx_wa, 256); -static msg_t can_rx(void *p) { - struct can_instance *cip = p; - EventListener el; - CANRxFrame rxmsg; - (void)p; - chRegSetThreadName("receiver"); - chEvtRegister(&cip->canp->rxfull_event, &el, 0); -#if SPC5_CAN_USE_FILTERS - rxFlag = chEvtGetAndClearFlagsI(&el); -#endif - while(!chThdShouldTerminate()) { - if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) - continue; -#if !SPC5_CAN_USE_FILTERS - while (canReceive(cip->canp, CAN_ANY_MAILBOX, - &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(PORT_D, cip->led); - } -#else - while (canReceive(cip->canp, rxFlag, - &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(PORT_D, cip->led); - } -#endif - } - chEvtUnregister(&CAND1.rxfull_event, &el); - return 0; -} - -/* - * Transmitter thread. - */ -static WORKING_AREA(can_tx_wa, 256); -static msg_t can_tx(void * p) { - CANTxFrame txmsg; - - (void)p; - chRegSetThreadName("transmitter"); - txmsg.IDE = CAN_IDE_EXT; - txmsg.EID = 0x01234567; - txmsg.RTR = CAN_RTR_DATA; - txmsg.LENGTH = 8; - txmsg.data32[0] = 0x55AA55AA; - txmsg.data32[1] = 0x00FF00FF; - - while (!chThdShouldTerminate()) { - canTransmit(&CAND1, 1, &txmsg, MS2ST(100)); - palTogglePad(PORT_D, PD_LED2); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the CAN driver 1. - */ - canStart(&CAND1, &cancfg); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(can_rx_wa, sizeof(can_rx_wa), NORMALPRIO + 7, - can_rx, (void *)&can1); - chThdCreateStatic(can_tx_wa, sizeof(can_tx_wa), NORMALPRIO + 7, - can_tx, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} - diff --git a/testhal/SPC560Pxx/CAN/mcuconf.h b/testhal/SPC560Pxx/CAN/mcuconf.h deleted file mode 100644 index bdd11f6ae..000000000 --- a/testhal/SPC560Pxx/CAN/mcuconf.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Licensed under ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * SPC560Pxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - */ - -#define SPC560Pxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_DISABLE_WATCHDOG TRUE -#define SPC5_FMPLL0_IDF_VALUE 5 -#define SPC5_FMPLL0_NDIV_VALUE 32 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_FMPLL1_IDF_VALUE 5 -#define SPC5_FMPLL1_NDIV_VALUE 60 -#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_AUX0CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_MCONTROL_DIVIDER_VALUE 2 -#define SPC5_FMPLL1_CLK_DIVIDER_VALUE 2 -#define SPC5_AUX2CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_SP_CLK_DIVIDER_VALUE 2 -#define SPC5_AUX3CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_FR_CLK_DIVIDER_VALUE 2 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0) -#define SPC5_ME_TEST_MC_BITS (SPC5_ME_MC_SYSCLK_IRC | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_PIT0_IRQ_PRIORITY 4 -#define SPC5_CLOCK_FAILURE_HOOK() chSysHalt() - -/* - * SERIAL driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * PWM driver system settings. - */ -#define SPC5_PWM_USE_SMOD0 TRUE -#define SPC5_PWM_USE_SMOD1 FALSE -#define SPC5_PWM_USE_SMOD2 FALSE -#define SPC5_PWM_USE_SMOD3 FALSE -#define SPC5_PWM_SMOD0_PRIORITY 7 -#define SPC5_PWM_SMOD1_PRIORITY 7 -#define SPC5_PWM_SMOD2_PRIORITY 7 -#define SPC5_PWM_SMOD3_PRIORITY 7 -#define SPC5_PWM_FLEXPWM0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_PWM_FLEXPWM0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * CAN driver system settings. - */ -#define SPC5_CAN_USE_FILTERS TRUE - -#define SPC5_CAN_USE_FLEXCAN0 TRUE -#define SPC5_CAN_FLEXCAN0_PRIORITY 11 -#define SPC5_CAN_FLEXCAN0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_CAN_FLEXCAN0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/testhal/SPC560Pxx/CAN/readme.txt b/testhal/SPC560Pxx/CAN/readme.txt deleted file mode 100644 index b5587dd29..000000000 --- a/testhal/SPC560Pxx/CAN/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - CAN drivers demo for SPC560Pxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC560Pxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC560Pxx CAN drivers. - -** Board Setup ** - -- Enable LED1 and LED2. - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC560Pxx/PWM-ICU/.cproject b/testhal/SPC560Pxx/PWM-ICU/.cproject deleted file mode 100644 index 18c26cafe..000000000 --- a/testhal/SPC560Pxx/PWM-ICU/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC560Pxx/PWM-ICU/.project b/testhal/SPC560Pxx/PWM-ICU/.project deleted file mode 100644 index 4c2d806c5..000000000 --- a/testhal/SPC560Pxx/PWM-ICU/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC560Pxx-PWM-ICU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC560P - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC560Pxx/PWM-ICU/Makefile b/testhal/SPC560Pxx/PWM-ICU/Makefile deleted file mode 100644 index 1bdaed928..000000000 --- a/testhal/SPC560Pxx/PWM-ICU/Makefile +++ /dev/null @@ -1,167 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_EVB_SPC560P/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC560Pxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC560Pxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC560P50.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -D_SPC560P50L5_ - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/testhal/SPC560Pxx/PWM-ICU/chconf.h b/testhal/SPC560Pxx/PWM-ICU/chconf.h deleted file mode 100644 index c132ac014..000000000 --- a/testhal/SPC560Pxx/PWM-ICU/chconf.h +++ /dev/null @@ -1,525 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560Pxx/PWM-ICU/halconf.h b/testhal/SPC560Pxx/PWM-ICU/halconf.h deleted file mode 100644 index 09022b9e7..000000000 --- a/testhal/SPC560Pxx/PWM-ICU/halconf.h +++ /dev/null @@ -1,367 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @name Drivers enable switches - */ -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name ADC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name CAN driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name I2C driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MAC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MMC_SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SDC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 1 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL_USB driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 64 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560Pxx/PWM-ICU/main.c b/testhal/SPC560Pxx/PWM-ICU/main.c deleted file mode 100644 index 31ef444ee..000000000 --- a/testhal/SPC560Pxx/PWM-ICU/main.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(PORT_D, PD_LED1); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(PORT_D, PD_LED1); -} - -static PWMConfig pwmcfg = { - 250000, /* 250kHz PWM clock frequency.*/ - 50000, /* Initial PWM period 0.2s.*/ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL} - }, - PWM_ALIGN_EDGE -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(PORT_D, PD_LED2); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(PORT_D, PD_LED2); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 250000, /* 250kHz ICU clock frequency.*/ - icuwidthcb, - icuperiodcb, - NULL -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 1 and ICU driver 1. - * GPIOD10 is the PWM output. - * GPIOA0 is the ICU input. - * The two pins have to be externally connected together. - */ - icuStart(&ICUD1, &icucfg); - icuEnable(&ICUD1); - - /* Sets A0 alternative function.*/ - SIU.PCR[0].R = 0b0100010100000100; - - pwmStart(&PWMD1, &pwmcfg); - /* Sets D10 alternative function.*/ - SIU.PCR[58].R = 0b0100010100000100; - - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period and the PWM channel 0 to 50% duty cycle. - */ - pwmChangePeriod(&PWMD1, 25000); - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD1, 0); - pwmStop(&PWMD1); - icuDisable(&ICUD1); - icuStop(&ICUD1); - palClearPad(PORT_D, PD_LED3); - palClearPad(PORT_D, PD_LED4); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/SPC560Pxx/PWM-ICU/mcuconf.h b/testhal/SPC560Pxx/PWM-ICU/mcuconf.h deleted file mode 100644 index ae770ef86..000000000 --- a/testhal/SPC560Pxx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,298 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC560Pxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - * DMA priorities: - * 0...15 Highest...Lowest. - */ - -#define SPC560Pxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_DISABLE_WATCHDOG TRUE -#define SPC5_FMPLL0_IDF_VALUE 5 -#define SPC5_FMPLL0_NDIV_VALUE 32 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_FMPLL1_IDF_VALUE 5 -#define SPC5_FMPLL1_NDIV_VALUE 60 -#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_AUX0CLK_SRC SPC5_CGM_SS_FMPLL0 -#define SPC5_MCONTROL_DIVIDER_VALUE 2 -#define SPC5_FMPLL1_CLK_DIVIDER_VALUE 2 -#define SPC5_AUX2CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_SP_CLK_DIVIDER_VALUE 2 -#define SPC5_AUX3CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_FR_CLK_DIVIDER_VALUE 2 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0) -#define SPC5_ME_TEST_MC_BITS (SPC5_ME_MC_SYSCLK_IRC | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_PIT0_IRQ_PRIORITY 4 -#define SPC5_CLOCK_FAILURE_HOOK() chSysHalt() - -/* - * EDMA driver settings. - */ -#define SPC5_EDMA_CR_SETTING 0 -#define SPC5_EDMA_GROUP0_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_ERROR_IRQ_PRIO 2 -#define SPC5_EDMA_ERROR_HANDLER() chSysHalt() - -/* - * Serial driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * PWM driver system settings. - */ -#define SPC5_PWM_USE_SMOD0 TRUE -#define SPC5_PWM_USE_SMOD1 FALSE -#define SPC5_PWM_USE_SMOD2 FALSE -#define SPC5_PWM_USE_SMOD3 FALSE -#define SPC5_PWM_SMOD0_PRIORITY 7 -#define SPC5_PWM_SMOD1_PRIORITY 7 -#define SPC5_PWM_SMOD2_PRIORITY 7 -#define SPC5_PWM_SMOD3_PRIORITY 7 -#define SPC5_PWM_FLEXPWM0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_PWM_FLEXPWM0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * ICU driver system settings. - */ -#define SPC5_ICU_USE_SMOD0 TRUE -#define SPC5_ICU_USE_SMOD1 FALSE -#define SPC5_ICU_USE_SMOD2 FALSE -#define SPC5_ICU_USE_SMOD3 FALSE -#define SPC5_ICU_USE_SMOD4 FALSE -#define SPC5_ICU_USE_SMOD5 FALSE -#define SPC5_ICU_ETIMER0_PRIORITY 7 -#define SPC5_ICU_ETIMER0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_ICU_USE_SMOD6 FALSE -#define SPC5_ICU_USE_SMOD7 FALSE -#define SPC5_ICU_USE_SMOD8 FALSE -#define SPC5_ICU_USE_SMOD9 FALSE -#define SPC5_ICU_USE_SMOD10 FALSE -#define SPC5_ICU_USE_SMOD11 FALSE -#define SPC5_ICU_ETIMER1_PRIORITY 7 -#define SPC5_ICU_ETIMER1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * SPI driver system settings. - */ -#define SPC5_SPI_USE_DSPI0 FALSE -#define SPC5_SPI_USE_DSPI1 FALSE -#define SPC5_SPI_USE_DSPI2 FALSE -#define SPC5_SPI_USE_DSPI3 FALSE -#define SPC5_SPI_USE_DSPI4 FALSE -#define SPC5_SPI_DSPI0_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI1_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI2_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI3_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI4_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI0_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI3_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI4_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI0_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_IRQ_PRIO 10 -#define SPC5_SPI_DSPI3_IRQ_PRIO 10 -#define SPC5_SPI_DSPI4_IRQ_PRIO 10 -#define SPC5_SPI_DMA_ERROR_HOOK(spip) chSysHalt() -#define SPC5_SPI_DSPI0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI2_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI2_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI3_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI3_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI4_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI4_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/testhal/SPC560Pxx/PWM-ICU/readme.txt b/testhal/SPC560Pxx/PWM-ICU/readme.txt deleted file mode 100644 index 025e73c87..000000000 --- a/testhal/SPC560Pxx/PWM-ICU/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM/ICU drivers demo for SPC560Pxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC560Pxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC560Pxx PWM-ICU drivers. - -** Board Setup ** - -- Connect D10 and A0 together. - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC560Pxx/SPI/.cproject b/testhal/SPC560Pxx/SPI/.cproject deleted file mode 100644 index a4ae17c6d..000000000 --- a/testhal/SPC560Pxx/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC560Pxx/SPI/.project b/testhal/SPC560Pxx/SPI/.project deleted file mode 100644 index c0c005e49..000000000 --- a/testhal/SPC560Pxx/SPI/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC560Pxx-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC560P - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC560Pxx/SPI/Makefile b/testhal/SPC560Pxx/SPI/Makefile deleted file mode 100644 index c5e4bde95..000000000 --- a/testhal/SPC560Pxx/SPI/Makefile +++ /dev/null @@ -1,168 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_EVB_SPC560P/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC560Pxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC560Pxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC560P50.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -D_SPC560P50L5_ - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/testhal/SPC560Pxx/SPI/chconf.h b/testhal/SPC560Pxx/SPI/chconf.h deleted file mode 100644 index dc956ef13..000000000 --- a/testhal/SPC560Pxx/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560Pxx/SPI/halconf.h b/testhal/SPC560Pxx/SPI/halconf.h deleted file mode 100644 index fdc079aef..000000000 --- a/testhal/SPC560Pxx/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC560Pxx/SPI/main.c b/testhal/SPC560Pxx/SPI/main.c deleted file mode 100644 index 83ee0bbb1..000000000 --- a/testhal/SPC560Pxx/SPI/main.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration. - */ -static const SPIConfig hs_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV2 | SPC5_CTAR_ASC_DIV2 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV2, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(1) /* PUSHR. */ -}; - -/* - * Low speed SPI configuration (328.125kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV64 | SPC5_CTAR_ASC_DIV64 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV256, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(0) /* PUSHR. */ -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palClearPad(PORT_D, PD_LED1); /* LED ON. */ - spiStart(&SPID1, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palSetPad(PORT_D, PD_LED1); /* LED OFF. */ - spiStart(&SPID1, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* Starting driver for test, DSPI_1 I/O pins setup.*/ - spiStart(&SPID1, &ls_spicfg); - SIU.PCR[37].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SCK */ - SIU.PCR[38].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SOUT */ - SIU.PCR[36].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* CS[0] */ - SIU.PCR[35].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* CS[1] */ - - /* Testing sending and receiving at the same time.*/ - spiExchange(&SPID1, 4, txbuf, rxbuf); - spiExchange(&SPID1, 32, txbuf, rxbuf); - spiExchange(&SPID1, 512, txbuf, rxbuf); - - /* Testing clock pulses without data buffering.*/ - spiIgnore(&SPID1, 4); - spiIgnore(&SPID1, 32); - - /* Testing sending data ignoring incoming data.*/ - spiSend(&SPID1, 4, txbuf); - spiSend(&SPID1, 32, txbuf); - - /* Testing receiving data while sending idle bits (high level).*/ - spiReceive(&SPID1, 4, rxbuf); - spiReceive(&SPID1, 32, rxbuf); - - /* Testing stop procedure.*/ - spiStop(&SPID1); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - palTogglePad(PORT_D, PD_LED2); - } - return 0; -} diff --git a/testhal/SPC560Pxx/SPI/mcuconf.h b/testhal/SPC560Pxx/SPI/mcuconf.h deleted file mode 100644 index ba5720366..000000000 --- a/testhal/SPC560Pxx/SPI/mcuconf.h +++ /dev/null @@ -1,298 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC560Pxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - * DMA priorities: - * 0...15 Highest...Lowest. - */ - -#define SPC560Pxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_DISABLE_WATCHDOG TRUE -#define SPC5_FMPLL0_IDF_VALUE 5 -#define SPC5_FMPLL0_NDIV_VALUE 32 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_FMPLL1_IDF_VALUE 5 -#define SPC5_FMPLL1_NDIV_VALUE 60 -#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_AUX0CLK_SRC SPC5_CGM_SS_FMPLL0 -#define SPC5_MCONTROL_DIVIDER_VALUE 2 -#define SPC5_FMPLL1_CLK_DIVIDER_VALUE 2 -#define SPC5_AUX2CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_SP_CLK_DIVIDER_VALUE 2 -#define SPC5_AUX3CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_FR_CLK_DIVIDER_VALUE 2 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0) -#define SPC5_ME_TEST_MC_BITS (SPC5_ME_MC_SYSCLK_IRC | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_CFLAON_NORMAL | \ - SPC5_ME_MC_DFLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_PIT0_IRQ_PRIORITY 4 -#define SPC5_CLOCK_FAILURE_HOOK() chSysHalt() - -/* - * EDMA driver settings. - */ -#define SPC5_EDMA_CR_SETTING 0 -#define SPC5_EDMA_GROUP0_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_ERROR_IRQ_PRIO 2 -#define SPC5_EDMA_ERROR_HANDLER() chSysHalt() - -/* - * Serial driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * PWM driver system settings. - */ -#define SPC5_PWM_USE_SMOD0 FALSE -#define SPC5_PWM_USE_SMOD1 FALSE -#define SPC5_PWM_USE_SMOD2 FALSE -#define SPC5_PWM_USE_SMOD3 FALSE -#define SPC5_PWM_SMOD0_PRIORITY 7 -#define SPC5_PWM_SMOD1_PRIORITY 7 -#define SPC5_PWM_SMOD2_PRIORITY 7 -#define SPC5_PWM_SMOD3_PRIORITY 7 -#define SPC5_PWM_FLEXPWM0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_PWM_FLEXPWM0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * ICU driver system settings. - */ -#define SPC5_ICU_USE_SMOD0 FALSE -#define SPC5_ICU_USE_SMOD1 FALSE -#define SPC5_ICU_USE_SMOD2 FALSE -#define SPC5_ICU_USE_SMOD3 FALSE -#define SPC5_ICU_USE_SMOD4 FALSE -#define SPC5_ICU_USE_SMOD5 FALSE -#define SPC5_ICU_ETIMER0_PRIORITY 7 -#define SPC5_ICU_ETIMER0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_ICU_USE_SMOD6 FALSE -#define SPC5_ICU_USE_SMOD7 FALSE -#define SPC5_ICU_USE_SMOD8 FALSE -#define SPC5_ICU_USE_SMOD9 FALSE -#define SPC5_ICU_USE_SMOD10 FALSE -#define SPC5_ICU_USE_SMOD11 FALSE -#define SPC5_ICU_ETIMER1_PRIORITY 7 -#define SPC5_ICU_ETIMER1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * SPI driver system settings. - */ -#define SPC5_SPI_USE_DSPI0 TRUE -#define SPC5_SPI_USE_DSPI1 TRUE -#define SPC5_SPI_USE_DSPI2 TRUE -#define SPC5_SPI_USE_DSPI3 TRUE -#define SPC5_SPI_USE_DSPI4 FALSE -#define SPC5_SPI_DSPI0_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI1_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI2_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI3_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI4_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI0_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI3_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI4_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI0_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_IRQ_PRIO 10 -#define SPC5_SPI_DSPI3_IRQ_PRIO 10 -#define SPC5_SPI_DSPI4_IRQ_PRIO 10 -#define SPC5_SPI_DMA_ERROR_HOOK(spip) chSysHalt() -#define SPC5_SPI_DSPI0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI2_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI2_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI3_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI3_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI4_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI4_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/testhal/SPC560Pxx/SPI/readme.txt b/testhal/SPC560Pxx/SPI/readme.txt deleted file mode 100644 index 302b4a23b..000000000 --- a/testhal/SPC560Pxx/SPI/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for SPC560Pxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC560Pxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC560Pxx SPI driver. - -** Board Setup ** - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC563Mxx/ADC/.cproject b/testhal/SPC563Mxx/ADC/.cproject deleted file mode 100644 index 57b44e9a8..000000000 --- a/testhal/SPC563Mxx/ADC/.cproject +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC563Mxx/ADC/.project b/testhal/SPC563Mxx/ADC/.project deleted file mode 100644 index ff4e5ffca..000000000 --- a/testhal/SPC563Mxx/ADC/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC563Mxx-ADC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC563M - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC563Mxx/ADC/Makefile b/testhal/SPC563Mxx/ADC/Makefile deleted file mode 100644 index 644898587..000000000 --- a/testhal/SPC563Mxx/ADC/Makefile +++ /dev/null @@ -1,168 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_EVB_SPC563M/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC563Mxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC563Mxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC563M64.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - adc_cfg.c main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/testhal/SPC563Mxx/ADC/adc_cfg.c b/testhal/SPC563Mxx/ADC/adc_cfg.c deleted file mode 100644 index 7bb5bbbe6..000000000 --- a/testhal/SPC563Mxx/ADC/adc_cfg.c +++ /dev/null @@ -1,743 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" -#include "adc_cfg.h" - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 5 channels, SW triggered. - * Channels: ADC_CHN_VRL, ADC_CHN_VREF25, ADC_CHN_VREF50, - * ADC_CHN_VREF75, ADC_CHN_VRH. - * - * NOTE: The configuration of a sequence is very complex in this ADC - * implementation. Configurations are meant to be generated by the - * SPC5 Studio visual configuration tool and not be written manually. - * Writing complex sequences manually requires ad deep knowledge of both - * the EQADC peripheral and the driver implementation. - */ -static const adccommand_t adcgrpcfg1_commands[ADC_GRP1_NUM_CHANNELS * - ADC_GRP1_BUF_DEPTH] = { - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(0) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH) -}; - -const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - EQADC_CFCR_MODE_SWCS, - 0, 0, /* ISEL, EISEL.*/ - ADC_GRP1_BUF_DEPTH, - adcgrpcfg1_commands -}; - -/* - * ADC conversion group. - * Mode: Circular buffer, 16 samples of 5 channels, SW triggered. - * Channels: ADC_CHN_VRL, ADC_CHN_VRL, ADC_CHN_VREF25, ADC_CHN_VREF50, - * ADC_CHN_VREF50, ADC_CHN_VREF75, ADC_CHN_VRH, ADC_CHN_VRH. - * - * NOTE: The configuration of a sequence is very complex in this ADC - * implementation. Configurations are meant to be generated by the - * SPC5 Studio visual configuration tool and not be written manually. - * Writing complex sequences manually requires ad deep knowledge of both - * the EQADC peripheral and the driver implementation. - */ -static const adccommand_t adcgrpcfg2_commands[ADC_GRP2_NUM_CHANNELS * - ADC_GRP2_BUF_DEPTH] = { - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRL), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF25), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF50), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VREF75), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), - - EQADC_CONV_BN_ADC0 | EQADC_CONV_LST_64 | EQADC_CONV_CAL | - EQADC_CONV_FMT_RJU | EQADC_CONV_CONFIG_STD | EQADC_CONV_MSG_RFIFO(2) | - EQADC_CONV_CHANNEL(ADC_CHN_VRH), -}; - -const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - EQADC_CFCR_MODE_SWCS, - 0, 0, /* ISEL, EISEL.*/ - ADC_GRP2_BUF_DEPTH, - adcgrpcfg2_commands -}; diff --git a/testhal/SPC563Mxx/ADC/adc_cfg.h b/testhal/SPC563Mxx/ADC/adc_cfg.h deleted file mode 100644 index cf0f411a3..000000000 --- a/testhal/SPC563Mxx/ADC/adc_cfg.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef _ADC_CFG_H_ -#define _ADC_CFG_H_ - -#define ADC_GRP1_NUM_CHANNELS 5 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -extern const ADCConversionGroup adcgrpcfg1; -extern const ADCConversionGroup adcgrpcfg2; - -#ifdef __cplusplus -extern "C" { -#endif - void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n); - void adcerrorcallback(ADCDriver *adcp, adcerror_t err); -#ifdef __cplusplus -} -#endif - -#endif /* _ADC_CFG_H_ */ diff --git a/testhal/SPC563Mxx/ADC/chconf.h b/testhal/SPC563Mxx/ADC/chconf.h deleted file mode 100644 index dc956ef13..000000000 --- a/testhal/SPC563Mxx/ADC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC563Mxx/ADC/halconf.h b/testhal/SPC563Mxx/ADC/halconf.h deleted file mode 100644 index a719ec40a..000000000 --- a/testhal/SPC563Mxx/ADC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC563Mxx/ADC/main.c b/testhal/SPC563Mxx/ADC/main.c deleted file mode 100644 index 6ec736309..000000000 --- a/testhal/SPC563Mxx/ADC/main.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" -#include "adc_cfg.h" - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -/* - * ADC error callback. - */ -void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; - - palSetPad(PORT11, P11_LED4); - chSysHalt(); -} - -/* - * LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(PORT11, P11_LED1); - chThdSleepMilliseconds(500); - palClearPad(PORT11, P11_LED1); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1, ADC3 drivers. - */ - adcStart(&ADCD1, NULL); - adcStart(&ADCD3, NULL); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD3, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, once the button is pressed the ADC - * conversion is stopped. - */ - while (TRUE) { - if (palReadPad(PORT11, P11_BUTTON1)) { - adcStopConversion(&ADCD3); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/SPC563Mxx/ADC/mcuconf.h b/testhal/SPC563Mxx/ADC/mcuconf.h deleted file mode 100644 index 18cc088ac..000000000 --- a/testhal/SPC563Mxx/ADC/mcuconf.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC563Mxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - * DMA priorities: - * 0...15 Highest...Lowest. - */ - -#define SPC563Mxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_CLK_BYPASS FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_CLK_PREDIV_VALUE 2 -#define SPC5_CLK_MFD_VALUE 80 -#define SPC5_CLK_RFD SPC5_RFD_DIV4 -#define SPC5_FLASH_BIUCR (BIUCR_BANK1_TOO | \ - BIUCR_MASTER4_PREFETCH | \ - BIUCR_MASTER0_PREFETCH | \ - BIUCR_DPFEN | \ - BIUCR_IPFEN | \ - BIUCR_PFLIM_ON_MISS | \ - BIUCR_BFEN) - -/* - * EDMA driver settings. - */ -#define SPC5_EDMA_CR_SETTING (EDMA_CR_GRP3PRI(3) | \ - EDMA_CR_GRP2PRI(2) | \ - EDMA_CR_GRP1PRI(1) | \ - EDMA_CR_GRP0PRI(0) | \ - EDMA_CR_ERGA) -#define SPC5_EDMA_GROUP0_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_GROUP1_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_ERROR_IRQ_PRIO 2 -#define SPC5_EDMA_ERROR_HANDLER() chSysHalt() - -/* - * ADC driver settings. - */ -#define SPC5_ADC_USE_ADC0_Q0 TRUE -#define SPC5_ADC_USE_ADC0_Q1 TRUE -#define SPC5_ADC_USE_ADC0_Q2 TRUE -#define SPC5_ADC_USE_ADC1_Q3 TRUE -#define SPC5_ADC_USE_ADC1_Q4 TRUE -#define SPC5_ADC_USE_ADC1_Q5 TRUE -#define SPC5_ADC_FIFO0_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO1_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO2_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO3_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO4_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO5_DMA_IRQ_PRIO 12 -#define SPC5_ADC_CR_CLK_PS ADC_CR_CLK_PS(5) -#define SPC5_ADC_PUDCR {ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE} - -/* - * SERIAL driver system settings. - */ -#define SPC5_USE_ESCIA TRUE -#define SPC5_USE_ESCIB TRUE -#define SPC5_ESCIA_PRIORITY 8 -#define SPC5_ESCIB_PRIORITY 8 - -/* - * SPI driver system settings. - */ -#define SPC5_SPI_USE_DSPI1 FALSE -#define SPC5_SPI_USE_DSPI2 FALSE -#define SPC5_SPI_DSPI1_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI2_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI1_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_IRQ_PRIO 10 -#define SPC5_SPI_DMA_ERROR_HOOK(spip) chSysHalt() diff --git a/testhal/SPC563Mxx/ADC/readme.txt b/testhal/SPC563Mxx/ADC/readme.txt deleted file mode 100644 index ebe5c0a37..000000000 --- a/testhal/SPC563Mxx/ADC/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for SPC563Mxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC563Mxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC563Mxx ADC driver. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC563Mxx/ICU-PWM/.cproject b/testhal/SPC563Mxx/ICU-PWM/.cproject deleted file mode 100644 index a4ae17c6d..000000000 --- a/testhal/SPC563Mxx/ICU-PWM/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC563Mxx/ICU-PWM/.project b/testhal/SPC563Mxx/ICU-PWM/.project deleted file mode 100644 index 31139adbb..000000000 --- a/testhal/SPC563Mxx/ICU-PWM/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC563Mxx-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC563M - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC563Mxx/ICU-PWM/Makefile b/testhal/SPC563Mxx/ICU-PWM/Makefile deleted file mode 100644 index 911a39668..000000000 --- a/testhal/SPC563Mxx/ICU-PWM/Makefile +++ /dev/null @@ -1,168 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_EVB_SPC563M/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC563Mxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC563Mxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC563M64.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/testhal/SPC563Mxx/ICU-PWM/chconf.h b/testhal/SPC563Mxx/ICU-PWM/chconf.h deleted file mode 100644 index b4c46c7f6..000000000 --- a/testhal/SPC563Mxx/ICU-PWM/chconf.h +++ /dev/null @@ -1,536 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - --- - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes ChibiOS/RT, without being obliged to provide - the source code for any proprietary components. See the file exception.txt - for full details of how and when the exception can be applied. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES FALSE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC563Mxx/ICU-PWM/halconf.h b/testhal/SPC563Mxx/ICU-PWM/halconf.h deleted file mode 100644 index 3a6d72910..000000000 --- a/testhal/SPC563Mxx/ICU-PWM/halconf.h +++ /dev/null @@ -1,367 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @name Drivers enable switches - */ -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name ADC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name CAN driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name I2C driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MAC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MMC_SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SDC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 1 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL_USB driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 64 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC563Mxx/ICU-PWM/main.c b/testhal/SPC563Mxx/ICU-PWM/main.c deleted file mode 100644 index 51edb64c8..000000000 --- a/testhal/SPC563Mxx/ICU-PWM/main.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(PORT11, P11_LED1); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(PORT11, P11_LED1); -} - -static PWMConfig pwmcfg = { - 100000, /* 100kHz PWM clock frequency.*/ - 20000, /* Initial PWM period 0.2s.*/ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb} - }, - PWM_ALIGN_EDGE -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(PORT11, P11_LED2); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(PORT11, P11_LED2); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 100000, /* 100kHz ICU clock frequency.*/ - icuwidthcb, - icuperiodcb, - NULL -}; - -/* - * Application entry point. - */ -int main(void) { - - /* Initialization of all the imported components in the order specified in - the application wizard. The function is generated automatically.*/ - componentsInit(); - - palClearPad(PORT11, P11_LED4); - - /* - * Initializes the PWM driver 8 and ICU driver 1. - * PIN80 is the PWM output. - * PIN63 is the ICU input. - * The two pins have to be externally connected together. - */ - - /* Sets PIN63 alternative function.*/ - SIU.PCR[179].R = 0b0000010100001100; - - /* Sets PIN80 alternative function.*/ - SIU.PCR[202].R = 0b0000011000001100; - - icuStart(&ICUD1, &icucfg); - icuEnable(&ICUD1); - pwmStart(&PWMD8, &pwmcfg); - - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD8, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD8, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD8, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD8, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD8, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD8, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period and the PWM channel 0 to 50% duty cycle. - */ - pwmChangePeriod(&PWMD8, 25000); - pwmEnableChannel(&PWMD8, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD8, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Disables PWM channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD8, 0); - pwmStop(&PWMD8); - - /* - * Disables and stops the ICU drivers. - */ - - icuDisable(&ICUD1); - icuStop(&ICUD1); - - palClearPad(PORT11, P11_LED3); - palClearPad(PORT11, P11_LED4); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/SPC563Mxx/ICU-PWM/mcuconf.h b/testhal/SPC563Mxx/ICU-PWM/mcuconf.h deleted file mode 100644 index be3ee85cf..000000000 --- a/testhal/SPC563Mxx/ICU-PWM/mcuconf.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC563Mxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - */ - -#define SPC563Mxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_CLK_BYPASS FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_CLK_PREDIV_VALUE 2 -#define SPC5_CLK_MFD_VALUE 80 -#define SPC5_CLK_RFD SPC5_RFD_DIV4 -#define SPC5_FLASH_BIUCR (BIUCR_BANK1_TOO | \ - BIUCR_MASTER4_PREFETCH | \ - BIUCR_MASTER0_PREFETCH | \ - BIUCR_DPFEN | \ - BIUCR_IPFEN | \ - BIUCR_PFLIM_ON_MISS | \ - BIUCR_BFEN) - -/* - * ADC driver settings. - */ -#define SPC5_ADC_USE_ADC0_Q0 FALSE -#define SPC5_ADC_USE_ADC0_Q1 FALSE -#define SPC5_ADC_USE_ADC0_Q2 FALSE -#define SPC5_ADC_USE_ADC1_Q3 FALSE -#define SPC5_ADC_USE_ADC1_Q4 FALSE -#define SPC5_ADC_USE_ADC1_Q5 FALSE -#define SPC5_ADC_FIFO0_DMA_PRIO 12 -#define SPC5_ADC_FIFO1_DMA_PRIO 12 -#define SPC5_ADC_FIFO2_DMA_PRIO 12 -#define SPC5_ADC_FIFO3_DMA_PRIO 12 -#define SPC5_ADC_FIFO4_DMA_PRIO 12 -#define SPC5_ADC_FIFO5_DMA_PRIO 12 -#define SPC5_ADC_FIFO0_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO1_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO2_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO3_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO4_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO5_DMA_IRQ_PRIO 12 -#define SPC5_ADC_CR_CLK_PS ADC_CR_CLK_PS(5) -#define SPC5_ADC_PUDCR {ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE} - -/* - * SERIAL driver system settings. - */ -#define SPC5_USE_ESCIA TRUE -#define SPC5_USE_ESCIB FALSE -#define SPC5_ESCIA_PRIORITY 8 -#define SPC5_ESCIB_PRIORITY 8 - -/* - * ICU - PWM driver system settings. - */ -#define SPC5_ICU_USE_EMIOS_CH0 TRUE -#define SPC5_ICU_USE_EMIOS_CH1 TRUE -#define SPC5_ICU_USE_EMIOS_CH2 TRUE -#define SPC5_ICU_USE_EMIOS_CH3 TRUE -#define SPC5_ICU_USE_EMIOS_CH4 TRUE -#define SPC5_ICU_USE_EMIOS_CH5 TRUE -#define SPC5_ICU_USE_EMIOS_CH6 TRUE -#define SPC5_ICU_USE_EMIOS_CH8 TRUE - -#define SPC5_PWM_USE_EMIOS_CH9 TRUE -#define SPC5_PWM_USE_EMIOS_CH10 TRUE -#define SPC5_PWM_USE_EMIOS_CH11 TRUE -#define SPC5_PWM_USE_EMIOS_CH12 TRUE -#define SPC5_PWM_USE_EMIOS_CH13 TRUE -#define SPC5_PWM_USE_EMIOS_CH14 TRUE -#define SPC5_PWM_USE_EMIOS_CH15 TRUE -#define SPC5_PWM_USE_EMIOS_CH23 TRUE - -#define SPC5_EMIOS_GLOBAL_PRESCALER 200 diff --git a/testhal/SPC563Mxx/ICU-PWM/readme.txt b/testhal/SPC563Mxx/ICU-PWM/readme.txt deleted file mode 100644 index 90fcf6d5c..000000000 --- a/testhal/SPC563Mxx/ICU-PWM/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ICU_PWM driver demo for SPC563Mxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC563Mxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC563Mxx ICU and PWM drivers. - -** Board Setup ** - -Connect PIN63 and PIN80 together. - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC563Mxx/SPI/.cproject b/testhal/SPC563Mxx/SPI/.cproject deleted file mode 100644 index a4ae17c6d..000000000 --- a/testhal/SPC563Mxx/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC563Mxx/SPI/.project b/testhal/SPC563Mxx/SPI/.project deleted file mode 100644 index 31139adbb..000000000 --- a/testhal/SPC563Mxx/SPI/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC563Mxx-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC563M - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC563Mxx/SPI/Makefile b/testhal/SPC563Mxx/SPI/Makefile deleted file mode 100644 index 911a39668..000000000 --- a/testhal/SPC563Mxx/SPI/Makefile +++ /dev/null @@ -1,168 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_EVB_SPC563M/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC563Mxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC563Mxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC563M64.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/testhal/SPC563Mxx/SPI/chconf.h b/testhal/SPC563Mxx/SPI/chconf.h deleted file mode 100644 index dc956ef13..000000000 --- a/testhal/SPC563Mxx/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC563Mxx/SPI/halconf.h b/testhal/SPC563Mxx/SPI/halconf.h deleted file mode 100644 index fdc079aef..000000000 --- a/testhal/SPC563Mxx/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC563Mxx/SPI/main.c b/testhal/SPC563Mxx/SPI/main.c deleted file mode 100644 index 46378a5f8..000000000 --- a/testhal/SPC563Mxx/SPI/main.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration. - */ -static const SPIConfig hs_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV2 | SPC5_CTAR_ASC_DIV2 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV2, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(1) /* PUSHR. */ -}; - -/* - * Low speed SPI configuration (328.125kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV64 | SPC5_CTAR_ASC_DIV64 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV256, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(0) /* PUSHR. */ -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palClearPad(PORT11, P11_LED1); /* LED ON. */ - spiStart(&SPID2, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palSetPad(PORT11, P11_LED1); /* LED OFF. */ - spiStart(&SPID2, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* Starting driver for test, DSPI_B I/O pins setup.*/ - spiStart(&SPID2, &ls_spicfg); - SIU.PCR[102].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SCK */ - SIU.PCR[103].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SIN */ - SIU.PCR[104].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SOUT */ - SIU.PCR[105].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* PCS[0] */ - SIU.PCR[106].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* PCS[1] */ - - /* Testing sending and receiving at the same time.*/ - spiExchange(&SPID2, 4, txbuf, rxbuf); - spiExchange(&SPID2, 32, txbuf, rxbuf); - spiExchange(&SPID2, 512, txbuf, rxbuf); - - /* Testing clock pulses without data buffering.*/ - spiIgnore(&SPID2, 4); - spiIgnore(&SPID2, 32); - - /* Testing sending data ignoring incoming data.*/ - spiSend(&SPID2, 4, txbuf); - spiSend(&SPID2, 32, txbuf); - - /* Testing receiving data while sending idle bits (high level).*/ - spiReceive(&SPID2, 4, rxbuf); - spiReceive(&SPID2, 32, rxbuf); - - /* Testing stop procedure.*/ - spiStop(&SPID2); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - palTogglePad(PORT11, P11_LED2); - } - return 0; -} diff --git a/testhal/SPC563Mxx/SPI/mcuconf.h b/testhal/SPC563Mxx/SPI/mcuconf.h deleted file mode 100644 index 6affa7878..000000000 --- a/testhal/SPC563Mxx/SPI/mcuconf.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC563Mxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - * DMA priorities: - * 0...15 Highest...Lowest. - */ - -#define SPC563Mxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_CLK_BYPASS FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_CLK_PREDIV_VALUE 2 -#define SPC5_CLK_MFD_VALUE 80 -#define SPC5_CLK_RFD SPC5_RFD_DIV4 -#define SPC5_FLASH_BIUCR (BIUCR_BANK1_TOO | \ - BIUCR_MASTER4_PREFETCH | \ - BIUCR_MASTER0_PREFETCH | \ - BIUCR_DPFEN | \ - BIUCR_IPFEN | \ - BIUCR_PFLIM_ON_MISS | \ - BIUCR_BFEN) - -/* - * EDMA driver settings. - */ -#define SPC5_EDMA_CR_SETTING (EDMA_CR_GRP3PRI(3) | \ - EDMA_CR_GRP2PRI(2) | \ - EDMA_CR_GRP1PRI(1) | \ - EDMA_CR_GRP0PRI(0) | \ - EDMA_CR_ERGA) -#define SPC5_EDMA_GROUP0_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_GROUP1_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_ERROR_IRQ_PRIO 2 -#define SPC5_EDMA_ERROR_HANDLER() chSysHalt() - -/* - * ADC driver settings. - */ -#define SPC5_ADC_USE_ADC0_Q0 FALSE -#define SPC5_ADC_USE_ADC0_Q1 FALSE -#define SPC5_ADC_USE_ADC0_Q2 FALSE -#define SPC5_ADC_USE_ADC1_Q3 FALSE -#define SPC5_ADC_USE_ADC1_Q4 FALSE -#define SPC5_ADC_USE_ADC1_Q5 FALSE -#define SPC5_ADC_FIFO0_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO1_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO2_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO3_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO4_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO5_DMA_IRQ_PRIO 12 -#define SPC5_ADC_CR_CLK_PS ADC_CR_CLK_PS(5) -#define SPC5_ADC_PUDCR {ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE} - -/* - * SERIAL driver system settings. - */ -#define SPC5_USE_ESCIA TRUE -#define SPC5_USE_ESCIB TRUE -#define SPC5_ESCIA_PRIORITY 8 -#define SPC5_ESCIB_PRIORITY 8 - -/* - * SPI driver system settings. - */ -#define SPC5_SPI_USE_DSPI1 TRUE -#define SPC5_SPI_USE_DSPI2 TRUE -#define SPC5_SPI_DSPI1_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI2_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI1_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_IRQ_PRIO 10 -#define SPC5_SPI_DMA_ERROR_HOOK(spip) chSysHalt() diff --git a/testhal/SPC563Mxx/SPI/readme.txt b/testhal/SPC563Mxx/SPI/readme.txt deleted file mode 100644 index 1e0b7fcc0..000000000 --- a/testhal/SPC563Mxx/SPI/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for SPC563Mxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC563Mxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC563Mxx SPI driver. - -** Board Setup ** - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC564Axx/ICU-PWM/Makefile b/testhal/SPC564Axx/ICU-PWM/Makefile deleted file mode 100644 index bdd72d6ac..000000000 --- a/testhal/SPC564Axx/ICU-PWM/Makefile +++ /dev/null @@ -1,121 +0,0 @@ -############################################################################## -# This file is automatically generated and can be overwritten, do no change -# this file manually. -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = out - -# Imported source files -include components/components.mak - -# Checks if there is a user mak file in the project directory. -ifneq ($(wildcard user.mak),) - include user.mak -endif - -# Define linker script file here -LDSCRIPT= application.ld - -# C sources here. -CSRC = $(LIB_C_SRC) \ - $(APP_C_SRC) \ - $(U_C_SRC) \ - ./components/components.c \ - ./main.c - -# C++ sources here. -CPPSRC = $(LIB_CPP_SRC) \ - $(APP_CPP_SRC) \ - $(U_CPP_SRC) - -# List ASM source files here -ASMSRC = $(LIB_ASM_SRC) \ - $(APP_ASM_SRC) \ - $(U_ASM_SRC) - -INCDIR = $(LIB_INCLUDES) \ - $(APP_INCLUDES) \ - ./components - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -include C:/SPC5Studio/eclipse/plugins/com.st.tools.spc5.components.platform.spc564axx_1.0.0.201305101230/component/lib/rsc/rules.mk diff --git a/testhal/SPC564Axx/ICU-PWM/chconf.h b/testhal/SPC564Axx/ICU-PWM/chconf.h deleted file mode 100644 index b4c46c7f6..000000000 --- a/testhal/SPC564Axx/ICU-PWM/chconf.h +++ /dev/null @@ -1,536 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - --- - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes ChibiOS/RT, without being obliged to provide - the source code for any proprietary components. See the file exception.txt - for full details of how and when the exception can be applied. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES FALSE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC564Axx/ICU-PWM/halconf.h b/testhal/SPC564Axx/ICU-PWM/halconf.h deleted file mode 100644 index 24462dafd..000000000 --- a/testhal/SPC564Axx/ICU-PWM/halconf.h +++ /dev/null @@ -1,367 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @name Drivers enable switches - */ -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name ADC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name CAN driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name I2C driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MAC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MMC_SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SDC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 1 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL_USB driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 64 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC564Axx/ICU-PWM/main.c b/testhal/SPC564Axx/ICU-PWM/main.c deleted file mode 100644 index 9f175890c..000000000 --- a/testhal/SPC564Axx/ICU-PWM/main.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(PORT11, P11_LED1); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(PORT11, P11_LED1); -} - -static PWMConfig pwmcfg = { - 187500, /* 187500Hz PWM clock frequency.*/ - 19500, /* Initial PWM period 0.1040s.*/ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb} - }, - PWM_ALIGN_EDGE -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(PORT11, P11_LED2); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(PORT11, P11_LED2); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 187500, /* 187500Hz ICU clock frequency.*/ - icuwidthcb, - icuperiodcb, - NULL -}; - -/* - * Application entry point. - */ -int main(void) { - - /* Initialization of all the imported components in the order specified in - the application wizard. The function is generated automatically.*/ - componentsInit(); - - palClearPad(PORT11, P11_LED4); - - /* - * Initializes the PWM driver 6 and ICU driver 3. - * PIN78 is the PWM output. - * PIN65 is the ICU input. - * The two pins have to be externally connected together. - */ - - /* Sets PIN65 alternative function.*/ - SIU.PCR[181].R = 0b0000010100001100; - - /* Sets PIN78 alternative function.*/ - SIU.PCR[193].R = 0b0000011000001100; - - icuStart(&ICUD3, &icucfg); - icuEnable(&ICUD3); - pwmStart(&PWMD6, &pwmcfg); - - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD6, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD6, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD6, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD6, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD6, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD6, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period and the PWM channel 0 to 50% duty cycle. - */ - pwmChangePeriod(&PWMD6, 25000); - pwmEnableChannel(&PWMD6, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD6, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Disables PWM channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD6, 0); - pwmStop(&PWMD6); - - /* - * Disables and stops the ICU drivers. - */ - - icuDisable(&ICUD3); - icuStop(&ICUD3); - - palClearPad(PORT11, P11_LED3); - palClearPad(PORT11, P11_LED4); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/SPC564Axx/ICU-PWM/mcuconf.h b/testhal/SPC564Axx/ICU-PWM/mcuconf.h deleted file mode 100644 index a2e46cd16..000000000 --- a/testhal/SPC564Axx/ICU-PWM/mcuconf.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC564Axx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - */ - -#define SPC564Axx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_CLK_BYPASS FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_CLK_PREDIV_VALUE 2 -#define SPC5_CLK_MFD_VALUE 75 -#define SPC5_CLK_RFD SPC5_RFD_DIV2 -#define SPC5_FLASH_BIUCR (BIUCR_BANK1_TOO | \ - BIUCR_MASTER4_PREFETCH | \ - BIUCR_MASTER0_PREFETCH | \ - BIUCR_DPFEN | \ - BIUCR_IPFEN | \ - BIUCR_PFLIM_ON_MISS | \ - BIUCR_BFEN) - -/* - * ADC driver settings. - */ -#define SPC5_ADC_USE_ADC0_Q0 FALSE -#define SPC5_ADC_USE_ADC0_Q1 FALSE -#define SPC5_ADC_USE_ADC0_Q2 FALSE -#define SPC5_ADC_USE_ADC1_Q3 FALSE -#define SPC5_ADC_USE_ADC1_Q4 FALSE -#define SPC5_ADC_USE_ADC1_Q5 FALSE -#define SPC5_ADC_FIFO0_DMA_PRIO 12 -#define SPC5_ADC_FIFO1_DMA_PRIO 12 -#define SPC5_ADC_FIFO2_DMA_PRIO 12 -#define SPC5_ADC_FIFO3_DMA_PRIO 12 -#define SPC5_ADC_FIFO4_DMA_PRIO 12 -#define SPC5_ADC_FIFO5_DMA_PRIO 12 -#define SPC5_ADC_FIFO0_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO1_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO2_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO3_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO4_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO5_DMA_IRQ_PRIO 12 -#define SPC5_ADC_CR_CLK_PS ADC_CR_CLK_PS(5) -#define SPC5_ADC_PUDCR {ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE,ADC_PUDCR_NONE} - -/* - * SERIAL driver system settings. - */ -#define SPC5_USE_ESCIA TRUE -#define SPC5_USE_ESCIB FALSE -#define SPC5_ESCIA_PRIORITY 8 -#define SPC5_ESCIB_PRIORITY 8 - -/* - * ICU - PWM driver system settings. - */ -#define SPC5_ICU_USE_EMIOS_CH0 TRUE -#define SPC5_ICU_USE_EMIOS_CH1 TRUE -#define SPC5_ICU_USE_EMIOS_CH2 TRUE -#define SPC5_ICU_USE_EMIOS_CH3 TRUE -#define SPC5_ICU_USE_EMIOS_CH4 TRUE -#define SPC5_ICU_USE_EMIOS_CH5 TRUE -#define SPC5_ICU_USE_EMIOS_CH6 TRUE -#define SPC5_ICU_USE_EMIOS_CH7 TRUE -#define SPC5_ICU_USE_EMIOS_CH8 TRUE -#define SPC5_ICU_USE_EMIOS_CH16 TRUE -#define SPC5_ICU_USE_EMIOS_CH17 TRUE -#define SPC5_ICU_USE_EMIOS_CH18 TRUE - -#define SPC5_PWM_USE_EMIOS_CH9 TRUE -#define SPC5_PWM_USE_EMIOS_CH10 TRUE -#define SPC5_PWM_USE_EMIOS_CH11 TRUE -#define SPC5_PWM_USE_EMIOS_CH12 TRUE -#define SPC5_PWM_USE_EMIOS_CH13 TRUE -#define SPC5_PWM_USE_EMIOS_CH14 TRUE -#define SPC5_PWM_USE_EMIOS_CH15 TRUE -#define SPC5_PWM_USE_EMIOS_CH19 TRUE -#define SPC5_PWM_USE_EMIOS_CH20 TRUE -#define SPC5_PWM_USE_EMIOS_CH21 TRUE -#define SPC5_PWM_USE_EMIOS_CH22 TRUE -#define SPC5_PWM_USE_EMIOS_CH23 TRUE - -#define SPC5_EMIOS_GLOBAL_PRESCALER 200 diff --git a/testhal/SPC564Axx/ICU-PWM/readme.txt b/testhal/SPC564Axx/ICU-PWM/readme.txt deleted file mode 100644 index 01668f205..000000000 --- a/testhal/SPC564Axx/ICU-PWM/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ICU-PWM driver demo for SPC564Axx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC564Axx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC564Axx ICU and PWM drivers. - -** Board Setup ** - -Connect PIN65 and PIN78 together. - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC564Axx/SPI/.cproject b/testhal/SPC564Axx/SPI/.cproject deleted file mode 100644 index a4ae17c6d..000000000 --- a/testhal/SPC564Axx/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC564Axx/SPI/.project b/testhal/SPC564Axx/SPI/.project deleted file mode 100644 index bb29d6206..000000000 --- a/testhal/SPC564Axx/SPI/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC564Axx-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC564A - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC564Axx/SPI/Makefile b/testhal/SPC564Axx/SPI/Makefile deleted file mode 100644 index 200b9191d..000000000 --- a/testhal/SPC564Axx/SPI/Makefile +++ /dev/null @@ -1,168 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_EVB_SPC564A/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC564Axx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC564Axx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC564A70.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -D_SPC564A70L7_ - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/testhal/SPC564Axx/SPI/chconf.h b/testhal/SPC564Axx/SPI/chconf.h deleted file mode 100644 index dc956ef13..000000000 --- a/testhal/SPC564Axx/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC564Axx/SPI/halconf.h b/testhal/SPC564Axx/SPI/halconf.h deleted file mode 100644 index fdc079aef..000000000 --- a/testhal/SPC564Axx/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC564Axx/SPI/main.c b/testhal/SPC564Axx/SPI/main.c deleted file mode 100644 index 46378a5f8..000000000 --- a/testhal/SPC564Axx/SPI/main.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration. - */ -static const SPIConfig hs_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV2 | SPC5_CTAR_ASC_DIV2 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV2, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(1) /* PUSHR. */ -}; - -/* - * Low speed SPI configuration (328.125kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV64 | SPC5_CTAR_ASC_DIV64 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV256, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(0) /* PUSHR. */ -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palClearPad(PORT11, P11_LED1); /* LED ON. */ - spiStart(&SPID2, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palSetPad(PORT11, P11_LED1); /* LED OFF. */ - spiStart(&SPID2, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* Starting driver for test, DSPI_B I/O pins setup.*/ - spiStart(&SPID2, &ls_spicfg); - SIU.PCR[102].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SCK */ - SIU.PCR[103].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SIN */ - SIU.PCR[104].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SOUT */ - SIU.PCR[105].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* PCS[0] */ - SIU.PCR[106].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* PCS[1] */ - - /* Testing sending and receiving at the same time.*/ - spiExchange(&SPID2, 4, txbuf, rxbuf); - spiExchange(&SPID2, 32, txbuf, rxbuf); - spiExchange(&SPID2, 512, txbuf, rxbuf); - - /* Testing clock pulses without data buffering.*/ - spiIgnore(&SPID2, 4); - spiIgnore(&SPID2, 32); - - /* Testing sending data ignoring incoming data.*/ - spiSend(&SPID2, 4, txbuf); - spiSend(&SPID2, 32, txbuf); - - /* Testing receiving data while sending idle bits (high level).*/ - spiReceive(&SPID2, 4, rxbuf); - spiReceive(&SPID2, 32, rxbuf); - - /* Testing stop procedure.*/ - spiStop(&SPID2); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - palTogglePad(PORT11, P11_LED2); - } - return 0; -} diff --git a/testhal/SPC564Axx/SPI/mcuconf.h b/testhal/SPC564Axx/SPI/mcuconf.h deleted file mode 100644 index 2fccca076..000000000 --- a/testhal/SPC564Axx/SPI/mcuconf.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC563Mxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - * DMA priorities: - * 0...15 Highest...Lowest. - */ - -#define SPC564Axx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_CLK_BYPASS FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_CLK_PREDIV_VALUE 2 -#define SPC5_CLK_MFD_VALUE 75 -#define SPC5_CLK_RFD SPC5_RFD_DIV2 -#define SPC5_FLASH_BIUCR (BIUCR_BANK1_TOO | \ - BIUCR_MASTER4_PREFETCH | \ - BIUCR_MASTER0_PREFETCH | \ - BIUCR_DPFEN | \ - BIUCR_IPFEN | \ - BIUCR_PFLIM_ON_MISS | \ - BIUCR_BFEN) - -/* - * EDMA driver settings. - */ -#define SPC5_EDMA_CR_SETTING (EDMA_CR_GRP3PRI(3) | \ - EDMA_CR_GRP2PRI(2) | \ - EDMA_CR_GRP1PRI(1) | \ - EDMA_CR_GRP0PRI(0) | \ - EDMA_CR_ERGA) -#define SPC5_EDMA_GROUP0_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_GROUP1_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_GROUP2_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_GROUP3_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_ERROR_IRQ_PRIO 2 -#define SPC5_EDMA_ERROR_HANDLER() chSysHalt() - -/* - * ADC driver settings. - */ -#define SPC5_ADC_USE_ADC0_Q0 FALSE -#define SPC5_ADC_USE_ADC0_Q1 FALSE -#define SPC5_ADC_USE_ADC0_Q2 FALSE -#define SPC5_ADC_USE_ADC1_Q3 FALSE -#define SPC5_ADC_USE_ADC1_Q4 FALSE -#define SPC5_ADC_USE_ADC1_Q5 FALSE -#define SPC5_ADC_FIFO0_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO1_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO2_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO3_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO4_DMA_IRQ_PRIO 12 -#define SPC5_ADC_FIFO5_DMA_IRQ_PRIO 12 -#define SPC5_ADC_CR_CLK_PS ADC_CR_CLK_PS(10) -#define SPC5_ADC_PUDCR {ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE, \ - ADC_PUDCR_NONE} - -/* - * SERIAL driver system settings. - */ -#define SPC5_USE_ESCIA TRUE -#define SPC5_USE_ESCIB TRUE -#define SPC5_USE_ESCIC TRUE -#define SPC5_ESCIA_PRIORITY 8 -#define SPC5_ESCIB_PRIORITY 8 -#define SPC5_ESCIC_PRIORITY 8 - -/* - * SPI driver system settings. - */ -#define SPC5_SPI_USE_DSPI1 TRUE -#define SPC5_SPI_USE_DSPI2 TRUE -#define SPC5_SPI_USE_DSPI3 TRUE -#define SPC5_SPI_DSPI1_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI2_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI3_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI1_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI3_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_IRQ_PRIO 10 -#define SPC5_SPI_DSPI3_IRQ_PRIO 10 -#define SPC5_SPI_DMA_ERROR_HOOK(spip) chSysHalt() diff --git a/testhal/SPC564Axx/SPI/readme.txt b/testhal/SPC564Axx/SPI/readme.txt deleted file mode 100644 index cd9368fb1..000000000 --- a/testhal/SPC564Axx/SPI/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for SPC564Axx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC564Axx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC564Axx SPI driver. - -** Board Setup ** - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC56ELxx/CAN/.cproject b/testhal/SPC56ELxx/CAN/.cproject deleted file mode 100644 index dd958292f..000000000 --- a/testhal/SPC56ELxx/CAN/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC56ELxx/CAN/.project b/testhal/SPC56ELxx/CAN/.project deleted file mode 100644 index 80fb08c6f..000000000 --- a/testhal/SPC56ELxx/CAN/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC56ELxx-PWM-ICU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC56EL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC56ELxx/CAN/Makefile b/testhal/SPC56ELxx/CAN/Makefile deleted file mode 100644 index 79d8dd648..000000000 --- a/testhal/SPC56ELxx/CAN/Makefile +++ /dev/null @@ -1,139 +0,0 @@ -############################################################################## -# This file is automatically generated and can be overwritten, do no change -# this file manually. -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -fno-exceptions -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = out - -# Imported source files -include components/components.mak - -# Checks if there is a user mak file in the project directory. -ifneq ($(wildcard user.mak),) - include user.mak -endif - -# Define linker script file here -LDSCRIPT= application.ld - -# C sources here. -CSRC = $(LIB_C_SRC) \ - $(APP_C_SRC) \ - $(U_C_SRC) \ - ./components/components.c \ - ./main.c - -# C++ sources here. -CPPSRC = $(LIB_CPP_SRC) \ - $(APP_CPP_SRC) \ - $(U_CPP_SRC) - -# List ASM source files here -ASMSRC = $(LIB_ASM_SRC) \ - $(APP_ASM_SRC) \ - $(U_ASM_SRC) - -INCDIR = $(LIB_INCLUDES) \ - $(APP_INCLUDES) \ - ./components - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = -DSPC56EL60L3 - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -include C:/SPC5Studio/eclipse/plugins/com.st.tools.spc5.components.platform.spc56elxx_1.0.0.201302201417/component/lib/rsc/rules.mk diff --git a/testhal/SPC56ELxx/CAN/chconf.h b/testhal/SPC56ELxx/CAN/chconf.h deleted file mode 100644 index 8800269d4..000000000 --- a/testhal/SPC56ELxx/CAN/chconf.h +++ /dev/null @@ -1,529 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC56ELxx/CAN/halconf.h b/testhal/SPC56ELxx/CAN/halconf.h deleted file mode 100644 index 7c9fe78a8..000000000 --- a/testhal/SPC56ELxx/CAN/halconf.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @name Drivers enable switches - */ -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name ADC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name CAN driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name I2C driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MAC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MMC_SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SDC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 1 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL_USB driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 64 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC56ELxx/CAN/main.c b/testhal/SPC56ELxx/CAN/main.c deleted file mode 100644 index a0750898a..000000000 --- a/testhal/SPC56ELxx/CAN/main.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -struct can_instance { - CANDriver *canp; - uint32_t led; -}; - -static const struct can_instance can1 = {&CAND1, PD_LED1}; - -/* - * Internal loopback mode, 1MBaud. - * See chapter 25 on the SPC5 reference manual. - */ -static const CANConfig cancfg = { - CAN_MCR_WRN_EN, - CAN_CTRL_LPB | CAN_CTRL_PROPSEG(2) | CAN_CTRL_PSEG2(7) | - CAN_CTRL_PSEG1(3) | CAN_CTRL_PRESDIV(3) -#if SPC5_CAN_USE_FILTERS - , - { - {0, 0x00000001}, - {1, 0x01234567}, - {0, 0x00000000}, - {0, 0x00000003}, - {0, 0x00000004}, - {0, 0x00000005}, - {0, 0x00000006}, - {0, 0x00000007} - } -#endif -}; - -#if SPC5_CAN_USE_FILTERS -flagsmask_t rxFlag; -#endif - -/* - * Receiver thread. - */ -static WORKING_AREA(can_rx_wa, 256); -static msg_t can_rx(void *p) { - struct can_instance *cip = p; - EventListener el; - CANRxFrame rxmsg; - (void)p; - chRegSetThreadName("receiver"); - chEvtRegister(&cip->canp->rxfull_event, &el, 0); -#if SPC5_CAN_USE_FILTERS - rxFlag = chEvtGetAndClearFlagsI(&el); -#endif - while(!chThdShouldTerminate()) { - if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) - continue; -#if !SPC5_CAN_USE_FILTERS - while (canReceive(cip->canp, CAN_ANY_MAILBOX, - &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(PORT_D, cip->led); - } -#else - while (canReceive(cip->canp, rxFlag, - &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(PORT_D, cip->led); - } -#endif - } - chEvtUnregister(&CAND1.rxfull_event, &el); - return 0; -} - -/* - * Transmitter thread. - */ -static WORKING_AREA(can_tx_wa, 256); -static msg_t can_tx(void * p) { - CANTxFrame txmsg; - - (void)p; - chRegSetThreadName("transmitter"); - txmsg.IDE = CAN_IDE_EXT; - txmsg.EID = 0x01234567; - txmsg.RTR = CAN_RTR_DATA; - txmsg.LENGTH = 8; - txmsg.data32[0] = 0x55AA55AA; - txmsg.data32[1] = 0x00FF00FF; - - while (!chThdShouldTerminate()) { - canTransmit(&CAND1, 1, &txmsg, MS2ST(100)); - palTogglePad(PORT_D, PD_LED2); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the CAN driver 1. - */ - canStart(&CAND1, &cancfg); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(can_rx_wa, sizeof(can_rx_wa), NORMALPRIO + 7, - can_rx, (void *)&can1); - chThdCreateStatic(can_tx_wa, sizeof(can_tx_wa), NORMALPRIO + 7, - can_tx, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/SPC56ELxx/CAN/mcuconf.h b/testhal/SPC56ELxx/CAN/mcuconf.h deleted file mode 100644 index 212082fc9..000000000 --- a/testhal/SPC56ELxx/CAN/mcuconf.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Licensed under ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * SPC56ELxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - */ - -#define SPC56ELxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_DISABLE_WATCHDOG TRUE -#define SPC5_FMPLL0_CLK_SRC SPC5_FMPLL_SRC_XOSC -#define SPC5_FMPLL0_IDF_VALUE 5 -#define SPC5_FMPLL0_NDIV_VALUE 32 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_FMPLL1_CLK_SRC SPC5_FMPLL_SRC_XOSC -#define SPC5_FMPLL1_IDF_VALUE 5 -#define SPC5_FMPLL1_NDIV_VALUE 60 -#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_SYSCLK_DIVIDER_VALUE 2 -#define SPC5_AUX0CLK_SRC SPC5_CGM_SS_FMPLL0 -#define SPC5_MCONTROL_DIVIDER_VALUE 2 -#define SPC5_SWG_DIVIDER_VALUE 2 -#define SPC5_AUX1CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_FLEXRAY_DIVIDER_VALUE 2 -#define SPC5_AUX2CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_FLEXCAN_DIVIDER_VALUE 2 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_CLOCK_FAILURE_HOOK() chSysHalt() - -/* - * SERIAL driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * PWM driver system settings. - */ -#define SPC5_PWM_USE_SMOD0 TRUE -#define SPC5_PWM_USE_SMOD1 FALSE -#define SPC5_PWM_USE_SMOD2 FALSE -#define SPC5_PWM_USE_SMOD3 FALSE -#define SPC5_PWM_SMOD0_PRIORITY 7 -#define SPC5_PWM_SMOD1_PRIORITY 7 -#define SPC5_PWM_SMOD2_PRIORITY 7 -#define SPC5_PWM_SMOD3_PRIORITY 7 -#define SPC5_PWM_FLEXPWM0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_PWM_FLEXPWM0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_PWM_USE_SMOD4 FALSE -#define SPC5_PWM_USE_SMOD5 FALSE -#define SPC5_PWM_USE_SMOD6 FALSE -#define SPC5_PWM_USE_SMOD7 FALSE -#define SPC5_PWM_SMOD4_PRIORITY 7 -#define SPC5_PWM_SMOD5_PRIORITY 7 -#define SPC5_PWM_SMOD6_PRIORITY 7 -#define SPC5_PWM_SMOD7_PRIORITY 7 -#define SPC5_PWM_FLEXPWM1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_PWM_FLEXPWM1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * ICU driver system settings. - */ -#define SPC5_ICU_USE_SMOD0 TRUE -#define SPC5_ICU_USE_SMOD1 FALSE -#define SPC5_ICU_USE_SMOD2 FALSE -#define SPC5_ICU_USE_SMOD3 FALSE -#define SPC5_ICU_USE_SMOD4 FALSE -#define SPC5_ICU_USE_SMOD5 FALSE -#define SPC5_ICU_ETIMER0_PRIORITY 7 -#define SPC5_ICU_ETIMER0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_ICU_USE_SMOD6 FALSE -#define SPC5_ICU_USE_SMOD7 FALSE -#define SPC5_ICU_USE_SMOD8 FALSE -#define SPC5_ICU_USE_SMOD9 FALSE -#define SPC5_ICU_USE_SMOD10 FALSE -#define SPC5_ICU_USE_SMOD11 FALSE -#define SPC5_ICU_ETIMER1_PRIORITY 7 -#define SPC5_ICU_ETIMER1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_ICU_USE_SMOD12 FALSE -#define SPC5_ICU_USE_SMOD13 FALSE -#define SPC5_ICU_USE_SMOD14 FALSE -#define SPC5_ICU_USE_SMOD15 FALSE -#define SPC5_ICU_USE_SMOD16 FALSE -#define SPC5_ICU_USE_SMOD17 TRUE -#define SPC5_ICU_ETIMER2_PRIORITY 7 -#define SPC5_ICU_ETIMER2_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER2_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * CAN driver system settings. - */ -#define SPC5_CAN_USE_FILTERS TRUE - -#define SPC5_CAN_USE_FLEXCAN0 TRUE -#define SPC5_CAN_FLEXCAN0_PRIORITY 11 -#define SPC5_CAN_FLEXCAN0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_CAN_FLEXCAN0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_CAN_USE_FLEXCAN1 FALSE -#define SPC5_CAN_FLEXCAN1_PRIORITY 11 -#define SPC5_CAN_FLEXCAN1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_CAN_FLEXCAN1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/testhal/SPC56ELxx/CAN/readme.txt b/testhal/SPC56ELxx/CAN/readme.txt deleted file mode 100644 index 036a5502e..000000000 --- a/testhal/SPC56ELxx/CAN/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - CAN drivers demo for SPC56ELxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC56ELxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC56ELxx CAN drivers. - -** Board Setup ** - -- Enable LED1 and LED2. - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC56ELxx/PWM-ICU/.cproject b/testhal/SPC56ELxx/PWM-ICU/.cproject deleted file mode 100644 index dd958292f..000000000 --- a/testhal/SPC56ELxx/PWM-ICU/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC56ELxx/PWM-ICU/.project b/testhal/SPC56ELxx/PWM-ICU/.project deleted file mode 100644 index 80fb08c6f..000000000 --- a/testhal/SPC56ELxx/PWM-ICU/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC56ELxx-PWM-ICU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC56EL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC56ELxx/PWM-ICU/Makefile b/testhal/SPC56ELxx/PWM-ICU/Makefile deleted file mode 100644 index a6f7718ca..000000000 --- a/testhal/SPC56ELxx/PWM-ICU/Makefile +++ /dev/null @@ -1,167 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_EVB_SPC56EL/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC56ELxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC56ELxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC56EL60_LSM.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/testhal/SPC56ELxx/PWM-ICU/chconf.h b/testhal/SPC56ELxx/PWM-ICU/chconf.h deleted file mode 100644 index 50d8024a1..000000000 --- a/testhal/SPC56ELxx/PWM-ICU/chconf.h +++ /dev/null @@ -1,525 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC56ELxx/PWM-ICU/halconf.h b/testhal/SPC56ELxx/PWM-ICU/halconf.h deleted file mode 100644 index 09022b9e7..000000000 --- a/testhal/SPC56ELxx/PWM-ICU/halconf.h +++ /dev/null @@ -1,367 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @name Drivers enable switches - */ -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name ADC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name CAN driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name I2C driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MAC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name MMC_SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SDC driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 1 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SERIAL_USB driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 64 -#endif -/** @} */ - -/*===========================================================================*/ -/** - * @name SPI driver related setting - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION FALSE -#endif -/** @} */ - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC56ELxx/PWM-ICU/main.c b/testhal/SPC56ELxx/PWM-ICU/main.c deleted file mode 100644 index e6ac6281f..000000000 --- a/testhal/SPC56ELxx/PWM-ICU/main.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(PORT_D, PD_LED1); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(PORT_D, PD_LED1); -} - -static PWMConfig pwmcfg = { - 250000, /* 250kHz PWM clock frequency.*/ - 50000, /* Initial PWM period 0.2s.*/ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL} - }, - PWM_ALIGN_EDGE -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(PORT_D, PD_LED2); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(PORT_D, PD_LED2); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 250000, /* 250kHz ICU clock frequency.*/ - icuwidthcb, - icuperiodcb, - NULL -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - /* - * Initializes the PWM driver 1 and ICU driver 1. - * GPIOD10 is the PWM output. - * GPIOA0 is the ICU input. - * The two pins have to be externally connected together. - */ - icuStart(&ICUD1, &icucfg); - icuEnable(&ICUD1); - - /* Sets A0 alternative function.*/ - SIU.PCR[0].R = 0b0100010100000100; - - pwmStart(&PWMD1, &pwmcfg); - /* Sets D10 alternative function.*/ - SIU.PCR[58].R = 0b0100010100000100; - - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period and the PWM channel 0 to 50% duty cycle. - */ - pwmChangePeriod(&PWMD1, 25000); - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD1, 0); - pwmStop(&PWMD1); - icuDisable(&ICUD1); - icuStop(&ICUD1); - palClearPad(PORT_D, PD_LED3); - palClearPad(PORT_D, PD_LED4); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/SPC56ELxx/PWM-ICU/mcuconf.h b/testhal/SPC56ELxx/PWM-ICU/mcuconf.h deleted file mode 100644 index 221ad245e..000000000 --- a/testhal/SPC56ELxx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,280 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC56ELxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - * DMA priorities: - * 0...15 Highest...Lowest. - */ - -#define SPC56ELxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_DISABLE_WATCHDOG TRUE -#define SPC5_FMPLL0_CLK_SRC SPC5_FMPLL_SRC_XOSC -#define SPC5_FMPLL0_IDF_VALUE 5 -#define SPC5_FMPLL0_NDIV_VALUE 60 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_FMPLL1_CLK_SRC SPC5_FMPLL_SRC_XOSC -#define SPC5_FMPLL1_IDF_VALUE 5 -#define SPC5_FMPLL1_NDIV_VALUE 60 -#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_SYSCLK_DIVIDER_VALUE 2 -#define SPC5_AUX0CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_MCONTROL_DIVIDER_VALUE 15 -#define SPC5_SWG_DIVIDER_VALUE 2 -#define SPC5_AUX1CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_FLEXRAY_DIVIDER_VALUE 2 -#define SPC5_AUX2CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_FLEXCAN_DIVIDER_VALUE 2 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_CLOCK_FAILURE_HOOK() chSysHalt() - -/* - * EDMA driver settings. - */ -#define SPC5_EDMA_CR_SETTING 0 -#define SPC5_EDMA_GROUP0_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_ERROR_IRQ_PRIO 2 -#define SPC5_EDMA_ERROR_HANDLER() chSysHalt() - -/* - * SERIAL driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * PWM driver system settings. - */ -#define SPC5_PWM_USE_SMOD0 TRUE -#define SPC5_PWM_USE_SMOD1 FALSE -#define SPC5_PWM_USE_SMOD2 FALSE -#define SPC5_PWM_USE_SMOD3 FALSE -#define SPC5_PWM_SMOD0_PRIORITY 7 -#define SPC5_PWM_SMOD1_PRIORITY 7 -#define SPC5_PWM_SMOD2_PRIORITY 7 -#define SPC5_PWM_SMOD3_PRIORITY 7 -#define SPC5_PWM_FLEXPWM0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_PWM_FLEXPWM0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_PWM_USE_SMOD4 FALSE -#define SPC5_PWM_USE_SMOD5 FALSE -#define SPC5_PWM_USE_SMOD6 FALSE -#define SPC5_PWM_USE_SMOD7 FALSE -#define SPC5_PWM_SMOD4_PRIORITY 7 -#define SPC5_PWM_SMOD5_PRIORITY 7 -#define SPC5_PWM_SMOD6_PRIORITY 7 -#define SPC5_PWM_SMOD7_PRIORITY 7 -#define SPC5_PWM_FLEXPWM1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_PWM_FLEXPWM1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * ICU driver system settings. - */ -#define SPC5_ICU_USE_SMOD0 TRUE -#define SPC5_ICU_USE_SMOD1 FALSE -#define SPC5_ICU_USE_SMOD2 FALSE -#define SPC5_ICU_USE_SMOD3 FALSE -#define SPC5_ICU_USE_SMOD4 FALSE -#define SPC5_ICU_USE_SMOD5 FALSE -#define SPC5_ICU_ETIMER0_PRIORITY 7 -#define SPC5_ICU_ETIMER0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_ICU_USE_SMOD6 FALSE -#define SPC5_ICU_USE_SMOD7 FALSE -#define SPC5_ICU_USE_SMOD8 FALSE -#define SPC5_ICU_USE_SMOD9 FALSE -#define SPC5_ICU_USE_SMOD10 FALSE -#define SPC5_ICU_USE_SMOD11 FALSE -#define SPC5_ICU_ETIMER1_PRIORITY 7 -#define SPC5_ICU_ETIMER1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_ICU_USE_SMOD12 FALSE -#define SPC5_ICU_USE_SMOD13 FALSE -#define SPC5_ICU_USE_SMOD14 FALSE -#define SPC5_ICU_USE_SMOD15 FALSE -#define SPC5_ICU_USE_SMOD16 FALSE -#define SPC5_ICU_USE_SMOD17 TRUE -#define SPC5_ICU_ETIMER2_PRIORITY 7 -#define SPC5_ICU_ETIMER2_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER2_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * SPI driver system settings. - */ -#define SPC5_SPI_USE_DSPI0 FALSE -#define SPC5_SPI_USE_DSPI1 FALSE -#define SPC5_SPI_USE_DSPI2 FALSE -#define SPC5_SPI_DSPI0_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI1_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI2_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI0_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI0_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_IRQ_PRIO 10 -#define SPC5_SPI_DMA_ERROR_HOOK(spip) chSysHalt() -#define SPC5_SPI_DSPI0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI2_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI2_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/testhal/SPC56ELxx/PWM-ICU/readme.txt b/testhal/SPC56ELxx/PWM-ICU/readme.txt deleted file mode 100644 index b17dba82f..000000000 --- a/testhal/SPC56ELxx/PWM-ICU/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM/ICU drivers demo for SPC56ELxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC56ELxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC56ELxx PWM-ICU drivers. - -** Board Setup ** - -- Connect D10 and A0 together. - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/SPC56ELxx/SPI/.cproject b/testhal/SPC56ELxx/SPI/.cproject deleted file mode 100644 index a4ae17c6d..000000000 --- a/testhal/SPC56ELxx/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/SPC56ELxx/SPI/.project b/testhal/SPC56ELxx/SPI/.project deleted file mode 100644 index c5157f21e..000000000 --- a/testhal/SPC56ELxx/SPI/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - SPC56ELxx-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_EVB_SPC56EL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/SPC56ELxx/SPI/Makefile b/testhal/SPC56ELxx/SPI/Makefile deleted file mode 100644 index afc709b93..000000000 --- a/testhal/SPC56ELxx/SPI/Makefile +++ /dev/null @@ -1,168 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# If enabled, this option allows to compile the application in VLE mode. -ifeq ($(USE_VLE),) - USE_VLE = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_EVB_SPC56EL/board.mk -include $(CHIBIOS)/os/hal/platforms/SPC56ELxx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/PPC/SPC56ELxx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/SPC56EL60_LSM.ld - -# C sources here. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources here. -CPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -#MCU = e500mc -meabi -msdata=none -mnew-mnemonics -mregnames -MCU = e200zx -meabi -msdata=none -mnew-mnemonics -mregnames - -#TRGT = powerpc-eabi- -TRGT = ppc-vle- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = -D_SPC560P50L5_ - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -include $(CHIBIOS)/os/ports/GCC/PPC/rules.mk diff --git a/testhal/SPC56ELxx/SPI/chconf.h b/testhal/SPC56ELxx/SPI/chconf.h deleted file mode 100644 index dc956ef13..000000000 --- a/testhal/SPC56ELxx/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC56ELxx/SPI/halconf.h b/testhal/SPC56ELxx/SPI/halconf.h deleted file mode 100644 index fdc079aef..000000000 --- a/testhal/SPC56ELxx/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/SPC56ELxx/SPI/main.c b/testhal/SPC56ELxx/SPI/main.c deleted file mode 100644 index ef283f656..000000000 --- a/testhal/SPC56ELxx/SPI/main.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration. - */ -static const SPIConfig hs_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV2 | SPC5_CTAR_ASC_DIV2 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV2, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(1) /* PUSHR. */ -}; - -/* - * Low speed SPI configuration. - */ -static const SPIConfig ls_spicfg = { - NULL, - 0, - 0, - SPC5_CTAR_CSSCK_DIV64 | SPC5_CTAR_ASC_DIV64 | SPC5_CTAR_FMSZ(8) | - SPC5_CTAR_PBR_PRE2 | SPC5_CTAR_BR_DIV256, /* CTAR0. */ - SPC5_PUSHR_CONT | SPC5_PUSHR_PCS(0) /* PUSHR. */ -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palClearPad(PORT_D, PD_LED1); /* LED ON. */ - spiStart(&SPID1, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palSetPad(PORT_D, PD_LED1); /* LED OFF. */ - spiStart(&SPID1, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* Starting driver for test, DSPI_0 I/O pins setup.*/ - spiStart(&SPID1, &ls_spicfg); - SIU.PCR[37].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SCK */ - SIU.PCR[38].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SOUT */ - SIU.PCR[36].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* CS[0] */ - SIU.PCR[54].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* CS[2] */ - - /* Testing sending and receiving at the same time.*/ - spiExchange(&SPID1, 4, txbuf, rxbuf); - spiExchange(&SPID1, 32, txbuf, rxbuf); - spiExchange(&SPID1, 512, txbuf, rxbuf); - - /* Testing clock pulses without data buffering.*/ - spiIgnore(&SPID1, 4); - spiIgnore(&SPID1, 32); - - /* Testing sending data ignoring incoming data.*/ - spiSend(&SPID1, 4, txbuf); - spiSend(&SPID1, 32, txbuf); - - /* Testing receiving data while sending idle bits (high level).*/ - spiReceive(&SPID1, 4, rxbuf); - spiReceive(&SPID1, 32, rxbuf); - - /* Testing stop procedure.*/ - spiStop(&SPID1); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - palTogglePad(PORT_D, PD_LED2); - } - return 0; -} diff --git a/testhal/SPC56ELxx/SPI/mcuconf.h b/testhal/SPC56ELxx/SPI/mcuconf.h deleted file mode 100644 index 322a9be56..000000000 --- a/testhal/SPC56ELxx/SPI/mcuconf.h +++ /dev/null @@ -1,280 +0,0 @@ -/* - SPC5 HAL - Copyright (C) 2013 STMicroelectronics - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * SPC56ELxx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 1...15 Lowest...Highest. - * DMA priorities: - * 0...15 Highest...Lowest. - */ - -#define SPC56ELxx_MCUCONF - -/* - * HAL driver system settings. - */ -#define SPC5_NO_INIT FALSE -#define SPC5_ALLOW_OVERCLOCK FALSE -#define SPC5_DISABLE_WATCHDOG TRUE -#define SPC5_FMPLL0_CLK_SRC SPC5_FMPLL_SRC_XOSC -#define SPC5_FMPLL0_IDF_VALUE 5 -#define SPC5_FMPLL0_NDIV_VALUE 60 -#define SPC5_FMPLL0_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_FMPLL1_CLK_SRC SPC5_FMPLL_SRC_XOSC -#define SPC5_FMPLL1_IDF_VALUE 5 -#define SPC5_FMPLL1_NDIV_VALUE 60 -#define SPC5_FMPLL1_ODF SPC5_FMPLL_ODF_DIV4 -#define SPC5_SYSCLK_DIVIDER_VALUE 2 -#define SPC5_AUX0CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_MCONTROL_DIVIDER_VALUE 15 -#define SPC5_SWG_DIVIDER_VALUE 2 -#define SPC5_AUX1CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_FLEXRAY_DIVIDER_VALUE 2 -#define SPC5_AUX2CLK_SRC SPC5_CGM_SS_FMPLL1 -#define SPC5_FLEXCAN_DIVIDER_VALUE 2 -#define SPC5_ME_ME_BITS (SPC5_ME_ME_RUN1 | \ - SPC5_ME_ME_RUN2 | \ - SPC5_ME_ME_RUN3 | \ - SPC5_ME_ME_HALT0 | \ - SPC5_ME_ME_STOP0) -#define SPC5_ME_SAFE_MC_BITS (SPC5_ME_MC_PDO) -#define SPC5_ME_DRUN_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN1_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN2_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN3_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_HALT0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_STOP0_MC_BITS (SPC5_ME_MC_SYSCLK_FMPLL0 | \ - SPC5_ME_MC_IRCON | \ - SPC5_ME_MC_XOSC0ON | \ - SPC5_ME_MC_PLL0ON | \ - SPC5_ME_MC_PLL1ON | \ - SPC5_ME_MC_FLAON_NORMAL | \ - SPC5_ME_MC_MVRON) -#define SPC5_ME_RUN_PC3_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC4_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC5_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC6_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_RUN_PC7_BITS (SPC5_ME_RUN_PC_RUN0 | \ - SPC5_ME_RUN_PC_RUN1 | \ - SPC5_ME_RUN_PC_RUN2 | \ - SPC5_ME_RUN_PC_RUN3) -#define SPC5_ME_LP_PC4_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC5_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC6_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_ME_LP_PC7_BITS (SPC5_ME_LP_PC_HALT0 | \ - SPC5_ME_LP_PC_STOP0) -#define SPC5_CLOCK_FAILURE_HOOK() chSysHalt() - -/* - * EDMA driver settings. - */ -#define SPC5_EDMA_CR_SETTING 0 -#define SPC5_EDMA_GROUP0_PRIORITIES \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 -#define SPC5_EDMA_ERROR_IRQ_PRIO 2 -#define SPC5_EDMA_ERROR_HANDLER() chSysHalt() - -/* - * SERIAL driver system settings. - */ -#define SPC5_SERIAL_USE_LINFLEX0 TRUE -#define SPC5_SERIAL_USE_LINFLEX1 TRUE -#define SPC5_SERIAL_LINFLEX0_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX1_PRIORITY 8 -#define SPC5_SERIAL_LINFLEX0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SERIAL_LINFLEX1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SERIAL_LINFLEX1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * PWM driver system settings. - */ -#define SPC5_PWM_USE_SMOD0 FALSE -#define SPC5_PWM_USE_SMOD1 FALSE -#define SPC5_PWM_USE_SMOD2 FALSE -#define SPC5_PWM_USE_SMOD3 FALSE -#define SPC5_PWM_SMOD0_PRIORITY 7 -#define SPC5_PWM_SMOD1_PRIORITY 7 -#define SPC5_PWM_SMOD2_PRIORITY 7 -#define SPC5_PWM_SMOD3_PRIORITY 7 -#define SPC5_PWM_FLEXPWM0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_PWM_FLEXPWM0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_PWM_USE_SMOD4 FALSE -#define SPC5_PWM_USE_SMOD5 FALSE -#define SPC5_PWM_USE_SMOD6 FALSE -#define SPC5_PWM_USE_SMOD7 FALSE -#define SPC5_PWM_SMOD4_PRIORITY 7 -#define SPC5_PWM_SMOD5_PRIORITY 7 -#define SPC5_PWM_SMOD6_PRIORITY 7 -#define SPC5_PWM_SMOD7_PRIORITY 7 -#define SPC5_PWM_FLEXPWM1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_PWM_FLEXPWM1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * ICU driver system settings. - */ -#define SPC5_ICU_USE_SMOD0 FALSE -#define SPC5_ICU_USE_SMOD1 FALSE -#define SPC5_ICU_USE_SMOD2 FALSE -#define SPC5_ICU_USE_SMOD3 FALSE -#define SPC5_ICU_USE_SMOD4 FALSE -#define SPC5_ICU_USE_SMOD5 FALSE -#define SPC5_ICU_ETIMER0_PRIORITY 7 -#define SPC5_ICU_ETIMER0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_ICU_USE_SMOD6 FALSE -#define SPC5_ICU_USE_SMOD7 FALSE -#define SPC5_ICU_USE_SMOD8 FALSE -#define SPC5_ICU_USE_SMOD9 FALSE -#define SPC5_ICU_USE_SMOD10 FALSE -#define SPC5_ICU_USE_SMOD11 FALSE -#define SPC5_ICU_ETIMER1_PRIORITY 7 -#define SPC5_ICU_ETIMER1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -#define SPC5_ICU_USE_SMOD12 FALSE -#define SPC5_ICU_USE_SMOD13 FALSE -#define SPC5_ICU_USE_SMOD14 FALSE -#define SPC5_ICU_USE_SMOD15 FALSE -#define SPC5_ICU_USE_SMOD16 FALSE -#define SPC5_ICU_USE_SMOD17 TRUE -#define SPC5_ICU_ETIMER2_PRIORITY 7 -#define SPC5_ICU_ETIMER2_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_ICU_ETIMER2_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) - -/* - * SPI driver system settings. - */ -#define SPC5_SPI_USE_DSPI0 TRUE -#define SPC5_SPI_USE_DSPI1 TRUE -#define SPC5_SPI_USE_DSPI2 TRUE -#define SPC5_SPI_DSPI0_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI1_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI2_MCR (SPC5_MCR_PCSIS0 | \ - SPC5_MCR_PCSIS1 | \ - SPC5_MCR_PCSIS2 | \ - SPC5_MCR_PCSIS3 | \ - SPC5_MCR_PCSIS4 | \ - SPC5_MCR_PCSIS5 | \ - SPC5_MCR_PCSIS6 | \ - SPC5_MCR_PCSIS7) -#define SPC5_SPI_DSPI0_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_DMA_IRQ_PRIO 10 -#define SPC5_SPI_DSPI0_IRQ_PRIO 10 -#define SPC5_SPI_DSPI1_IRQ_PRIO 10 -#define SPC5_SPI_DSPI2_IRQ_PRIO 10 -#define SPC5_SPI_DMA_ERROR_HOOK(spip) chSysHalt() -#define SPC5_SPI_DSPI0_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI0_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI1_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI1_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) -#define SPC5_SPI_DSPI2_START_PCTL (SPC5_ME_PCTL_RUN(1) | \ - SPC5_ME_PCTL_LP(2)) -#define SPC5_SPI_DSPI2_STOP_PCTL (SPC5_ME_PCTL_RUN(0) | \ - SPC5_ME_PCTL_LP(0)) diff --git a/testhal/SPC56ELxx/SPI/readme.txt b/testhal/SPC56ELxx/SPI/readme.txt deleted file mode 100644 index 96da3df24..000000000 --- a/testhal/SPC56ELxx/SPI/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for SPC56ELxx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics SPC56ELxx microcontroller installed on -XPC56xx EVB Motherboard. - -** The Demo ** - -The application demonstrates the use of the SPC56ELxx SPI driver. - -** Board Setup ** - -** Build Procedure ** - -The demo has been tested using HighTec compiler. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. - - http://www.st.com diff --git a/testhal/STM32F0xx/ADC/.cproject b/testhal/STM32F0xx/ADC/.cproject deleted file mode 100644 index a3fb831a8..000000000 --- a/testhal/STM32F0xx/ADC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F0xx/ADC/.project b/testhal/STM32F0xx/ADC/.project deleted file mode 100644 index 4aa2b6463..000000000 --- a/testhal/STM32F0xx/ADC/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F0xx-ADC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F0_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F0xx/ADC/Makefile b/testhal/STM32F0xx/ADC/Makefile deleted file mode 100644 index 0b2d556fb..000000000 --- a/testhal/STM32F0xx/ADC/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/ADC/chconf.h b/testhal/STM32F0xx/ADC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F0xx/ADC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/ADC/halconf.h b/testhal/STM32F0xx/ADC/halconf.h deleted file mode 100644 index a719ec40a..000000000 --- a/testhal/STM32F0xx/ADC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/ADC/main.c b/testhal/STM32F0xx/ADC/main.c deleted file mode 100644 index 90b05df1a..000000000 --- a/testhal/STM32F0xx/ADC/main.c +++ /dev/null @@ -1,152 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 4 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: IN10. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - ADC_CFGR1_RES_12BIT, /* CFGRR1 */ - ADC_TR(0, 0), /* TR */ - ADC_SMPR_SMP_1P5, /* SMPR */ - ADC_CHSELR_CHSEL10 /* CHSELR */ -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN10, IN11, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - ADC_CFGR1_RES_12BIT, /* CFGRR1 */ - ADC_TR(0, 0), /* TR */ - ADC_SMPR_SMP_28P5, /* SMPR */ - ADC_CHSELR_CHSEL10 | ADC_CHSELR_CHSEL11 | - ADC_CHSELR_CHSEL16 | ADC_CHSELR_CHSEL17 /* CHSELR */ -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOC, GPIOC_LED4); - chThdSleepMilliseconds(500); - palClearPad(GPIOC, GPIOC_LED4); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(0) | PAL_PORT_BIT(1), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the temperature sensor. - */ - adcStart(&ADCD1, NULL); - adcSTM32SetCCR(ADC_CCR_VBATEN | ADC_CCR_TSEN | ADC_CCR_VREFEN); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - adcStopConversion(&ADCD1); - adcSTM32SetCCR(0); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F0xx/ADC/mcuconf.h b/testhal/STM32F0xx/ADC/mcuconf.h deleted file mode 100644 index cca199b9c..000000000 --- a/testhal/STM32F0xx/ADC/mcuconf.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/ADC/readme.txt b/testhal/STM32F0xx/ADC/readme.txt deleted file mode 100644 index 704ffb1a6..000000000 --- a/testhal/STM32F0xx/ADC/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx ADC driver. - -** Board Setup ** - -- Remove the LCD module. -- Connect PC0 to 3.3V and PC1 to GND for analog measurements. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F0xx/EXT/.cproject b/testhal/STM32F0xx/EXT/.cproject deleted file mode 100644 index 818c355d4..000000000 --- a/testhal/STM32F0xx/EXT/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F0xx/EXT/.project b/testhal/STM32F0xx/EXT/.project deleted file mode 100644 index 301651983..000000000 --- a/testhal/STM32F0xx/EXT/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F0xx-EXT - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F0_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F0xx/EXT/Makefile b/testhal/STM32F0xx/EXT/Makefile deleted file mode 100644 index 0b2d556fb..000000000 --- a/testhal/STM32F0xx/EXT/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/EXT/chconf.h b/testhal/STM32F0xx/EXT/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F0xx/EXT/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/EXT/halconf.h b/testhal/STM32F0xx/EXT/halconf.h deleted file mode 100644 index 1069ba5c1..000000000 --- a/testhal/STM32F0xx/EXT/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/EXT/main.c b/testhal/STM32F0xx/EXT/main.c deleted file mode 100644 index cdba37eff..000000000 --- a/testhal/STM32F0xx/EXT/main.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void led4off(void *arg) { - - (void)arg; - palClearPad(GPIOC, GPIOC_LED4); -} - -/* Triggered when the button is pressed or released. The LED4 is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - palSetPad(GPIOC, GPIOC_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - /* LED4 set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), led4off, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32F0xx/EXT/mcuconf.h b/testhal/STM32F0xx/EXT/mcuconf.h deleted file mode 100644 index ea61b3dec..000000000 --- a/testhal/STM32F0xx/EXT/mcuconf.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/EXT/readme.txt b/testhal/STM32F0xx/EXT/readme.txt deleted file mode 100644 index 542fc577e..000000000 --- a/testhal/STM32F0xx/EXT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx EXT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F0xx/IRQ_STORM/.cproject b/testhal/STM32F0xx/IRQ_STORM/.cproject deleted file mode 100644 index aea7bcbae..000000000 --- a/testhal/STM32F0xx/IRQ_STORM/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F0xx/IRQ_STORM/.project b/testhal/STM32F0xx/IRQ_STORM/.project deleted file mode 100644 index a3027689a..000000000 --- a/testhal/STM32F0xx/IRQ_STORM/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F0xx-IRQ_STORM - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F0_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F0xx/IRQ_STORM/Makefile b/testhal/STM32F0xx/IRQ_STORM/Makefile deleted file mode 100644 index 0b2d556fb..000000000 --- a/testhal/STM32F0xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/IRQ_STORM/chconf.h b/testhal/STM32F0xx/IRQ_STORM/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F0xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/IRQ_STORM/halconf.h b/testhal/STM32F0xx/IRQ_STORM/halconf.h deleted file mode 100644 index d91a792b4..000000000 --- a/testhal/STM32F0xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/IRQ_STORM/main.c b/testhal/STM32F0xx/IRQ_STORM/main.c deleted file mode 100644 index fd74a54c1..000000000 --- a/testhal/STM32F0xx/IRQ_STORM/main.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOC, GPIOC_LED4); - } - } - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 1 and GPT drivers 2 and 3. - */ - sdStart(&SD1, NULL); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(1)); /* USART1 TX. */ - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(1)); /* USART1 RX. */ - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/STM32F0xx/IRQ_STORM/mcuconf.h b/testhal/STM32F0xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index 1a719e0ce..000000000 --- a/testhal/STM32F0xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 TRUE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/IRQ_STORM/readme.txt b/testhal/STM32F0xx/IRQ_STORM/readme.txt deleted file mode 100644 index e56547a46..000000000 --- a/testhal/STM32F0xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM stress test demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F0xx/PWM-ICU/.cproject b/testhal/STM32F0xx/PWM-ICU/.cproject deleted file mode 100644 index b8b1e0f2b..000000000 --- a/testhal/STM32F0xx/PWM-ICU/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F0xx/PWM-ICU/.project b/testhal/STM32F0xx/PWM-ICU/.project deleted file mode 100644 index 60ef1bb65..000000000 --- a/testhal/STM32F0xx/PWM-ICU/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F0xx-PWM-ICU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F0_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F0xx/PWM-ICU/Makefile b/testhal/STM32F0xx/PWM-ICU/Makefile deleted file mode 100644 index 0b2d556fb..000000000 --- a/testhal/STM32F0xx/PWM-ICU/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/PWM-ICU/chconf.h b/testhal/STM32F0xx/PWM-ICU/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F0xx/PWM-ICU/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/PWM-ICU/halconf.h b/testhal/STM32F0xx/PWM-ICU/halconf.h deleted file mode 100644 index 501792854..000000000 --- a/testhal/STM32F0xx/PWM-ICU/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/PWM-ICU/main.c b/testhal/STM32F0xx/PWM-ICU/main.c deleted file mode 100644 index de6191c01..000000000 --- a/testhal/STM32F0xx/PWM-ICU/main.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIOC, GPIOC_LED4); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIOC, GPIOC_LED4); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(GPIOC, GPIOC_LED3); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(GPIOC, GPIOC_LED3); - last_period = icuGetPeriod(icup); -} - -static void icuoverflowcb(ICUDriver *icup) { - - (void)icup; -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - icuoverflowcb, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 2 and ICU driver 3. - * GPIOA6 is the ICU input (CH1). - * GPIOA15 is the PWM output (CH1). - * The two pins have to be externally connected together. - */ - pwmStart(&PWMD2, &pwmcfg); - palSetPadMode(GPIOA, 15, PAL_MODE_ALTERNATE(2)); - icuStart(&ICUD3, &icucfg); - palSetPadMode(GPIOA, 6, PAL_MODE_ALTERNATE(1)); - icuEnable(&ICUD3); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD2, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD2, 0); - pwmStop(&PWMD2); - icuDisable(&ICUD3); - icuStop(&ICUD3); - palClearPad(GPIOC, GPIOC_LED3); - palClearPad(GPIOC, GPIOC_LED4); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F0xx/PWM-ICU/mcuconf.h b/testhal/STM32F0xx/PWM-ICU/mcuconf.h deleted file mode 100644 index 8e7779960..000000000 --- a/testhal/STM32F0xx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 TRUE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 TRUE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/PWM-ICU/readme.txt b/testhal/STM32F0xx/PWM-ICU/readme.txt deleted file mode 100644 index eccb291d3..000000000 --- a/testhal/STM32F0xx/PWM-ICU/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM-ICU drivers demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx PWM-ICU drivers. - -** Board Setup ** - -- Connect PA15 and PC6 together. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F0xx/SPI/.cproject b/testhal/STM32F0xx/SPI/.cproject deleted file mode 100644 index d5cace391..000000000 --- a/testhal/STM32F0xx/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F0xx/SPI/.project b/testhal/STM32F0xx/SPI/.project deleted file mode 100644 index be544ce50..000000000 --- a/testhal/STM32F0xx/SPI/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F0xx-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F0_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F0xx/SPI/Makefile b/testhal/STM32F0xx/SPI/Makefile deleted file mode 100644 index 0b2d556fb..000000000 --- a/testhal/STM32F0xx/SPI/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/SPI/chconf.h b/testhal/STM32F0xx/SPI/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F0xx/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/SPI/halconf.h b/testhal/STM32F0xx/SPI/halconf.h deleted file mode 100644 index fdc079aef..000000000 --- a/testhal/STM32F0xx/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/SPI/main.c b/testhal/STM32F0xx/SPI/main.c deleted file mode 100644 index 0f6313022..000000000 --- a/testhal/STM32F0xx/SPI/main.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOB, - 12, - 0, - SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 -}; - -/* - * Low speed SPI configuration (140.625kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - GPIOB, - 12, - SPI_CR1_BR_2 | SPI_CR1_BR_1, - SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palSetPad(GPIOC, GPIOC_LED4); /* LED ON. */ - spiStart(&SPID2, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palClearPad(GPIOC, GPIOC_LED4); /* LED OFF. */ - spiStart(&SPID2, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static WORKING_AREA(blinker_wa, 128); -static msg_t blinker(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOC, GPIOC_LED3); - chThdSleepMilliseconds(500); - palClearPad(GPIOC, GPIOC_LED3); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * SPI2 I/O pins setup. - */ - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(0) | - PAL_STM32_OSPEED_HIGHEST); /* New SCK. */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(0) | - PAL_STM32_OSPEED_HIGHEST); /* New MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(0) | - PAL_STM32_OSPEED_HIGHEST); /* New MOSI. */ - palSetPad(GPIOB, 12); - palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); /* New CS. */ - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Starting the blinker thread. - */ - chThdCreateStatic(blinker_wa, sizeof(blinker_wa), - NORMALPRIO-1, blinker, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F0xx/SPI/mcuconf.h b/testhal/STM32F0xx/SPI/mcuconf.h deleted file mode 100644 index cf60d78be..000000000 --- a/testhal/STM32F0xx/SPI/mcuconf.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/SPI/readme.txt b/testhal/STM32F0xx/SPI/readme.txt deleted file mode 100644 index 636a7c248..000000000 --- a/testhal/STM32F0xx/SPI/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx SPI driver. - -** Board Setup ** - -- Connect PB14 and PB15 together for SPI loop-back. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F0xx/UART/.cproject b/testhal/STM32F0xx/UART/.cproject deleted file mode 100644 index 9dc8b7121..000000000 --- a/testhal/STM32F0xx/UART/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F0xx/UART/.project b/testhal/STM32F0xx/UART/.project deleted file mode 100644 index d05252ac5..000000000 --- a/testhal/STM32F0xx/UART/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F0xx-UART - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F0_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F0xx/UART/Makefile b/testhal/STM32F0xx/UART/Makefile deleted file mode 100644 index 0b2d556fb..000000000 --- a/testhal/STM32F0xx/UART/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F0_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F0xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F0xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F051x8.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F0xx/UART/chconf.h b/testhal/STM32F0xx/UART/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F0xx/UART/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/UART/halconf.h b/testhal/STM32F0xx/UART/halconf.h deleted file mode 100644 index a4fc70926..000000000 --- a/testhal/STM32F0xx/UART/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F0xx/UART/main.c b/testhal/STM32F0xx/UART/main.c deleted file mode 100644 index aa52aeb77..000000000 --- a/testhal/STM32F0xx/UART/main.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt1, vt2; - -static void restart(void *p) { - - (void)p; - - chSysLockFromIsr(); - uartStartSendI(&UARTD1, 14, "Hello World!\r\n"); - chSysUnlockFromIsr(); -} - -static void ledoff(void *p) { - - (void)p; - palClearPad(GPIOC, GPIOC_LED4); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; - palSetPad(GPIOC, GPIOC_LED4); -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palClearPad(GPIOC, GPIOC_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt1)) - chVTResetI(&vt1); - chVTSetI(&vt1, MS2ST(5000), restart, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palSetPad(GPIOC, GPIOC_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt2)) - chVTResetI(&vt2); - chVTSetI(&vt2, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1, PA9 and PA10 are routed to USART1. - */ - uartStart(&UARTD1, &uart_cfg_1); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(1)); /* USART1 TX. */ - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(1)); /* USART1 RX. */ - - /* - * Starts the transmission, it will be handled entirely in background. - */ - uartStartSend(&UARTD1, 13, "Starting...\r\n"); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F0xx/UART/mcuconf.h b/testhal/STM32F0xx/UART/mcuconf.h deleted file mode 100644 index fb5ea8f3d..000000000 --- a/testhal/STM32F0xx/UART/mcuconf.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F0xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 3...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F0xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_HSI14_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 12 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE STM32_PPRE_DIV1 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_ADCSW STM32_ADCSW_HSI14 -#define STM32_CECSW STM32_CECSW_HSI -#define STM32_I2C1SW STM32_I2C1SW_HSI -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 2 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 2 -#define STM32_GPT_TIM2_IRQ_PRIORITY 2 -#define STM32_GPT_TIM3_IRQ_PRIORITY 2 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 3 -#define STM32_ICU_TIM2_IRQ_PRIORITY 3 -#define STM32_ICU_TIM3_IRQ_PRIORITY 3 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 3 -#define STM32_PWM_TIM2_IRQ_PRIORITY 3 -#define STM32_PWM_TIM3_IRQ_PRIORITY 3 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USART1_PRIORITY 3 -#define STM32_SERIAL_USART2_PRIORITY 3 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 2 -#define STM32_SPI_SPI2_IRQ_PRIORITY 2 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USART1_IRQ_PRIORITY 3 -#define STM32_UART_USART2_IRQ_PRIORITY 3 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() diff --git a/testhal/STM32F0xx/UART/readme.txt b/testhal/STM32F0xx/UART/readme.txt deleted file mode 100644 index 921f1bc8e..000000000 --- a/testhal/STM32F0xx/UART/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32F0xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F0-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F0xx UART driver. - -** Board Setup ** - -- Connect an RS232 transceiver to pins PA9(TX) and PA10(RX). -- Connect a terminal emulator to the transceiver (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/ADC/Makefile b/testhal/STM32F1xx/ADC/Makefile deleted file mode 100644 index 0f7e20317..000000000 --- a/testhal/STM32F1xx/ADC/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/ADC/chconf.h b/testhal/STM32F1xx/ADC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F1xx/ADC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/ADC/halconf.h b/testhal/STM32F1xx/ADC/halconf.h deleted file mode 100644 index 85a5dbd3b..000000000 --- a/testhal/STM32F1xx/ADC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/ADC/main.c b/testhal/STM32F1xx/ADC/main.c deleted file mode 100644 index 43ae179ee..000000000 --- a/testhal/STM32F1xx/ADC/main.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: IN10. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - 0, 0, /* CR1, CR2 */ - ADC_SMPR1_SMP_AN10(ADC_SAMPLE_1P5), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, /* SQR2 */ - ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN10, IN11, IN10, IN11, IN10, IN11, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, ADC_CR2_TSVREFE, /* CR1, CR2 */ - ADC_SMPR1_SMP_AN11(ADC_SAMPLE_41P5) | ADC_SMPR1_SMP_AN10(ADC_SAMPLE_41P5) | - ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_239P5) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_239P5), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), - ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VREFINT), - ADC_SQR3_SQ6_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN10) | - ADC_SQR3_SQ4_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN10) | - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - palSetPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(0) | PAL_PORT_BIT(1), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the temperature sensor. - */ - adcStart(&ADCD1, NULL); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) - adcStopConversion(&ADCD1); - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/ADC/mcuconf.h b/testhal/STM32F1xx/ADC/mcuconf.h deleted file mode 100644 index 1b3927677..000000000 --- a/testhal/STM32F1xx/ADC/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/ADC/readme.txt b/testhal/STM32F1xx/ADC/readme.txt deleted file mode 100644 index 1502425f4..000000000 --- a/testhal/STM32F1xx/ADC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 ADC driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/CAN/Makefile b/testhal/STM32F1xx/CAN/Makefile deleted file mode 100644 index 0f7e20317..000000000 --- a/testhal/STM32F1xx/CAN/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/CAN/chconf.h b/testhal/STM32F1xx/CAN/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F1xx/CAN/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/CAN/halconf.h b/testhal/STM32F1xx/CAN/halconf.h deleted file mode 100644 index 5b6535967..000000000 --- a/testhal/STM32F1xx/CAN/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/CAN/main.c b/testhal/STM32F1xx/CAN/main.c deleted file mode 100644 index 43164e1ce..000000000 --- a/testhal/STM32F1xx/CAN/main.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Internal loopback mode, 500KBaud, automatic wakeup, automatic recover - * from abort mode. - * See section 22.7.7 on the STM32 reference manual. - */ -static const CANConfig cancfg = { - CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP, - CAN_BTR_LBKM | CAN_BTR_SJW(0) | CAN_BTR_TS2(1) | - CAN_BTR_TS1(8) | CAN_BTR_BRP(6) -}; - -/* - * Receiver thread. - */ -static WORKING_AREA(can_rx_wa, 256); -static msg_t can_rx(void *p) { - EventListener el; - CANRxFrame rxmsg; - - (void)p; - chRegSetThreadName("receiver"); - chEvtRegister(&CAND1.rxfull_event, &el, 0); - while(!chThdShouldTerminate()) { - if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) - continue; - while (canReceive(&CAND1, CAN_ANY_MAILBOX, &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(IOPORT3, GPIOC_LED); - } - } - chEvtUnregister(&CAND1.rxfull_event, &el); - return 0; -} - -/* - * Transmitter thread. - */ -static WORKING_AREA(can_tx_wa, 256); -static msg_t can_tx(void * p) { - CANTxFrame txmsg; - - (void)p; - chRegSetThreadName("transmitter"); - txmsg.IDE = CAN_IDE_EXT; - txmsg.EID = 0x01234567; - txmsg.RTR = CAN_RTR_DATA; - txmsg.DLC = 8; - txmsg.data32[0] = 0x55AA55AA; - txmsg.data32[1] = 0x00FF00FF; - - while (!chThdShouldTerminate()) { - canTransmit(&CAND1, CAN_ANY_MAILBOX, &txmsg, MS2ST(100)); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the CAN driver 1. - */ - canStart(&CAND1, &cancfg); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(can_rx_wa, sizeof(can_rx_wa), NORMALPRIO + 7, can_rx, NULL); - chThdCreateStatic(can_tx_wa, sizeof(can_tx_wa), NORMALPRIO + 7, can_tx, NULL); - - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/CAN/mcuconf.h b/testhal/STM32F1xx/CAN/mcuconf.h deleted file mode 100644 index 06bc8c715..000000000 --- a/testhal/STM32F1xx/CAN/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/CAN/readme.txt b/testhal/STM32F1xx/CAN/readme.txt deleted file mode 100644 index b78112885..000000000 --- a/testhal/STM32F1xx/CAN/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - CAN driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 CAN driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/EXT/Makefile b/testhal/STM32F1xx/EXT/Makefile deleted file mode 100644 index e9b6719d7..000000000 --- a/testhal/STM32F1xx/EXT/Makefile +++ /dev/null @@ -1,208 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/EXT/chconf.h b/testhal/STM32F1xx/EXT/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F1xx/EXT/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/EXT/halconf.h b/testhal/STM32F1xx/EXT/halconf.h deleted file mode 100644 index e0e0c38ff..000000000 --- a/testhal/STM32F1xx/EXT/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/EXT/main.c b/testhal/STM32F1xx/EXT/main.c deleted file mode 100644 index e0fcd896c..000000000 --- a/testhal/STM32F1xx/EXT/main.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt; - -/* LED set to OFF after 200mS.*/ -static void ledoff(void *arg) { - - (void)arg; - palSetPad(GPIOC, GPIOC_LED); -} - -/* Triggered when the button is pressed or released. The LED is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - - (void)extp; - (void)channel; - palClearPad(GPIOC, GPIOC_LED); - chSysLockFromIsr(); - if (!chVTIsArmedI(&vt)) - chVTSetI(&vt, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* Triggered when the LED goes OFF.*/ -static void extcb2(EXTDriver *extp, expchannel_t channel) { - - (void)extp; - (void)channel; -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_RISING_EDGE | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOC, extcb2}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32F1xx/EXT/mcuconf.h b/testhal/STM32F1xx/EXT/mcuconf.h deleted file mode 100644 index d7d712736..000000000 --- a/testhal/STM32F1xx/EXT/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/EXT/readme.txt b/testhal/STM32F1xx/EXT/readme.txt deleted file mode 100644 index 48288c565..000000000 --- a/testhal/STM32F1xx/EXT/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 EXT driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/GPT/Makefile b/testhal/STM32F1xx/GPT/Makefile deleted file mode 100644 index 0f7e20317..000000000 --- a/testhal/STM32F1xx/GPT/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/GPT/chconf.h b/testhal/STM32F1xx/GPT/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F1xx/GPT/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/GPT/halconf.h b/testhal/STM32F1xx/GPT/halconf.h deleted file mode 100644 index 554b4e9ca..000000000 --- a/testhal/STM32F1xx/GPT/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/GPT/main.c b/testhal/STM32F1xx/GPT/main.c deleted file mode 100644 index f14ffd941..000000000 --- a/testhal/STM32F1xx/GPT/main.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * GPT1 callback. - */ -static void gpt1cb(GPTDriver *gptp) { - - (void)gptp; - palClearPad(IOPORT3, GPIOC_LED); - chSysLockFromIsr(); - gptStartOneShotI(&GPTD2, 200); /* 0.02 second pulse.*/ - chSysUnlockFromIsr(); -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - - (void)gptp; - palSetPad(IOPORT3, GPIOC_LED); -} - -/* - * GPT1 configuration. - */ -static const GPTConfig gpt1cfg = { - 10000, /* 10kHz timer clock.*/ - gpt1cb /* Timer callback.*/ -}; - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 10000, /* 10kHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the GPT drivers 1 and 2. - */ - gptStart(&GPTD1, &gpt1cfg); - gptPolledDelay(&GPTD1, 10); /* Small delay.*/ - gptStart(&GPTD2, &gpt2cfg); - gptPolledDelay(&GPTD2, 10); /* Small delay.*/ - - /* - * Normal main() thread activity, it changes the GPT1 period every - * five seconds. - */ - while (TRUE) { - gptStartContinuous(&GPTD1, 5000); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD1); - gptStartContinuous(&GPTD1, 2500); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD1); - } - return 0; -} diff --git a/testhal/STM32F1xx/GPT/mcuconf.h b/testhal/STM32F1xx/GPT/mcuconf.h deleted file mode 100644 index e987d18f5..000000000 --- a/testhal/STM32F1xx/GPT/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 TRUE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 TRUE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/GPT/readme.txt b/testhal/STM32F1xx/GPT/readme.txt deleted file mode 100644 index 2355ef173..000000000 --- a/testhal/STM32F1xx/GPT/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - GPT driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo will on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 GPT driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/I2C/Makefile b/testhal/STM32F1xx/I2C/Makefile deleted file mode 100644 index 24cebda3b..000000000 --- a/testhal/STM32F1xx/I2C/Makefile +++ /dev/null @@ -1,220 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -Wall -Wextra - #USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -Wall -Wextra -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_103STK/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c \ - i2c_pns.c \ - tmp75.c \ - fake.c \ - lis3.c - - - - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. - -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk - - diff --git a/testhal/STM32F1xx/I2C/chconf.h b/testhal/STM32F1xx/I2C/chconf.h deleted file mode 100644 index c1dec4b48..000000000 --- a/testhal/STM32F1xx/I2C/chconf.h +++ /dev/null @@ -1,505 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/* Kernel parameters. */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 0//20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/*===========================================================================*/ -/* Performance options. */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/*===========================================================================*/ -/* Subsystem options. */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS FALSE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT FALSE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/*===========================================================================*/ -/* Debug options. */ -/*===========================================================================*/ -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/*===========================================================================*/ -/* Kernel hooks. */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/I2C/fake.c b/testhal/STM32F1xx/I2C/fake.c deleted file mode 100644 index 74fc44539..000000000 --- a/testhal/STM32F1xx/I2C/fake.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * Not responding slave test - */ - -#include - -#include "ch.h" -#include "hal.h" - -#include "fake.h" - - -/* input buffer */ -static uint8_t rx_data[2]; - -/* temperature value */ -static int16_t temperature = 0; - -static i2cflags_t errors = 0; - -#define addr 0b1001100 - -/* This is main function. */ -void request_fake(void){ - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - i2cAcquireBus(&I2CD1); - status = i2cMasterReceiveTimeout(&I2CD1, addr, rx_data, 2, tmo); - i2cReleaseBus(&I2CD1); - - if (status == RDY_RESET){ - errors = i2cGetErrors(&I2CD1); - if (errors == I2CD_ACK_FAILURE){ - /* there is no slave with given address on the bus, or it was die */ - return; - } - } - - else{ - temperature = (rx_data[0] << 8) + rx_data[1]; - } -} - - diff --git a/testhal/STM32F1xx/I2C/fake.h b/testhal/STM32F1xx/I2C/fake.h deleted file mode 100644 index 2869b0c93..000000000 --- a/testhal/STM32F1xx/I2C/fake.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef FAKE_H_ -#define FAKE_H_ - -void request_fake(void); - -#endif /* FAKE_H_ */ diff --git a/testhal/STM32F1xx/I2C/halconf.h b/testhal/STM32F1xx/I2C/halconf.h deleted file mode 100644 index 3ac5de5ba..000000000 --- a/testhal/STM32F1xx/I2C/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/I2C/i2c_pns.c b/testhal/STM32F1xx/I2C/i2c_pns.c deleted file mode 100644 index 3cb568ce8..000000000 --- a/testhal/STM32F1xx/I2C/i2c_pns.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#include "i2c_pns.h" -#include "lis3.h" - - -/* I2C1 */ -static const I2CConfig i2cfg1 = { - OPMODE_I2C, - 400000, - FAST_DUTY_CYCLE_2, -}; - - - -void I2CInit_pns(void){ - i2cInit(); - - i2cStart(&I2CD1, &i2cfg1); - - /* tune ports for I2C1*/ - palSetPadMode(IOPORT2, 6, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); - palSetPadMode(IOPORT2, 7, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); - - chThdSleepMilliseconds(100); /* Just to be safe. */ - - init_lis3(); /* accelerometer init */ -} - - diff --git a/testhal/STM32F1xx/I2C/i2c_pns.h b/testhal/STM32F1xx/I2C/i2c_pns.h deleted file mode 100644 index b01c85b7e..000000000 --- a/testhal/STM32F1xx/I2C/i2c_pns.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef I2C_PNS_H_ -#define I2C_PNS_H_ - - -void I2CInit_pns(void); - - -#endif /* I2C_PNS_H_ */ diff --git a/testhal/STM32F1xx/I2C/lis3.c b/testhal/STM32F1xx/I2C/lis3.c deleted file mode 100644 index e55d1180e..000000000 --- a/testhal/STM32F1xx/I2C/lis3.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * This is device realize "read through write" paradigm. This is not - * standard, but most of I2C devices use this paradigm. - * You must write to device reading address, send restart to bus, - * and then begin reading process. - */ - -#include - -#include "ch.h" -#include "hal.h" - -#include "lis3.h" - - -#define lis3_addr 0b0011101 - - -/* buffers */ -static uint8_t accel_rx_data[ACCEL_RX_DEPTH]; -static uint8_t accel_tx_data[ACCEL_TX_DEPTH]; - -static i2cflags_t errors = 0; - -static int16_t acceleration_x = 0; -static int16_t acceleration_y = 0; -static int16_t acceleration_z = 0; - - -/** - * Init function. Here we will also start personal serving thread. - */ -int init_lis3(void){ - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - /* configure accelerometer */ - accel_tx_data[0] = ACCEL_CTRL_REG1 | AUTO_INCREMENT_BIT; /* register address */ - accel_tx_data[1] = 0b11100111; - accel_tx_data[2] = 0b01000001; - accel_tx_data[3] = 0b00000000; - - /* sending */ - i2cAcquireBus(&I2CD1); - status = i2cMasterTransmitTimeout(&I2CD1, lis3_addr, accel_tx_data, 4, accel_rx_data, 0, tmo); - i2cReleaseBus(&I2CD1); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD1); - } - - return 0; -} - -/** - * - */ -void request_acceleration_data(void){ - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - accel_tx_data[0] = ACCEL_OUT_DATA | AUTO_INCREMENT_BIT; /* register address */ - i2cAcquireBus(&I2CD1); - status = i2cMasterTransmitTimeout(&I2CD1, lis3_addr, accel_tx_data, 1, accel_rx_data, 6, tmo); - i2cReleaseBus(&I2CD1); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD1); - } - - acceleration_x = accel_rx_data[0] + (accel_rx_data[1] << 8); - acceleration_y = accel_rx_data[2] + (accel_rx_data[3] << 8); - acceleration_z = accel_rx_data[4] + (accel_rx_data[5] << 8); -} - diff --git a/testhal/STM32F1xx/I2C/lis3.h b/testhal/STM32F1xx/I2C/lis3.h deleted file mode 100644 index f48b7cd20..000000000 --- a/testhal/STM32F1xx/I2C/lis3.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include "ch.h" - -#ifndef LIS3_H_ -#define LIS3_H_ - - - -/* buffers depth */ -#define ACCEL_RX_DEPTH 8 -#define ACCEL_TX_DEPTH 8 - -/* autoincrement bit position. This bit needs to perform reading of - * multiple bytes at one request */ -#define AUTO_INCREMENT_BIT (1<<7) - -/* slave specific addresses */ -#define ACCEL_STATUS_REG 0x27 -#define ACCEL_CTRL_REG1 0x20 -#define ACCEL_OUT_DATA 0x28 - - - -inline int init_lis3(void); -inline void request_acceleration_data(void); - - -#endif /* LIS3_H_ */ diff --git a/testhal/STM32F1xx/I2C/main.c b/testhal/STM32F1xx/I2C/main.c deleted file mode 100644 index cba3dad3a..000000000 --- a/testhal/STM32F1xx/I2C/main.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -#include - -#include "ch.h" -#include "hal.h" - -#include "i2c_pns.h" -#include "lis3.h" -#include "tmp75.h" -#include "fake.h" - - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(BlinkWA, 64); -static msg_t Blink(void *arg) { - chRegSetThreadName("Blink"); - (void)arg; - while (TRUE) { - palClearPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - palSetPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Accelerometer thread - */ -static WORKING_AREA(PollAccelThreadWA, 256); -static msg_t PollAccelThread(void *arg) { - chRegSetThreadName("PollAccel"); - (void)arg; - while (TRUE) { - /*chThdSleepMilliseconds(rand() & 31);*/ - chThdSleepMilliseconds(32); - request_acceleration_data(); - } - return 0; -} - - -/* Temperature polling thread */ -static WORKING_AREA(PollTmp75ThreadWA, 256); -static msg_t PollTmp75Thread(void *arg) { - chRegSetThreadName("PollTmp75"); - (void)arg; - while (TRUE) { - /*chThdSleepMilliseconds(rand() & 31);*/ - chThdSleepMilliseconds(15); - /* Call reading function */ - request_temperature(); - } - return 0; -} - - -/* Temperature polling thread */ -static WORKING_AREA(PollFakeThreadWA, 256); -static msg_t PollFakeThread(void *arg) { - chRegSetThreadName("PollFake"); - (void)arg; - while (TRUE) { - chThdSleepMilliseconds(16); - /* Call reading function */ - request_fake(); - } - return 0; -} - - -/* - * Entry point, note, the main() function is already a thread in the system - * on entry. - */ -int main(void) { - - halInit(); - chSysInit(); - - chThdSleepMilliseconds(200); - I2CInit_pns(); - - /* Create accelerometer thread */ - chThdCreateStatic(PollAccelThreadWA, - sizeof(PollAccelThreadWA), - NORMALPRIO, - PollAccelThread, - NULL); - - /* Create temperature thread */ - chThdCreateStatic(PollTmp75ThreadWA, - sizeof(PollTmp75ThreadWA), - NORMALPRIO, - PollTmp75Thread, - NULL); - - /* Create not responding thread */ - chThdCreateStatic(PollFakeThreadWA, - sizeof(PollFakeThreadWA), - NORMALPRIO, - PollFakeThread, - NULL); - - /* Creates the blinker thread. */ - chThdCreateStatic(BlinkWA, sizeof(BlinkWA), HIGHPRIO, Blink, NULL); - - /* main loop that do nothing */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - - return 0; -} diff --git a/testhal/STM32F1xx/I2C/mcuconf.h b/testhal/STM32F1xx/I2C/mcuconf.h deleted file mode 100644 index a5748e0e8..000000000 --- a/testhal/STM32F1xx/I2C/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 TRUE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/I2C/tmp75.c b/testhal/STM32F1xx/I2C/tmp75.c deleted file mode 100644 index 478c322fa..000000000 --- a/testhal/STM32F1xx/I2C/tmp75.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * TMP75 is most simple I2C device in our case. It is already useful with - * default settings after powerup. - * You only must read 2 sequential bytes from it. - */ - -#include - -#include "ch.h" -#include "hal.h" - -#include "tmp75.h" - - -/* input buffer */ -static uint8_t tmp75_rx_data[TMP75_RX_DEPTH]; - -/* temperature value */ -static int16_t temperature = 0; - -static i2cflags_t errors = 0; - -#define tmp75_addr 0b1001000 - -/* This is main function. */ -void request_temperature(void){ - int16_t t_int = 0, t_frac = 0; - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - i2cAcquireBus(&I2CD1); - status = i2cMasterReceiveTimeout(&I2CD1, tmp75_addr, tmp75_rx_data, 2, tmo); - i2cReleaseBus(&I2CD1); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD1); - } - - t_int = tmp75_rx_data[0] * 100; - t_frac = (tmp75_rx_data[1] * 100) >> 8; - temperature = t_int + t_frac; -} - - diff --git a/testhal/STM32F1xx/I2C/tmp75.h b/testhal/STM32F1xx/I2C/tmp75.h deleted file mode 100644 index 57729b9db..000000000 --- a/testhal/STM32F1xx/I2C/tmp75.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef TMP75_H_ -#define TMP75_H_ - - - -/* buffers depth */ -#define TMP75_RX_DEPTH 2 -#define TMP75_TX_DEPTH 2 - -void init_tmp75(void); -void request_temperature(void); - -#endif /* TMP75_H_ */ diff --git a/testhal/STM32F1xx/IRQ_STORM/Makefile b/testhal/STM32F1xx/IRQ_STORM/Makefile deleted file mode 100644 index 0f7e20317..000000000 --- a/testhal/STM32F1xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/IRQ_STORM/chconf.h b/testhal/STM32F1xx/IRQ_STORM/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F1xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/IRQ_STORM/halconf.h b/testhal/STM32F1xx/IRQ_STORM/halconf.h deleted file mode 100644 index 117a5979b..000000000 --- a/testhal/STM32F1xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/IRQ_STORM/main.c b/testhal/STM32F1xx/IRQ_STORM/main.c deleted file mode 100644 index 8961668b0..000000000 --- a/testhal/STM32F1xx/IRQ_STORM/main.c +++ /dev/null @@ -1,326 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOC, GPIOC_LED); - } - } - } -} - -/* - * GPT1 callback. - */ -static void gpt1cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT1 configuration. - */ -static const GPTConfig gpt1cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt1cb /* Timer callback.*/ -}; - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } - chSequentialStreamWrite(&SD2, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD2, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD2, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 1 and 2. - */ - sdStart(&SD2, NULL); /* Default is 38400-8-N-1.*/ - gptStart(&GPTD1, &gpt1cfg); - gptStart(&GPTD2, &gpt2cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD1, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD2, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD1); - gptStopTimer(&GPTD2); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/STM32F1xx/IRQ_STORM/mcuconf.h b/testhal/STM32F1xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index e607b235c..000000000 --- a/testhal/STM32F1xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 TRUE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 6 -#define STM32_GPT_TIM2_IRQ_PRIORITY 10 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/IRQ_STORM/readme.txt b/testhal/STM32F1xx/IRQ_STORM/readme.txt deleted file mode 100644 index 32f5a3781..000000000 --- a/testhal/STM32F1xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ-STORM demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32F1xx GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/PWM-ICU/Makefile b/testhal/STM32F1xx/PWM-ICU/Makefile deleted file mode 100644 index 0f7e20317..000000000 --- a/testhal/STM32F1xx/PWM-ICU/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/PWM-ICU/chconf.h b/testhal/STM32F1xx/PWM-ICU/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F1xx/PWM-ICU/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/PWM-ICU/halconf.h b/testhal/STM32F1xx/PWM-ICU/halconf.h deleted file mode 100644 index 2f74c82c8..000000000 --- a/testhal/STM32F1xx/PWM-ICU/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/PWM-ICU/main.c b/testhal/STM32F1xx/PWM-ICU/main.c deleted file mode 100644 index a2ba2a12d..000000000 --- a/testhal/STM32F1xx/PWM-ICU/main.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(IOPORT3, GPIOC_LED); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(IOPORT3, GPIOC_LED); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -#if STM32_PWM_USE_ADVANCED - 0 -#endif -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - NULL, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * LED initially off. - */ - palSetPad(IOPORT3, GPIOC_LED); - - /* - * Initializes the PWM driver 1 and ICU driver 4. - */ - pwmStart(&PWMD1, &pwmcfg); - palSetPadMode(IOPORT1, 8, PAL_MODE_STM32_ALTERNATE_PUSHPULL); - icuStart(&ICUD4, &icucfg); - icuEnable(&ICUD4); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD1, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD1, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD1, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD1, 0); - pwmStop(&PWMD1); - icuDisable(&ICUD4); - icuStop(&ICUD4); - palSetPad(IOPORT3, GPIOC_LED); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/PWM-ICU/mcuconf.h b/testhal/STM32F1xx/PWM-ICU/mcuconf.h deleted file mode 100644 index de845bbbe..000000000 --- a/testhal/STM32F1xx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 TRUE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED TRUE -#define STM32_PWM_USE_TIM1 TRUE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/PWM-ICU/readme.txt b/testhal/STM32F1xx/PWM-ICU/readme.txt deleted file mode 100644 index 55ffef2cf..000000000 --- a/testhal/STM32F1xx/PWM-ICU/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM/ICU driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 PWM and ICU drivers. Pins -PA8 and PB6 must be connected in order to trigger the ICU input with the -PWM output. The ICU unit will measure the generated PWM. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/RTC/Makefile b/testhal/STM32F1xx/RTC/Makefile deleted file mode 100644 index 3d28124f2..000000000 --- a/testhal/STM32F1xx/RTC/Makefile +++ /dev/null @@ -1,211 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/chrtclib.c \ - main.c \ - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. - -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/RTC/chconf.h b/testhal/STM32F1xx/RTC/chconf.h deleted file mode 100644 index c1dec4b48..000000000 --- a/testhal/STM32F1xx/RTC/chconf.h +++ /dev/null @@ -1,505 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/* Kernel parameters. */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 0//20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/*===========================================================================*/ -/* Performance options. */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/*===========================================================================*/ -/* Subsystem options. */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS FALSE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT FALSE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/*===========================================================================*/ -/* Debug options. */ -/*===========================================================================*/ -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/*===========================================================================*/ -/* Kernel hooks. */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/RTC/halconf.h b/testhal/STM32F1xx/RTC/halconf.h deleted file mode 100644 index 388e9a080..000000000 --- a/testhal/STM32F1xx/RTC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/RTC/main.c b/testhal/STM32F1xx/RTC/main.c deleted file mode 100644 index 1d43b33ad..000000000 --- a/testhal/STM32F1xx/RTC/main.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#include "chrtclib.h" - -RTCTime timespec; -RTCAlarm alarmspec; - -#define TEST_ALARM_WAKEUP FALSE - - -#if TEST_ALARM_WAKEUP - -/* sleep indicator thread */ -static WORKING_AREA(blinkWA, 128); -static msg_t blink_thd(void *arg){ - (void)arg; - while (TRUE) { - chThdSleepMilliseconds(100); - palTogglePad(GPIOC, GPIOC_LED); - } - return 0; -} - -int main(void) { - halInit(); - chSysInit(); - - chThdCreateStatic(blinkWA, sizeof(blinkWA), NORMALPRIO, blink_thd, NULL); - /* set alarm in near future */ - rtcGetTime(&RTCD1, ×pec); - alarmspec.tv_sec = timespec.tv_sec + 30; - rtcSetAlarm(&RTCD1, 0, &alarmspec); - - while (TRUE){ - chThdSleepSeconds(10); - chSysLock(); - - /* going to anabiosis*/ - PWR->CR |= (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_CSBF | PWR_CR_CWUF); - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - __WFI(); - } - return 0; -} - -#else /* TEST_ALARM_WAKEUP */ - -/* Manually reloaded test alarm period.*/ -#define RTC_ALARMPERIOD 10 - -BinarySemaphore alarm_sem; - -static void my_cb(RTCDriver *rtcp, rtcevent_t event) { - - (void)rtcp; - - switch (event) { - case RTC_EVENT_OVERFLOW: - palTogglePad(GPIOC, GPIOC_LED); - break; - case RTC_EVENT_SECOND: - /* palTogglePad(GPIOC, GPIOC_LED); */ - break; - case RTC_EVENT_ALARM: - palTogglePad(GPIOC, GPIOC_LED); - chSysLockFromIsr(); - chBSemSignalI(&alarm_sem); - chSysUnlockFromIsr(); - break; - } -} - -int main(void) { - msg_t status = RDY_TIMEOUT; - - halInit(); - chSysInit(); - chBSemInit(&alarm_sem, TRUE); - - rtcGetTime(&RTCD1, ×pec); - alarmspec.tv_sec = timespec.tv_sec + RTC_ALARMPERIOD; - rtcSetAlarm(&RTCD1, 0, &alarmspec); - - rtcSetCallback(&RTCD1, my_cb); - while (TRUE){ - - /* Wait until alarm callback signaled semaphore.*/ - status = chBSemWaitTimeout(&alarm_sem, S2ST(RTC_ALARMPERIOD + 5)); - - if (status == RDY_TIMEOUT){ - chSysHalt(); - } - else{ - rtcGetTime(&RTCD1, ×pec); - alarmspec.tv_sec = timespec.tv_sec + RTC_ALARMPERIOD; - rtcSetAlarm(&RTCD1, 0, &alarmspec); - } - } - return 0; -} -#endif /* TEST_ALARM_WAKEUP */ diff --git a/testhal/STM32F1xx/RTC/mcuconf.h b/testhal/STM32F1xx/RTC/mcuconf.h deleted file mode 100644 index 589b599d4..000000000 --- a/testhal/STM32F1xx/RTC/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/RTC_FATTIME/Makefile b/testhal/STM32F1xx/RTC_FATTIME/Makefile deleted file mode 100644 index 347169ba9..000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/Makefile +++ /dev/null @@ -1,213 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_103STK/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/chrtclib.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various $(FATFSINC) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/RTC_FATTIME/chconf.h b/testhal/STM32F1xx/RTC_FATTIME/chconf.h deleted file mode 100644 index f29e139f7..000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/RTC_FATTIME/ffconf.h b/testhal/STM32F1xx/RTC_FATTIME/ffconf.h deleted file mode 100644 index a4816e845..000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 1 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1251 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 1 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 1 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 1 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/testhal/STM32F1xx/RTC_FATTIME/halconf.h b/testhal/STM32F1xx/RTC_FATTIME/halconf.h deleted file mode 100644 index 54be7f5e8..000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI TRUE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/RTC_FATTIME/main.c b/testhal/STM32F1xx/RTC_FATTIME/main.c deleted file mode 100644 index c229830d0..000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/main.c +++ /dev/null @@ -1,570 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include -#include - -#include "ch.h" -#include "hal.h" - -#include "usb_cdc.h" -#include "shell.h" -#include "chprintf.h" -#include "chrtclib.h" -#include "ff.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Endpoints to be used for USBD1. - */ -#define USBD1_DATA_REQUEST_EP 1 -#define USBD1_DATA_AVAILABLE_EP 1 -#define USBD1_INTERRUPT_REQUEST_EP 2 - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USB_CDC_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 1, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USB_CDC_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USB_CDC_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(&SDU1); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD1, - USBD1_DATA_REQUEST_EP, - USBD1_DATA_AVAILABLE_EP, - USBD1_INTERRUPT_REQUEST_EP -}; - -/** - * @brief FS object. - */ -FATFS MMC_FS; - -/** - * MMC driver instance. - */ -MMCDriver MMCD1; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/* Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first).*/ -static SPIConfig hs_spicfg = {NULL, IOPORT2, GPIOB_SPI2NSS, 0}; - -/* Low speed SPI configuration (281.250kHz, CPHA=0, CPOL=0, MSb first).*/ -static SPIConfig ls_spicfg = {NULL, IOPORT2, GPIOB_SPI2NSS, - SPI_CR1_BR_2 | SPI_CR1_BR_1}; - -/* MMC/SD over SPI driver configuration.*/ -static MMCConfig mmccfg = {&SPID2, &ls_spicfg, &hs_spicfg}; - -/** - * - */ -bool_t mmc_lld_is_write_protected(MMCDriver *sdcp) { - (void)sdcp; - return FALSE; -} - -/** - * - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *sdcp) { - (void)sdcp; - return !palReadPad(GPIOC, GPIOC_MMCCP); -} - -/** - * - */ -void cmd_sdiotest(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argc; - (void)argv; - FRESULT err; - uint32_t clusters; - FATFS *fsp; - FIL FileObject; - //FILINFO FileInfo; - size_t bytes_written; - struct tm timp; - - // set time to 2011-03-13 07:06:40 - //rtcSetTimeUnixSec(&RTCD1, 1300000000); - -#if !HAL_USE_RTC - chprintf(chp, "ERROR! Chibios compiled without RTC support."); - chprintf(chp, "Enable HAL_USE_RCT in you halconf.h"); - chThdSleepMilliseconds(100); - return; -#endif - - chprintf(chp, "Trying to connect SDIO... "); - chThdSleepMilliseconds(100); - - if (!mmcConnect(&MMCD1)) { - chprintf(chp, "OK\r\n"); - chprintf(chp, "Register working area for filesystem... "); - chThdSleepMilliseconds(100); - err = f_mount(0, &MMC_FS); - if (err != FR_OK){ - chSysHalt(); - } - else{ - fs_ready = TRUE; - chprintf(chp, "OK\r\n"); - } - - chprintf(chp, "Mounting filesystem... "); - chThdSleepMilliseconds(100); - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)MMC_FS.csize, - clusters * (uint32_t)MMC_FS.csize * (uint32_t)MMCSD_BLOCK_SIZE); - - rtcGetTimeTm(&RTCD1, &timp); - chprintf(chp, "Current RTC time is: "); - chprintf(chp, "%u-%u-%u %u:%u:%u\r\n", - timp.tm_year+1900, timp.tm_mon+1, timp.tm_mday, timp.tm_hour, timp.tm_min, - timp.tm_sec); - - chprintf(chp, "Creating empty file 'tmstmp.tst'... "); - chThdSleepMilliseconds(100); - err = f_open(&FileObject, "0:tmstmp.tst", FA_WRITE | FA_OPEN_ALWAYS); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Write some data in it... "); - chThdSleepMilliseconds(100); - err = f_write(&FileObject, "tst", sizeof("tst"), (void *)&bytes_written); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Closing file 'tmstmp.tst'... "); - chThdSleepMilliseconds(100); - err = f_close(&FileObject); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - -// chprintf(chp, "Obtaining file info ... "); -// chThdSleepMilliseconds(100); -// err = f_stat("0:tmstmp.tst", &FileInfo); -// if (err != FR_OK) { -// chSysHalt(); -// } -// else{ -// chprintf(chp, "OK\r\n"); -// chprintf(chp, " Timestamp: %u-%u-%u %u:%u:%u\r\n", -// ((FileInfo.fdate >> 9) & 127) + 1980, -// (FileInfo.fdate >> 5) & 15, -// FileInfo.fdate & 31, -// (FileInfo.ftime >> 11) & 31, -// (FileInfo.ftime >> 5) & 63, -// (FileInfo.ftime & 31) * 2); -// } - - chprintf(chp, "Umounting filesystem... "); - f_mount(0, NULL); - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Disconnecting from SDIO..."); - chThdSleepMilliseconds(100); - if (mmcDisconnect(&MMCD1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chprintf(chp, "------------------------------------------------------\r\n"); - chprintf(chp, "Now you can remove memory card and check timestamp on PC.\r\n"); - chThdSleepMilliseconds(100); - } - else{ - chSysHalt(); - } -} - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) - -static const ShellCommand commands[] = { - {"sdiotest", cmd_sdiotest}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1000); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(100); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Initializes the SDIO drivers. - */ - mmcObjectInit(&MMCD1); - mmcStart(&MMCD1, &mmccfg); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); -} - -} diff --git a/testhal/STM32F1xx/RTC_FATTIME/mcuconf.h b/testhal/STM32F1xx/RTC_FATTIME/mcuconf.h deleted file mode 100644 index 6c437d356..000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/RTC_FATTIME/readme.txt b/testhal/STM32F1xx/RTC_FATTIME/readme.txt deleted file mode 100644 index 0d7b112ee..000000000 --- a/testhal/STM32F1xx/RTC_FATTIME/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates checks timestamp correctness on FAT. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/SDC/Makefile b/testhal/STM32F1xx/SDC/Makefile deleted file mode 100644 index 4e25ee845..000000000 --- a/testhal/STM32F1xx/SDC/Makefile +++ /dev/null @@ -1,212 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT= ch.ld - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM3210E_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xE.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/SDC/chconf.h b/testhal/STM32F1xx/SDC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F1xx/SDC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/SDC/halconf.h b/testhal/STM32F1xx/SDC/halconf.h deleted file mode 100644 index 3f22f8d9c..000000000 --- a/testhal/STM32F1xx/SDC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/SDC/main.c b/testhal/STM32F1xx/SDC/main.c deleted file mode 100644 index 24a8d4346..000000000 --- a/testhal/STM32F1xx/SDC/main.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * SDIO configuration. - */ -static const SDCConfig sdccfg = { - 0 -}; - -static uint8_t blkbuf[MMCSD_BLOCK_SIZE * 4 + 1]; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the SDIO drivers. - */ - sdcStart(&SDCD1, &sdccfg); - if (!sdcConnect(&SDCD1)) { - int i; - - /* Single aligned read.*/ - if (sdcRead(&SDCD1, 0, blkbuf, 1)) - chSysHalt(); - - /* Single unaligned read.*/ - if (sdcRead(&SDCD1, 0, blkbuf + 1, 1)) - chSysHalt(); - - /* Multiple aligned read.*/ - if (sdcRead(&SDCD1, 0, blkbuf, 4)) - chSysHalt(); - - /* Multiple unaligned read.*/ - if (sdcRead(&SDCD1, 0, blkbuf + 1, 4)) - chSysHalt(); - - /* Repeated multiple aligned reads.*/ - for (i = 0; i < 1000; i++) { - if (sdcRead(&SDCD1, 0, blkbuf, 4)) - chSysHalt(); - } - - /* Repeated multiple unaligned reads.*/ - for (i = 0; i < 1000; i++) { - if (sdcRead(&SDCD1, 0, blkbuf + 1, 4)) - chSysHalt(); - } - - /* Repeated multiple aligned writes.*/ - for (i = 0; i < 100; i++) { - if (sdcRead(&SDCD1, 0x10000, blkbuf, 4)) - chSysHalt(); - if (sdcWrite(&SDCD1, 0x10000, blkbuf, 4)) - chSysHalt(); - if (sdcWrite(&SDCD1, 0x10000, blkbuf, 4)) - chSysHalt(); - } - - /* Repeated multiple unaligned writes.*/ - for (i = 0; i < 100; i++) { - if (sdcRead(&SDCD1, 0x10000, blkbuf + 1, 4)) - chSysHalt(); - if (sdcWrite(&SDCD1, 0x10000, blkbuf + 1, 4)) - chSysHalt(); - if (sdcWrite(&SDCD1, 0x10000, blkbuf + 1, 4)) - chSysHalt(); - } - - if (sdcDisconnect(&SDCD1)) - chSysHalt(); - } - - /* - * Normal main() thread activity. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F1xx/SDC/mcuconf.h b/testhal/STM32F1xx/SDC/mcuconf.h deleted file mode 100644 index b506af317..000000000 --- a/testhal/STM32F1xx/SDC/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/SDC/readme.txt b/testhal/STM32F1xx/SDC/readme.txt deleted file mode 100644 index b897676af..000000000 --- a/testhal/STM32F1xx/SDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex ST_STM3210E_EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32 SDC driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/SPI/Makefile b/testhal/STM32F1xx/SPI/Makefile deleted file mode 100644 index 0f7e20317..000000000 --- a/testhal/STM32F1xx/SPI/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/SPI/chconf.h b/testhal/STM32F1xx/SPI/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F1xx/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/SPI/halconf.h b/testhal/STM32F1xx/SPI/halconf.h deleted file mode 100644 index 3e1cafbbf..000000000 --- a/testhal/STM32F1xx/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/SPI/main.c b/testhal/STM32F1xx/SPI/main.c deleted file mode 100644 index 35b7c3b42..000000000 --- a/testhal/STM32F1xx/SPI/main.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOA, - GPIOA_SPI1NSS, - 0 -}; - -/* - * Low speed SPI configuration (281.250kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - GPIOA, - GPIOA_SPI1NSS, - SPI_CR1_BR_2 | SPI_CR1_BR_1 -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palClearPad(IOPORT3, GPIOC_LED); /* LED ON. */ - spiStart(&SPID1, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID1); /* Acquire ownership of the bus. */ - palSetPad(IOPORT3, GPIOC_LED); /* LED OFF. */ - spiStart(&SPID1, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID1); /* Slave Select assertion. */ - spiExchange(&SPID1, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID1); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID1); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * SPI1 I/O pins setup. - */ - palSetPadMode(IOPORT1, 5, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* SCK. */ - palSetPadMode(IOPORT1, 6, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* MISO.*/ - palSetPadMode(IOPORT1, 7, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* MOSI.*/ - palSetPadMode(IOPORT1, GPIOA_SPI1NSS, PAL_MODE_OUTPUT_PUSHPULL); - palSetPad(IOPORT1, GPIOA_SPI1NSS); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/SPI/mcuconf.h b/testhal/STM32F1xx/SPI/mcuconf.h deleted file mode 100644 index c74814336..000000000 --- a/testhal/STM32F1xx/SPI/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/SPI/readme.txt b/testhal/STM32F1xx/SPI/readme.txt deleted file mode 100644 index 1a9c90b47..000000000 --- a/testhal/STM32F1xx/SPI/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 SPI driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/UART/Makefile b/testhal/STM32F1xx/UART/Makefile deleted file mode 100644 index 0f7e20317..000000000 --- a/testhal/STM32F1xx/UART/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/UART/chconf.h b/testhal/STM32F1xx/UART/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F1xx/UART/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/UART/halconf.h b/testhal/STM32F1xx/UART/halconf.h deleted file mode 100644 index 520e71b0a..000000000 --- a/testhal/STM32F1xx/UART/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/UART/main.c b/testhal/STM32F1xx/UART/main.c deleted file mode 100644 index 5682b8029..000000000 --- a/testhal/STM32F1xx/UART/main.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt1, vt2; - -static void restart(void *p) { - - (void)p; - - chSysLockFromIsr(); - uartStartSendI(&UARTD2, 14, "Hello World!\r\n"); - chSysUnlockFromIsr(); -} - -static void ledoff(void *p) { - - (void)p; - palSetPad(IOPORT3, GPIOC_LED); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; - palClearPad(IOPORT3, GPIOC_LED); -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palSetPad(IOPORT3, GPIOC_LED); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt1)) - chVTResetI(&vt1); - chVTSetI(&vt1, MS2ST(5000), restart, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palClearPad(IOPORT3, GPIOC_LED); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt2)) - chVTResetI(&vt2); - chVTSetI(&vt2, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - uartStart(&UARTD2, &uart_cfg_1); - - /* - * Starts the transmission, it will be handled entirely in background. - */ - uartStartSend(&UARTD2, 13, "Starting...\r\n"); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F1xx/UART/mcuconf.h b/testhal/STM32F1xx/UART/mcuconf.h deleted file mode 100644 index 05ad2de0d..000000000 --- a/testhal/STM32F1xx/UART/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USE_USART3 TRUE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/UART/readme.txt b/testhal/STM32F1xx/UART/readme.txt deleted file mode 100644 index e24a2c568..000000000 --- a/testhal/STM32F1xx/UART/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 UART driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/USB_CDC/Makefile b/testhal/STM32F1xx/USB_CDC/Makefile deleted file mode 100644 index 0c781d14c..000000000 --- a/testhal/STM32F1xx/USB_CDC/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/USB_CDC/chconf.h b/testhal/STM32F1xx/USB_CDC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F1xx/USB_CDC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_CDC/halconf.h b/testhal/STM32F1xx/USB_CDC/halconf.h deleted file mode 100644 index cd76b0cfe..000000000 --- a/testhal/STM32F1xx/USB_CDC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_CDC/main.c b/testhal/STM32F1xx/USB_CDC/main.c deleted file mode 100644 index 8b11e7ed4..000000000 --- a/testhal/STM32F1xx/USB_CDC/main.c +++ /dev/null @@ -1,509 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "shell.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Endpoints to be used for USBD1. - */ -#define USBD1_DATA_REQUEST_EP 1 -#define USBD1_DATA_AVAILABLE_EP 1 -#define USBD1_INTERRUPT_REQUEST_EP 2 - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 1, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(&SDU1); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD1, - USBD1_DATA_REQUEST_EP, - USBD1_DATA_AVAILABLE_EP, - USBD1_INTERRUPT_REQUEST_EP -}; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { - static uint8_t buf[] = - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: write\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) { - chSequentialStreamWrite(&SDU1, buf, sizeof buf - 1); - } - chprintf(chp, "\r\n\nstopped\r\n"); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"write", cmd_write}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - systime_t time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; - palClearPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(time); - palSetPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(time); - } -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1500); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F1xx/USB_CDC/mcuconf.h b/testhal/STM32F1xx/USB_CDC/mcuconf.h deleted file mode 100644 index ba73e46b0..000000000 --- a/testhal/STM32F1xx/USB_CDC/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F1xx/USB_CDC/readme.txt b/testhal/STM32F1xx/USB_CDC/readme.txt deleted file mode 100644 index 2d71df64f..000000000 --- a/testhal/STM32F1xx/USB_CDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P103 board. - -** The Demo ** - -The application demonstrates the use of the STM32 USB driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/USB_CDC_F107/.cproject b/testhal/STM32F1xx/USB_CDC_F107/.cproject deleted file mode 100644 index e5f35ee12..000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/.cproject +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F1xx/USB_CDC_F107/.project b/testhal/STM32F1xx/USB_CDC_F107/.project deleted file mode 100644 index cdd1937af..000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/.project +++ /dev/null @@ -1,95 +0,0 @@ - - - TEST-STM32F1xx-USB_CDC_F107 - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_P107 - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/testhal/STM32F1xx/USB_CDC_F107/Makefile b/testhal/STM32F1xx/USB_CDC_F107/Makefile deleted file mode 100644 index 9b861f6d3..000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P107/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform_f105_f107.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F107xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/USB_CDC_F107/chconf.h b/testhal/STM32F1xx/USB_CDC_F107/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_CDC_F107/halconf.h b/testhal/STM32F1xx/USB_CDC_F107/halconf.h deleted file mode 100644 index cd76b0cfe..000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_CDC_F107/main.c b/testhal/STM32F1xx/USB_CDC_F107/main.c deleted file mode 100644 index 8dda559c0..000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/main.c +++ /dev/null @@ -1,509 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "shell.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Endpoints to be used for USBD1. - */ -#define USBD1_DATA_REQUEST_EP 1 -#define USBD1_DATA_AVAILABLE_EP 1 -#define USBD1_INTERRUPT_REQUEST_EP 2 - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 1, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(&SDU1); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD1, - USBD1_DATA_REQUEST_EP, - USBD1_DATA_AVAILABLE_EP, - USBD1_INTERRUPT_REQUEST_EP -}; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { - static uint8_t buf[] = - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: write\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) { - chSequentialStreamWrite(&SDU1, buf, sizeof buf - 1); - } - chprintf(chp, "\r\n\nstopped\r\n"); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"write", cmd_write}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - systime_t time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; - palClearPad(IOPORT3, GPIOC_LED_STATUS1); - chThdSleepMilliseconds(time); - palSetPad(IOPORT3, GPIOC_LED_STATUS1); - chThdSleepMilliseconds(time); - } -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1000); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F1xx/USB_CDC_F107/mcuconf.h b/testhal/STM32F1xx/USB_CDC_F107/mcuconf.h deleted file mode 100644 index 5b6ba6683..000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/mcuconf.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F107 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F107_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_PREDIV1 -#define STM32_PREDIV1SRC STM32_PREDIV1SRC_PLL2 -#define STM32_PREDIV1_VALUE 5 -#define STM32_PLLMUL_VALUE 9 -#define STM32_PREDIV2_VALUE 5 -#define STM32_PLL2MUL_VALUE 8 -#define STM32_PLL3MUL_VALUE 10 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_OTG_CLOCK_REQUIRED TRUE -#define STM32_OTGFSPRE STM32_OTGFSPRE_DIV3 -#define STM32_I2S_CLOCK_REQUIRED FALSE -#define STM32_MCOSEL STM32_MCOSEL_PLL3 -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 TRUE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F1xx/USB_CDC_F107/readme.txt b/testhal/STM32F1xx/USB_CDC_F107/readme.txt deleted file mode 100644 index 43098d8ac..000000000 --- a/testhal/STM32F1xx/USB_CDC_F107/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-P107 board. - -** The Demo ** - -The application demonstrates the use of the STM32 USB (OTG) driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F1xx/USB_MSC/Makefile b/testhal/STM32F1xx/USB_MSC/Makefile deleted file mode 100644 index 1f76375fe..000000000 --- a/testhal/STM32F1xx/USB_MSC/Makefile +++ /dev/null @@ -1,210 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/usb_msc.c \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F1xx/USB_MSC/chconf.h b/testhal/STM32F1xx/USB_MSC/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F1xx/USB_MSC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_MSC/halconf.h b/testhal/STM32F1xx/USB_MSC/halconf.h deleted file mode 100644 index 2d8f40004..000000000 --- a/testhal/STM32F1xx/USB_MSC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI TRUE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F1xx/USB_MSC/main.c b/testhal/STM32F1xx/USB_MSC/main.c deleted file mode 100644 index c8e350596..000000000 --- a/testhal/STM32F1xx/USB_MSC/main.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "usb_msc.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * USB Device Descriptor. - */ -static const uint8_t msc_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x00, /* bDeviceClass (in interface). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x2004, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor msc_device_descriptor = { - sizeof msc_device_descriptor_data, - msc_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t msc_configuration_descriptor_data[32] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(32, /* wTotalLength. */ - 0x01, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x08, /* bInterfaceClass (Mass Stprage). */ - 0x06, /* bInterfaceSubClass (SCSI - transparent command set, MSCO - chapter 2). */ - 0x50, /* bInterfaceProtocol (Bulk-Only - Mass Storage, MSCO chapter 3). */ - 4), /* iInterface. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (MSC_DATA_IN_EP|0x80, /* bEndpointAddress. */ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval (ignored for bulk). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (MSC_DATA_OUT_EP, /* bEndpointAddress. */ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval (ignored for bulk). */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor msc_configuration_descriptor = { - sizeof msc_configuration_descriptor_data, - msc_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t msc_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t msc_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t msc_string2[] = { - USB_DESC_BYTE(50), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'M', 0, 'a', 0, 's', 0, 's', 0, ' ', 0, - 'S', 0, 't', 0, 'o', 0, 'r', 0, 'a', 0, 'g', 0, 'e', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t msc_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Interface string. - */ -static const uint8_t msc_string4[] = { - 16, /* bLength. */ - USB_DESCRIPTOR_STRING, /* bDescriptorType. */ - 'S', 0, 'T', 0, ' ', 0, 'M', 0, 'a', 0, 's', 0, 's', 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor msc_strings[] = { - {sizeof msc_string0, msc_string0}, - {sizeof msc_string1, msc_string1}, - {sizeof msc_string2, msc_string2}, - {sizeof msc_string3, msc_string3}, - {sizeof msc_string4, msc_string4} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &msc_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &msc_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 5) - return &msc_strings[dindex]; - } - return NULL; -} - -/* - * IN EP1 state. - */ -USBInEndpointState ep1state; - -/* - * OUT EP2 state. - */ -USBOutEndpointState ep2state; - -/* - * EP1 initialization structure (IN only). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK | USB_EP_MODE_TRANSACTION, - mscDataTransmitted, - NULL, - 0x0040, - 0x0000, - &ep1state, - NULL -}; - -/* - * EP2 initialization structure (OUT only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_BULK | USB_EP_MODE_TRANSACTION, - NULL, - mscDataReceived, - 0x0000, - 0x0040, - NULL, - &ep2state -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - chSysLockFromIsr(); - usbInitEndpointI(usbp, MSC_DATA_IN_EP, &ep1config); - usbInitEndpointI(usbp, MSC_DATA_OUT_EP, &ep2config); - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * Serial over USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - mscRequestsHook, - NULL -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - palSetPad(IOPORT3, GPIOC_LED); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - */ - usbStart(&USBD1, &usbcfg); - palClearPad(GPIOC, GPIOC_USB_DISC); - - /* - * Activates the serial driver 2 using the driver default configuration. - */ - sdStart(&SD2, NULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (palReadPad(IOPORT1, GPIOA_BUTTON)) - TestThread(&SD2); - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F1xx/USB_MSC/mcuconf.h b/testhal/STM32F1xx/USB_MSC/mcuconf.h deleted file mode 100644 index 157bbda32..000000000 --- a/testhal/STM32F1xx/USB_MSC/mcuconf.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - diff --git a/testhal/STM32F30x/ADC/.cproject b/testhal/STM32F30x/ADC/.cproject deleted file mode 100644 index 18ecf6a9c..000000000 --- a/testhal/STM32F30x/ADC/.cproject +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F30x/ADC/.project b/testhal/STM32F30x/ADC/.project deleted file mode 100644 index 723f89815..000000000 --- a/testhal/STM32F30x/ADC/.project +++ /dev/null @@ -1,90 +0,0 @@ - - - STM32F30x-ADC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F30x/ADC/Makefile b/testhal/STM32F30x/ADC/Makefile deleted file mode 100644 index 455c2e5da..000000000 --- a/testhal/STM32F30x/ADC/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F30x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F30x/ADC/chconf.h b/testhal/STM32F30x/ADC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F30x/ADC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/ADC/halconf.h b/testhal/STM32F30x/ADC/halconf.h deleted file mode 100644 index 85a5dbd3b..000000000 --- a/testhal/STM32F30x/ADC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/ADC/main.c b/testhal/STM32F30x/ADC/main.c deleted file mode 100644 index 8489f1bef..000000000 --- a/testhal/STM32F30x/ADC/main.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 2 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 2 channels, SW triggered. - * Channels: IN7, IN8. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - 0, /* CFGR */ - ADC_TR(0, 4095), /* TR1 */ - 0, /* CCR */ - { /* SMPR[2] */ - 0, - 0 - }, - { /* SQR[4] */ - ADC_SQR1_SQ1_N(ADC_CHANNEL_IN7) | ADC_SQR1_SQ2_N(ADC_CHANNEL_IN8), - 0, - 0, - 0 - } -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN7, IN8, IN7, IN8, IN7, IN8, Sensor, VBat/2. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, /* CFGR */ - ADC_TR(0, 4095), /* TR1 */ - ADC_CCR_TSEN | ADC_CCR_VBATEN, /* CCR */ - { /* SMPR[2] */ - ADC_SMPR1_SMP_AN7(ADC_SMPR_SMP_19P5) - | ADC_SMPR1_SMP_AN8(ADC_SMPR_SMP_19P5), - ADC_SMPR2_SMP_AN16(ADC_SMPR_SMP_61P5) - | ADC_SMPR2_SMP_AN17(ADC_SMPR_SMP_61P5), - }, - { /* SQR[4] */ - ADC_SQR1_SQ1_N(ADC_CHANNEL_IN7) | ADC_SQR1_SQ2_N(ADC_CHANNEL_IN8) | - ADC_SQR1_SQ3_N(ADC_CHANNEL_IN7) | ADC_SQR1_SQ4_N(ADC_CHANNEL_IN8), - ADC_SQR2_SQ5_N(ADC_CHANNEL_IN7) | ADC_SQR2_SQ6_N(ADC_CHANNEL_IN8) | - ADC_SQR2_SQ7_N(ADC_CHANNEL_IN16) | ADC_SQR2_SQ8_N(ADC_CHANNEL_IN17), - 0, - 0 - } -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOE, GPIOE_LED10_RED); - chThdSleepMilliseconds(500); - palClearPad(GPIOE, GPIOE_LED10_RED); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(1) | PAL_PORT_BIT(2), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the temperature sensor. - */ - adcStart(&ADCD1, NULL); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - adcStopConversion(&ADCD1); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F30x/ADC/mcuconf.h b/testhal/STM32F30x/ADC/mcuconf.h deleted file mode 100644 index 3f9c9b5fa..000000000 --- a/testhal/STM32F30x/ADC/mcuconf.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_UART4SW STM32_UART4SW_PCLK -#define STM32_UART5SW STM32_UART5SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_TIM1SW STM32_TIM1SW_PCLK2 -#define STM32_TIM8SW STM32_TIM8SW_PCLK2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC3 TRUE -#define STM32_ADC_ADC12_DMA_PRIORITY 2 -#define STM32_ADC_ADC34_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_DUAL_MODE FALSE - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F30x/ADC/readme.txt b/testhal/STM32F30x/ADC/readme.txt deleted file mode 100644 index bc0a30424..000000000 --- a/testhal/STM32F30x/ADC/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32F30x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F3-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F30x ADC driver. - -** Board Setup ** - -- Connect PC1 to 3.3V and PC2 to GND for analog measurements. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F30x/ADC_DUAL/.cproject b/testhal/STM32F30x/ADC_DUAL/.cproject deleted file mode 100644 index 151e30397..000000000 --- a/testhal/STM32F30x/ADC_DUAL/.cproject +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F30x/ADC_DUAL/.project b/testhal/STM32F30x/ADC_DUAL/.project deleted file mode 100644 index 216f76c48..000000000 --- a/testhal/STM32F30x/ADC_DUAL/.project +++ /dev/null @@ -1,90 +0,0 @@ - - - STM32F30x-ADC_DUAL - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F30x/ADC_DUAL/Makefile b/testhal/STM32F30x/ADC_DUAL/Makefile deleted file mode 100644 index 455c2e5da..000000000 --- a/testhal/STM32F30x/ADC_DUAL/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F30x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F30x/ADC_DUAL/chconf.h b/testhal/STM32F30x/ADC_DUAL/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F30x/ADC_DUAL/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/ADC_DUAL/halconf.h b/testhal/STM32F30x/ADC_DUAL/halconf.h deleted file mode 100644 index 85a5dbd3b..000000000 --- a/testhal/STM32F30x/ADC_DUAL/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/ADC_DUAL/main.c b/testhal/STM32F30x/ADC_DUAL/main.c deleted file mode 100644 index c4fa35c5c..000000000 --- a/testhal/STM32F30x/ADC_DUAL/main.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 4 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 16 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 2 channels, SW triggered. - * Channels: IN7, IN8. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - 0, /* CFGR */ - ADC_TR(0, 4095), /* TR1 */ - ADC_CCR_DUAL(1), /* CCR */ - { /* SMPR[2] */ - 0, - 0 - }, - { /* SQR[4] */ - ADC_SQR1_SQ1_N(ADC_CHANNEL_IN7) | ADC_SQR1_SQ2_N(ADC_CHANNEL_IN8), - 0, - 0, - 0 - }, - { /* SSMPR[2] */ - 0, - 0 - }, - { /* SSQR[4] */ - ADC_SQR1_SQ1_N(ADC_CHANNEL_IN8) | ADC_SQR1_SQ2_N(ADC_CHANNEL_IN7), - 0, - 0, - 0 - } -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN7, IN8, IN7, IN8, IN7, IN8, Sensor, VBat/2. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, /* CFGR */ - ADC_TR(0, 4095), /* TR1 */ - ADC_CCR_DUAL(1) | ADC_CCR_TSEN | ADC_CCR_VBATEN, /* CCR */ - { /* SMPR[2] */ - ADC_SMPR1_SMP_AN7(ADC_SMPR_SMP_19P5) - | ADC_SMPR1_SMP_AN8(ADC_SMPR_SMP_19P5), - ADC_SMPR2_SMP_AN16(ADC_SMPR_SMP_61P5) - | ADC_SMPR2_SMP_AN17(ADC_SMPR_SMP_61P5), - }, - { /* SQR[4] */ - ADC_SQR1_SQ1_N(ADC_CHANNEL_IN7) | ADC_SQR1_SQ2_N(ADC_CHANNEL_IN8) | - ADC_SQR1_SQ3_N(ADC_CHANNEL_IN7) | ADC_SQR1_SQ4_N(ADC_CHANNEL_IN8), - ADC_SQR2_SQ5_N(ADC_CHANNEL_IN7) | ADC_SQR2_SQ6_N(ADC_CHANNEL_IN8) | - ADC_SQR2_SQ7_N(ADC_CHANNEL_IN16) | ADC_SQR2_SQ8_N(ADC_CHANNEL_IN17), - 0, - 0 - }, - { /* SSMPR[2] */ - ADC_SMPR1_SMP_AN7(ADC_SMPR_SMP_19P5) - | ADC_SMPR1_SMP_AN8(ADC_SMPR_SMP_19P5), - ADC_SMPR2_SMP_AN16(ADC_SMPR_SMP_61P5) - | ADC_SMPR2_SMP_AN17(ADC_SMPR_SMP_61P5), - }, - { /* SSQR[4] */ - ADC_SQR1_SQ1_N(ADC_CHANNEL_IN8) | ADC_SQR1_SQ2_N(ADC_CHANNEL_IN7) | - ADC_SQR1_SQ3_N(ADC_CHANNEL_IN8) | ADC_SQR1_SQ4_N(ADC_CHANNEL_IN7), - ADC_SQR2_SQ5_N(ADC_CHANNEL_IN8) | ADC_SQR2_SQ6_N(ADC_CHANNEL_IN7) | - ADC_SQR2_SQ7_N(ADC_CHANNEL_IN17) | ADC_SQR2_SQ8_N(ADC_CHANNEL_IN16), - 0, - 0 - } -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOE, GPIOE_LED10_RED); - chThdSleepMilliseconds(500); - palClearPad(GPIOE, GPIOE_LED10_RED); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(1) | PAL_PORT_BIT(2), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the temperature sensor. - */ - adcStart(&ADCD1, NULL); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - adcStopConversion(&ADCD1); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F30x/ADC_DUAL/mcuconf.h b/testhal/STM32F30x/ADC_DUAL/mcuconf.h deleted file mode 100644 index 4b69ad89d..000000000 --- a/testhal/STM32F30x/ADC_DUAL/mcuconf.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_UART4SW STM32_UART4SW_PCLK -#define STM32_UART5SW STM32_UART5SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_TIM1SW STM32_TIM1SW_PCLK2 -#define STM32_TIM8SW STM32_TIM8SW_PCLK2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC3 TRUE -#define STM32_ADC_ADC12_DMA_PRIORITY 2 -#define STM32_ADC_ADC34_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_DUAL_MODE TRUE - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F30x/ADC_DUAL/readme.txt b/testhal/STM32F30x/ADC_DUAL/readme.txt deleted file mode 100644 index bc0a30424..000000000 --- a/testhal/STM32F30x/ADC_DUAL/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32F30x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F3-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F30x ADC driver. - -** Board Setup ** - -- Connect PC1 to 3.3V and PC2 to GND for analog measurements. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F30x/CAN/.cproject b/testhal/STM32F30x/CAN/.cproject deleted file mode 100644 index 7cdad62bb..000000000 --- a/testhal/STM32F30x/CAN/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F30x/CAN/.project b/testhal/STM32F30x/CAN/.project deleted file mode 100644 index a01f8a133..000000000 --- a/testhal/STM32F30x/CAN/.project +++ /dev/null @@ -1,90 +0,0 @@ - - - STM32F30x-CAN - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j1 - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F30x/CAN/Makefile b/testhal/STM32F30x/CAN/Makefile deleted file mode 100644 index 455c2e5da..000000000 --- a/testhal/STM32F30x/CAN/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F30x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F30x/CAN/chconf.h b/testhal/STM32F30x/CAN/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F30x/CAN/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/CAN/halconf.h b/testhal/STM32F30x/CAN/halconf.h deleted file mode 100644 index 5b6535967..000000000 --- a/testhal/STM32F30x/CAN/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/CAN/main.c b/testhal/STM32F30x/CAN/main.c deleted file mode 100644 index c44acf566..000000000 --- a/testhal/STM32F30x/CAN/main.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Internal loopback mode, 500KBaud, automatic wakeup, automatic recover - * from abort mode. - */ -static const CANConfig cancfg = { - CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP, - CAN_BTR_LBKM | CAN_BTR_SJW(0) | CAN_BTR_TS2(1) | - CAN_BTR_TS1(8) | CAN_BTR_BRP(6) -}; - -/* - * Receiver thread. - */ -static WORKING_AREA(can_rx_wa, 256); -static msg_t can_rx(void *p) { - EventListener el; - CANRxFrame rxmsg; - - (void)p; - chRegSetThreadName("receiver"); - chEvtRegister(&CAND1.rxfull_event, &el, 0); - while(!chThdShouldTerminate()) { - if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) - continue; - while (canReceive(&CAND1, CAN_ANY_MAILBOX, &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(GPIOE, GPIOE_LED3_RED); - } - } - chEvtUnregister(&CAND1.rxfull_event, &el); - return 0; -} - -/* - * Transmitter thread. - */ -static WORKING_AREA(can_tx_wa, 256); -static msg_t can_tx(void * p) { - CANTxFrame txmsg; - - (void)p; - chRegSetThreadName("transmitter"); - txmsg.IDE = CAN_IDE_EXT; - txmsg.EID = 0x01234567; - txmsg.RTR = CAN_RTR_DATA; - txmsg.DLC = 8; - txmsg.data32[0] = 0x55AA55AA; - txmsg.data32[1] = 0x00FF00FF; - - while (!chThdShouldTerminate()) { - canTransmit(&CAND1, CAN_ANY_MAILBOX, &txmsg, MS2ST(100)); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the CAN driver 1. - */ - canStart(&CAND1, &cancfg); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(can_rx_wa, sizeof(can_rx_wa), NORMALPRIO + 7, can_rx, NULL); - chThdCreateStatic(can_tx_wa, sizeof(can_tx_wa), NORMALPRIO + 7, can_tx, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F30x/CAN/mcuconf.h b/testhal/STM32F30x/CAN/mcuconf.h deleted file mode 100644 index 42fc2ed25..000000000 --- a/testhal/STM32F30x/CAN/mcuconf.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_UART4SW STM32_UART4SW_PCLK -#define STM32_UART5SW STM32_UART5SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_TIM1SW STM32_TIM1SW_PCLK2 -#define STM32_TIM8SW STM32_TIM8SW_PCLK2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC12_DMA_PRIORITY 2 -#define STM32_ADC_ADC34_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_DUAL_MODE FALSE - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F30x/CAN/readme.txt b/testhal/STM32F30x/CAN/readme.txt deleted file mode 100644 index 983b34d1d..000000000 --- a/testhal/STM32F30x/CAN/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - CAN driver demo for STM32F30x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F3-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F30x CAN driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F30x/EXT/.cproject b/testhal/STM32F30x/EXT/.cproject deleted file mode 100644 index 81789e942..000000000 --- a/testhal/STM32F30x/EXT/.cproject +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F30x/EXT/.project b/testhal/STM32F30x/EXT/.project deleted file mode 100644 index 7c6f467a6..000000000 --- a/testhal/STM32F30x/EXT/.project +++ /dev/null @@ -1,90 +0,0 @@ - - - STM32F30x-EXT - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F30x/EXT/Makefile b/testhal/STM32F30x/EXT/Makefile deleted file mode 100644 index 8e7cec92d..000000000 --- a/testhal/STM32F30x/EXT/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F30x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F30x/EXT/chconf.h b/testhal/STM32F30x/EXT/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F30x/EXT/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/EXT/halconf.h b/testhal/STM32F30x/EXT/halconf.h deleted file mode 100644 index e0e0c38ff..000000000 --- a/testhal/STM32F30x/EXT/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/EXT/main.c b/testhal/STM32F30x/EXT/main.c deleted file mode 100644 index 9ef548d87..000000000 --- a/testhal/STM32F30x/EXT/main.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void led5off(void *arg) { - - (void)arg; - palClearPad(GPIOE, GPIOE_LED10_RED); -} - -/* Triggered when the button is pressed or released. The LED5 is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - - palSetPad(GPIOE, GPIOE_LED10_RED); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - - /* LED4 set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), led5off, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32F30x/EXT/mcuconf.h b/testhal/STM32F30x/EXT/mcuconf.h deleted file mode 100644 index 42fc2ed25..000000000 --- a/testhal/STM32F30x/EXT/mcuconf.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_UART4SW STM32_UART4SW_PCLK -#define STM32_UART5SW STM32_UART5SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_TIM1SW STM32_TIM1SW_PCLK2 -#define STM32_TIM8SW STM32_TIM8SW_PCLK2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC12_DMA_PRIORITY 2 -#define STM32_ADC_ADC34_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_DUAL_MODE FALSE - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F30x/EXT/readme.txt b/testhal/STM32F30x/EXT/readme.txt deleted file mode 100644 index 39255526b..000000000 --- a/testhal/STM32F30x/EXT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32F30x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F3-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F30x EXT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F30x/IRQ_STORM/.cproject b/testhal/STM32F30x/IRQ_STORM/.cproject deleted file mode 100644 index ed2858c43..000000000 --- a/testhal/STM32F30x/IRQ_STORM/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F30x/IRQ_STORM/.project b/testhal/STM32F30x/IRQ_STORM/.project deleted file mode 100644 index a7a6d0b2e..000000000 --- a/testhal/STM32F30x/IRQ_STORM/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F30x-IRQ_STORM - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F30x/IRQ_STORM/Makefile b/testhal/STM32F30x/IRQ_STORM/Makefile deleted file mode 100644 index 455c2e5da..000000000 --- a/testhal/STM32F30x/IRQ_STORM/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F30x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F30x/IRQ_STORM/chconf.h b/testhal/STM32F30x/IRQ_STORM/chconf.h deleted file mode 100644 index 38242d75d..000000000 --- a/testhal/STM32F30x/IRQ_STORM/chconf.h +++ /dev/null @@ -1,533 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#define CORTEX_USE_FPU FALSE - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/IRQ_STORM/halconf.h b/testhal/STM32F30x/IRQ_STORM/halconf.h deleted file mode 100644 index 117a5979b..000000000 --- a/testhal/STM32F30x/IRQ_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/IRQ_STORM/main.c b/testhal/STM32F30x/IRQ_STORM/main.c deleted file mode 100644 index 2487373ca..000000000 --- a/testhal/STM32F30x/IRQ_STORM/main.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOE, GPIOE_LED10_RED); - } - } - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1, PA9 and PA10 are routed to USART1. - */ - sdStart(&SD1, NULL); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(7)); /* USART1 TX. */ - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(7)); /* USART1 RX. */ - - /* - * Activates GPTs. - */ - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 10; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } -} diff --git a/testhal/STM32F30x/IRQ_STORM/mcuconf.h b/testhal/STM32F30x/IRQ_STORM/mcuconf.h deleted file mode 100644 index c660fc3f9..000000000 --- a/testhal/STM32F30x/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_UART4SW STM32_UART4SW_PCLK -#define STM32_UART5SW STM32_UART5SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_TIM1SW STM32_TIM1SW_PCLK2 -#define STM32_TIM8SW STM32_TIM8SW_PCLK2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC12_DMA_PRIORITY 2 -#define STM32_ADC_ADC34_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_DUAL_MODE FALSE - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 TRUE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 TRUE -#define STM32_GPT_USE_TIM8 TRUE -#define STM32_GPT_USE_TIM7 TRUE -#define STM32_GPT_USE_TIM8 TRUE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 6 -#define STM32_GPT_TIM3_IRQ_PRIORITY 10 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 TRUE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F30x/IRQ_STORM/readme.txt b/testhal/STM32F30x/IRQ_STORM/readme.txt deleted file mode 100644 index 5193c5f89..000000000 --- a/testhal/STM32F30x/IRQ_STORM/readme.txt +++ /dev/null @@ -1,32 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM stress test demo for STM32F30x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F3-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F30x GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -- Connect an RS232 transceiver to pins PA9(TX) and PA10(RX). -- Connect a terminal emulator to the transceiver (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F30x/PWM-ICU/.cproject b/testhal/STM32F30x/PWM-ICU/.cproject deleted file mode 100644 index 0bb5b2f00..000000000 --- a/testhal/STM32F30x/PWM-ICU/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F30x/PWM-ICU/.project b/testhal/STM32F30x/PWM-ICU/.project deleted file mode 100644 index 6d36832e8..000000000 --- a/testhal/STM32F30x/PWM-ICU/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F30x-PWM-ICU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F30x/PWM-ICU/Makefile b/testhal/STM32F30x/PWM-ICU/Makefile deleted file mode 100644 index 455c2e5da..000000000 --- a/testhal/STM32F30x/PWM-ICU/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F30x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F30x/PWM-ICU/chconf.h b/testhal/STM32F30x/PWM-ICU/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F30x/PWM-ICU/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/PWM-ICU/halconf.h b/testhal/STM32F30x/PWM-ICU/halconf.h deleted file mode 100644 index 2f74c82c8..000000000 --- a/testhal/STM32F30x/PWM-ICU/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/PWM-ICU/main.c b/testhal/STM32F30x/PWM-ICU/main.c deleted file mode 100644 index 01215fdda..000000000 --- a/testhal/STM32F30x/PWM-ICU/main.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIOE, GPIOE_LED4_BLUE); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIOE, GPIOE_LED4_BLUE); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(GPIOE, GPIOE_LED9_BLUE); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(GPIOE, GPIOE_LED9_BLUE); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - NULL, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 2 and ICU driver 3. - * GPIOA15 is the PWM output. - * GPIOC6 is the ICU input. - * The two pins have to be externally connected together. - */ - pwmStart(&PWMD2, &pwmcfg); - palSetPadMode(GPIOA, 15, PAL_MODE_ALTERNATE(1)); - icuStart(&ICUD3, &icucfg); - palSetPadMode(GPIOC, 6, PAL_MODE_ALTERNATE(2)); - icuEnable(&ICUD3); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD2, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD2, 0); - pwmStop(&PWMD2); - icuDisable(&ICUD3); - icuStop(&ICUD3); - palClearPad(GPIOE, GPIOE_LED4_BLUE); - palClearPad(GPIOE, GPIOE_LED9_BLUE); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F30x/PWM-ICU/mcuconf.h b/testhal/STM32F30x/PWM-ICU/mcuconf.h deleted file mode 100644 index ca40cb887..000000000 --- a/testhal/STM32F30x/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_UART4SW STM32_UART4SW_PCLK -#define STM32_UART5SW STM32_UART5SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_TIM1SW STM32_TIM1SW_PCLK2 -#define STM32_TIM8SW STM32_TIM8SW_PCLK2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC12_DMA_PRIORITY 2 -#define STM32_ADC_ADC34_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_DUAL_MODE FALSE - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 TRUE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 TRUE -#define STM32_ICU_USE_TIM4 TRUE -#define STM32_ICU_USE_TIM8 TRUE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 TRUE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F30x/PWM-ICU/readme.txt b/testhal/STM32F30x/PWM-ICU/readme.txt deleted file mode 100644 index cfb53f76a..000000000 --- a/testhal/STM32F30x/PWM-ICU/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM-ICU drivers demo for STM32F30x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F3-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F30x PWM-ICU drivers. - -** Board Setup ** - -- Connect PA15 and PC6 together. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F30x/SPI/.cproject b/testhal/STM32F30x/SPI/.cproject deleted file mode 100644 index 104d73e64..000000000 --- a/testhal/STM32F30x/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F30x/SPI/.project b/testhal/STM32F30x/SPI/.project deleted file mode 100644 index 61b728dcf..000000000 --- a/testhal/STM32F30x/SPI/.project +++ /dev/null @@ -1,90 +0,0 @@ - - - STM32F30x-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j1 - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F30x/SPI/Makefile b/testhal/STM32F30x/SPI/Makefile deleted file mode 100644 index 455c2e5da..000000000 --- a/testhal/STM32F30x/SPI/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F30x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F30x/SPI/chconf.h b/testhal/STM32F30x/SPI/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F30x/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/SPI/halconf.h b/testhal/STM32F30x/SPI/halconf.h deleted file mode 100644 index 3e1cafbbf..000000000 --- a/testhal/STM32F30x/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/SPI/main.c b/testhal/STM32F30x/SPI/main.c deleted file mode 100644 index aedae794a..000000000 --- a/testhal/STM32F30x/SPI/main.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOB, - 12, - 0, - SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 -}; - -/* - * Low speed SPI configuration (140.625kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - GPIOB, - 12, - SPI_CR1_BR_2 | SPI_CR1_BR_1, - SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palSetPad(GPIOE, GPIOE_LED10_RED); /* LED ON. */ - spiStart(&SPID2, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palClearPad(GPIOE, GPIOE_LED10_RED);/* LED OFF. */ - spiStart(&SPID2, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static WORKING_AREA(blinker_wa, 128); -static msg_t blinker(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOE, GPIOE_LED3_RED); - chThdSleepMilliseconds(500); - palClearPad(GPIOE, GPIOE_LED3_RED); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * SPI2 I/O pins setup. - */ - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New SCK. */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New MOSI. */ - palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); /* New CS. */ - palSetPad(GPIOB, 12); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Starting the blinker thread. - */ - chThdCreateStatic(blinker_wa, sizeof(blinker_wa), - NORMALPRIO-1, blinker, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F30x/SPI/mcuconf.h b/testhal/STM32F30x/SPI/mcuconf.h deleted file mode 100644 index 1768aa8db..000000000 --- a/testhal/STM32F30x/SPI/mcuconf.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_UART4SW STM32_UART4SW_PCLK -#define STM32_UART5SW STM32_UART5SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_TIM1SW STM32_TIM1SW_PCLK2 -#define STM32_TIM8SW STM32_TIM8SW_PCLK2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC12_DMA_PRIORITY 2 -#define STM32_ADC_ADC34_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_DUAL_MODE FALSE - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F30x/SPI/readme.txt b/testhal/STM32F30x/SPI/readme.txt deleted file mode 100644 index 9275c06ee..000000000 --- a/testhal/STM32F30x/SPI/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for STM32F30x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32F3-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F30x SPI driver. - -** Board Setup ** - -- Connect PB14 and PB15 together for SPI loop-back. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F30x/UART/.cproject b/testhal/STM32F30x/UART/.cproject deleted file mode 100644 index 661d548d0..000000000 --- a/testhal/STM32F30x/UART/.cproject +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F30x/UART/.project b/testhal/STM32F30x/UART/.project deleted file mode 100644 index 24b9d53ce..000000000 --- a/testhal/STM32F30x/UART/.project +++ /dev/null @@ -1,90 +0,0 @@ - - - STM32F30x-UART - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F30x/UART/Makefile b/testhal/STM32F30x/UART/Makefile deleted file mode 100644 index 8e7cec92d..000000000 --- a/testhal/STM32F30x/UART/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F30x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F30x/UART/chconf.h b/testhal/STM32F30x/UART/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F30x/UART/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/UART/halconf.h b/testhal/STM32F30x/UART/halconf.h deleted file mode 100644 index a4fc70926..000000000 --- a/testhal/STM32F30x/UART/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/UART/main.c b/testhal/STM32F30x/UART/main.c deleted file mode 100644 index 9d0bea53c..000000000 --- a/testhal/STM32F30x/UART/main.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt1, vt2; - -static void restart(void *p) { - - (void)p; - - chSysLockFromIsr(); - uartStartSendI(&UARTD1, 14, "Hello World!\r\n"); - chSysUnlockFromIsr(); -} - -static void ledoff(void *p) { - - (void)p; - palClearPad(GPIOE, GPIOE_LED3_RED); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; - palSetPad(GPIOE, GPIOE_LED3_RED); -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palClearPad(GPIOE, GPIOE_LED3_RED); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt1)) - chVTResetI(&vt1); - chVTSetI(&vt1, MS2ST(5000), restart, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palSetPad(GPIOE, GPIOE_LED3_RED); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt2)) - chVTResetI(&vt2); - chVTSetI(&vt2, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1, PA9 and PA10 are routed to USART1. - */ - uartStart(&UARTD1, &uart_cfg_1); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(7)); /* USART1 TX. */ - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(7)); /* USART1 RX. */ - - /* - * Starts the transmission, it will be handled entirely in background. - */ - uartStartSend(&UARTD1, 13, "Starting...\r\n"); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F30x/UART/mcuconf.h b/testhal/STM32F30x/UART/mcuconf.h deleted file mode 100644 index 0eaddf96a..000000000 --- a/testhal/STM32F30x/UART/mcuconf.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_UART4SW STM32_UART4SW_PCLK -#define STM32_UART5SW STM32_UART5SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_TIM1SW STM32_TIM1SW_PCLK2 -#define STM32_TIM8SW STM32_TIM8SW_PCLK2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC12_DMA_PRIORITY 2 -#define STM32_ADC_ADC34_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_DUAL_MODE FALSE - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USE_USART3 TRUE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F30x/UART/readme.txt b/testhal/STM32F30x/UART/readme.txt deleted file mode 100644 index 3f55599a8..000000000 --- a/testhal/STM32F30x/UART/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32F30x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F3-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F30x UART driver. - -** Board Setup ** - -- Connect an RS232 transceiver to pins PA9(TX) and PA10(RX). -- Connect a terminal emulator to the transceiver (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F30x/USB_CDC/.cproject b/testhal/STM32F30x/USB_CDC/.cproject deleted file mode 100644 index 839c40d30..000000000 --- a/testhal/STM32F30x/USB_CDC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F30x/USB_CDC/.project b/testhal/STM32F30x/USB_CDC/.project deleted file mode 100644 index a1dcbcd63..000000000 --- a/testhal/STM32F30x/USB_CDC/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - STM32F30x-USB_CDC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F3_DISCOVERY - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/testhal/STM32F30x/USB_CDC/Makefile b/testhal/STM32F30x/USB_CDC/Makefile deleted file mode 100644 index 1f03d2992..000000000 --- a/testhal/STM32F30x/USB_CDC/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F3_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F30x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F303xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F30x/USB_CDC/chconf.h b/testhal/STM32F30x/USB_CDC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F30x/USB_CDC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/USB_CDC/halconf.h b/testhal/STM32F30x/USB_CDC/halconf.h deleted file mode 100644 index cd76b0cfe..000000000 --- a/testhal/STM32F30x/USB_CDC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F30x/USB_CDC/main.c b/testhal/STM32F30x/USB_CDC/main.c deleted file mode 100644 index 6555da8d3..000000000 --- a/testhal/STM32F30x/USB_CDC/main.c +++ /dev/null @@ -1,516 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "shell.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Endpoints to be used for USBD1. - */ -#define USBD1_DATA_REQUEST_EP 1 -#define USBD1_DATA_AVAILABLE_EP 1 -#define USBD1_INTERRUPT_REQUEST_EP 2 - -/* - * DP resistor control is not possible on the STM32F3-Discovery, using stubs - * for the connection macros. - */ -#define usb_lld_connect_bus(usbp) -#define usb_lld_disconnect_bus(usbp) - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 1, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(&SDU1); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD1, - USBD1_DATA_REQUEST_EP, - USBD1_DATA_AVAILABLE_EP, - USBD1_INTERRUPT_REQUEST_EP -}; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { - static uint8_t buf[] = - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: write\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) { - chSequentialStreamWrite(&SDU1, buf, sizeof buf - 1); - } - chprintf(chp, "\r\n\nstopped\r\n"); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"write", cmd_write}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - systime_t time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; - palClearPad(GPIOE, GPIOE_LED3_RED); - chThdSleepMilliseconds(time); - palSetPad(GPIOE, GPIOE_LED3_RED); - chThdSleepMilliseconds(time); - } -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1500); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F30x/USB_CDC/mcuconf.h b/testhal/STM32F30x/USB_CDC/mcuconf.h deleted file mode 100644 index c0a1aaa0f..000000000 --- a/testhal/STM32F30x/USB_CDC/mcuconf.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F30x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 -#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_UART4SW STM32_UART4SW_PCLK -#define STM32_UART5SW STM32_UART5SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_TIM1SW STM32_TIM1SW_PCLK2 -#define STM32_TIM8SW STM32_TIM8SW_PCLK2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC12_DMA_PRIORITY 2 -#define STM32_ADC_ADC34_DMA_PRIORITY 2 -#define STM32_ADC_ADC12_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC34_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 -#define STM32_ADC_DUAL_MODE FALSE - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F30x/USB_CDC/readme.txt b/testhal/STM32F30x/USB_CDC/readme.txt deleted file mode 100644 index 39055f999..000000000 --- a/testhal/STM32F30x/USB_CDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32F30x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32F3-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F30x USB driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/ADC/.cproject b/testhal/STM32F37x/ADC/.cproject deleted file mode 100644 index 2230bab81..000000000 --- a/testhal/STM32F37x/ADC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/ADC/.project b/testhal/STM32F37x/ADC/.project deleted file mode 100644 index cf24ffaeb..000000000 --- a/testhal/STM32F37x/ADC/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F37x-ADC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F37x/ADC/Makefile b/testhal/STM32F37x/ADC/Makefile deleted file mode 100644 index 684302ce4..000000000 --- a/testhal/STM32F37x/ADC/Makefile +++ /dev/null @@ -1,220 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/ADC/chconf.h b/testhal/STM32F37x/ADC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F37x/ADC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/ADC/halconf.h b/testhal/STM32F37x/ADC/halconf.h deleted file mode 100644 index 85a5dbd3b..000000000 --- a/testhal/STM32F37x/ADC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/ADC/main.c b/testhal/STM32F37x/ADC/main.c deleted file mode 100644 index b9a481825..000000000 --- a/testhal/STM32F37x/ADC/main.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 2 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 2 channels, SW triggered. - * Channels: IN1, IN9. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - .u.adc = { - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - 0, /* LTR */ - 0, /* HTR */ - { /* SMPR[2] */ - 0, - ADC_SMPR2_SMP_AN9(ADC_SAMPLE_41P5) | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_41P5), - }, - { /* SQR[3] */ - 0, - 0, - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN9) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN1) - } - } -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN1, IN9, IN1, IN9, IN1, IN9, VBat, Sensor. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - .u.adc = { - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - 0, /* LTR */ - 0, /* HTR */ - { /* SMPR[2] */ - ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_239P5) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_239P5), - ADC_SMPR2_SMP_AN9(ADC_SAMPLE_41P5) | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_41P5) - }, - { /* SQR[3] */ - 0, - ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VBAT), - ADC_SQR3_SQ6_N(ADC_CHANNEL_IN9) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN1) | - ADC_SQR3_SQ4_N(ADC_CHANNEL_IN9) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN1) | - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN9) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN1) - } - } -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(500); - palSetPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver, the temperature sensor and the VBat - * measurement. - */ - adcStart(&ADCD1, NULL); - adcSTM32Calibrate(&ADCD1); - adcSTM32EnableTSVREFE(); - adcSTM32EnableVBATE(); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_WKUP_BUTTON)) { - adcStopConversion(&ADCD1); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F37x/ADC/mcuconf.h b/testhal/STM32F37x/ADC/mcuconf.h deleted file mode 100644 index 7cdc9bf4a..000000000 --- a/testhal/STM32F37x/ADC/mcuconf.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_SDADC1 FALSE -#define STM32_ADC_USE_SDADC2 FALSE -#define STM32_ADC_USE_SDADC3 FALSE -#define STM32_ADC_SDADC_SLOW_MODE FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/ADC/readme.txt b/testhal/STM32F37x/ADC/readme.txt deleted file mode 100644 index 8cb97fdc2..000000000 --- a/testhal/STM32F37x/ADC/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x ADC driver on the -ADC peripheral. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/CAN/.cproject b/testhal/STM32F37x/CAN/.cproject deleted file mode 100644 index a6eeccae8..000000000 --- a/testhal/STM32F37x/CAN/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/CAN/.project b/testhal/STM32F37x/CAN/.project deleted file mode 100644 index d26e9f35e..000000000 --- a/testhal/STM32F37x/CAN/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F37x-CAN - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F37x/CAN/Makefile b/testhal/STM32F37x/CAN/Makefile deleted file mode 100644 index 782a3b3d7..000000000 --- a/testhal/STM32F37x/CAN/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/CAN/chconf.h b/testhal/STM32F37x/CAN/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F37x/CAN/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/CAN/halconf.h b/testhal/STM32F37x/CAN/halconf.h deleted file mode 100644 index 5b6535967..000000000 --- a/testhal/STM32F37x/CAN/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/CAN/main.c b/testhal/STM32F37x/CAN/main.c deleted file mode 100644 index 12e0c4650..000000000 --- a/testhal/STM32F37x/CAN/main.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Internal loopback mode, 500KBaud, automatic wakeup, automatic recover - * from abort mode. - */ -static const CANConfig cancfg = { - CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP, - CAN_BTR_LBKM | CAN_BTR_SJW(0) | CAN_BTR_TS2(1) | - CAN_BTR_TS1(8) | CAN_BTR_BRP(6) -}; - -/* - * Receiver thread. - */ -static WORKING_AREA(can_rx_wa, 256); -static msg_t can_rx(void *p) { - EventListener el; - CANRxFrame rxmsg; - - (void)p; - chRegSetThreadName("receiver"); - chEvtRegister(&CAND1.rxfull_event, &el, 0); - while(!chThdShouldTerminate()) { - if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) - continue; - while (canReceive(&CAND1, CAN_ANY_MAILBOX, &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(GPIOC, GPIOC_LED1); - } - } - chEvtUnregister(&CAND1.rxfull_event, &el); - return 0; -} - -/* - * Transmitter thread. - */ -static WORKING_AREA(can_tx_wa, 256); -static msg_t can_tx(void * p) { - CANTxFrame txmsg; - - (void)p; - chRegSetThreadName("transmitter"); - txmsg.IDE = CAN_IDE_EXT; - txmsg.EID = 0x01234567; - txmsg.RTR = CAN_RTR_DATA; - txmsg.DLC = 8; - txmsg.data32[0] = 0x55AA55AA; - txmsg.data32[1] = 0x00FF00FF; - - while (!chThdShouldTerminate()) { - canTransmit(&CAND1, CAN_ANY_MAILBOX, &txmsg, MS2ST(100)); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the CAN driver 1. - */ - canStart(&CAND1, &cancfg); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(can_rx_wa, sizeof(can_rx_wa), NORMALPRIO + 7, can_rx, NULL); - chThdCreateStatic(can_tx_wa, sizeof(can_tx_wa), NORMALPRIO + 7, can_tx, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F37x/CAN/mcuconf.h b/testhal/STM32F37x/CAN/mcuconf.h deleted file mode 100644 index 1434b2fae..000000000 --- a/testhal/STM32F37x/CAN/mcuconf.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_SDADC1 FALSE -#define STM32_ADC_USE_SDADC2 FALSE -#define STM32_ADC_USE_SDADC3 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/CAN/readme.txt b/testhal/STM32F37x/CAN/readme.txt deleted file mode 100644 index 9acc1deee..000000000 --- a/testhal/STM32F37x/CAN/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - CAN driver demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x CAN driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/EXT/.cproject b/testhal/STM32F37x/EXT/.cproject deleted file mode 100644 index 420df3639..000000000 --- a/testhal/STM32F37x/EXT/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/EXT/.project b/testhal/STM32F37x/EXT/.project deleted file mode 100644 index e64b8406f..000000000 --- a/testhal/STM32F37x/EXT/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F37x-EXT - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F37x/EXT/Makefile b/testhal/STM32F37x/EXT/Makefile deleted file mode 100644 index 782a3b3d7..000000000 --- a/testhal/STM32F37x/EXT/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/EXT/chconf.h b/testhal/STM32F37x/EXT/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F37x/EXT/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/EXT/halconf.h b/testhal/STM32F37x/EXT/halconf.h deleted file mode 100644 index e0e0c38ff..000000000 --- a/testhal/STM32F37x/EXT/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/EXT/main.c b/testhal/STM32F37x/EXT/main.c deleted file mode 100644 index 7c158e306..000000000 --- a/testhal/STM32F37x/EXT/main.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void led5off(void *arg) { - - (void)arg; - palClearPad(GPIOC, GPIOC_LED1); -} - -/* Triggered when the button is pressed or released. The LED5 is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - - palSetPad(GPIOC, GPIOC_LED1); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - - /* LED4 set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), led5off, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32F37x/EXT/mcuconf.h b/testhal/STM32F37x/EXT/mcuconf.h deleted file mode 100644 index 1434b2fae..000000000 --- a/testhal/STM32F37x/EXT/mcuconf.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_SDADC1 FALSE -#define STM32_ADC_USE_SDADC2 FALSE -#define STM32_ADC_USE_SDADC3 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/EXT/readme.txt b/testhal/STM32F37x/EXT/readme.txt deleted file mode 100644 index e5a0e21fb..000000000 --- a/testhal/STM32F37x/EXT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x EXT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/I2C/.cproject b/testhal/STM32F37x/I2C/.cproject deleted file mode 100644 index 367316a03..000000000 --- a/testhal/STM32F37x/I2C/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/I2C/.project b/testhal/STM32F37x/I2C/.project deleted file mode 100644 index 03945c10e..000000000 --- a/testhal/STM32F37x/I2C/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F37x-I2C - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F37x/I2C/Makefile b/testhal/STM32F37x/I2C/Makefile deleted file mode 100644 index 782a3b3d7..000000000 --- a/testhal/STM32F37x/I2C/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/I2C/chconf.h b/testhal/STM32F37x/I2C/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F37x/I2C/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/I2C/halconf.h b/testhal/STM32F37x/I2C/halconf.h deleted file mode 100644 index 3ac5de5ba..000000000 --- a/testhal/STM32F37x/I2C/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/I2C/main.c b/testhal/STM32F37x/I2C/main.c deleted file mode 100644 index fc0e4e2ab..000000000 --- a/testhal/STM32F37x/I2C/main.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Timing values are taken from the RM except the PRESC set to 9 because - * the input clock is 72MHz. - * The timings are critical, please always refer to the STM32 Reference - * Manual before attempting changes. - */ -#if 0 -static const I2CConfig i2cconfig = { - STM32_TIMINGR_PRESC(8U) | /* 72MHz/9 = 8MHz I2CCLK. */ - STM32_TIMINGR_SCLDEL(3U) | STM32_TIMINGR_SDADEL(3U) | - STM32_TIMINGR_SCLH(3U) | STM32_TIMINGR_SCLL(9U), - 0, - 0 -}; -#endif -static const I2CConfig i2cconfig = { - STM32_TIMINGR_PRESC(15U) | - STM32_TIMINGR_SCLDEL(4U) | STM32_TIMINGR_SDADEL(2U) | - STM32_TIMINGR_SCLH(15U) | STM32_TIMINGR_SCLL(21U), - 0, - 0 -}; - -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static WORKING_AREA(blinker_wa, 128); -static msg_t blinker(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(500); - palClearPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Starting the I2C driver 2. - */ - i2cStart(&I2CD2, &i2cconfig); - - /* - * Starting the blinker thread. - */ - chThdCreateStatic(blinker_wa, sizeof(blinker_wa), - NORMALPRIO-1, blinker, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - unsigned i; - msg_t msg; - static const uint8_t cmd[] = {0, 0}; - uint8_t data[16]; - - msg = i2cMasterTransmitTimeout(&I2CD2, 0x52, cmd, sizeof(cmd), - data, sizeof(data), TIME_INFINITE); - if (msg != RDY_OK) - palTogglePad(GPIOC, GPIOC_LED3); - for (i = 0; i < 256; i++) { - msg = i2cMasterReceiveTimeout(&I2CD2, 0x52, - data, sizeof(data), TIME_INFINITE); - if (msg != RDY_OK) - palTogglePad(GPIOC, GPIOC_LED3); - } - chThdSleepMilliseconds(500); - palTogglePad(GPIOC, GPIOC_LED2); - } - return 0; -} diff --git a/testhal/STM32F37x/I2C/mcuconf.h b/testhal/STM32F37x/I2C/mcuconf.h deleted file mode 100644 index c18448c10..000000000 --- a/testhal/STM32F37x/I2C/mcuconf.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_SDADC1 FALSE -#define STM32_ADC_USE_SDADC2 FALSE -#define STM32_ADC_USE_SDADC3 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 TRUE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/I2C/readme.txt b/testhal/STM32F37x/I2C/readme.txt deleted file mode 100644 index f7d032869..000000000 --- a/testhal/STM32F37x/I2C/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - I2C driver demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x I2C driver. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/IRQ_STORM/.cproject b/testhal/STM32F37x/IRQ_STORM/.cproject deleted file mode 100644 index bf0ac2f78..000000000 --- a/testhal/STM32F37x/IRQ_STORM/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/IRQ_STORM/.project b/testhal/STM32F37x/IRQ_STORM/.project deleted file mode 100644 index da09bb566..000000000 --- a/testhal/STM32F37x/IRQ_STORM/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F37x-IRQ_STORM - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F37x/IRQ_STORM/Makefile b/testhal/STM32F37x/IRQ_STORM/Makefile deleted file mode 100644 index 782a3b3d7..000000000 --- a/testhal/STM32F37x/IRQ_STORM/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/IRQ_STORM/chconf.h b/testhal/STM32F37x/IRQ_STORM/chconf.h deleted file mode 100644 index 38242d75d..000000000 --- a/testhal/STM32F37x/IRQ_STORM/chconf.h +++ /dev/null @@ -1,533 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#define CORTEX_USE_FPU FALSE - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/IRQ_STORM/halconf.h b/testhal/STM32F37x/IRQ_STORM/halconf.h deleted file mode 100644 index 117a5979b..000000000 --- a/testhal/STM32F37x/IRQ_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/IRQ_STORM/main.c b/testhal/STM32F37x/IRQ_STORM/main.c deleted file mode 100644 index 7a630450b..000000000 --- a/testhal/STM32F37x/IRQ_STORM/main.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOC, GPIOC_LED1); - } - } - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } - chSequentialStreamWrite(&SD2, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD2, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD2, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 2 using the default configuration, pins - * are pre-configured in board.h. - */ - sdStart(&SD2, NULL); - - /* - * Activates GPTs. - */ - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 10; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } -} diff --git a/testhal/STM32F37x/IRQ_STORM/mcuconf.h b/testhal/STM32F37x/IRQ_STORM/mcuconf.h deleted file mode 100644 index 1434b2fae..000000000 --- a/testhal/STM32F37x/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_SDADC1 FALSE -#define STM32_ADC_USE_SDADC2 FALSE -#define STM32_ADC_USE_SDADC3 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/IRQ_STORM/readme.txt b/testhal/STM32F37x/IRQ_STORM/readme.txt deleted file mode 100644 index 740cf3c20..000000000 --- a/testhal/STM32F37x/IRQ_STORM/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM stress test demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -- Connect a terminal emulator to serial port connector (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/PWM-ICU/.cproject b/testhal/STM32F37x/PWM-ICU/.cproject deleted file mode 100644 index 42e9f611b..000000000 --- a/testhal/STM32F37x/PWM-ICU/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/PWM-ICU/.project b/testhal/STM32F37x/PWM-ICU/.project deleted file mode 100644 index 958fa1637..000000000 --- a/testhal/STM32F37x/PWM-ICU/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F37x-PWM-ICU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F37x/PWM-ICU/Makefile b/testhal/STM32F37x/PWM-ICU/Makefile deleted file mode 100644 index 782a3b3d7..000000000 --- a/testhal/STM32F37x/PWM-ICU/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/PWM-ICU/chconf.h b/testhal/STM32F37x/PWM-ICU/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F37x/PWM-ICU/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/PWM-ICU/halconf.h b/testhal/STM32F37x/PWM-ICU/halconf.h deleted file mode 100644 index 2f74c82c8..000000000 --- a/testhal/STM32F37x/PWM-ICU/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/PWM-ICU/main.c b/testhal/STM32F37x/PWM-ICU/main.c deleted file mode 100644 index 603b891f8..000000000 --- a/testhal/STM32F37x/PWM-ICU/main.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIOC, GPIOC_LED1); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIOC, GPIOC_LED1); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_LOW, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(GPIOC, GPIOC_LED2); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(GPIOC, GPIOC_LED2); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_LOW, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - NULL, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 5 and ICU driver 3. - * GPIOC0 is the PWM output. - * GPIOC6 is the ICU input. - * The two pins have to be externally connected together. - */ - pwmStart(&PWMD5, &pwmcfg); - palSetPadMode(GPIOC, 0, PAL_MODE_ALTERNATE(2)); - icuStart(&ICUD3, &icucfg); - palSetPadMode(GPIOC, 6, PAL_MODE_ALTERNATE(2)); - icuEnable(&ICUD3); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD5, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD5, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD5, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD5, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD5, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD5, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD5, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD5, 0); - pwmStop(&PWMD5); - icuDisable(&ICUD3); - icuStop(&ICUD3); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F37x/PWM-ICU/mcuconf.h b/testhal/STM32F37x/PWM-ICU/mcuconf.h deleted file mode 100644 index 36b5c84a5..000000000 --- a/testhal/STM32F37x/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_SDADC1 FALSE -#define STM32_ADC_USE_SDADC2 FALSE -#define STM32_ADC_USE_SDADC3 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 TRUE -#define STM32_ICU_USE_TIM4 TRUE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 TRUE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 TRUE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/PWM-ICU/readme.txt b/testhal/STM32F37x/PWM-ICU/readme.txt deleted file mode 100644 index b1acb879a..000000000 --- a/testhal/STM32F37x/PWM-ICU/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM-ICU drivers demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x PWM and ICU drivers. - -** Board Setup ** - -- Connect PC0 and PC6 together. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/SDADC/.cproject b/testhal/STM32F37x/SDADC/.cproject deleted file mode 100644 index e3d709437..000000000 --- a/testhal/STM32F37x/SDADC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/SDADC/.project b/testhal/STM32F37x/SDADC/.project deleted file mode 100644 index 83a87eb03..000000000 --- a/testhal/STM32F37x/SDADC/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F37x-SDADC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F37x/SDADC/Makefile b/testhal/STM32F37x/SDADC/Makefile deleted file mode 100644 index 782a3b3d7..000000000 --- a/testhal/STM32F37x/SDADC/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/SDADC/chconf.h b/testhal/STM32F37x/SDADC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F37x/SDADC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/SDADC/halconf.h b/testhal/STM32F37x/SDADC/halconf.h deleted file mode 100644 index 85a5dbd3b..000000000 --- a/testhal/STM32F37x/SDADC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/SDADC/main.c b/testhal/STM32F37x/SDADC/main.c deleted file mode 100644 index 1d700a3a5..000000000 --- a/testhal/STM32F37x/SDADC/main.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 1 -#define ADC_GRP2_BUF_DEPTH 32 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * SDADC configuration. - */ -static const ADCConfig sdadc_config = { - 0, - { - SDADC_CONFR_GAIN_1X | SDADC_CONFR_SE_ZERO_VOLT | SDADC_CONFR_COMMON_VSSSD, - 0, - 0 - } -}; - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: ADC_IN5P. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - .u.sdadc = { - SDADC_CR2_JSWSTART, /* CR2 */ - SDADC_JCHGR_CH(5), /* JCHGR */ - { /* CONFCHR[2]*/ - SDADC_CONFCHR1_CH5(0), - 0 - } - } -}; - -/* - * ADC conversion group. - * Mode: Continuous, 32 samples of 1 channel, SW triggered. - * Channels: ADC_IN5P. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - .u.sdadc = { - SDADC_CR2_JSWSTART, /* CR2 */ - SDADC_JCHGR_CH(5), /* JCHGR */ - { /* CONFCHR[2]*/ - SDADC_CONFCHR1_CH5(0), - 0 - } - } -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(500); - palSetPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the SDADC1 driver. - */ - adcStart(&SDADCD1, &sdadc_config); - adcSTM32Calibrate(&SDADCD1); - - /* - * Linear conversion. - */ - adcConvert(&SDADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&SDADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_WKUP_BUTTON)) { - adcStopConversion(&SDADCD1); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F37x/SDADC/mcuconf.h b/testhal/STM32F37x/SDADC/mcuconf.h deleted file mode 100644 index 8a4e68ba8..000000000 --- a/testhal/STM32F37x/SDADC/mcuconf.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_SDADC1 TRUE -#define STM32_ADC_USE_SDADC2 TRUE -#define STM32_ADC_USE_SDADC3 TRUE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/SDADC/readme.txt b/testhal/STM32F37x/SDADC/readme.txt deleted file mode 100644 index 0e5191419..000000000 --- a/testhal/STM32F37x/SDADC/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x ADC driver on the -SDADC peripheral. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/SPI/.cproject b/testhal/STM32F37x/SPI/.cproject deleted file mode 100644 index 5aaba7ac7..000000000 --- a/testhal/STM32F37x/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/SPI/.project b/testhal/STM32F37x/SPI/.project deleted file mode 100644 index c3985659c..000000000 --- a/testhal/STM32F37x/SPI/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F37x-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F37x/SPI/Makefile b/testhal/STM32F37x/SPI/Makefile deleted file mode 100644 index 782a3b3d7..000000000 --- a/testhal/STM32F37x/SPI/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/SPI/chconf.h b/testhal/STM32F37x/SPI/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F37x/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/SPI/halconf.h b/testhal/STM32F37x/SPI/halconf.h deleted file mode 100644 index 3e1cafbbf..000000000 --- a/testhal/STM32F37x/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/SPI/main.c b/testhal/STM32F37x/SPI/main.c deleted file mode 100644 index 3a828f3a9..000000000 --- a/testhal/STM32F37x/SPI/main.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration (18MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOB, - 10, - 0, - SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 -}; - -/* - * Low speed SPI configuration (140.625kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - GPIOB, - 10, - SPI_CR1_BR_2 | SPI_CR1_BR_1, - SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palClearPad(GPIOC, GPIOC_LED2); /* LED ON. */ - spiStart(&SPID2, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palSetPad(GPIOC, GPIOC_LED2); /* LED OFF. */ - spiStart(&SPID2, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static WORKING_AREA(blinker_wa, 128); -static msg_t blinker(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(500); - palClearPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * SPI2 I/O pins setup. - */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New MOSI. */ - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Starting the blinker thread. - */ - chThdCreateStatic(blinker_wa, sizeof(blinker_wa), - NORMALPRIO-1, blinker, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F37x/SPI/mcuconf.h b/testhal/STM32F37x/SPI/mcuconf.h deleted file mode 100644 index 5326570a9..000000000 --- a/testhal/STM32F37x/SPI/mcuconf.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_SDADC1 FALSE -#define STM32_ADC_USE_SDADC2 FALSE -#define STM32_ADC_USE_SDADC3 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/SPI/readme.txt b/testhal/STM32F37x/SPI/readme.txt deleted file mode 100644 index ebf5f3563..000000000 --- a/testhal/STM32F37x/SPI/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x SPI driver. - -** Board Setup ** - -- Connect PB14 and PB15 together for SPI loop-back. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/UART/.cproject b/testhal/STM32F37x/UART/.cproject deleted file mode 100644 index be46a014d..000000000 --- a/testhal/STM32F37x/UART/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/UART/.project b/testhal/STM32F37x/UART/.project deleted file mode 100644 index dfdbbc5df..000000000 --- a/testhal/STM32F37x/UART/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F37x-UART - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F37x/UART/Makefile b/testhal/STM32F37x/UART/Makefile deleted file mode 100644 index 782a3b3d7..000000000 --- a/testhal/STM32F37x/UART/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/UART/chconf.h b/testhal/STM32F37x/UART/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F37x/UART/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/UART/halconf.h b/testhal/STM32F37x/UART/halconf.h deleted file mode 100644 index a4fc70926..000000000 --- a/testhal/STM32F37x/UART/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/UART/main.c b/testhal/STM32F37x/UART/main.c deleted file mode 100644 index 7b9577f8a..000000000 --- a/testhal/STM32F37x/UART/main.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt1, vt2; - -static void restart(void *p) { - - (void)p; - - chSysLockFromIsr(); - uartStartSendI(&UARTD2, 14, "Hello World!\r\n"); - chSysUnlockFromIsr(); -} - -static void ledoff(void *p) { - - (void)p; - palSetPad(GPIOC, GPIOC_LED1); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; - palSetPad(GPIOC, GPIOC_LED1); -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palSetPad(GPIOC, GPIOC_LED1); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt1)) - chVTResetI(&vt1); - chVTSetI(&vt1, MS2ST(5000), restart, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palClearPad(GPIOC, GPIOC_LED1); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt2)) - chVTResetI(&vt2); - chVTSetI(&vt2, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1, PA9 and PA10 are routed to USART2. - */ - uartStart(&UARTD2, &uart_cfg_1); - - /* - * Starts the transmission, it will be handled entirely in background. - */ - uartStartSend(&UARTD2, 13, "Starting...\r\n"); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F37x/UART/mcuconf.h b/testhal/STM32F37x/UART/mcuconf.h deleted file mode 100644 index 1421ff9f3..000000000 --- a/testhal/STM32F37x/UART/mcuconf.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_SDADC1 FALSE -#define STM32_ADC_USE_SDADC2 FALSE -#define STM32_ADC_USE_SDADC3 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USE_USART3 TRUE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/UART/readme.txt b/testhal/STM32F37x/UART/readme.txt deleted file mode 100644 index 27b6bfefd..000000000 --- a/testhal/STM32F37x/UART/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x UART driver. - -** Board Setup ** - -- Connect an RS232 transceiver to pins PA9(TX) and PA10(RX). -- Connect a terminal emulator to the transceiver (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F37x/USB_CDC/.cproject b/testhal/STM32F37x/USB_CDC/.cproject deleted file mode 100644 index 66a97f931..000000000 --- a/testhal/STM32F37x/USB_CDC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F37x/USB_CDC/.project b/testhal/STM32F37x/USB_CDC/.project deleted file mode 100644 index 4e173140c..000000000 --- a/testhal/STM32F37x/USB_CDC/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - STM32F37x-USB_CDC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32373C_EVAL - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/testhal/STM32F37x/USB_CDC/Makefile b/testhal/STM32F37x/USB_CDC/Makefile deleted file mode 100644 index 60e76cc62..000000000 --- a/testhal/STM32F37x/USB_CDC/Makefile +++ /dev/null @@ -1,223 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32373C_EVAL/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F37x/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F3xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F373xC.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various/devices_lib/accel \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F37x/USB_CDC/chconf.h b/testhal/STM32F37x/USB_CDC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F37x/USB_CDC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/USB_CDC/halconf.h b/testhal/STM32F37x/USB_CDC/halconf.h deleted file mode 100644 index cd76b0cfe..000000000 --- a/testhal/STM32F37x/USB_CDC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F37x/USB_CDC/main.c b/testhal/STM32F37x/USB_CDC/main.c deleted file mode 100644 index 200a0f3d5..000000000 --- a/testhal/STM32F37x/USB_CDC/main.c +++ /dev/null @@ -1,515 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "shell.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Endpoints to be used for USBD1. - */ -#define USBD1_DATA_REQUEST_EP 1 -#define USBD1_DATA_AVAILABLE_EP 1 -#define USBD1_INTERRUPT_REQUEST_EP 2 - -/* - * DP resistor control. - */ -#define usb_lld_connect_bus(usbp) palClearPad(GPIOC, GPIOC_USB_DISCONNECT) -#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOC, GPIOC_USB_DISCONNECT) - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU1; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USBD1_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 1, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(&SDU1); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD1, - USBD1_DATA_REQUEST_EP, - USBD1_DATA_AVAILABLE_EP, - USBD1_INTERRUPT_REQUEST_EP -}; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { - static uint8_t buf[] = - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: write\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) { - chSequentialStreamWrite(&SDU1, buf, sizeof buf - 1); - } - chprintf(chp, "\r\n\nstopped\r\n"); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"write", cmd_write}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - systime_t time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; - palClearPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(time); - palSetPad(GPIOC, GPIOC_LED1); - chThdSleepMilliseconds(time); - } -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1500); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU1.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F37x/USB_CDC/mcuconf.h b/testhal/STM32F37x/USB_CDC/mcuconf.h deleted file mode 100644 index 4d4320200..000000000 --- a/testhal/STM32F37x/USB_CDC/mcuconf.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F30x drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F37x_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PREDIV_VALUE 1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_SDPRE STM32_SDPRE_DIV12 -#define STM32_USART1SW STM32_USART1SW_PCLK -#define STM32_USART2SW STM32_USART2SW_PCLK -#define STM32_USART3SW STM32_USART3SW_PCLK -#define STM32_I2C1SW STM32_I2C1SW_SYSCLK -#define STM32_I2C2SW STM32_I2C2SW_SYSCLK -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_SDADC1 FALSE -#define STM32_ADC_USE_SDADC2 FALSE -#define STM32_ADC_USE_SDADC3 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC1_DMA_PRIORITY 2 -#define STM32_ADC_SDADC2_DMA_PRIORITY 2 -#define STM32_ADC_SDADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC1_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC2_DMA_IRQ_PRIORITY 5 -#define STM32_ADC_SDADC3_DMA_IRQ_PRIORITY 5 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_23_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 10 -#define STM32_I2C_I2C2_IRQ_PRIORITY 10 -#define STM32_I2C_I2C1_DMA_PRIORITY 1 -#define STM32_I2C_I2C2_DMA_PRIORITY 1 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32F37x/USB_CDC/readme.txt b/testhal/STM32F37x/USB_CDC/readme.txt deleted file mode 100644 index 1c0755213..000000000 --- a/testhal/STM32F37x/USB_CDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32F37x. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32373C-EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32F37x USB driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/ADC/.cproject b/testhal/STM32F4xx/ADC/.cproject deleted file mode 100644 index b279459f3..000000000 --- a/testhal/STM32F4xx/ADC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/ADC/.project b/testhal/STM32F4xx/ADC/.project deleted file mode 100644 index eafa4d503..000000000 --- a/testhal/STM32F4xx/ADC/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-ADC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/ADC/Makefile b/testhal/STM32F4xx/ADC/Makefile deleted file mode 100644 index 86de6d81c..000000000 --- a/testhal/STM32F4xx/ADC/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/ADC/chconf.h b/testhal/STM32F4xx/ADC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F4xx/ADC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/ADC/halconf.h b/testhal/STM32F4xx/ADC/halconf.h deleted file mode 100644 index 85a5dbd3b..000000000 --- a/testhal/STM32F4xx/ADC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/ADC/main.c b/testhal/STM32F4xx/ADC/main.c deleted file mode 100644 index 650347f76..000000000 --- a/testhal/STM32F4xx/ADC/main.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: IN11. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - ADC_SMPR1_SMP_AN11(ADC_SAMPLE_3), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, /* SQR2 */ - ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11) -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN11, IN12, IN11, IN12, IN11, IN12, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - ADC_SMPR1_SMP_AN12(ADC_SAMPLE_56) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_56) | - ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_144), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), - ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VREFINT), - ADC_SQR3_SQ6_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN11) | - ADC_SQR3_SQ4_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN11) | - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11) -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOD, GPIOD_LED5); - chThdSleepMilliseconds(500); - palClearPad(GPIOD, GPIOD_LED5); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(1) | PAL_PORT_BIT(2), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the temperature sensor. - */ - adcStart(&ADCD1, NULL); - adcSTM32EnableTSVREFE(); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - adcStopConversion(&ADCD1); - adcSTM32DisableTSVREFE(); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F4xx/ADC/mcuconf.h b/testhal/STM32F4xx/ADC/mcuconf.h deleted file mode 100644 index 10e1fae6c..000000000 --- a/testhal/STM32F4xx/ADC/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 TRUE -#define STM32_ADC_USE_ADC3 TRUE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/ADC/readme.txt b/testhal/STM32F4xx/ADC/readme.txt deleted file mode 100644 index af029649b..000000000 --- a/testhal/STM32F4xx/ADC/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx ADC driver. - -** Board Setup ** - -- Connect PC1 to 3.3V and PC2 to GND for analog measurements. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/CAN/.cproject b/testhal/STM32F4xx/CAN/.cproject deleted file mode 100644 index 41abe3d02..000000000 --- a/testhal/STM32F4xx/CAN/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/CAN/.project b/testhal/STM32F4xx/CAN/.project deleted file mode 100644 index 3c1df9502..000000000 --- a/testhal/STM32F4xx/CAN/.project +++ /dev/null @@ -1,90 +0,0 @@ - - - STM32F4xx-CAN - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.autoBuildTarget - all - - - org.eclipse.cdt.make.core.buildArguments - -j1 - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.cleanBuildTarget - clean - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.fullBuildTarget - all - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/CAN/Makefile b/testhal/STM32F4xx/CAN/Makefile deleted file mode 100644 index 62d0516f0..000000000 --- a/testhal/STM32F4xx/CAN/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/CAN/chconf.h b/testhal/STM32F4xx/CAN/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F4xx/CAN/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/CAN/halconf.h b/testhal/STM32F4xx/CAN/halconf.h deleted file mode 100644 index 5b6535967..000000000 --- a/testhal/STM32F4xx/CAN/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/CAN/main.c b/testhal/STM32F4xx/CAN/main.c deleted file mode 100644 index 8202afe1e..000000000 --- a/testhal/STM32F4xx/CAN/main.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -struct can_instance { - CANDriver *canp; - uint32_t led; -}; - -static const struct can_instance can1 = {&CAND1, GPIOD_LED5}; -static const struct can_instance can2 = {&CAND2, GPIOD_LED3}; - -/* - * Internal loopback mode, 500KBaud, automatic wakeup, automatic recover - * from abort mode. - * See section 22.7.7 on the STM32 reference manual. - */ -static const CANConfig cancfg = { - CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP, - CAN_BTR_LBKM | CAN_BTR_SJW(0) | CAN_BTR_TS2(1) | - CAN_BTR_TS1(8) | CAN_BTR_BRP(6) -}; - -/* - * Receiver thread. - */ -static WORKING_AREA(can_rx1_wa, 256); -static WORKING_AREA(can_rx2_wa, 256); -static msg_t can_rx(void *p) { - struct can_instance *cip = p; - EventListener el; - CANRxFrame rxmsg; - - (void)p; - chRegSetThreadName("receiver"); - chEvtRegister(&cip->canp->rxfull_event, &el, 0); - while(!chThdShouldTerminate()) { - if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) - continue; - while (canReceive(cip->canp, CAN_ANY_MAILBOX, - &rxmsg, TIME_IMMEDIATE) == RDY_OK) { - /* Process message.*/ - palTogglePad(GPIOD, cip->led); - } - } - chEvtUnregister(&CAND1.rxfull_event, &el); - return 0; -} - -/* - * Transmitter thread. - */ -static WORKING_AREA(can_tx_wa, 256); -static msg_t can_tx(void * p) { - CANTxFrame txmsg; - - (void)p; - chRegSetThreadName("transmitter"); - txmsg.IDE = CAN_IDE_EXT; - txmsg.EID = 0x01234567; - txmsg.RTR = CAN_RTR_DATA; - txmsg.DLC = 8; - txmsg.data32[0] = 0x55AA55AA; - txmsg.data32[1] = 0x00FF00FF; - - while (!chThdShouldTerminate()) { - canTransmit(&CAND1, CAN_ANY_MAILBOX, &txmsg, MS2ST(100)); - canTransmit(&CAND2, CAN_ANY_MAILBOX, &txmsg, MS2ST(100)); - chThdSleepMilliseconds(500); - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the CAN drivers 1 and 2. - */ - canStart(&CAND1, &cancfg); - canStart(&CAND2, &cancfg); - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(can_rx1_wa, sizeof(can_rx1_wa), NORMALPRIO + 7, - can_rx, (void *)&can1); - chThdCreateStatic(can_rx2_wa, sizeof(can_rx2_wa), NORMALPRIO + 7, - can_rx, (void *)&can2); - chThdCreateStatic(can_tx_wa, sizeof(can_tx_wa), NORMALPRIO + 7, - can_tx, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F4xx/CAN/mcuconf.h b/testhal/STM32F4xx/CAN/mcuconf.h deleted file mode 100644 index e0dffb5de..000000000 --- a/testhal/STM32F4xx/CAN/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_USE_CAN2 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/CAN/readme.txt b/testhal/STM32F4xx/CAN/readme.txt deleted file mode 100644 index 5884567ac..000000000 --- a/testhal/STM32F4xx/CAN/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - CAN driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32 CAN driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/DMA_STORM/.cproject b/testhal/STM32F4xx/DMA_STORM/.cproject deleted file mode 100644 index 4b78ef53c..000000000 --- a/testhal/STM32F4xx/DMA_STORM/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/DMA_STORM/.project b/testhal/STM32F4xx/DMA_STORM/.project deleted file mode 100644 index fdacc2794..000000000 --- a/testhal/STM32F4xx/DMA_STORM/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-DMA_STORM - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/DMA_STORM/Makefile b/testhal/STM32F4xx/DMA_STORM/Makefile deleted file mode 100644 index 86de6d81c..000000000 --- a/testhal/STM32F4xx/DMA_STORM/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/DMA_STORM/chconf.h b/testhal/STM32F4xx/DMA_STORM/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F4xx/DMA_STORM/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/DMA_STORM/halconf.h b/testhal/STM32F4xx/DMA_STORM/halconf.h deleted file mode 100644 index e2b440694..000000000 --- a/testhal/STM32F4xx/DMA_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/DMA_STORM/main.c b/testhal/STM32F4xx/DMA_STORM/main.c deleted file mode 100644 index a3193fcc1..000000000 --- a/testhal/STM32F4xx/DMA_STORM/main.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - (void)buffer; - (void)n; -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; - chSysHalt(); -} - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN11, IN12, IN11, IN12, IN11, IN12, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - ADC_SMPR1_SMP_AN12(ADC_SAMPLE_56) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_56) | - ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_144), - 0, /* SMPR2 */ - ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), - ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VREFINT), - ADC_SQR3_SQ6_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN11) | - ADC_SQR3_SQ4_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN11) | - ADC_SQR3_SQ2_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11) -}; - -/* - * Maximum speed SPI configuration (21MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOB, - 12, - 0 -}; - -static void tmo(void *p) { - - (void)p; - chSysHalt(); -} - -/* - * SPI thread. - */ -static WORKING_AREA(waSPI1, 1024); -static WORKING_AREA(waSPI2, 1024); -static WORKING_AREA(waSPI3, 1024); -static msg_t spi_thread(void *p) { - unsigned i; - SPIDriver *spip = (SPIDriver *)p; - VirtualTimer vt; - uint8_t txbuf[256]; - uint8_t rxbuf[256]; - - /* Prepare transmit pattern.*/ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* Continuous transmission.*/ - while (TRUE) { - /* Starts a VT working as watchdog to catch a malfunction in the SPI - driver.*/ - chSysLock(); - chVTSetI(&vt, MS2ST(10), tmo, NULL); - chSysUnlock(); - - spiExchange(spip, sizeof(txbuf), txbuf, rxbuf); - - /* Stops the watchdog.*/ - chSysLock(); - if (chVTIsArmedI(&vt)) - chVTResetI(&vt); - chSysUnlock(); - } -} - -/* - * This is a periodic thread that does absolutely nothing except flashing - * a LED. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); - palClearPad(GPIOD, GPIOD_LED3); /* Orange. */ - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - static uint8_t patterns1[4096], patterns2[4096], buf1[4096], buf2[4096]; - - /* System initializations. - - HAL initialization, this also initializes the configured device drivers - and performs the board-specific initializations. - - Kernel initialization, the main() function becomes a thread and the - RTOS is active.*/ - halInit(); - chSysInit(); - - /* Creates the blinker thread.*/ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 10, - Thread1, NULL); - - /* Activates the ADC1 driver and the temperature sensor.*/ - adcStart(&ADCD1, NULL); - adcSTM32EnableTSVREFE(); - - /* Starts an ADC continuous conversion.*/ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* Activating SPI drivers.*/ - spiStart(&SPID1, &hs_spicfg); - spiStart(&SPID2, &hs_spicfg); - spiStart(&SPID3, &hs_spicfg); - - /* Starting SPI threads instances.*/ - chThdCreateStatic(waSPI1, sizeof(waSPI1), NORMALPRIO + 1, spi_thread, &SPID1); - chThdCreateStatic(waSPI2, sizeof(waSPI2), NORMALPRIO + 1, spi_thread, &SPID2); - chThdCreateStatic(waSPI3, sizeof(waSPI3), NORMALPRIO + 1, spi_thread, &SPID3); - - /* Allocating two DMA2 streams for memory copy operations.*/ - if (dmaStreamAllocate(STM32_DMA2_STREAM6, 0, NULL, NULL)) - chSysHalt(); - if (dmaStreamAllocate(STM32_DMA2_STREAM7, 0, NULL, NULL)) - chSysHalt(); - for (i = 0; i < sizeof (patterns1); i++) - patterns1[i] = (uint8_t)i; - for (i = 0; i < sizeof (patterns2); i++) - patterns2[i] = (uint8_t)(i ^ 0xAA); - - /* Normal main() thread activity, it does continues memory copy operations - using 2 DMA streams at the lowest priority.*/ - while (TRUE) { - VirtualTimer vt; - - /* Starts a VT working as watchdog to catch a malfunction in the DMA - driver.*/ - chSysLock(); - chVTSetI(&vt, MS2ST(10), tmo, NULL); - chSysUnlock(); - - /* Copy pattern 1.*/ - dmaStartMemCopy(STM32_DMA2_STREAM6, - STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_BYTE | - STM32_DMA_CR_MSIZE_BYTE, - patterns1, buf1, sizeof (patterns1)); - dmaStartMemCopy(STM32_DMA2_STREAM7, - STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_BYTE | - STM32_DMA_CR_MSIZE_BYTE, - patterns1, buf2, sizeof (patterns1)); - dmaWaitCompletion(STM32_DMA2_STREAM6); - dmaWaitCompletion(STM32_DMA2_STREAM7); - if (memcmp(patterns1, buf1, sizeof (patterns1))) - chSysHalt(); - if (memcmp(patterns1, buf2, sizeof (patterns1))) - chSysHalt(); - - /* Copy pattern 2.*/ - dmaStartMemCopy(STM32_DMA2_STREAM6, - STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_BYTE | - STM32_DMA_CR_MSIZE_BYTE, - patterns2, buf1, sizeof (patterns2)); - dmaStartMemCopy(STM32_DMA2_STREAM7, - STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_BYTE | - STM32_DMA_CR_MSIZE_BYTE, - patterns2, buf2, sizeof (patterns2)); - dmaWaitCompletion(STM32_DMA2_STREAM6); - dmaWaitCompletion(STM32_DMA2_STREAM7); - if (memcmp(patterns2, buf1, sizeof (patterns2))) - chSysHalt(); - if (memcmp(patterns2, buf2, sizeof (patterns2))) - chSysHalt(); - - /* Stops the watchdog.*/ - chSysLock(); - if (chVTIsArmedI(&vt)) - chVTResetI(&vt); - chSysUnlock(); - - chThdSleepMilliseconds(2); - } - return 0; -} diff --git a/testhal/STM32F4xx/DMA_STORM/mcuconf.h b/testhal/STM32F4xx/DMA_STORM/mcuconf.h deleted file mode 100644 index 84cd9a0f1..000000000 --- a/testhal/STM32F4xx/DMA_STORM/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/EXT/.cproject b/testhal/STM32F4xx/EXT/.cproject deleted file mode 100644 index 59e262be9..000000000 --- a/testhal/STM32F4xx/EXT/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/EXT/.project b/testhal/STM32F4xx/EXT/.project deleted file mode 100644 index b4ae995c3..000000000 --- a/testhal/STM32F4xx/EXT/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-EXT - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/EXT/Makefile b/testhal/STM32F4xx/EXT/Makefile deleted file mode 100644 index 86de6d81c..000000000 --- a/testhal/STM32F4xx/EXT/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/EXT/chconf.h b/testhal/STM32F4xx/EXT/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F4xx/EXT/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/EXT/halconf.h b/testhal/STM32F4xx/EXT/halconf.h deleted file mode 100644 index e0e0c38ff..000000000 --- a/testhal/STM32F4xx/EXT/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/EXT/main.c b/testhal/STM32F4xx/EXT/main.c deleted file mode 100644 index 1bdce5a09..000000000 --- a/testhal/STM32F4xx/EXT/main.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void led5off(void *arg) { - - (void)arg; - palClearPad(GPIOD, GPIOD_LED5); -} - -/* Triggered when the button is pressed or released. The LED5 is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - - palSetPad(GPIOD, GPIOD_LED5); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - - /* LED4 set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), led5off, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32F4xx/EXT/mcuconf.h b/testhal/STM32F4xx/EXT/mcuconf.h deleted file mode 100644 index 172f90b30..000000000 --- a/testhal/STM32F4xx/EXT/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/EXT/readme.txt b/testhal/STM32F4xx/EXT/readme.txt deleted file mode 100644 index 1105f431e..000000000 --- a/testhal/STM32F4xx/EXT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx EXT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/GPT/.cproject b/testhal/STM32F4xx/GPT/.cproject deleted file mode 100644 index 4933adfbb..000000000 --- a/testhal/STM32F4xx/GPT/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/GPT/.project b/testhal/STM32F4xx/GPT/.project deleted file mode 100644 index 90014959c..000000000 --- a/testhal/STM32F4xx/GPT/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-GPT - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/GPT/Makefile b/testhal/STM32F4xx/GPT/Makefile deleted file mode 100644 index 86de6d81c..000000000 --- a/testhal/STM32F4xx/GPT/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/GPT/chconf.h b/testhal/STM32F4xx/GPT/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F4xx/GPT/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/GPT/halconf.h b/testhal/STM32F4xx/GPT/halconf.h deleted file mode 100644 index 554b4e9ca..000000000 --- a/testhal/STM32F4xx/GPT/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/GPT/main.c b/testhal/STM32F4xx/GPT/main.c deleted file mode 100644 index 4b0031dc3..000000000 --- a/testhal/STM32F4xx/GPT/main.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - - (void)gptp; - palSetPad(GPIOD, GPIOD_LED5); - chSysLockFromIsr(); - gptStartOneShotI(&GPTD3, 1000); /* 0.1 second pulse.*/ - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - - (void)gptp; - palClearPad(GPIOD, GPIOD_LED5); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 10000, /* 10kHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 10000, /* 10kHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the GPT drivers 2 and 3. - */ - gptStart(&GPTD2, &gpt2cfg); - gptPolledDelay(&GPTD2, 10); /* Small delay.*/ - gptStart(&GPTD3, &gpt3cfg); - gptPolledDelay(&GPTD3, 10); /* Small delay.*/ - - /* - * Normal main() thread activity, it changes the GPT1 period every - * five seconds. - */ - while (TRUE) { - palSetPad(GPIOD, GPIOD_LED4); - gptStartContinuous(&GPTD2, 5000); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD2); - palClearPad(GPIOD, GPIOD_LED4); - gptStartContinuous(&GPTD2, 2500); - chThdSleepMilliseconds(5000); - gptStopTimer(&GPTD2); - } -} diff --git a/testhal/STM32F4xx/GPT/mcuconf.h b/testhal/STM32F4xx/GPT/mcuconf.h deleted file mode 100644 index ffc39aa31..000000000 --- a/testhal/STM32F4xx/GPT/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 TRUE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 TRUE -#define STM32_GPT_USE_TIM5 TRUE -#define STM32_GPT_USE_TIM8 TRUE -#define STM32_GPT_USE_TIM7 TRUE -#define STM32_GPT_USE_TIM8 TRUE -#define STM32_GPT_USE_TIM9 TRUE -#define STM32_GPT_USE_TIM11 TRUE -#define STM32_GPT_USE_TIM12 TRUE -#define STM32_GPT_USE_TIM14 TRUE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/GPT/readme.txt b/testhal/STM32F4xx/GPT/readme.txt deleted file mode 100644 index 1508a8233..000000000 --- a/testhal/STM32F4xx/GPT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - GPT driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx GPT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/I2C/.cproject b/testhal/STM32F4xx/I2C/.cproject deleted file mode 100644 index 5effe9a53..000000000 --- a/testhal/STM32F4xx/I2C/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/I2C/.project b/testhal/STM32F4xx/I2C/.project deleted file mode 100644 index c506abb10..000000000 --- a/testhal/STM32F4xx/I2C/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-I2C - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/NONSTANDARD_STM32F4_BARTHESS1 - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/I2C/Makefile b/testhal/STM32F4xx/I2C/Makefile deleted file mode 100644 index d52f5d4e8..000000000 --- a/testhal/STM32F4xx/I2C/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/I2C/chconf.h b/testhal/STM32F4xx/I2C/chconf.h deleted file mode 100644 index 9357b698c..000000000 --- a/testhal/STM32F4xx/I2C/chconf.h +++ /dev/null @@ -1,508 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -//#define CORTEX_VTOR_INIT 0x000E0000 -#define CORTEX_VTOR_INIT 0x00000000 - -/*===========================================================================*/ -/* Kernel parameters. */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 0//20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/*===========================================================================*/ -/* Performance options. */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/*===========================================================================*/ -/* Subsystem options. */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS FALSE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT FALSE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/*===========================================================================*/ -/* Debug options. */ -/*===========================================================================*/ -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/*===========================================================================*/ -/* Kernel hooks. */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/I2C/halconf.h b/testhal/STM32F4xx/I2C/halconf.h deleted file mode 100644 index 8f77e1d4a..000000000 --- a/testhal/STM32F4xx/I2C/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C TRUE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/I2C/main.c b/testhal/STM32F4xx/I2C/main.c deleted file mode 100644 index e83a98ffd..000000000 --- a/testhal/STM32F4xx/I2C/main.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ -/* - Concepts and parts of this file have been contributed by Uladzimir Pylinsky - aka barthess. - */ - -/** - * This demo acquire data from accelerometer and prints it in shell. - */ - -#include - -#include "ch.h" -#include "hal.h" - -/* buffers depth */ -#define ACCEL_RX_DEPTH 6 -#define ACCEL_TX_DEPTH 4 - -/* mma8451q specific addresses */ -#define ACCEL_OUT_DATA 0x01 -#define ACCEL_CTRL_REG1 0x2A - -static uint8_t rxbuf[ACCEL_RX_DEPTH]; -static uint8_t txbuf[ACCEL_TX_DEPTH]; -static i2cflags_t errors = 0; -static int16_t acceleration_x, acceleration_y, acceleration_z; -#define mma8451_addr 0b0011100 - -/** - * - */ -static void print(char *p) { - - while (*p) { - sdPut(&SD2, *p++); - } -} - -/** - * - */ -static void println(char *p) { - - while (*p) { - sdPut(&SD2, *p++); - } - sdWriteTimeout(&SD2, (uint8_t *)"\r\n", 2, TIME_INFINITE); -} - -/** - * - */ -static void printn(int16_t n) { - char buf[16], *p; - - if (n > 0) - sdPut(&SD2, '+'); - else{ - sdPut(&SD2, '-'); - n = abs(n); - } - - if (!n) - sdPut(&SD2, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - sdPut(&SD2, *--p); - } -} - -/** - * Converts data from 2complemented representation to signed integer - */ -int16_t complement2signed(uint8_t msb, uint8_t lsb){ - uint16_t word = 0; - word = (msb << 8) + lsb; - if (msb > 0x7F){ - return -1 * ((int16_t)((~word) + 1)); - } - return (int16_t)word; -} - -/* I2C interface #2 */ -static const I2CConfig i2cfg2 = { - OPMODE_I2C, - 400000, - FAST_DUTY_CYCLE_2, -}; - -/* - * Application entry point. - */ -int main(void) { - msg_t status = RDY_OK; - systime_t tmo = MS2ST(4); - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Starts I2C - */ - i2cStart(&I2CD2, &i2cfg2); - - /* - * Prepares the Serial driver 2 - */ - sdStart(&SD2, NULL); /* Default is 38400-8-N-1.*/ - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - - /** - * Prepares the accelerometer - */ - txbuf[0] = ACCEL_CTRL_REG1; /* register address */ - txbuf[1] = 0x1; - i2cAcquireBus(&I2CD2); - status = i2cMasterTransmitTimeout(&I2CD2, mma8451_addr, txbuf, 2, rxbuf, 0, tmo); - i2cReleaseBus(&I2CD2); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD2); - } - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - palTogglePad(GPIOB, GPIOB_LED_B); - chThdSleepMilliseconds(100); - - txbuf[0] = ACCEL_OUT_DATA; /* register address */ - i2cAcquireBus(&I2CD2); - status = i2cMasterTransmitTimeout(&I2CD2, mma8451_addr, txbuf, 1, rxbuf, 6, tmo); - i2cReleaseBus(&I2CD2); - - if (status != RDY_OK){ - errors = i2cGetErrors(&I2CD2); - } - - acceleration_x = complement2signed(rxbuf[0], rxbuf[1]); - acceleration_y = complement2signed(rxbuf[2], rxbuf[3]); - acceleration_z = complement2signed(rxbuf[4], rxbuf[5]); - - print("x: "); - printn(acceleration_x); - print(" y: "); - printn(acceleration_y); - print(" z: "); - printn(acceleration_z); - println(""); - } -} - - - diff --git a/testhal/STM32F4xx/I2C/mcuconf.h b/testhal/STM32F4xx/I2C/mcuconf.h deleted file mode 100644 index da3dba336..000000000 --- a/testhal/STM32F4xx/I2C/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 TRUE -#define STM32_I2C_USE_I2C2 TRUE -#define STM32_I2C_USE_I2C3 TRUE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/IRQ_STORM/.cproject b/testhal/STM32F4xx/IRQ_STORM/.cproject deleted file mode 100644 index 1e9c4518b..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM/.project b/testhal/STM32F4xx/IRQ_STORM/.project deleted file mode 100644 index 6f3b0385f..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-IRQ_STORM - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/IRQ_STORM/Makefile b/testhal/STM32F4xx/IRQ_STORM/Makefile deleted file mode 100644 index 86de6d81c..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/IRQ_STORM/chconf.h b/testhal/STM32F4xx/IRQ_STORM/chconf.h deleted file mode 100644 index 38242d75d..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,533 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#define CORTEX_USE_FPU FALSE - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/IRQ_STORM/halconf.h b/testhal/STM32F4xx/IRQ_STORM/halconf.h deleted file mode 100644 index 117a5979b..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp b/testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp deleted file mode 100644 index ffd2532c1..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/iar/ch.ewp +++ /dev/null @@ -1,2289 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\..\boards\ST_STM32f4_DISCOVERY\board.c - - - $PROJ_DIR$\..\..\..\..\boards\ST_STM32f4_DISCOVERY\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\tm.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\tm.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\gpt_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\gpt_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\USARTv1\serial_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\USARTv1\serial_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\SPIv1\spi_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\SPIv1\spi_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32f4xx.h - - - - port - - STM32F4xx - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\STM32f4xx\cmparams.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\STM32f4xx\vectors.s - - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - test - - $PROJ_DIR$\..\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM/iar/ch.eww b/testhal/STM32F4xx/IRQ_STORM/iar/ch.eww deleted file mode 100644 index f9b3b2000..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM/iar/ch.icf b/testhal/STM32F4xx/IRQ_STORM/iar/ch.icf deleted file mode 100644 index c0a51f44c..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj b/testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj deleted file mode 100644 index b5e042b8a..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/keil/ch.uvproj +++ /dev/null @@ -1,945 +0,0 @@ - - - - 1.1 - -

    ### uVision Project, (C) Keil Software
    - - - - Demo - 0x4 - ARM-ADS - - - STM32F407VG - STMicroelectronics - IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 - - "Startup\ST\STM32F4xx\startup_stm32f4xx.s" ("STM32F4xx Startup Code") - UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) - 6103 - stm32f4xx.h - - - - - - - - - - SFD\ST\STM32F4xx\STM32F4xx.sfr - 0 - - - - ST\STM32F4xx\ - ST\STM32F4xx\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - "" () - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 1 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x20020000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\..\os\kernel\include;..\..\..\..\os\ports\common\ARMCMx;..\..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\..\os\ports\RVCT\ARMCMx;..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx;..\..\..\..\os\hal\include;..\..\..\..\os\hal\platforms\STM32;..\..\..\..\os\hal\platforms\STM32\GPIOv2;..\..\..\..\os\hal\platforms\STM32\USARTv1;..\..\..\..\os\hal\platforms\STM32F4xx;..\..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\..\boards\ST_STM32F4_DISCOVERY\board.c - - - board.h - 5 - ..\..\..\..\boards\ST_STM32F4_DISCOVERY\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - chcoreasm_v7m.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - cmparams.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\cmparams.h - - - vectors.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\vectors.s - - - nvic.c - 1 - ..\..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\..\os\kernel\include\chvt.h - - - - - hal - - - hal.c - 1 - ..\..\..\..\os\hal\src\hal.c - - - pal.c - 1 - ..\..\..\..\os\hal\src\pal.c - - - serial.c - 1 - ..\..\..\..\os\hal\src\serial.c - - - hal.h - 5 - ..\..\..\..\os\hal\include\hal.h - - - pal.h - 5 - ..\..\..\..\os\hal\include\pal.h - - - serial.h - 5 - ..\..\..\..\os\hal\include\serial.h - - - gpt.h - 5 - ..\..\..\..\os\hal\include\gpt.h - - - gpt.c - 1 - ..\..\..\..\os\hal\src\gpt.c - - - tm.c - 1 - ..\..\..\..\os\hal\src\tm.c - - - - - platform - - - gpt_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\gpt_lld.h - - - gpt_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\gpt_lld.c - - - hal_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.c - - - hal_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.h - - - pal_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - pal_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - serial_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\USARTv1\serial_lld.c - - - serial_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\USARTv1\serial_lld.h - - - stm32_dma.c - 1 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.c - - - stm32_dma.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.h - - - stm32_rcc.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_rcc.h - - - stm32l1xx.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32l1xx.h - - - - - test - - - test.c - 1 - ..\..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - mcuconf.h - 5 - ..\mcuconf.h - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - - - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM/main.c b/testhal/STM32F4xx/IRQ_STORM/main.c deleted file mode 100644 index 905af44fe..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/main.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOD, GPIOD_LED5); - } - } - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } - chSequentialStreamWrite(&SD2, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD2, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD2, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 2 and 3. - */ - sdStart(&SD2, NULL); /* Default is 38400-8-N-1.*/ - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 10; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } -} diff --git a/testhal/STM32F4xx/IRQ_STORM/mcuconf.h b/testhal/STM32F4xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index dc10c0604..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 6 -#define STM32_GPT_TIM3_IRQ_PRIORITY 10 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/IRQ_STORM/readme.txt b/testhal/STM32F4xx/IRQ_STORM/readme.txt deleted file mode 100644 index 2b9f076f5..000000000 --- a/testhal/STM32F4xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM stress test demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/.cproject b/testhal/STM32F4xx/IRQ_STORM_FPU/.cproject deleted file mode 100644 index 22b5f4d43..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/.project b/testhal/STM32F4xx/IRQ_STORM_FPU/.project deleted file mode 100644 index 46cb19671..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-IRQ_STORM_FPU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/Makefile b/testhal/STM32F4xx/IRQ_STORM_FPU/Makefile deleted file mode 100644 index 8391b78dc..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = yes -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - extfunc.c main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h b/testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c b/testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c deleted file mode 100644 index 0418e3124..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/extfunc.c +++ /dev/null @@ -1,23 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -float ff1(float par) { - return par; -} - -float ff2(float par1, float par2, float par3, float par4) { - return (par1 + par2) * (par3 + par4); -} diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h b/testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h deleted file mode 100644 index d91a792b4..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp b/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp deleted file mode 100644 index 186319a4c..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.ewp +++ /dev/null @@ -1,2292 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - General - 3 - - 21 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - BILINK - 0 - - - - - Release - - ARM - - 0 - - General - 3 - - 21 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 28 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 8 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 0 - - - - - - - - - CUSTOM - 3 - - - - - - - BICOMP - 0 - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 14 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 0 - - - - - - - BILINK - 0 - - - - - board - - $PROJ_DIR$\..\..\..\..\boards\ST_STM32f4_DISCOVERY\board.c - - - $PROJ_DIR$\..\..\..\..\boards\ST_STM32f4_DISCOVERY\board.h - - - - os - - hal - - include - - $PROJ_DIR$\..\..\..\..\os\hal\include\adc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\can.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\ext.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\gpt.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\hal.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\i2c.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\icu.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mac.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mii.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\mmc_spi.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\pal.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\pwm.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\rtc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\sdc.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\serial.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\serial_usb.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\spi.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\tm.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\uart.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\usb.h - - - $PROJ_DIR$\..\..\..\..\os\hal\include\usb_cdc.h - - - - src - - $PROJ_DIR$\..\..\..\..\os\hal\src\adc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\can.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\ext.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\gpt.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\hal.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\i2c.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\icu.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\mac.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\mmc_spi.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\pal.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\pwm.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\rtc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\sdc.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\serial.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\serial_usb.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\spi.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\tm.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\uart.c - - - $PROJ_DIR$\..\..\..\..\os\hal\src\usb.c - - - - - kernel - - include - - $PROJ_DIR$\..\..\..\..\os\kernel\include\ch.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chcond.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chdebug.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chdynamic.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chevents.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chheap.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chinline.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chioch.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chlists.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmboxes.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmemcore.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmempools.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmsg.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chmtx.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chqueues.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chregistry.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chschd.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chsem.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chstreams.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chsys.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chthreads.h - - - $PROJ_DIR$\..\..\..\..\os\kernel\include\chvt.h - - - - src - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chcond.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chdebug.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chdynamic.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chevents.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chheap.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chlists.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmboxes.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmemcore.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmempools.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmsg.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chmtx.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chqueues.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chregistry.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chschd.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chsem.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chsys.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chthreads.c - - - $PROJ_DIR$\..\..\..\..\os\kernel\src\chvt.c - - - - - platform - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\gpt_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\gpt_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\hal_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\hal_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\USARTv1\serial_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\USARTv1\serial_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\SPIv1\spi_lld.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32\SPIv1\spi_lld.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32_dma.c - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32_dma.h - - - $PROJ_DIR$\..\..\..\..\os\hal\platforms\STM32f4xx\stm32f4xx.h - - - - port - - STM32F4xx - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\STM32f4xx\cmparams.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\STM32f4xx\vectors.s - - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore.c - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.c - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcore_v7m.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chcoreasm_v7m.s - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\chtypes.h - - - $PROJ_DIR$\..\..\..\..\os\ports\IAR\ARMCMx\cstartup.s - - - $PROJ_DIR$\..\..\..\..\os\ports\common\ARMCMx\nvic.c - - - $PROJ_DIR$\..\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - test - - $PROJ_DIR$\..\..\..\..\test\test.c - - - $PROJ_DIR$\..\..\..\..\test\test.h - - - $PROJ_DIR$\..\..\..\..\test\testbmk.c - - - $PROJ_DIR$\..\..\..\..\test\testbmk.h - - - $PROJ_DIR$\..\..\..\..\test\testdyn.c - - - $PROJ_DIR$\..\..\..\..\test\testdyn.h - - - $PROJ_DIR$\..\..\..\..\test\testevt.c - - - $PROJ_DIR$\..\..\..\..\test\testevt.h - - - $PROJ_DIR$\..\..\..\..\test\testheap.c - - - $PROJ_DIR$\..\..\..\..\test\testheap.h - - - $PROJ_DIR$\..\..\..\..\test\testmbox.c - - - $PROJ_DIR$\..\..\..\..\test\testmbox.h - - - $PROJ_DIR$\..\..\..\..\test\testmsg.c - - - $PROJ_DIR$\..\..\..\..\test\testmsg.h - - - $PROJ_DIR$\..\..\..\..\test\testmtx.c - - - $PROJ_DIR$\..\..\..\..\test\testmtx.h - - - $PROJ_DIR$\..\..\..\..\test\testpools.c - - - $PROJ_DIR$\..\..\..\..\test\testpools.h - - - $PROJ_DIR$\..\..\..\..\test\testqueues.c - - - $PROJ_DIR$\..\..\..\..\test\testqueues.h - - - $PROJ_DIR$\..\..\..\..\test\testsem.c - - - $PROJ_DIR$\..\..\..\..\test\testsem.h - - - $PROJ_DIR$\..\..\..\..\test\testthd.c - - - $PROJ_DIR$\..\..\..\..\test\testthd.h - - - - $PROJ_DIR$\..\chconf.h - - - $PROJ_DIR$\..\extfunc.c - - - $PROJ_DIR$\..\halconf.h - - - $PROJ_DIR$\..\main.c - - - $PROJ_DIR$\..\mcuconf.h - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww b/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww deleted file mode 100644 index f9b3b2000..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.eww +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $WS_DIR$\ch.ewp - - - - - diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf b/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf deleted file mode 100644 index c0a51f44c..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/iar/ch.icf +++ /dev/null @@ -1,39 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ -/*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 0x08000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; -define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; -define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x400; -define symbol __ICFEDIT_size_heap__ = 0x400; -/**** End of ICF editor section. ###ICF###*/ - -/* Size of the IRQ Stack (Main Stack).*/ -define symbol __ICFEDIT_size_irqstack__ = 0x400; - -define memory mem with size = 4G; -define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; -define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; - -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ {section CSTACK}; -define block IRQSTACK with alignment = 8, size = __ICFEDIT_size_irqstack__ {}; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ {}; -define block SYSHEAP with alignment = 8 {section SYSHEAP}; -define block DATABSS with alignment = 8 {readwrite, zeroinit}; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -keep { section .intvec }; - -place at address mem:__ICFEDIT_intvec_start__ {section .intvec}; -place in ROM_region {readonly}; -place at start of RAM_region {block IRQSTACK}; -place in RAM_region {block DATABSS, block HEAP}; -place in RAM_region {block SYSHEAP}; -place at end of RAM_region {block CSTACK}; diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj b/testhal/STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj deleted file mode 100644 index 0f02f5523..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/keil/ch.uvproj +++ /dev/null @@ -1,945 +0,0 @@ - - - - 1.1 - -
    ### uVision Project, (C) Keil Software
    - - - - Demo - 0x4 - ARM-ADS - - - STM32F407VG - STMicroelectronics - IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 - - "Startup\ST\STM32F4xx\startup_stm32f4xx.s" ("STM32F4xx Startup Code") - UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) - 6103 - stm32f4xx.h - - - - - - - - - - SFD\ST\STM32F4xx\STM32F4xx.sfr - 0 - - - - ST\STM32F4xx\ - ST\STM32F4xx\ - - 0 - 0 - 0 - 0 - 1 - - .\obj\ - ch - 1 - 0 - 0 - 1 - 1 - .\lst\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - - - SARMCM3.DLL - -MPU - DCM.DLL - -pCM4 - SARMCM3.DLL - -MPU - TCM.DLL - -pCM4 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - - 0 - 8 - - - - - - - - - - - - - - STLink\ST-LINKIII-KEIL.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4100 - - STLink\ST-LINKIII-KEIL.dll - "" () - - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 1 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 1 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 1 - 0x8000000 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x20000 - - - 0 - 0x20020000 - 0x1 - - - - - - 1 - 4 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - __heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base - - ..\;..\..\..\..\os\kernel\include;..\..\..\..\os\ports\common\ARMCMx;..\..\..\..\os\ports\common\ARMCMx\CMSIS\include;..\..\..\..\os\ports\RVCT\ARMCMx;..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx;..\..\..\..\os\hal\include;..\..\..\..\os\hal\platforms\STM32;..\..\..\..\os\hal\platforms\STM32\GPIOv2;..\..\..\..\os\hal\platforms\STM32\USARTv1;..\..\..\..\os\hal\platforms\STM32F4xx;..\..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\..\test - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - - --cpreproc - - - ..\;..\..\..\..\boards\ST_STM32F4_DISCOVERY;..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - board - - - board.c - 1 - ..\..\..\..\boards\ST_STM32F4_DISCOVERY\board.c - - - board.h - 5 - ..\..\..\..\boards\ST_STM32F4_DISCOVERY\board.h - - - - - port - - - cstartup.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\cstartup.s - - - chcoreasm_v7m.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcoreasm_v7m.s - - - chcore.c - 1 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore.c - - - chcore_v7m.c - 1 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.c - - - chcore.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore.h - - - chcore_v7m.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chcore_v7m.h - - - chtypes.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\chtypes.h - - - cmparams.h - 5 - ..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\cmparams.h - - - vectors.s - 2 - ..\..\..\..\os\ports\RVCT\ARMCMx\STM32F4xx\vectors.s - - - nvic.c - 1 - ..\..\..\..\os\ports\common\ARMCMx\nvic.c - - - nvic.h - 5 - ..\..\..\..\os\ports\common\ARMCMx\nvic.h - - - - - kernel - - - chcond.c - 1 - ..\..\..\..\os\kernel\src\chcond.c - - - chdebug.c - 1 - ..\..\..\..\os\kernel\src\chdebug.c - - - chdynamic.c - 1 - ..\..\..\..\os\kernel\src\chdynamic.c - - - chevents.c - 1 - ..\..\..\..\os\kernel\src\chevents.c - - - chheap.c - 1 - ..\..\..\..\os\kernel\src\chheap.c - - - chlists.c - 1 - ..\..\..\..\os\kernel\src\chlists.c - - - chmboxes.c - 1 - ..\..\..\..\os\kernel\src\chmboxes.c - - - chmemcore.c - 1 - ..\..\..\..\os\kernel\src\chmemcore.c - - - chmempools.c - 1 - ..\..\..\..\os\kernel\src\chmempools.c - - - chmsg.c - 1 - ..\..\..\..\os\kernel\src\chmsg.c - - - chmtx.c - 1 - ..\..\..\..\os\kernel\src\chmtx.c - - - chqueues.c - 1 - ..\..\..\..\os\kernel\src\chqueues.c - - - chregistry.c - 1 - ..\..\..\..\os\kernel\src\chregistry.c - - - chschd.c - 1 - ..\..\..\..\os\kernel\src\chschd.c - - - chsem.c - 1 - ..\..\..\..\os\kernel\src\chsem.c - - - chsys.c - 1 - ..\..\..\..\os\kernel\src\chsys.c - - - chthreads.c - 1 - ..\..\..\..\os\kernel\src\chthreads.c - - - chvt.c - 1 - ..\..\..\..\os\kernel\src\chvt.c - - - ch.h - 5 - ..\..\..\..\os\kernel\include\ch.h - - - chbsem.h - 5 - ..\..\..\..\os\kernel\include\chbsem.h - - - chcond.h - 5 - ..\..\..\..\os\kernel\include\chcond.h - - - chdebug.h - 5 - ..\..\..\..\os\kernel\include\chdebug.h - - - chdynamic.h - 5 - ..\..\..\..\os\kernel\include\chdynamic.h - - - chevents.h - 5 - ..\..\..\..\os\kernel\include\chevents.h - - - chfiles.h - 5 - ..\..\..\..\os\kernel\include\chfiles.h - - - chheap.h - 5 - ..\..\..\..\os\kernel\include\chheap.h - - - chinline.h - 5 - ..\..\..\..\os\kernel\include\chinline.h - - - chioch.h - 5 - ..\..\..\..\os\kernel\include\chioch.h - - - chlists.h - 5 - ..\..\..\..\os\kernel\include\chlists.h - - - chmboxes.h - 5 - ..\..\..\..\os\kernel\include\chmboxes.h - - - chmemcore.h - 5 - ..\..\..\..\os\kernel\include\chmemcore.h - - - chmempools.h - 5 - ..\..\..\..\os\kernel\include\chmempools.h - - - chmsg.h - 5 - ..\..\..\..\os\kernel\include\chmsg.h - - - chmtx.h - 5 - ..\..\..\..\os\kernel\include\chmtx.h - - - chqueues.h - 5 - ..\..\..\..\os\kernel\include\chqueues.h - - - chregistry.h - 5 - ..\..\..\..\os\kernel\include\chregistry.h - - - chschd.h - 5 - ..\..\..\..\os\kernel\include\chschd.h - - - chsem.h - 5 - ..\..\..\..\os\kernel\include\chsem.h - - - chstreams.h - 5 - ..\..\..\..\os\kernel\include\chstreams.h - - - chsys.h - 5 - ..\..\..\..\os\kernel\include\chsys.h - - - chthreads.h - 5 - ..\..\..\..\os\kernel\include\chthreads.h - - - chvt.h - 5 - ..\..\..\..\os\kernel\include\chvt.h - - - - - hal - - - hal.c - 1 - ..\..\..\..\os\hal\src\hal.c - - - pal.c - 1 - ..\..\..\..\os\hal\src\pal.c - - - serial.c - 1 - ..\..\..\..\os\hal\src\serial.c - - - hal.h - 5 - ..\..\..\..\os\hal\include\hal.h - - - pal.h - 5 - ..\..\..\..\os\hal\include\pal.h - - - serial.h - 5 - ..\..\..\..\os\hal\include\serial.h - - - gpt.h - 5 - ..\..\..\..\os\hal\include\gpt.h - - - gpt.c - 1 - ..\..\..\..\os\hal\src\gpt.c - - - - - platform - - - gpt_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\gpt_lld.h - - - gpt_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\gpt_lld.c - - - hal_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.c - - - hal_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\hal_lld.h - - - pal_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.c - - - pal_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\GPIOv2\pal_lld.h - - - serial_lld.c - 1 - ..\..\..\..\os\hal\platforms\STM32\USARTv1\serial_lld.c - - - serial_lld.h - 5 - ..\..\..\..\os\hal\platforms\STM32\USARTv1\serial_lld.h - - - stm32_dma.c - 1 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.c - - - stm32_dma.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_dma.h - - - stm32_rcc.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32_rcc.h - - - stm32l1xx.h - 5 - ..\..\..\..\os\hal\platforms\STM32F4xx\stm32l1xx.h - - - - - test - - - test.c - 1 - ..\..\..\..\test\test.c - - - testbmk.c - 1 - ..\..\..\..\test\testbmk.c - - - testdyn.c - 1 - ..\..\..\..\test\testdyn.c - - - testevt.c - 1 - ..\..\..\..\test\testevt.c - - - testheap.c - 1 - ..\..\..\..\test\testheap.c - - - testmbox.c - 1 - ..\..\..\..\test\testmbox.c - - - testmsg.c - 1 - ..\..\..\..\test\testmsg.c - - - testmtx.c - 1 - ..\..\..\..\test\testmtx.c - - - testpools.c - 1 - ..\..\..\..\test\testpools.c - - - testqueues.c - 1 - ..\..\..\..\test\testqueues.c - - - testsem.c - 1 - ..\..\..\..\test\testsem.c - - - testthd.c - 1 - ..\..\..\..\test\testthd.c - - - test.h - 5 - ..\..\..\..\test\test.h - - - testbmk.h - 5 - ..\..\..\..\test\testbmk.h - - - testdyn.h - 5 - ..\..\..\..\test\testdyn.h - - - testevt.h - 5 - ..\..\..\..\test\testevt.h - - - testheap.h - 5 - ..\..\..\..\test\testheap.h - - - testmbox.h - 5 - ..\..\..\..\test\testmbox.h - - - testmsg.h - 5 - ..\..\..\..\test\testmsg.h - - - testmtx.h - 5 - ..\..\..\..\test\testmtx.h - - - testpools.h - 5 - ..\..\..\..\test\testpools.h - - - testqueues.h - 5 - ..\..\..\..\test\testqueues.h - - - testsem.h - 5 - ..\..\..\..\test\testsem.h - - - testthd.h - 5 - ..\..\..\..\test\testthd.h - - - - - demo - - - main.c - 1 - ..\main.c - - - mcuconf.h - 5 - ..\mcuconf.h - - - chconf.h - 5 - ..\chconf.h - - - halconf.h - 5 - ..\halconf.h - - - extfunc.c - 1 - ..\extfunc.c - - - - - - - -
    diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/main.c b/testhal/STM32F4xx/IRQ_STORM_FPU/main.c deleted file mode 100644 index ad72cc0b9..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/main.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -float ff1(float par); - -float ff2(float par1, float par2, float par3, float par4); - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -static bool_t saturated; - -/* - * Test worker thread. - */ -static WORKING_AREA(waWorkerThread, 128); -static msg_t WorkerThread(void *arg) { - - (void)arg; - - while(1) { - float f1, f2, f3, f4, f5; - - f1 = ff1(3.0f); - f2 = ff1(4.0f); - f3 = ff1(5.0f); - f5 = f1 + f2 + f3; - f4 = ff1(6.0f); - f5 = ff2(f5, f4, f5, f4); - if (f5 != 324.0f) - chSysHalt(); - } -} - -/* - * Test periodic thread. - */ -static WORKING_AREA(waPeriodicThread, 128); -static msg_t PeriodicThread(void *arg) { - - (void)arg; - - while(1) { - float f1, f2, f3, f4, f5; - - f1 = ff1(4.0f); - f2 = ff1(5.0f); - f3 = ff1(6.0f); - f5 = f1 + f2 + f3; - f4 = ff1(7.0f); - f5 = ff2(f5, f4, f5, f4); - if (f5 != 484.0f) - chSysHalt(); - chThdSleepSeconds(1); - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - float f1, f2, f3, f4, f5; - - (void)gptp; - - f1 = ff1(2.0f); - f2 = ff1(3.0f); - f3 = ff1(4.0f); - f5 = f1 + f2 + f3; - f4 = ff1(5.0f); - f5 = ff2(f5, f4, f5, f4); - if (f5 != 196.0f) - chSysHalt(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - float f1, f2, f3, f4, f5; - - (void)gptp; - - f1 = ff1(1.0f); - f2 = ff1(2.0f); - f3 = ff1(3.0f); - f5 = f1 + f2 + f3; - f4 = ff1(4.0f); - f5 = ff2(f5, f4, f5, f4); - if (f5 != 100.0f) - chSysHalt(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD2, *p++); - } - chSequentialStreamWrite(&SD2, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD2, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD2, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 2 and GPT drivers 2 and 3. - */ - sdStart(&SD2, NULL); /* Default is 38400-8-N-1.*/ - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the worker threads. - */ - chThdCreateStatic(waWorkerThread, sizeof waWorkerThread, - NORMALPRIO - 20, WorkerThread, NULL); - chThdCreateStatic(waPeriodicThread, sizeof waPeriodicThread, - NORMALPRIO - 10, PeriodicThread, NULL); - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM-FPU long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 10; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } -} diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h b/testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h deleted file mode 100644 index dc10c0604..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 6 -#define STM32_GPT_TIM3_IRQ_PRIORITY 10 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt b/testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt deleted file mode 100644 index cb043261f..000000000 --- a/testhal/STM32F4xx/IRQ_STORM_FPU/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM_FPU stress test demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx GPT, PAL and Serial -drivers in order to implement a system stress demo involving the FPU. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using YAGARTO 4.6.2. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/PWM-ICU/.cproject b/testhal/STM32F4xx/PWM-ICU/.cproject deleted file mode 100644 index 940a1c9d5..000000000 --- a/testhal/STM32F4xx/PWM-ICU/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/PWM-ICU/.project b/testhal/STM32F4xx/PWM-ICU/.project deleted file mode 100644 index ebfbb62af..000000000 --- a/testhal/STM32F4xx/PWM-ICU/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-PWM-ICU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/PWM-ICU/Makefile b/testhal/STM32F4xx/PWM-ICU/Makefile deleted file mode 100644 index 86de6d81c..000000000 --- a/testhal/STM32F4xx/PWM-ICU/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/PWM-ICU/chconf.h b/testhal/STM32F4xx/PWM-ICU/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F4xx/PWM-ICU/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/PWM-ICU/halconf.h b/testhal/STM32F4xx/PWM-ICU/halconf.h deleted file mode 100644 index 2f74c82c8..000000000 --- a/testhal/STM32F4xx/PWM-ICU/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/PWM-ICU/main.c b/testhal/STM32F4xx/PWM-ICU/main.c deleted file mode 100644 index dc6287209..000000000 --- a/testhal/STM32F4xx/PWM-ICU/main.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIOD, GPIOD_LED5); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIOD, GPIOD_LED5); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(GPIOD, GPIOD_LED4); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(GPIOD, GPIOD_LED4); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - NULL, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 2 and ICU driver 3. - * GPIOA15 is the PWM output. - * GPIOC6 is the ICU input. - * The two pins have to be externally connected together. - */ - pwmStart(&PWMD2, &pwmcfg); - palSetPadMode(GPIOA, 15, PAL_MODE_ALTERNATE(1)); - icuStart(&ICUD3, &icucfg); - palSetPadMode(GPIOC, 6, PAL_MODE_ALTERNATE(2)); - icuEnable(&ICUD3); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD2, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD2, 0); - pwmStop(&PWMD2); - icuDisable(&ICUD3); - icuStop(&ICUD3); - palClearPad(GPIOD, GPIOD_LED4); - palClearPad(GPIOD, GPIOD_LED5); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F4xx/PWM-ICU/mcuconf.h b/testhal/STM32F4xx/PWM-ICU/mcuconf.h deleted file mode 100644 index e1e2badda..000000000 --- a/testhal/STM32F4xx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 TRUE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 TRUE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/PWM-ICU/readme.txt b/testhal/STM32F4xx/PWM-ICU/readme.txt deleted file mode 100644 index bd908948f..000000000 --- a/testhal/STM32F4xx/PWM-ICU/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM-ICU drivers demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx PWM-ICU drivers. - -** Board Setup ** - -- Connect PA15 and PC6 together. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/RTC/.cproject b/testhal/STM32F4xx/RTC/.cproject deleted file mode 100644 index 685ffe5f1..000000000 --- a/testhal/STM32F4xx/RTC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/RTC/.project b/testhal/STM32F4xx/RTC/.project deleted file mode 100644 index b281eb7d2..000000000 --- a/testhal/STM32F4xx/RTC/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-RTC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/RTC/Makefile b/testhal/STM32F4xx/RTC/Makefile deleted file mode 100644 index e383fef85..000000000 --- a/testhal/STM32F4xx/RTC/Makefile +++ /dev/null @@ -1,226 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/chrtclib.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/RTC/chconf.h b/testhal/STM32F4xx/RTC/chconf.h deleted file mode 100644 index 0a00640e2..000000000 --- a/testhal/STM32F4xx/RTC/chconf.h +++ /dev/null @@ -1,508 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -#define PORT_IDLE_THREAD_STACK_SIZE 32 -#define CORTEX_USE_FPU FALSE - -/*===========================================================================*/ -/* Kernel parameters. */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 0//20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/*===========================================================================*/ -/* Performance options. */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED FALSE -#endif - -/*===========================================================================*/ -/* Subsystem options. */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS FALSE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT FALSE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP FALSE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC FALSE -#endif - -/*===========================================================================*/ -/* Debug options. */ -/*===========================================================================*/ -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/*===========================================================================*/ -/* Kernel hooks. */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/RTC/halconf.h b/testhal/STM32F4xx/RTC/halconf.h deleted file mode 100644 index f0040635d..000000000 --- a/testhal/STM32F4xx/RTC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/RTC/main.c b/testhal/STM32F4xx/RTC/main.c deleted file mode 100644 index 6b25d371a..000000000 --- a/testhal/STM32F4xx/RTC/main.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* -This structure is used to hold the values representing a calendar time. -It contains the following members, with the meanings as shown. - -int tm_sec seconds after minute [0-61] (61 allows for 2 leap-seconds) -int tm_min minutes after hour [0-59] -int tm_hour hours after midnight [0-23] -int tm_mday day of the month [1-31] -int tm_mon month of year [0-11] -int tm_year current year-1900 -int tm_wday days since Sunday [0-6] -int tm_yday days since January 1st [0-365] -int tm_isdst daylight savings indicator (1 = yes, 0 = no, -1 = unknown) -*/ -#define WAKEUP_TEST FALSE - -#include -#include -#include - -#include "ch.h" -#include "hal.h" - -#include "shell.h" -#include "chprintf.h" -#include "chrtclib.h" - -#if WAKEUP_TEST -static RTCWakeup wakeupspec; -#endif -static RTCAlarm alarmspec; -static time_t unix_time; - -/* libc stub */ -int _getpid(void) {return 1;} -/* libc stub */ -void _exit(int i) {(void)i;} -/* libc stub */ -#include -#undef errno -extern int errno; -int _kill(int pid, int sig) { - (void)pid; - (void)sig; - errno = EINVAL; - return -1; -} - - -/* sleep indicator thread */ -static WORKING_AREA(blinkWA, 128); -static msg_t blink_thd(void *arg){ - (void)arg; - while (TRUE) { - chThdSleepMilliseconds(100); - palTogglePad(GPIOB, GPIOB_LED_R); - } - return 0; -} - -static void func_sleep(void){ - chSysLock(); - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - PWR->CR |= (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_CSBF | PWR_CR_CWUF); - RTC->ISR &= ~(RTC_ISR_ALRBF | RTC_ISR_ALRAF | RTC_ISR_WUTF | RTC_ISR_TAMP1F | - RTC_ISR_TSOVF | RTC_ISR_TSF); - __WFI(); -} - -static void cmd_sleep(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: sleep\r\n"); - return; - } - chprintf(chp, "Going to sleep.\r\n"); - - chThdSleepMilliseconds(200); - - /* going to anabiosis */ - func_sleep(); -} - -/* - * - */ -static void cmd_alarm(BaseSequentialStream *chp, int argc, char *argv[]){ - int i = 0; - - (void)argv; - if (argc < 1) { - goto ERROR; - } - - if ((argc == 1) && (strcmp(argv[0], "get") == 0)){ - rtcGetAlarm(&RTCD1, 0, &alarmspec); - chprintf(chp, "%D%s",alarmspec," - alarm in STM internal format\r\n"); - return; - } - - if ((argc == 2) && (strcmp(argv[0], "set") == 0)){ - i = atol(argv[1]); - alarmspec.tv_datetime = ((i / 10) & 7 << 4) | (i % 10) | RTC_ALRMAR_MSK4 | - RTC_ALRMAR_MSK3 | RTC_ALRMAR_MSK2; - rtcSetAlarm(&RTCD1, 0, &alarmspec); - return; - } - else{ - goto ERROR; - } - -ERROR: - chprintf(chp, "Usage: alarm get\r\n"); - chprintf(chp, " alarm set N\r\n"); - chprintf(chp, "where N is alarm time in seconds\r\n"); -} - -/* - * - */ -static void cmd_date(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argv; - struct tm timp; - - if (argc == 0) { - goto ERROR; - } - - if ((argc == 1) && (strcmp(argv[0], "get") == 0)){ - unix_time = rtcGetTimeUnixSec(&RTCD1); - - if (unix_time == -1){ - chprintf(chp, "incorrect time in RTC cell\r\n"); - } - else{ - chprintf(chp, "%D%s",unix_time," - unix time\r\n"); - rtcGetTimeTm(&RTCD1, &timp); - chprintf(chp, "%s%s",asctime(&timp)," - formatted time string\r\n"); - } - return; - } - - if ((argc == 2) && (strcmp(argv[0], "set") == 0)){ - unix_time = atol(argv[1]); - if (unix_time > 0){ - rtcSetTimeUnixSec(&RTCD1, unix_time); - return; - } - else{ - goto ERROR; - } - } - else{ - goto ERROR; - } - -ERROR: - chprintf(chp, "Usage: date get\r\n"); - chprintf(chp, " date set N\r\n"); - chprintf(chp, "where N is time in seconds sins Unix epoch\r\n"); - chprintf(chp, "you can get current N value from unix console by the command\r\n"); - chprintf(chp, "%s", "date +\%s\r\n"); - return; -} - -static SerialConfig ser_cfg = { - 115200, - 0, - 0, - 0, -}; - -static const ShellCommand commands[] = { - {"alarm", cmd_alarm}, - {"date", cmd_date}, - {"sleep", cmd_sleep}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - - -/** - * Main function. - */ -int main(void){ - - halInit(); - chSysInit(); - chThdCreateStatic(blinkWA, sizeof(blinkWA), NORMALPRIO, blink_thd, NULL); - -#if !WAKEUP_TEST - /* switch off wakeup */ - rtcSetPeriodicWakeup_v2(&RTCD1, NULL); - - /* Shell initialization.*/ - sdStart(&SD2, &ser_cfg); - shellInit(); - static WORKING_AREA(waShell, 1024); - shellCreateStatic(&shell_cfg1, waShell, sizeof(waShell), NORMALPRIO); - - /* wait until user do not want to test wakeup */ - while (TRUE){ - chThdSleepMilliseconds(200); - } - -#else - /* set wakeup */ - wakeupspec.wakeup = ((uint32_t)4) << 16; /* select 1 Hz clock source */ - wakeupspec.wakeup |= 9; /* set counter value to 9. Period will be 9+1 seconds. */ - rtcSetPeriodicWakeup_v2(&RTCD1, &wakeupspec); - - chThdSleepSeconds(3); - func_sleep(); -#endif /* !WAKEUP_TEST */ - - return 0; -} - - diff --git a/testhal/STM32F4xx/RTC/mcuconf.h b/testhal/STM32F4xx/RTC/mcuconf.h deleted file mode 100644 index 5feae3259..000000000 --- a/testhal/STM32F4xx/RTC/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED TRUE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/RTC_FATTIME/Makefile b/testhal/STM32F4xx/RTC_FATTIME/Makefile deleted file mode 100644 index ffd36e3d2..000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/Makefile +++ /dev/null @@ -1,217 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 #-mhard-float -mfpu=fpv4-sp-d16 -fsingle-precision-constant -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT= ch.ld - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - $(CHIBIOS)/os/various/chrtclib.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various $(FATFSINC) - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/RTC_FATTIME/chconf.h b/testhal/STM32F4xx/RTC_FATTIME/chconf.h deleted file mode 100644 index 868377751..000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/chconf.h +++ /dev/null @@ -1,534 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -#define PORT_IDLE_THREAD_STACK_SIZE 32 -#define CORTEX_USE_FPU FALSE - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/RTC_FATTIME/ffconf.h b/testhal/STM32F4xx/RTC_FATTIME/ffconf.h deleted file mode 100644 index a4816e845..000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 1 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1251 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 1 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 1 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 1 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/testhal/STM32F4xx/RTC_FATTIME/halconf.h b/testhal/STM32F4xx/RTC_FATTIME/halconf.h deleted file mode 100644 index f33c18c27..000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/halconf.h +++ /dev/null @@ -1,319 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC TRUE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief Write timeout in milliseconds. - */ -#if !defined(SDC_WRITE_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_WRITE_TIMEOUT_MS 250 -#endif - -/** - * @brief Write timeout in milliseconds. - */ -#if !defined(SDC_READ_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_READ_TIMEOUT_MS 5 -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/RTC_FATTIME/main.c b/testhal/STM32F4xx/RTC_FATTIME/main.c deleted file mode 100644 index 3c031ade0..000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/main.c +++ /dev/null @@ -1,218 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" - -#include "shell.h" -#include "chprintf.h" -#include "chrtclib.h" - -#include "ff.h" - -/* FS object.*/ -static FATFS SDC_FS; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/** - * - */ -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { - (void)sdcp; - return FALSE; -} - -/** - * - */ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { - (void)sdcp; - return !palReadPad(GPIOE, GPIOE_SDIO_DETECT); -} - -/** - * - */ -void cmd_sdiotest(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argc; - (void)argv; - FRESULT err; - uint32_t clusters; - FATFS *fsp; - FIL FileObject; - //FILINFO FileInfo; - size_t bytes_written; - struct tm timp; - -#if !HAL_USE_RTC - chprintf(chp, "ERROR! Chibios compiled without RTC support."); - chprintf(chp, "Enable HAL_USE_RCT in you halconf.h"); - chThdSleepMilliseconds(100); - return; -#endif - - chprintf(chp, "Trying to connect SDIO... "); - chThdSleepMilliseconds(100); - - if (!sdcConnect(&SDCD1)) { - chprintf(chp, "OK\r\n"); - chprintf(chp, "Register working area for filesystem... "); - chThdSleepMilliseconds(100); - err = f_mount(0, &SDC_FS); - if (err != FR_OK){ - chSysHalt(); - } - else{ - fs_ready = TRUE; - chprintf(chp, "OK\r\n"); - } - - chprintf(chp, "Mounting filesystem... "); - chThdSleepMilliseconds(100); - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)SDC_FS.csize, - clusters * (uint32_t)SDC_FS.csize * (uint32_t)MMCSD_BLOCK_SIZE); - - rtcGetTimeTm(&RTCD1, &timp); - chprintf(chp, "Current RTC time is: "); - chprintf(chp, "%u-%u-%u %u:%u:%u\r\n", - timp.tm_year+1900, timp.tm_mon+1, timp.tm_mday, timp.tm_hour, timp.tm_min, - timp.tm_sec); - - chprintf(chp, "Creating empty file 'tmstmp.tst'... "); - chThdSleepMilliseconds(100); - err = f_open(&FileObject, "0:tmstmp.tst", FA_WRITE | FA_OPEN_ALWAYS); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Write some data in it... "); - chThdSleepMilliseconds(100); - err = f_write(&FileObject, "tst", sizeof("tst"), (void *)&bytes_written); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Closing file 'tmstmp.tst'... "); - chThdSleepMilliseconds(100); - err = f_close(&FileObject); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - -// chprintf(chp, "Obtaining file info ... "); -// chThdSleepMilliseconds(100); -// err = f_stat("0:tmstmp.tst", &FileInfo); -// if (err != FR_OK) { -// chSysHalt(); -// } -// else{ -// chprintf(chp, "OK\r\n"); -// chprintf(chp, " Timestamp: %u-%u-%u %u:%u:%u\r\n", -// ((FileInfo.fdate >> 9) & 127) + 1980, -// (FileInfo.fdate >> 5) & 15, -// FileInfo.fdate & 31, -// (FileInfo.ftime >> 11) & 31, -// (FileInfo.ftime >> 5) & 63, -// (FileInfo.ftime & 31) * 2); -// } - - chprintf(chp, "Umounting filesystem... "); - f_mount(0, NULL); - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Disconnecting from SDIO..."); - chThdSleepMilliseconds(100); - if (sdcDisconnect(&SDCD1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chprintf(chp, "------------------------------------------------------\r\n"); - chprintf(chp, "Now you can remove memory card and check timestamp on PC.\r\n"); - chThdSleepMilliseconds(100); - } - else{ - chSysHalt(); - } -} - -/* - * SDIO configuration. - */ -static const SDCConfig sdccfg = { - 0 -}; - -/** - * - */ -static SerialConfig ser_cfg = { - 115200, - 0, - 0, - 0, -}; -static const ShellCommand commands[] = { - {"sdiotest", cmd_sdiotest}, - {NULL, NULL} -}; -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - -/* - * Application entry point. - */ -int main(void) { - halInit(); - chSysInit(); - - /* start debugging serial link */ - sdStart(&SD2, &ser_cfg); - shellInit(); - static WORKING_AREA(waShell, 4096); - shellCreateStatic(&shell_cfg1, waShell, sizeof(waShell), NORMALPRIO); - - /* - * Initializes the SDIO drivers. - */ - sdcStart(&SDCD1, &sdccfg); - - /* - * Normal main() thread activity. - * Blinking signaling about successful passing. - */ - while (TRUE) { - palTogglePad(GPIOB, GPIOB_LED_R); - chThdSleepMilliseconds(100); - } -} diff --git a/testhal/STM32F4xx/RTC_FATTIME/mcuconf.h b/testhal/STM32F4xx/RTC_FATTIME/mcuconf.h deleted file mode 100644 index a8d51babe..000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/RTC_FATTIME/readme.txt b/testhal/STM32F4xx/RTC_FATTIME/readme.txt deleted file mode 100644 index b5036cd2c..000000000 --- a/testhal/STM32F4xx/RTC_FATTIME/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex ST_STM3210E_EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32 RTC driver for timestamping -files on FAT. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/SDC/.cproject b/testhal/STM32F4xx/SDC/.cproject deleted file mode 100644 index 5315ed60f..000000000 --- a/testhal/STM32F4xx/SDC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/SDC/.project b/testhal/STM32F4xx/SDC/.project deleted file mode 100644 index 630877d95..000000000 --- a/testhal/STM32F4xx/SDC/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - STM32F4xx-SDC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - fatfs - 2 - CHIBIOS/ext/fatfs - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/SDC/Makefile b/testhal/STM32F4xx/SDC/Makefile deleted file mode 100644 index b22e616e5..000000000 --- a/testhal/STM32F4xx/SDC/Makefile +++ /dev/null @@ -1,230 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Define linker script file here -LDSCRIPT= ch.ld - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/NONSTANDARD_STM32F4_BARTHESS1/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/os/various/fatfs_bindings/fatfs.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) \ - $(CHIBIOS)/os/various/evtimer.c \ - $(CHIBIOS)/os/various/syscalls.c \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various $(FATFSINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/SDC/chconf.h b/testhal/STM32F4xx/SDC/chconf.h deleted file mode 100644 index 868377751..000000000 --- a/testhal/STM32F4xx/SDC/chconf.h +++ /dev/null @@ -1,534 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -#define PORT_IDLE_THREAD_STACK_SIZE 32 -#define CORTEX_USE_FPU FALSE - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/SDC/csd.txt b/testhal/STM32F4xx/SDC/csd.txt deleted file mode 100644 index eefe5274c..000000000 --- a/testhal/STM32F4xx/SDC/csd.txt +++ /dev/null @@ -1,7 +0,0 @@ -127 ... ... 0 - -00000000 00101110 00000000 00110010 - 01011011 01011010 10100011 10100000 - 11111111111111111111111110000000 - 00001010100000000000000010001110 kingmax 2 GB -00000000 00101110 00000000 00110010 - 01011011 01011010 10000011 10101001 - 11111111111111111111111110000000 - 00010110100000000000000010010000 kingstone 2 GB -01000000 00001110 00000000 00110010 - 01011011 01011001 00000000 00000000 - 00111011010010110111111110000000 - 00001010010000000100000001000000 samsung sdhc 8 GB -00000000 00100110 00000000 00110010 - 01011111 01011010 10000011 10101110 - 11111110111110111100111111111111 - 10010010100000000100000011011110 noname 2 GB - diff --git a/testhal/STM32F4xx/SDC/ffconf.h b/testhal/STM32F4xx/SDC/ffconf.h deleted file mode 100644 index 9073f2286..000000000 --- a/testhal/STM32F4xx/SDC/ffconf.h +++ /dev/null @@ -1,193 +0,0 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.09 (C)ChaN, 2011 -/----------------------------------------------------------------------------/ -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FFCONF -#define _FFCONF 6502 /* Revision ID */ - - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system -/ object instead of the sector buffer in the individual file object for file -/ data transfer. This reduces memory consumption 512 bytes each file object. */ - - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* Setting _FS_READONLY to 1 defines read only configuration. This removes -/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, -/ f_truncate and useless f_getfree. */ - - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* The _FS_MINIMIZE option defines minimization level to remove some functions. -/ -/ 0: Full function. -/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename -/ are removed. -/ 2: f_opendir and f_readdir are removed in addition to 1. -/ 3: f_lseek is removed in addition to 2. */ - - -#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ -/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ - - -#define _USE_MKFS 1 /* 0:Disable or 1:Enable */ -/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ - - -#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ -/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ - - -#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ -/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ - - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1251 -/* The _CODE_PAGE specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII only (Valid for non LFN cfg.) -*/ - - -#define _USE_LFN 3 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN support. -/ -/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, -/ Unicode handling functions ff_convert() and ff_wtoupper() must be added -/ to the project. When enable to use heap, memory control functions -/ ff_memalloc() and ff_memfree() must be added to the project. */ - - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* To switch the character code set on FatFs API to Unicode, -/ enable LFN feature and set _LFN_UNICODE to 1. */ - - -#define _FS_RPATH 0 /* 0 to 2 */ -/* The _FS_RPATH option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path. f_chdrive() and f_chdir() are available. -/ 2: f_getcwd() is available in addition to 1. -/ -/ Note that output of the f_readdir fnction is affected by this option. */ - - - -/*---------------------------------------------------------------------------/ -/ Physical Drive Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* Maximum sector size to be handled. -/ Always set 512 for memory card and hard disk but a larger value may be -/ required for on-board flash memory, floppy disk and optical disk. -/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size -/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ - - -#define _MULTI_PARTITION 0 /* 0:Single partition, 1/2:Enable multiple partition */ -/* When set to 0, each volume is bound to the same physical drive number and -/ it can mount only first primaly partition. When it is set to 1, each volume -/ is tied to the partitions listed in VolToPart[]. */ - - -#define _USE_ERASE 1 /* 0:Disable or 1:Enable */ -/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command -/ should be added to the disk_ioctl functio. */ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _WORD_ACCESS 1 /* 0 or 1 */ -/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS -/ option defines which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. -/ 1: Word access. Do not choose this unless following condition is met. -/ -/ When the byte order on the memory is big-endian or address miss-aligned word -/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/ If it is not the case, the value can also be set to 1 to improve the -/ performance and code size. -*/ - - -/* A header file that defines sync object types on the O/S, such as -/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ - -#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t Semaphore * /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ - -/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. -/ -/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. -/ 1: Enable reentrancy. Also user provided synchronization handlers, -/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj -/ function must be added to the project. */ - - -#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value - defines how many files can be opened simultaneously. */ - - -#endif /* _FFCONFIG */ diff --git a/testhal/STM32F4xx/SDC/halconf.h b/testhal/STM32F4xx/SDC/halconf.h deleted file mode 100644 index 7c79feea0..000000000 --- a/testhal/STM32F4xx/SDC/halconf.h +++ /dev/null @@ -1,319 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC TRUE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief Write timeout in milliseconds. - */ -#if !defined(SDC_WRITE_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_WRITE_TIMEOUT_MS 250 -#endif - -/** - * @brief Write timeout in milliseconds. - */ -#if !defined(SDC_READ_TIMEOUT_MS) || defined(__DOXYGEN__) -#define SDC_READ_TIMEOUT_MS 5 -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/SDC/main.c b/testhal/STM32F4xx/SDC/main.c deleted file mode 100644 index 721eac66b..000000000 --- a/testhal/STM32F4xx/SDC/main.c +++ /dev/null @@ -1,382 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include "ch.h" -#include "hal.h" - -#include "shell.h" -#include "chprintf.h" - -#include "ff.h" - -#define SDC_DATA_DESTRUCTIVE_TEST FALSE - -#define SDC_BURST_SIZE 8 /* how many sectors reads at once */ -static uint8_t outbuf[MMCSD_BLOCK_SIZE * SDC_BURST_SIZE + 1]; -static uint8_t inbuf[MMCSD_BLOCK_SIZE * SDC_BURST_SIZE + 1]; - -/* FS object.*/ -static FATFS SDC_FS; - -/* FS mounted and ready.*/ -static bool_t fs_ready = FALSE; - -/** - * @brief Parody of UNIX badblocks program. - * - * @param[in] start first block to check - * @param[in] end last block to check - * @param[in] blockatonce number of blocks to check at once - * @param[in] pattern check pattern - * - * @return The operation status. - * @retval SDC_SUCCESS operation succeeded, the requested blocks have been - * read. - * @retval SDC_FAILED operation failed, the state of the buffer is uncertain. - */ -bool_t badblocks(uint32_t start, uint32_t end, uint32_t blockatonce, uint8_t pattern){ - uint32_t position = 0; - uint32_t i = 0; - - chDbgCheck(blockatonce <= SDC_BURST_SIZE, "badblocks"); - - /* fill control buffer */ - for (i=0; i < MMCSD_BLOCK_SIZE * blockatonce; i++) - outbuf[i] = pattern; - - /* fill SD card with pattern. */ - position = start; - while (position < end){ - if (sdcWrite(&SDCD1, position, outbuf, blockatonce)) - goto ERROR; - position += blockatonce; - } - - /* read and compare. */ - position = start; - while (position < end){ - if (sdcRead(&SDCD1, position, inbuf, blockatonce)) - goto ERROR; - if (memcmp(inbuf, outbuf, blockatonce * MMCSD_BLOCK_SIZE) != 0) - goto ERROR; - position += blockatonce; - } - return FALSE; - -ERROR: - return TRUE; -} - -/** - * - */ -void fillbuffer(uint8_t pattern, uint8_t *b){ - uint32_t i = 0; - for (i=0; i < MMCSD_BLOCK_SIZE * SDC_BURST_SIZE; i++) - b[i] = pattern; -} - -/** - * - */ -void fillbuffers(uint8_t pattern){ - fillbuffer(pattern, inbuf); - fillbuffer(pattern, outbuf); -} - -/** - * - */ -void cmd_sdiotest(BaseSequentialStream *chp, int argc, char *argv[]){ - (void)argc; - (void)argv; - uint32_t i = 0; - - chprintf(chp, "Trying to connect SDIO... "); - chThdSleepMilliseconds(100); - - if (!sdcConnect(&SDCD1)) { - - chprintf(chp, "OK\r\n"); - chprintf(chp, "*** Card CSD content is: "); - chprintf(chp, "%X %X %X %X \r\n", (&SDCD1)->csd[3], (&SDCD1)->csd[2], - (&SDCD1)->csd[1], (&SDCD1)->csd[0]); - - chprintf(chp, "Single aligned read..."); - chThdSleepMilliseconds(100); - if (sdcRead(&SDCD1, 0, inbuf, 1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chThdSleepMilliseconds(100); - - - chprintf(chp, "Single unaligned read..."); - chThdSleepMilliseconds(100); - if (sdcRead(&SDCD1, 0, inbuf + 1, 1)) - chSysHalt(); - if (sdcRead(&SDCD1, 0, inbuf + 2, 1)) - chSysHalt(); - if (sdcRead(&SDCD1, 0, inbuf + 3, 1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chThdSleepMilliseconds(100); - - - chprintf(chp, "Multiple aligned reads..."); - chThdSleepMilliseconds(100); - fillbuffers(0x55); - /* fill reference buffer from SD card */ - if (sdcRead(&SDCD1, 0, inbuf, SDC_BURST_SIZE)) - chSysHalt(); - for (i=0; i<1000; i++){ - if (sdcRead(&SDCD1, 0, outbuf, SDC_BURST_SIZE)) - chSysHalt(); - if (memcmp(inbuf, outbuf, SDC_BURST_SIZE * MMCSD_BLOCK_SIZE) != 0) - chSysHalt(); - } - chprintf(chp, " OK\r\n"); - chThdSleepMilliseconds(100); - - - chprintf(chp, "Multiple unaligned reads..."); - chThdSleepMilliseconds(100); - fillbuffers(0x55); - /* fill reference buffer from SD card */ - if (sdcRead(&SDCD1, 0, inbuf + 1, SDC_BURST_SIZE)) - chSysHalt(); - for (i=0; i<1000; i++){ - if (sdcRead(&SDCD1, 0, outbuf + 1, SDC_BURST_SIZE)) - chSysHalt(); - if (memcmp(inbuf, outbuf, SDC_BURST_SIZE * MMCSD_BLOCK_SIZE) != 0) - chSysHalt(); - } - chprintf(chp, " OK\r\n"); - chThdSleepMilliseconds(100); - -#if SDC_DATA_DESTRUCTIVE_TEST - - chprintf(chp, "Single aligned write..."); - chThdSleepMilliseconds(100); - fillbuffer(0xAA, inbuf); - if (sdcWrite(&SDCD1, 0, inbuf, 1)) - chSysHalt(); - fillbuffer(0, outbuf); - if (sdcRead(&SDCD1, 0, outbuf, 1)) - chSysHalt(); - if (memcmp(inbuf, outbuf, MMCSD_BLOCK_SIZE) != 0) - chSysHalt(); - chprintf(chp, " OK\r\n"); - - chprintf(chp, "Single unaligned write..."); - chThdSleepMilliseconds(100); - fillbuffer(0xFF, inbuf); - if (sdcWrite(&SDCD1, 0, inbuf+1, 1)) - chSysHalt(); - fillbuffer(0, outbuf); - if (sdcRead(&SDCD1, 0, outbuf+1, 1)) - chSysHalt(); - if (memcmp(inbuf+1, outbuf+1, MMCSD_BLOCK_SIZE) != 0) - chSysHalt(); - chprintf(chp, " OK\r\n"); - - chprintf(chp, "Running badblocks at 0x10000 offset..."); - chThdSleepMilliseconds(100); - if(badblocks(0x10000, 0x11000, SDC_BURST_SIZE, 0xAA)) - chSysHalt(); - chprintf(chp, " OK\r\n"); -#endif /* !SDC_DATA_DESTRUCTIVE_TEST */ - - - /** - * Now perform some FS tests. - */ - - FRESULT err; - uint32_t clusters; - FATFS *fsp; - FIL FileObject; - uint32_t bytes_written; - uint32_t bytes_read; - FILINFO filinfo; - uint8_t teststring[] = {"This is test file\r\n"}; - - chprintf(chp, "Register working area for filesystem... "); - chThdSleepMilliseconds(100); - err = f_mount(0, &SDC_FS); - if (err != FR_OK){ - chSysHalt(); - } - else{ - fs_ready = TRUE; - chprintf(chp, "OK\r\n"); - } - - -#if SDC_DATA_DESTRUCTIVE_TEST - chprintf(chp, "Formatting... "); - chThdSleepMilliseconds(100); - err = f_mkfs (0,0,0); - if (err != FR_OK){ - chSysHalt(); - } - else{ - chprintf(chp, "OK\r\n"); - } -#endif /* SDC_DATA_DESTRUCTIVE_TEST */ - - - chprintf(chp, "Mount filesystem... "); - chThdSleepMilliseconds(100); - err = f_getfree("/", &clusters, &fsp); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - chprintf(chp, - "FS: %lu free clusters, %lu sectors per cluster, %lu bytes free\r\n", - clusters, (uint32_t)SDC_FS.csize, - clusters * (uint32_t)SDC_FS.csize * (uint32_t)MMCSD_BLOCK_SIZE); - - - chprintf(chp, "Create file \"chtest.txt\"... "); - chThdSleepMilliseconds(100); - err = f_open(&FileObject, "0:chtest.txt", FA_WRITE | FA_OPEN_ALWAYS); - if (err != FR_OK) { - chSysHalt(); - } - chprintf(chp, "OK\r\n"); - chprintf(chp, "Write some data in it... "); - chThdSleepMilliseconds(100); - err = f_write(&FileObject, teststring, sizeof(teststring), (void *)&bytes_written); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Close file \"chtest.txt\"... "); - err = f_close(&FileObject); - if (err != FR_OK) { - chSysHalt(); - } - else - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Check file size \"chtest.txt\"... "); - err = f_stat("0:chtest.txt", &filinfo); - chThdSleepMilliseconds(100); - if (err != FR_OK) { - chSysHalt(); - } - else{ - if (filinfo.fsize == sizeof(teststring)) - chprintf(chp, "OK\r\n"); - else - chSysHalt(); - } - - chprintf(chp, "Check file content \"chtest.txt\"... "); - err = f_open(&FileObject, "0:chtest.txt", FA_READ | FA_OPEN_EXISTING); - chThdSleepMilliseconds(100); - if (err != FR_OK) { - chSysHalt(); - } - uint8_t buf[sizeof(teststring)]; - err = f_read(&FileObject, buf, sizeof(teststring), (void *)&bytes_read); - if (err != FR_OK) { - chSysHalt(); - } - else{ - if (memcmp(teststring, buf, sizeof(teststring)) != 0){ - chSysHalt(); - } - else{ - chprintf(chp, "OK\r\n"); - } - } - - chprintf(chp, "Umount filesystem... "); - f_mount(0, NULL); - chprintf(chp, "OK\r\n"); - - chprintf(chp, "Disconnecting from SDIO..."); - chThdSleepMilliseconds(100); - if (sdcDisconnect(&SDCD1)) - chSysHalt(); - chprintf(chp, " OK\r\n"); - chprintf(chp, "------------------------------------------------------\r\n"); - chprintf(chp, "All tests passed successfully.\r\n"); - chThdSleepMilliseconds(100); - } - else{ - chSysHalt(); - } -} - - -/* - * SDIO configuration. - */ -static const SDCConfig sdccfg = { - 0 -}; - -/** - * - */ -static SerialConfig ser_cfg = { - 115200, - 0, - 0, - 0, -}; -static const ShellCommand commands[] = { - {"sdiotest", cmd_sdiotest}, - {NULL, NULL} -}; -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - -/* - * Application entry point. - */ -int main(void) { - halInit(); - chSysInit(); - - /* start debugging serial link */ - sdStart(&SD2, &ser_cfg); - shellInit(); - static WORKING_AREA(waShell, 2048); - shellCreateStatic(&shell_cfg1, waShell, sizeof(waShell), NORMALPRIO); - - /* - * Initializes the SDIO drivers. - */ - sdcStart(&SDCD1, &sdccfg); - - /* - * Normal main() thread activity. - * Blinking signaling about successful passing. - */ - while (TRUE) { - palTogglePad(GPIOB, GPIOB_LED_R); - chThdSleepMilliseconds(100); - } -} diff --git a/testhal/STM32F4xx/SDC/mcuconf.h b/testhal/STM32F4xx/SDC/mcuconf.h deleted file mode 100644 index a8d51babe..000000000 --- a/testhal/STM32F4xx/SDC/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 TRUE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/SDC/readme.txt b/testhal/STM32F4xx/SDC/readme.txt deleted file mode 100644 index b897676af..000000000 --- a/testhal/STM32F4xx/SDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex ST_STM3210E_EVAL board. - -** The Demo ** - -The application demonstrates the use of the STM32 SDC driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/SPI/.cproject b/testhal/STM32F4xx/SPI/.cproject deleted file mode 100644 index 6b2c42453..000000000 --- a/testhal/STM32F4xx/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/SPI/.project b/testhal/STM32F4xx/SPI/.project deleted file mode 100644 index effebe09e..000000000 --- a/testhal/STM32F4xx/SPI/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/SPI/Makefile b/testhal/STM32F4xx/SPI/Makefile deleted file mode 100644 index 86de6d81c..000000000 --- a/testhal/STM32F4xx/SPI/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/SPI/chconf.h b/testhal/STM32F4xx/SPI/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F4xx/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/SPI/halconf.h b/testhal/STM32F4xx/SPI/halconf.h deleted file mode 100644 index 3e1cafbbf..000000000 --- a/testhal/STM32F4xx/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/SPI/main.c b/testhal/STM32F4xx/SPI/main.c deleted file mode 100644 index 04999434b..000000000 --- a/testhal/STM32F4xx/SPI/main.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration (21MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOB, - 12, - 0 -}; - -/* - * Low speed SPI configuration (328.125kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - GPIOB, - 12, - SPI_CR1_BR_2 | SPI_CR1_BR_1 -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palSetPad(GPIOD, GPIOD_LED5); /* LED ON. */ - spiStart(&SPID2, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palClearPad(GPIOD, GPIOD_LED5); /* LED OFF. */ - spiStart(&SPID2, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * SPI2 I/O pins setup. - */ - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New SCK. */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* New MOSI. */ - palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); /* New CS. */ - palSetPad(GPIOB, 12); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32F4xx/SPI/mcuconf.h b/testhal/STM32F4xx/SPI/mcuconf.h deleted file mode 100644 index 21f5e5dcc..000000000 --- a/testhal/STM32F4xx/SPI/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 TRUE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/SPI/readme.txt b/testhal/STM32F4xx/SPI/readme.txt deleted file mode 100644 index d3d78bc8c..000000000 --- a/testhal/STM32F4xx/SPI/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx SPI driver. - -** Board Setup ** - -- Connect PB14 and PB15 together for SPI loop-back. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/UART/.cproject b/testhal/STM32F4xx/UART/.cproject deleted file mode 100644 index 7bb8c14a7..000000000 --- a/testhal/STM32F4xx/UART/.cproject +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/UART/.project b/testhal/STM32F4xx/UART/.project deleted file mode 100644 index 06e8b52e8..000000000 --- a/testhal/STM32F4xx/UART/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32F4xx-UART - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32F4_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32F4xx/UART/Makefile b/testhal/STM32F4xx/UART/Makefile deleted file mode 100644 index 86de6d81c..000000000 --- a/testhal/STM32F4xx/UART/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/UART/chconf.h b/testhal/STM32F4xx/UART/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F4xx/UART/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/UART/halconf.h b/testhal/STM32F4xx/UART/halconf.h deleted file mode 100644 index 520e71b0a..000000000 --- a/testhal/STM32F4xx/UART/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/UART/main.c b/testhal/STM32F4xx/UART/main.c deleted file mode 100644 index fcd6fa965..000000000 --- a/testhal/STM32F4xx/UART/main.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt3, vt4, vt5; - -static const uint8_t message[] = "0123456789ABCDEF"; -static uint8_t buffer[16]; - -static void led3off(void *p) { - - (void)p; - palClearPad(GPIOD, GPIOD_LED3); -} - -static void led4off(void *p) { - - (void)p; - palClearPad(GPIOD, GPIOD_LED4); -} - -static void led5off(void *p) { - - (void)p; - palClearPad(GPIOD, GPIOD_LED5); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palSetPad(GPIOD, GPIOD_LED5); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt5)) - chVTResetI(&vt5); - chVTSetI(&vt5, MS2ST(200), led5off, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palSetPad(GPIOD, GPIOD_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - chVTSetI(&vt4, MS2ST(200), led4off, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; - - /* Flashing the LED each time a character is received.*/ - palSetPad(GPIOD, GPIOD_LED3); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt3)) - chVTResetI(&vt3); - chVTSetI(&vt3, MS2ST(200), led3off, NULL); - chSysUnlockFromIsr(); -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the UART driver 2, PA2(TX) and PA3(RX) are routed to USART2. - */ - uartStart(&UARTD2, &uart_cfg_1); - palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7)); - - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - /* - * Starts both a transmission and a receive operations, both will be - * handled entirely in background. - */ - uartStopReceive(&UARTD2); - uartStopSend(&UARTD2); - uartStartReceive(&UARTD2, 16, buffer); - uartStartSend(&UARTD2, 16, message); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32F4xx/UART/mcuconf.h b/testhal/STM32F4xx/UART/mcuconf.h deleted file mode 100644 index 102c44dd7..000000000 --- a/testhal/STM32F4xx/UART/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 8 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USE_USART3 TRUE -#define STM32_UART_USE_USART6 TRUE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 FALSE -#define STM32_USB_USE_OTG2 FALSE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/UART/readme.txt b/testhal/STM32F4xx/UART/readme.txt deleted file mode 100644 index 19a8e26da..000000000 --- a/testhal/STM32F4xx/UART/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32F4xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32F4-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32F4xx UART driver. - -** Board Setup ** - -- Connect an RS232 transceiver to pins PA2(TX) and PA3(RX). -- Connect a terminal emulator to the transceiver (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32F4xx/USB_CDC/.cproject b/testhal/STM32F4xx/USB_CDC/.cproject deleted file mode 100644 index 16a94a05d..000000000 --- a/testhal/STM32F4xx/USB_CDC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32F4xx/USB_CDC/.project b/testhal/STM32F4xx/USB_CDC/.project deleted file mode 100644 index 135abc544..000000000 --- a/testhal/STM32F4xx/USB_CDC/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - STM32F4xx-USB_CDC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/OLIMEX_STM32_E407 - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/testhal/STM32F4xx/USB_CDC/Makefile b/testhal/STM32F4xx/USB_CDC/Makefile deleted file mode 100644 index 8c329e2d7..000000000 --- a/testhal/STM32F4xx/USB_CDC/Makefile +++ /dev/null @@ -1,223 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/OLIMEX_STM32_E407/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(CHIBIOS)/os/various/shell.c \ - $(CHIBIOS)/os/various/chprintf.c \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32F4xx/USB_CDC/chconf.h b/testhal/STM32F4xx/USB_CDC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32F4xx/USB_CDC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/USB_CDC/halconf.h b/testhal/STM32F4xx/USB_CDC/halconf.h deleted file mode 100644 index cd76b0cfe..000000000 --- a/testhal/STM32F4xx/USB_CDC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB TRUE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB TRUE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32F4xx/USB_CDC/main.c b/testhal/STM32F4xx/USB_CDC/main.c deleted file mode 100644 index 8bdf3c0ba..000000000 --- a/testhal/STM32F4xx/USB_CDC/main.c +++ /dev/null @@ -1,522 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include -#include - -#include "ch.h" -#include "hal.h" -#include "test.h" - -#include "shell.h" -#include "chprintf.h" - -/*===========================================================================*/ -/* USB related stuff. */ -/*===========================================================================*/ - -/* - * Endpoints to be used for USBD2. - */ -#define USBD2_DATA_REQUEST_EP 1 -#define USBD2_DATA_AVAILABLE_EP 1 -#define USBD2_INTERRUPT_REQUEST_EP 2 - -/* - * Serial over USB Driver structure. - */ -static SerialUSBDriver SDU2; - -/* - * USB Device Descriptor. - */ -static const uint8_t vcom_device_descriptor_data[18] = { - USB_DESC_DEVICE (0x0110, /* bcdUSB (1.1). */ - 0x02, /* bDeviceClass (CDC). */ - 0x00, /* bDeviceSubClass. */ - 0x00, /* bDeviceProtocol. */ - 0x40, /* bMaxPacketSize. */ - 0x0483, /* idVendor (ST). */ - 0x5740, /* idProduct. */ - 0x0200, /* bcdDevice. */ - 1, /* iManufacturer. */ - 2, /* iProduct. */ - 3, /* iSerialNumber. */ - 1) /* bNumConfigurations. */ -}; - -/* - * Device Descriptor wrapper. - */ -static const USBDescriptor vcom_device_descriptor = { - sizeof vcom_device_descriptor_data, - vcom_device_descriptor_data -}; - -/* Configuration Descriptor tree for a CDC.*/ -static const uint8_t vcom_configuration_descriptor_data[67] = { - /* Configuration Descriptor.*/ - USB_DESC_CONFIGURATION(67, /* wTotalLength. */ - 0x02, /* bNumInterfaces. */ - 0x01, /* bConfigurationValue. */ - 0, /* iConfiguration. */ - 0xC0, /* bmAttributes (self powered). */ - 50), /* bMaxPower (100mA). */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x00, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x01, /* bNumEndpoints. */ - 0x02, /* bInterfaceClass (Communications - Interface Class, CDC section - 4.2). */ - 0x02, /* bInterfaceSubClass (Abstract - Control Model, CDC section 4.3). */ - 0x01, /* bInterfaceProtocol (AT commands, - CDC section 4.4). */ - 0), /* iInterface. */ - /* Header Functional Descriptor (CDC section 5.2.3).*/ - USB_DESC_BYTE (5), /* bLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x00), /* bDescriptorSubtype (Header - Functional Descriptor. */ - USB_DESC_BCD (0x0110), /* bcdCDC. */ - /* Call Management Functional Descriptor. */ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x01), /* bDescriptorSubtype (Call Management - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bmCapabilities (D0+D1). */ - USB_DESC_BYTE (0x01), /* bDataInterface. */ - /* ACM Functional Descriptor.*/ - USB_DESC_BYTE (4), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x02), /* bDescriptorSubtype (Abstract - Control Management Descriptor). */ - USB_DESC_BYTE (0x02), /* bmCapabilities. */ - /* Union Functional Descriptor.*/ - USB_DESC_BYTE (5), /* bFunctionLength. */ - USB_DESC_BYTE (0x24), /* bDescriptorType (CS_INTERFACE). */ - USB_DESC_BYTE (0x06), /* bDescriptorSubtype (Union - Functional Descriptor). */ - USB_DESC_BYTE (0x00), /* bMasterInterface (Communication - Class Interface). */ - USB_DESC_BYTE (0x01), /* bSlaveInterface0 (Data Class - Interface). */ - /* Endpoint 2 Descriptor.*/ - USB_DESC_ENDPOINT (USBD2_INTERRUPT_REQUEST_EP|0x80, - 0x03, /* bmAttributes (Interrupt). */ - 0x0008, /* wMaxPacketSize. */ - 0xFF), /* bInterval. */ - /* Interface Descriptor.*/ - USB_DESC_INTERFACE (0x01, /* bInterfaceNumber. */ - 0x00, /* bAlternateSetting. */ - 0x02, /* bNumEndpoints. */ - 0x0A, /* bInterfaceClass (Data Class - Interface, CDC section 4.5). */ - 0x00, /* bInterfaceSubClass (CDC section - 4.6). */ - 0x00, /* bInterfaceProtocol (CDC section - 4.7). */ - 0x00), /* iInterface. */ - /* Endpoint 3 Descriptor.*/ - USB_DESC_ENDPOINT (USBD2_DATA_AVAILABLE_EP, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00), /* bInterval. */ - /* Endpoint 1 Descriptor.*/ - USB_DESC_ENDPOINT (USBD2_DATA_REQUEST_EP|0x80, /* bEndpointAddress.*/ - 0x02, /* bmAttributes (Bulk). */ - 0x0040, /* wMaxPacketSize. */ - 0x00) /* bInterval. */ -}; - -/* - * Configuration Descriptor wrapper. - */ -static const USBDescriptor vcom_configuration_descriptor = { - sizeof vcom_configuration_descriptor_data, - vcom_configuration_descriptor_data -}; - -/* - * U.S. English language identifier. - */ -static const uint8_t vcom_string0[] = { - USB_DESC_BYTE(4), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - USB_DESC_WORD(0x0409) /* wLANGID (U.S. English). */ -}; - -/* - * Vendor string. - */ -static const uint8_t vcom_string1[] = { - USB_DESC_BYTE(38), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0, - 'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0, - 'c', 0, 's', 0 -}; - -/* - * Device Description string. - */ -static const uint8_t vcom_string2[] = { - USB_DESC_BYTE(56), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - 'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0, - 'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, - 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0, - 'o', 0, 'r', 0, 't', 0 -}; - -/* - * Serial Number string. - */ -static const uint8_t vcom_string3[] = { - USB_DESC_BYTE(8), /* bLength. */ - USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType. */ - '0' + CH_KERNEL_MAJOR, 0, - '0' + CH_KERNEL_MINOR, 0, - '0' + CH_KERNEL_PATCH, 0 -}; - -/* - * Strings wrappers array. - */ -static const USBDescriptor vcom_strings[] = { - {sizeof vcom_string0, vcom_string0}, - {sizeof vcom_string1, vcom_string1}, - {sizeof vcom_string2, vcom_string2}, - {sizeof vcom_string3, vcom_string3} -}; - -/* - * Handles the GET_DESCRIPTOR callback. All required descriptors must be - * handled here. - */ -static const USBDescriptor *get_descriptor(USBDriver *usbp, - uint8_t dtype, - uint8_t dindex, - uint16_t lang) { - - (void)usbp; - (void)lang; - switch (dtype) { - case USB_DESCRIPTOR_DEVICE: - return &vcom_device_descriptor; - case USB_DESCRIPTOR_CONFIGURATION: - return &vcom_configuration_descriptor; - case USB_DESCRIPTOR_STRING: - if (dindex < 4) - return &vcom_strings[dindex]; - } - return NULL; -} - -/** - * @brief IN EP1 state. - */ -static USBInEndpointState ep1instate; - -/** - * @brief OUT EP1 state. - */ -static USBOutEndpointState ep1outstate; - -/** - * @brief EP1 initialization structure (both IN and OUT). - */ -static const USBEndpointConfig ep1config = { - USB_EP_MODE_TYPE_BULK, - NULL, - sduDataTransmitted, - sduDataReceived, - 0x0040, - 0x0040, - &ep1instate, - &ep1outstate, - 2, - NULL -}; - -/** - * @brief IN EP2 state. - */ -static USBInEndpointState ep2instate; - -/** - * @brief EP2 initialization structure (IN only). - */ -static const USBEndpointConfig ep2config = { - USB_EP_MODE_TYPE_INTR, - NULL, - sduInterruptTransmitted, - NULL, - 0x0010, - 0x0000, - &ep2instate, - NULL, - 1, - NULL -}; - -/* - * Handles the USB driver global events. - */ -static void usb_event(USBDriver *usbp, usbevent_t event) { - - switch (event) { - case USB_EVENT_RESET: - return; - case USB_EVENT_ADDRESS: - return; - case USB_EVENT_CONFIGURED: - chSysLockFromIsr(); - - /* Enables the endpoints specified into the configuration. - Note, this callback is invoked from an ISR so I-Class functions - must be used.*/ - usbInitEndpointI(usbp, USBD2_DATA_REQUEST_EP, &ep1config); - usbInitEndpointI(usbp, USBD2_INTERRUPT_REQUEST_EP, &ep2config); - - /* Resetting the state of the CDC subsystem.*/ - sduConfigureHookI(&SDU2); - - chSysUnlockFromIsr(); - return; - case USB_EVENT_SUSPEND: - return; - case USB_EVENT_WAKEUP: - return; - case USB_EVENT_STALLED: - return; - } - return; -} - -/* - * USB driver configuration. - */ -static const USBConfig usbcfg = { - usb_event, - get_descriptor, - sduRequestsHook, - NULL -}; - -/* - * Serial over USB driver configuration. - */ -static const SerialUSBConfig serusbcfg = { - &USBD2, - USBD2_DATA_REQUEST_EP, - USBD2_DATA_AVAILABLE_EP, - USBD2_INTERRUPT_REQUEST_EP -}; - -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -#define SHELL_WA_SIZE THD_WA_SIZE(2048) -#define TEST_WA_SIZE THD_WA_SIZE(256) - -static void cmd_mem(BaseSequentialStream *chp, int argc, char *argv[]) { - size_t n, size; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: mem\r\n"); - return; - } - n = chHeapStatus(NULL, &size); - chprintf(chp, "core free memory : %u bytes\r\n", chCoreStatus()); - chprintf(chp, "heap fragments : %u\r\n", n); - chprintf(chp, "heap free total : %u bytes\r\n", size); -} - -static void cmd_threads(BaseSequentialStream *chp, int argc, char *argv[]) { - static const char *states[] = {THD_STATE_NAMES}; - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: threads\r\n"); - return; - } - chprintf(chp, " addr stack prio refs state time\r\n"); - tp = chRegFirstThread(); - do { - chprintf(chp, "%.8lx %.8lx %4lu %4lu %9s %lu\r\n", - (uint32_t)tp, (uint32_t)tp->p_ctx.r13, - (uint32_t)tp->p_prio, (uint32_t)(tp->p_refs - 1), - states[tp->p_state], (uint32_t)tp->p_time); - tp = chRegNextThread(tp); - } while (tp != NULL); -} - -static void cmd_test(BaseSequentialStream *chp, int argc, char *argv[]) { - Thread *tp; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: test\r\n"); - return; - } - tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(), - TestThread, chp); - if (tp == NULL) { - chprintf(chp, "out of memory\r\n"); - return; - } - chThdWait(tp); -} - -static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { - static uint8_t buf[] = - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - (void)argv; - if (argc > 0) { - chprintf(chp, "Usage: write\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) { - chSequentialStreamWrite(&SDU2, buf, sizeof buf - 1); - } - chprintf(chp, "\r\n\nstopped\r\n"); -} - -static const ShellCommand commands[] = { - {"mem", cmd_mem}, - {"threads", cmd_threads}, - {"test", cmd_test}, - {"write", cmd_write}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU2, - commands -}; - -/*===========================================================================*/ -/* Generic code. */ -/*===========================================================================*/ - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - systime_t time; - - time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; - palClearPad(GPIOC, GPIOC_LED); - chThdSleepMilliseconds(time); - palSetPad(GPIOC, GPIOC_LED); - chThdSleepMilliseconds(time); - } -} - -/* - * Application entry point. - */ -int main(void) { - Thread *shelltp = NULL; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU2); - sduStart(&SDU2, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1500); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Stopping and restarting the USB in order to test the stop procedure. The - * following lines are not usually required. - */ - chThdSleepMilliseconds(3000); - usbDisconnectBus(serusbcfg.usbp); - usbStop(serusbcfg.usbp); - chThdSleepMilliseconds(1500); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. - */ - shellInit(); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { - if (!shelltp && (SDU2.config->usbp->state == USB_ACTIVE)) - shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO); - else if (chThdTerminated(shelltp)) { - chThdRelease(shelltp); /* Recovers memory of the previous shell. */ - shelltp = NULL; /* Triggers spawning of a new shell. */ - } - chThdSleepMilliseconds(1000); - } -} diff --git a/testhal/STM32F4xx/USB_CDC/mcuconf.h b/testhal/STM32F4xx/USB_CDC/mcuconf.h deleted file mode 100644 index 34138a27d..000000000 --- a/testhal/STM32F4xx/USB_CDC/mcuconf.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32F4xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32F4xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_CLOCK48_REQUIRED TRUE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLM_VALUE 12 -#define STM32_PLLN_VALUE 336 -#define STM32_PLLP_VALUE 2 -#define STM32_PLLQ_VALUE 7 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV4 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_RTCSEL STM32_RTCSEL_LSI -#define STM32_RTCPRE_VALUE 8 -#define STM32_MCO1SEL STM32_MCO1SEL_HSI -#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 -#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK -#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 -#define STM32_I2SSRC STM32_I2SSRC_CKIN -#define STM32_PLLI2SN_VALUE 192 -#define STM32_PLLI2SR_VALUE 5 -#define STM32_VOS STM32_VOS_HIGH -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_USE_ADC2 FALSE -#define STM32_ADC_USE_ADC3 FALSE -#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) -#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC2_DMA_PRIORITY 2 -#define STM32_ADC_ADC3_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 -#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 FALSE -#define STM32_CAN_USE_CAN2 FALSE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 -#define STM32_CAN_CAN2_IRQ_PRIORITY 11 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 -#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM6 FALSE -#define STM32_GPT_USE_TIM7 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_USE_TIM9 FALSE -#define STM32_GPT_USE_TIM11 FALSE -#define STM32_GPT_USE_TIM12 FALSE -#define STM32_GPT_USE_TIM14 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM6_IRQ_PRIORITY 7 -#define STM32_GPT_TIM7_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 -#define STM32_GPT_TIM9_IRQ_PRIORITY 7 -#define STM32_GPT_TIM11_IRQ_PRIORITY 7 -#define STM32_GPT_TIM12_IRQ_PRIORITY 7 -#define STM32_GPT_TIM14_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_USE_I2C3 FALSE -#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) -#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C3_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C3_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * MAC driver system settings. - */ -#define STM32_MAC_TRANSMIT_BUFFERS 2 -#define STM32_MAC_RECEIVE_BUFFERS 4 -#define STM32_MAC_BUFFERS_SIZE 1522 -#define STM32_MAC_PHY_TIMEOUT 100 -#define STM32_MAC_ETH1_CHANGE_PHY_STATE TRUE -#define STM32_MAC_ETH1_IRQ_PRIORITY 13 -#define STM32_MAC_IP_CHECKSUM_OFFLOAD 0 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USE_USART6 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 -#define STM32_SERIAL_USART6_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) -#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) -#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) -#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USE_USART6 FALSE -#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) -#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) -#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) -#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) -#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) -#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) -#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART6_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_USART6_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_OTG1 TRUE -#define STM32_USB_USE_OTG2 TRUE -#define STM32_USB_OTG1_IRQ_PRIORITY 14 -#define STM32_USB_OTG2_IRQ_PRIORITY 14 -#define STM32_USB_OTG1_RX_FIFO_SIZE 512 -#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 -#define STM32_USB_OTG_THREAD_PRIO LOWPRIO -#define STM32_USB_OTG_THREAD_STACK_SIZE 128 -#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 diff --git a/testhal/STM32F4xx/USB_CDC/readme.txt b/testhal/STM32F4xx/USB_CDC/readme.txt deleted file mode 100644 index a619a3ec1..000000000 --- a/testhal/STM32F4xx/USB_CDC/readme.txt +++ /dev/null @@ -1,26 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - USB-CDC driver demo for STM32. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an Olimex STM32-E407 board. - -** The Demo ** - -The application demonstrates the use of the STM32 USB (OTG) driver. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/ADC/.cproject b/testhal/STM32L1xx/ADC/.cproject deleted file mode 100644 index dd444dc30..000000000 --- a/testhal/STM32L1xx/ADC/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32L1xx/ADC/.project b/testhal/STM32L1xx/ADC/.project deleted file mode 100644 index 170610f4f..000000000 --- a/testhal/STM32L1xx/ADC/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32L1xx-ADC - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32L_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32L1xx/ADC/Makefile b/testhal/STM32L1xx/ADC/Makefile deleted file mode 100644 index 0d3a8e2b2..000000000 --- a/testhal/STM32L1xx/ADC/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/ADC/chconf.h b/testhal/STM32L1xx/ADC/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32L1xx/ADC/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/ADC/halconf.h b/testhal/STM32L1xx/ADC/halconf.h deleted file mode 100644 index 85a5dbd3b..000000000 --- a/testhal/STM32L1xx/ADC/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC TRUE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/ADC/main.c b/testhal/STM32L1xx/ADC/main.c deleted file mode 100644 index 9ca4b541f..000000000 --- a/testhal/STM32L1xx/ADC/main.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -#define ADC_GRP1_NUM_CHANNELS 1 -#define ADC_GRP1_BUF_DEPTH 8 - -#define ADC_GRP2_NUM_CHANNELS 8 -#define ADC_GRP2_BUF_DEPTH 16 - -static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; - -/* - * ADC streaming callback. - */ -size_t nx = 0, ny = 0; -static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) { - - (void)adcp; - if (samples2 == buffer) { - nx += n; - } - else { - ny += n; - } -} - -static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { - - (void)adcp; - (void)err; -} - -/* - * ADC conversion group. - * Mode: Linear buffer, 8 samples of 1 channel, SW triggered. - * Channels: IN10. - */ -static const ADCConversionGroup adcgrpcfg1 = { - FALSE, - ADC_GRP1_NUM_CHANNELS, - NULL, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - 0, /* SMPR1 */ - ADC_SMPR2_SMP_AN10(ADC_SAMPLE_4), - 0, /* SMPR3 */ - ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), - 0, 0, 0, /* SQR2, SQR3, SQR4 */ - ADC_SQR5_SQ1_N(ADC_CHANNEL_IN10) -}; - -/* - * ADC conversion group. - * Mode: Continuous, 16 samples of 8 channels, SW triggered. - * Channels: IN10, IN11, IN10, IN11, IN10, IN11, Sensor, VRef. - */ -static const ADCConversionGroup adcgrpcfg2 = { - TRUE, - ADC_GRP2_NUM_CHANNELS, - adccallback, - adcerrorcallback, - 0, /* CR1 */ - ADC_CR2_SWSTART, /* CR2 */ - 0, /* SMPR1 */ - ADC_SMPR2_SMP_AN11(ADC_SAMPLE_48) | ADC_SMPR2_SMP_AN10(ADC_SAMPLE_48) | - ADC_SMPR2_SMP_SENSOR(ADC_SAMPLE_192) | ADC_SMPR2_SMP_VREF(ADC_SAMPLE_192), - 0, /* SMPR3 */ - ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), - 0, 0, /* SQR2, SQR3 */ - ADC_SQR4_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR4_SQ7_N(ADC_CHANNEL_VREFINT), - ADC_SQR5_SQ6_N(ADC_CHANNEL_IN11) | ADC_SQR5_SQ5_N(ADC_CHANNEL_IN10) | - ADC_SQR5_SQ4_N(ADC_CHANNEL_IN11) | ADC_SQR5_SQ3_N(ADC_CHANNEL_IN10) | - ADC_SQR5_SQ2_N(ADC_CHANNEL_IN11) | ADC_SQR5_SQ1_N(ADC_CHANNEL_IN10) -}; - -/* - * Red LEDs blinker thread, times are in milliseconds. - */ -static WORKING_AREA(waThread1, 128); -static msg_t Thread1(void *arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palSetPad(GPIOB, GPIOB_LED4); - chThdSleepMilliseconds(500); - palClearPad(GPIOB, GPIOB_LED4); - chThdSleepMilliseconds(500); - } -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Setting up analog inputs used by the demo. - */ - palSetGroupMode(GPIOC, PAL_PORT_BIT(0) | PAL_PORT_BIT(1), - 0, PAL_MODE_INPUT_ANALOG); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - /* - * Activates the ADC1 driver and the temperature sensor. - */ - adcStart(&ADCD1, NULL); - adcSTM32EnableTSVREFE(); - - /* - * Linear conversion. - */ - adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH); - chThdSleepMilliseconds(1000); - - /* - * Starts an ADC continuous conversion. - */ - adcStartConversion(&ADCD1, &adcgrpcfg2, samples2, ADC_GRP2_BUF_DEPTH); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - adcStopConversion(&ADCD1); - adcSTM32DisableTSVREFE(); - } - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32L1xx/ADC/mcuconf.h b/testhal/STM32L1xx/ADC/mcuconf.h deleted file mode 100644 index f0bf4a0cc..000000000 --- a/testhal/STM32L1xx/ADC/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 TRUE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/ADC/readme.txt b/testhal/STM32L1xx/ADC/readme.txt deleted file mode 100644 index 91e9574b3..000000000 --- a/testhal/STM32L1xx/ADC/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - ADC driver demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx ADC driver. - -** Board Setup ** - -- Remove the LCD module. -- Connect PC0 to 3.3V and PC1 to GND for analog measurements. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/EXT/.cproject b/testhal/STM32L1xx/EXT/.cproject deleted file mode 100644 index 2148e6575..000000000 --- a/testhal/STM32L1xx/EXT/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32L1xx/EXT/.project b/testhal/STM32L1xx/EXT/.project deleted file mode 100644 index c24be83e5..000000000 --- a/testhal/STM32L1xx/EXT/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32L1xx-EXT - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32L_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32L1xx/EXT/Makefile b/testhal/STM32L1xx/EXT/Makefile deleted file mode 100644 index 0d3a8e2b2..000000000 --- a/testhal/STM32L1xx/EXT/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/EXT/chconf.h b/testhal/STM32L1xx/EXT/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32L1xx/EXT/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/EXT/halconf.h b/testhal/STM32L1xx/EXT/halconf.h deleted file mode 100644 index e0e0c38ff..000000000 --- a/testhal/STM32L1xx/EXT/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/EXT/main.c b/testhal/STM32L1xx/EXT/main.c deleted file mode 100644 index c0820d139..000000000 --- a/testhal/STM32L1xx/EXT/main.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void led4off(void *arg) { - - (void)arg; - palClearPad(GPIOB, GPIOB_LED4); -} - -/* Triggered when the button is pressed or released. The LED4 is set to ON.*/ -static void extcb1(EXTDriver *extp, expchannel_t channel) { - static VirtualTimer vt4; - - (void)extp; - (void)channel; - palSetPad(GPIOB, GPIOB_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt4)) - chVTResetI(&vt4); - /* LED4 set to OFF after 200mS.*/ - chVTSetI(&vt4, MS2ST(200), led4off, NULL); - chSysUnlockFromIsr(); -} - -static const EXTConfig extcfg = { - { - {EXT_CH_MODE_BOTH_EDGES | EXT_CH_MODE_AUTOSTART | EXT_MODE_GPIOA, extcb1}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL}, - {EXT_CH_MODE_DISABLED, NULL} - } -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the EXT driver 1. - */ - extStart(&EXTD1, &extcfg); - - /* - * Normal main() thread activity, in this demo it enables and disables the - * button EXT channel using 5 seconds intervals. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - extChannelDisable(&EXTD1, 0); - chThdSleepMilliseconds(5000); - extChannelEnable(&EXTD1, 0); - } -} diff --git a/testhal/STM32L1xx/EXT/mcuconf.h b/testhal/STM32L1xx/EXT/mcuconf.h deleted file mode 100644 index 753e83df3..000000000 --- a/testhal/STM32L1xx/EXT/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/EXT/readme.txt b/testhal/STM32L1xx/EXT/readme.txt deleted file mode 100644 index 16953a3c9..000000000 --- a/testhal/STM32L1xx/EXT/readme.txt +++ /dev/null @@ -1,30 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - EXT driver demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx EXT driver. - -** Board Setup ** - -None required. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/IRQ_STORM/.cproject b/testhal/STM32L1xx/IRQ_STORM/.cproject deleted file mode 100644 index 5b23e9f4d..000000000 --- a/testhal/STM32L1xx/IRQ_STORM/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32L1xx/IRQ_STORM/.project b/testhal/STM32L1xx/IRQ_STORM/.project deleted file mode 100644 index 5cc197397..000000000 --- a/testhal/STM32L1xx/IRQ_STORM/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32L1xx-IRQ_STORM - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32L_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32L1xx/IRQ_STORM/Makefile b/testhal/STM32L1xx/IRQ_STORM/Makefile deleted file mode 100644 index 0d3a8e2b2..000000000 --- a/testhal/STM32L1xx/IRQ_STORM/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/IRQ_STORM/chconf.h b/testhal/STM32L1xx/IRQ_STORM/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM32L1xx/IRQ_STORM/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/IRQ_STORM/halconf.h b/testhal/STM32L1xx/IRQ_STORM/halconf.h deleted file mode 100644 index 117a5979b..000000000 --- a/testhal/STM32L1xx/IRQ_STORM/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT TRUE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL TRUE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/IRQ_STORM/main.c b/testhal/STM32L1xx/IRQ_STORM/main.c deleted file mode 100644 index 88d575b18..000000000 --- a/testhal/STM32L1xx/IRQ_STORM/main.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include - -#include "ch.h" -#include "hal.h" - -/*===========================================================================*/ -/* Configurable settings. */ -/*===========================================================================*/ - -#ifndef RANDOMIZE -#define RANDOMIZE FALSE -#endif - -#ifndef ITERATIONS -#define ITERATIONS 100 -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 4 -#endif - -#ifndef MAILBOX_SIZE -#define MAILBOX_SIZE 4 -#endif - -/*===========================================================================*/ -/* Test related code. */ -/*===========================================================================*/ - -#define MSG_SEND_LEFT 0 -#define MSG_SEND_RIGHT 1 - -static bool_t saturated; - -/* - * Mailboxes and buffers. - */ -static Mailbox mb[NUM_THREADS]; -static msg_t b[NUM_THREADS][MAILBOX_SIZE]; - -/* - * Test worker threads. - */ -static WORKING_AREA(waWorkerThread[NUM_THREADS], 128); -static msg_t WorkerThread(void *arg) { - static volatile unsigned x = 0; - static unsigned cnt = 0; - unsigned me = (unsigned)arg; - unsigned target; - unsigned r; - msg_t msg; - - chRegSetThreadName("worker"); - - /* Work loop.*/ - while (TRUE) { - /* Waiting for a message.*/ - chMBFetch(&mb[me], &msg, TIME_INFINITE); - -#if RANDOMIZE - /* Pseudo-random delay.*/ - { - chSysLock(); - r = rand() & 15; - chSysUnlock(); - while (r--) - x++; - } -#else - /* Fixed delay.*/ - { - r = me >> 4; - while (r--) - x++; - } -#endif - - /* Deciding in which direction to re-send the message.*/ - if (msg == MSG_SEND_LEFT) - target = me - 1; - else - target = me + 1; - - if (target < NUM_THREADS) { - /* If this thread is not at the end of a chain re-sending the message, - note this check works because the variable target is unsigned.*/ - msg = chMBPost(&mb[target], msg, TIME_IMMEDIATE); - if (msg != RDY_OK) - saturated = TRUE; - } - else { - /* Provides a visual feedback about the system.*/ - if (++cnt >= 500) { - cnt = 0; - palTogglePad(GPIOB, GPIOB_LED4); - } - } - } -} - -/* - * GPT2 callback. - */ -static void gpt2cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[0], MSG_SEND_RIGHT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT3 callback. - */ -static void gpt3cb(GPTDriver *gptp) { - msg_t msg; - - (void)gptp; - chSysLockFromIsr(); - msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT); - if (msg != RDY_OK) - saturated = TRUE; - chSysUnlockFromIsr(); -} - -/* - * GPT2 configuration. - */ -static const GPTConfig gpt2cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt2cb /* Timer callback.*/ -}; - -/* - * GPT3 configuration. - */ -static const GPTConfig gpt3cfg = { - 1000000, /* 1MHz timer clock.*/ - gpt3cb /* Timer callback.*/ -}; - - -/*===========================================================================*/ -/* Generic demo code. */ -/*===========================================================================*/ - -static void print(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } -} - -static void println(char *p) { - - while (*p) { - chSequentialStreamPut(&SD1, *p++); - } - chSequentialStreamWrite(&SD1, (uint8_t *)"\r\n", 2); -} - -static void printn(uint32_t n) { - char buf[16], *p; - - if (!n) - chSequentialStreamPut(&SD1, '0'); - else { - p = buf; - while (n) - *p++ = (n % 10) + '0', n /= 10; - while (p > buf) - chSequentialStreamPut(&SD1, *--p); - } -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - gptcnt_t interval, threshold, worst; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Prepares the Serial driver 1 and GPT drivers 2 and 3. - */ - sdStart(&SD1, NULL); /* Default is 38400-8-N-1.*/ - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(7)); - gptStart(&GPTD2, &gpt2cfg); - gptStart(&GPTD3, &gpt3cfg); - - /* - * Initializes the mailboxes and creates the worker threads. - */ - for (i = 0; i < NUM_THREADS; i++) { - chMBInit(&mb[i], b[i], MAILBOX_SIZE); - chThdCreateStatic(waWorkerThread[i], sizeof waWorkerThread[i], - NORMALPRIO - 20, WorkerThread, (void *)i); - } - - /* - * Test procedure. - */ - println(""); - println("*** ChibiOS/RT IRQ-STORM long duration test"); - println("***"); - print("*** Kernel: "); - println(CH_KERNEL_VERSION); - print("*** Compiled: "); - println(__DATE__ " - " __TIME__); -#ifdef CH_COMPILER_NAME - print("*** Compiler: "); - println(CH_COMPILER_NAME); -#endif - print("*** Architecture: "); - println(CH_ARCHITECTURE_NAME); -#ifdef CH_CORE_VARIANT_NAME - print("*** Core Variant: "); - println(CH_CORE_VARIANT_NAME); -#endif -#ifdef CH_PORT_INFO - print("*** Port Info: "); - println(CH_PORT_INFO); -#endif -#ifdef PLATFORM_NAME - print("*** Platform: "); - println(PLATFORM_NAME); -#endif -#ifdef BOARD_NAME - print("*** Test Board: "); - println(BOARD_NAME); -#endif - println("***"); - print("*** System Clock: "); - printn(STM32_SYSCLK); - println(""); - print("*** Iterations: "); - printn(ITERATIONS); - println(""); - print("*** Randomize: "); - printn(RANDOMIZE); - println(""); - print("*** Threads: "); - printn(NUM_THREADS); - println(""); - print("*** Mailbox size: "); - printn(MAILBOX_SIZE); - println(""); - - println(""); - worst = 0; - for (i = 1; i <= ITERATIONS; i++){ - print("Iteration "); - printn(i); - println(""); - saturated = FALSE; - threshold = 0; - for (interval = 2000; interval >= 20; interval -= interval / 10) { - gptStartContinuous(&GPTD2, interval - 1); /* Slightly out of phase.*/ - gptStartContinuous(&GPTD3, interval + 1); /* Slightly out of phase.*/ - chThdSleepMilliseconds(1000); - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - if (!saturated) - print("."); - else { - print("#"); - if (threshold == 0) - threshold = interval; - } - } - /* Gives the worker threads a chance to empty the mailboxes before next - cycle.*/ - chThdSleepMilliseconds(20); - println(""); - print("Saturated at "); - printn(threshold); - println(" uS"); - println(""); - if (threshold > worst) - worst = threshold; - } - gptStopTimer(&GPTD2); - gptStopTimer(&GPTD3); - - print("Worst case at "); - printn(worst); - println(" uS"); - println(""); - println("Test Complete"); - - /* - * Normal main() thread activity, nothing in this test. - */ - while (TRUE) { - chThdSleepMilliseconds(5000); - } - return 0; -} diff --git a/testhal/STM32L1xx/IRQ_STORM/mcuconf.h b/testhal/STM32L1xx/IRQ_STORM/mcuconf.h deleted file mode 100644 index e73375db2..000000000 --- a/testhal/STM32L1xx/IRQ_STORM/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 TRUE -#define STM32_GPT_USE_TIM3 TRUE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 6 -#define STM32_GPT_TIM3_IRQ_PRIORITY 10 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 TRUE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/IRQ_STORM/readme.txt b/testhal/STM32L1xx/IRQ_STORM/readme.txt deleted file mode 100644 index 9483b1f02..000000000 --- a/testhal/STM32L1xx/IRQ_STORM/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - IRQ_STORM stress test demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx GPT, PAL and Serial -drivers in order to implement a system stress demo. - -** Board Setup ** - -None. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/PWM-ICU/.cproject b/testhal/STM32L1xx/PWM-ICU/.cproject deleted file mode 100644 index b96ec18ee..000000000 --- a/testhal/STM32L1xx/PWM-ICU/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32L1xx/PWM-ICU/.project b/testhal/STM32L1xx/PWM-ICU/.project deleted file mode 100644 index 393dbac2d..000000000 --- a/testhal/STM32L1xx/PWM-ICU/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32L1xx-PWM-ICU - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32L_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32L1xx/PWM-ICU/Makefile b/testhal/STM32L1xx/PWM-ICU/Makefile deleted file mode 100644 index 0d3a8e2b2..000000000 --- a/testhal/STM32L1xx/PWM-ICU/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/PWM-ICU/chconf.h b/testhal/STM32L1xx/PWM-ICU/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32L1xx/PWM-ICU/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/PWM-ICU/halconf.h b/testhal/STM32L1xx/PWM-ICU/halconf.h deleted file mode 100644 index 2f74c82c8..000000000 --- a/testhal/STM32L1xx/PWM-ICU/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU TRUE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM TRUE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/PWM-ICU/main.c b/testhal/STM32L1xx/PWM-ICU/main.c deleted file mode 100644 index 3ef877831..000000000 --- a/testhal/STM32L1xx/PWM-ICU/main.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static void pwmpcb(PWMDriver *pwmp) { - - (void)pwmp; - palClearPad(GPIOB, GPIOB_LED4); -} - -static void pwmc1cb(PWMDriver *pwmp) { - - (void)pwmp; - palSetPad(GPIOB, GPIOB_LED4); -} - -static PWMConfig pwmcfg = { - 10000, /* 10kHz PWM clock frequency. */ - 10000, /* Initial PWM period 1S. */ - pwmpcb, - { - {PWM_OUTPUT_ACTIVE_HIGH, pwmc1cb}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -}; - -icucnt_t last_width, last_period; - -static void icuwidthcb(ICUDriver *icup) { - - palSetPad(GPIOB, GPIOB_LED3); - last_width = icuGetWidth(icup); -} - -static void icuperiodcb(ICUDriver *icup) { - - palClearPad(GPIOB, GPIOB_LED3); - last_period = icuGetPeriod(icup); -} - -static ICUConfig icucfg = { - ICU_INPUT_ACTIVE_HIGH, - 10000, /* 10kHz ICU clock frequency. */ - icuwidthcb, - icuperiodcb, - NULL, - ICU_CHANNEL_1 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Initializes the PWM driver 2 and ICU driver 3. - * GPIOA15 is the PWM output. - * GPIOC6 is the ICU input. - * The two pins have to be externally connected together. - */ - pwmStart(&PWMD2, &pwmcfg); - palSetPadMode(GPIOA, 15, PAL_MODE_ALTERNATE(1)); - icuStart(&ICUD3, &icucfg); - palSetPadMode(GPIOC, 6, PAL_MODE_ALTERNATE(2)); - icuEnable(&ICUD3); - chThdSleepMilliseconds(2000); - - /* - * Starts the PWM channel 0 using 75% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 7500)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 50% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 5000)); - chThdSleepMilliseconds(5000); - - /* - * Changes the PWM channel 0 to 25% duty cycle. - */ - pwmEnableChannel(&PWMD2, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD2, 2500)); - chThdSleepMilliseconds(5000); - - /* - * Changes PWM period to half second the duty cycle becomes 50% - * implicitly. - */ - pwmChangePeriod(&PWMD2, 5000); - chThdSleepMilliseconds(5000); - - /* - * Disables channel 0 and stops the drivers. - */ - pwmDisableChannel(&PWMD2, 0); - pwmStop(&PWMD2); - icuDisable(&ICUD3); - icuStop(&ICUD3); - palClearPad(GPIOB, GPIOB_LED3); - palClearPad(GPIOB, GPIOB_LED4); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32L1xx/PWM-ICU/mcuconf.h b/testhal/STM32L1xx/PWM-ICU/mcuconf.h deleted file mode 100644 index 961a41c01..000000000 --- a/testhal/STM32L1xx/PWM-ICU/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 TRUE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 TRUE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/PWM-ICU/readme.txt b/testhal/STM32L1xx/PWM-ICU/readme.txt deleted file mode 100644 index 52a2dd2ad..000000000 --- a/testhal/STM32L1xx/PWM-ICU/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - PWM-ICU drivers demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo will on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx PWM-ICU drivers. - -** Board Setup ** - -- Remove the LCD module. -- Connect PA15 and PC6 together. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/SPI/.cproject b/testhal/STM32L1xx/SPI/.cproject deleted file mode 100644 index b2bc5eb2d..000000000 --- a/testhal/STM32L1xx/SPI/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32L1xx/SPI/.project b/testhal/STM32L1xx/SPI/.project deleted file mode 100644 index aef073cf3..000000000 --- a/testhal/STM32L1xx/SPI/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32L1xx-SPI - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32L_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32L1xx/SPI/Makefile b/testhal/STM32L1xx/SPI/Makefile deleted file mode 100644 index 0d3a8e2b2..000000000 --- a/testhal/STM32L1xx/SPI/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/SPI/chconf.h b/testhal/STM32L1xx/SPI/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32L1xx/SPI/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/SPI/halconf.h b/testhal/STM32L1xx/SPI/halconf.h deleted file mode 100644 index 3e1cafbbf..000000000 --- a/testhal/STM32L1xx/SPI/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/SPI/main.c b/testhal/STM32L1xx/SPI/main.c deleted file mode 100644 index da394e97b..000000000 --- a/testhal/STM32L1xx/SPI/main.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Maximum speed SPI configuration (16MHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig hs_spicfg = { - NULL, - GPIOB, - 12, - 0 -}; - -/* - * Low speed SPI configuration (256kHz, CPHA=0, CPOL=0, MSb first). - */ -static const SPIConfig ls_spicfg = { - NULL, - GPIOB, - 12, - SPI_CR1_BR_2 | SPI_CR1_BR_1 -}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -/* - * SPI bus contender 1. - */ -static WORKING_AREA(spi_thread_1_wa, 256); -static msg_t spi_thread_1(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 1"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palSetPad(GPIOB, GPIOB_LED4); /* LED ON. */ - spiStart(&SPID2, &hs_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * SPI bus contender 2. - */ -static WORKING_AREA(spi_thread_2_wa, 256); -static msg_t spi_thread_2(void *p) { - - (void)p; - chRegSetThreadName("SPI thread 2"); - while (TRUE) { - spiAcquireBus(&SPID2); /* Acquire ownership of the bus. */ - palClearPad(GPIOB, GPIOB_LED4); /* LED OFF. */ - spiStart(&SPID2, &ls_spicfg); /* Setup transfer parameters. */ - spiSelect(&SPID2); /* Slave Select assertion. */ - spiExchange(&SPID2, 512, - txbuf, rxbuf); /* Atomic transfer operations. */ - spiUnselect(&SPID2); /* Slave Select de-assertion. */ - spiReleaseBus(&SPID2); /* Ownership release. */ - } - return 0; -} - -/* - * Application entry point. - */ -int main(void) { - unsigned i; - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * SPI1 I/O pins setup. - */ - palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); /* NSS. */ - palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* SCK. */ - palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5)); /* MISO. */ - palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) | - PAL_STM32_OSPEED_HIGHEST); /* MOSI. */ - palSetPad(GPIOB, 12); - - /* - * Prepare transmit pattern. - */ - for (i = 0; i < sizeof(txbuf); i++) - txbuf[i] = (uint8_t)i; - - /* - * Starting the transmitter and receiver threads. - */ - chThdCreateStatic(spi_thread_1_wa, sizeof(spi_thread_1_wa), - NORMALPRIO + 1, spi_thread_1, NULL); - chThdCreateStatic(spi_thread_2_wa, sizeof(spi_thread_2_wa), - NORMALPRIO + 1, spi_thread_2, NULL); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } - return 0; -} diff --git a/testhal/STM32L1xx/SPI/mcuconf.h b/testhal/STM32L1xx/SPI/mcuconf.h deleted file mode 100644 index a992d3419..000000000 --- a/testhal/STM32L1xx/SPI/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 TRUE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 FALSE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/SPI/readme.txt b/testhal/STM32L1xx/SPI/readme.txt deleted file mode 100644 index 2ce870851..000000000 --- a/testhal/STM32L1xx/SPI/readme.txt +++ /dev/null @@ -1,31 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - SPI driver demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx SPI driver. - -** Board Setup ** - -- Remove the LCD module. -- Connect PB14 and PB15 together for SPI loop-back. - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM32L1xx/UART/.cproject b/testhal/STM32L1xx/UART/.cproject deleted file mode 100644 index dc7b9ec94..000000000 --- a/testhal/STM32L1xx/UART/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/STM32L1xx/UART/.project b/testhal/STM32L1xx/UART/.project deleted file mode 100644 index ac58d7107..000000000 --- a/testhal/STM32L1xx/UART/.project +++ /dev/null @@ -1,38 +0,0 @@ - - - STM32L1xx-UART - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_STM32L_DISCOVERY - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/STM32L1xx/UART/Makefile b/testhal/STM32L1xx/UART/Makefile deleted file mode 100644 index 0d3a8e2b2..000000000 --- a/testhal/STM32L1xx/UART/Makefile +++ /dev/null @@ -1,207 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -include $(CHIBIOS)/boards/ST_STM32L_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/platforms/STM32L1xx/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32L1xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32L152xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m3 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/STM32L1xx/UART/chconf.h b/testhal/STM32L1xx/UART/chconf.h deleted file mode 100644 index 2e6fcc6ee..000000000 --- a/testhal/STM32L1xx/UART/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE TRUE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/UART/halconf.h b/testhal/STM32L1xx/UART/halconf.h deleted file mode 100644 index 520e71b0a..000000000 --- a/testhal/STM32L1xx/UART/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM TRUE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM32L1xx/UART/main.c b/testhal/STM32L1xx/UART/main.c deleted file mode 100644 index 01a8c8cd9..000000000 --- a/testhal/STM32L1xx/UART/main.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -static VirtualTimer vt1, vt2; - -static void restart(void *p) { - - (void)p; - - chSysLockFromIsr(); - uartStartSendI(&UARTD1, 14, "Hello World!\r\n"); - chSysUnlockFromIsr(); -} - -static void ledoff(void *p) { - - (void)p; - palClearPad(GPIOB, GPIOB_LED4); -} - -/* - * This callback is invoked when a transmission buffer has been completely - * read by the driver. - */ -static void txend1(UARTDriver *uartp) { - - (void)uartp; - palSetPad(GPIOB, GPIOB_LED4); -} - -/* - * This callback is invoked when a transmission has physically completed. - */ -static void txend2(UARTDriver *uartp) { - - (void)uartp; - palClearPad(GPIOB, GPIOB_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt1)) - chVTResetI(&vt1); - chVTSetI(&vt1, MS2ST(5000), restart, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked on a receive error, the errors mask is passed - * as parameter. - */ -static void rxerr(UARTDriver *uartp, uartflags_t e) { - - (void)uartp; - (void)e; -} - -/* - * This callback is invoked when a character is received but the application - * was not ready to receive it, the character is passed as parameter. - */ -static void rxchar(UARTDriver *uartp, uint16_t c) { - - (void)uartp; - (void)c; - /* Flashing the LED each time a character is received.*/ - palSetPad(GPIOB, GPIOB_LED4); - chSysLockFromIsr(); - if (chVTIsArmedI(&vt2)) - chVTResetI(&vt2); - chVTSetI(&vt2, MS2ST(200), ledoff, NULL); - chSysUnlockFromIsr(); -} - -/* - * This callback is invoked when a receive buffer has been completely written. - */ -static void rxend(UARTDriver *uartp) { - - (void)uartp; -} - -/* - * UART driver configuration structure. - */ -static UARTConfig uart_cfg_1 = { - txend1, - txend2, - rxend, - rxchar, - rxerr, - 38400, - 0, - USART_CR2_LINEN, - 0 -}; - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * Activates the serial driver 1, PA9 and PA10 are routed to USART1. - */ - uartStart(&UARTD1, &uart_cfg_1); - palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(7)); - palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(7)); - - /* - * Starts the transmission, it will be handled entirely in background. - */ - uartStartSend(&UARTD1, 13, "Starting...\r\n"); - - /* - * Normal main() thread activity, in this demo it does nothing. - */ - while (TRUE) { - chThdSleepMilliseconds(500); - } -} diff --git a/testhal/STM32L1xx/UART/mcuconf.h b/testhal/STM32L1xx/UART/mcuconf.h deleted file mode 100644 index ee338ce96..000000000 --- a/testhal/STM32L1xx/UART/mcuconf.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM32L1xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -#define STM32L1xx_MCUCONF - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED TRUE -#define STM32_HSE_ENABLED FALSE -#define STM32_LSE_ENABLED TRUE -#define STM32_ADC_CLOCK_ENABLED TRUE -#define STM32_USB_CLOCK_ENABLED TRUE -#define STM32_MSIRANGE STM32_MSIRANGE_2M -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSI -#define STM32_PLLMUL_VALUE 6 -#define STM32_PLLDIV_VALUE 3 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV1 -#define STM32_PPRE2 STM32_PPRE2_DIV1 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_MCOPRE STM32_MCOPRE_DIV1 -#define STM32_RTCSEL STM32_RTCSEL_LSE -#define STM32_RTCPRE STM32_RTCPRE_DIV2 -#define STM32_VOS STM32_VOS_1P8 -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_IRQ_PRIORITY 6 -#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 - -/* - * EXT driver system settings. - */ -#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 -#define STM32_EXT_EXTI21_22_IRQ_PRIORITY 6 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() -#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM9 FALSE -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM9_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM9 FALSE -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM9_IRQ_PRIORITY 7 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 TRUE -#define STM32_UART_USE_USART3 TRUE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 TRUE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 diff --git a/testhal/STM32L1xx/UART/readme.txt b/testhal/STM32L1xx/UART/readme.txt deleted file mode 100644 index 5f3edb851..000000000 --- a/testhal/STM32L1xx/UART/readme.txt +++ /dev/null @@ -1,32 +0,0 @@ -***************************************************************************** -** ChibiOS/RT HAL - UART driver demo for STM32L1xx. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an STMicroelectronics STM32L-Discovery board. - -** The Demo ** - -The application demonstrates the use of the STM32L1xx UART driver. - -** Board Setup ** - -- Remove the LCD module. -- Connect an RS232 transceiver to pins PA9(TX) and PA10(RX). -- Connect a terminal emulator to the transceiver (38400-N-8-1). - -** Build Procedure ** - -The demo has been tested using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/testhal/STM8S/SPI/ChibiOS-RT.stw b/testhal/STM8S/SPI/ChibiOS-RT.stw deleted file mode 100644 index a6630271a..000000000 --- a/testhal/STM8S/SPI/ChibiOS-RT.stw +++ /dev/null @@ -1,16 +0,0 @@ -; STMicroelectronics Workspace file - -[Version] -Keyword=ST7Workspace-V0.7 - -[Project0] -Filename=cosmic\cosmic.stp -Dependencies= - -[Project1] -Filename=raisonance\raisonance.stp -Dependencies= -[Options] -ActiveProject=cosmic -ActiveConfig=Release -AddSortedElements=0 diff --git a/testhal/STM8S/SPI/cosmic/cosmic.stp b/testhal/STM8S/SPI/cosmic/cosmic.stp deleted file mode 100644 index f45146b03..000000000 --- a/testhal/STM8S/SPI/cosmic/cosmic.stp +++ /dev/null @@ -1,1947 +0,0 @@ -; STMicroelectronics Project file - -[Version] -Keyword=ST7Project -Number=1.3 - -[Project] -Name=cosmic -Toolset=STM8 Cosmic - -[Config] -0=Config.0 -1=Config.1 - -[Config.0] -ConfigName=Debug -Target=$(ProjectSFile).elf -OutputFolder=Debug -Debug=$(TargetFName) - -[Config.1] -ConfigName=Release -Target=$(ProjectSFile).elf -OutputFolder=Release -Debug=$(TargetFName) - -[Root] -ElemType=Project -PathName=cosmic -Child=Root.Source Files -Config.0=Root.Config.0 -Config.1=Root.Config.1 - -[Root.Config.0] -Settings.0.0=Root.Config.0.Settings.0 -Settings.0.1=Root.Config.0.Settings.1 -Settings.0.2=Root.Config.0.Settings.2 -Settings.0.3=Root.Config.0.Settings.3 -Settings.0.4=Root.Config.0.Settings.4 -Settings.0.5=Root.Config.0.Settings.5 -Settings.0.6=Root.Config.0.Settings.6 -Settings.0.7=Root.Config.0.Settings.7 -Settings.0.8=Root.Config.0.Settings.8 - -[Root.Config.1] -Settings.1.0=Root.Config.1.Settings.0 -Settings.1.1=Root.Config.1.Settings.1 -Settings.1.2=Root.Config.1.Settings.2 -Settings.1.3=Root.Config.1.Settings.3 -Settings.1.4=Root.Config.1.Settings.4 -Settings.1.5=Root.Config.1.Settings.5 -Settings.1.6=Root.Config.1.Settings.6 -Settings.1.7=Root.Config.1.Settings.7 -Settings.1.8=Root.Config.1.Settings.8 - -[Root.Config.0.Settings.0] -String.6.0=2010,6,3,15,59,36 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=STM8 Cosmic -String.102.0=C:\Programmi\COSMIC\CXSTM8_32K -String.103.0= -String.104.0=Hstm8 -String.105.0=Lib -String.106.0=Debug -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.0.Settings.1] -String.6.0=2010,5,25,14,45,56 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\..\..\..\os\kernel\src;..\..\..\..\os\kernel\include;..\..\..\..\os\ports\cosmic\stm8;..\..\..\..\boards\st_stm8s_discovery;..\..\..\..\os\hal\platforms\stm8s;..\..\..\..\os\hal\include;..\..\..\..\os\hal\src;..\..\..\test;..\demo; - -[Root.Config.0.Settings.2] -String.2.0= -String.6.0=2010,5,25,14,45,56 -String.100.0=STM8S105C6 - -[Root.Config.0.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,26,17,30,51 - -[Root.Config.0.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Config.0.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,5,25,14,45,56 -String.8.0= - -[Root.Config.0.Settings.6] -String.2.0=Running Linker -String.3.0=clnk $(ToolsetLibOpts) -o $(OutputPath)$(TargetSName).sm8 -fakeInteger -fakeOutFile$(ProjectSFile).elf -fakeRunConv -fakeStartupcrtsi0.sm8 -fakeSemiAutoGen -fakeVectFilevectors.c -fakeVectAddr0x8000 -customMapFile -customMapFile-m$(OutputPath)$(TargetSName).map -customMapAddress -customCfgFile$(OutputPath)$(TargetSName).lkf -String.3.1=cvdwarf $(OutputPath)$(TargetSName).sm8 -String.4.0=$(OutputPath)$(TargetFName) -String.5.0= -String.6.0=2010,6,4,10,29,4 -String.100.0= -String.101.0=crtsi.st7 -String.102.0=+seg .const -b 0x8080 -m 0x7f80 -n .const -it -String.102.1=+seg .text -a .const -n .text -String.102.2=+seg .eeprom -b 0x4000 -m 0x400 -n .eeprom -String.102.3=+seg .bsct -b 0x0 -m 0x100 -n .bsct -String.102.4=+seg .ubsct -a .bsct -n .ubsct -String.102.5=+seg .bit -a .ubsct -n .bit -id -String.102.6=+seg .share -a .bit -n .share -is -String.102.7=+seg .data -b 0x100 -m 0x700 -n .data -String.102.8=+seg .bss -a .data -n .bss -String.103.0=Code,Constants[0x8080-0xffff]=.const,.text -String.103.1=Eeprom[0x4000-0x43ff]=.eeprom -String.103.2=Zero Page[0x0-0xff]=.bsct,.ubsct,.bit,.share -String.103.3=Ram[0x100-0x7ff]=.data,.bss -String.104.0=0x7ff -String.105.0=libisl0.sm8;libm0.sm8 -Int.0=0 -Int.1=0 - -[Root.Config.0.Settings.7] -String.2.0=Running Post-Build step -String.3.0=chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8 -String.6.0=2010,5,25,14,45,56 - -[Root.Config.0.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,5,25,14,45,56 - -[Root.Config.1.Settings.0] -String.6.0=2010,6,3,15,59,36 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=STM8 Cosmic -String.102.0=C:\Programmi\COSMIC\CXSTM8_32K -String.103.0= -String.104.0=Hstm8 -String.105.0=Lib -String.106.0=Release -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.1.Settings.1] -String.6.0=2010,5,25,14,45,56 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\..\..\..\os\kernel\src;..\..\..\..\os\kernel\include;..\..\..\..\os\ports\cosmic\stm8;..\..\..\..\boards\st_stm8s_discovery;..\..\..\..\os\hal\platforms\stm8s;..\..\..\..\os\hal\include;..\..\..\..\os\hal\src;..\..\..\test;..\demo; - -[Root.Config.1.Settings.2] -String.2.0= -String.6.0=2010,5,25,14,45,56 -String.100.0=STM8S105C6 - -[Root.Config.1.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Config.1.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Config.1.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,5,25,14,45,56 -String.8.0= - -[Root.Config.1.Settings.6] -String.2.0=Running Linker -String.3.0=clnk $(ToolsetLibOpts) -o $(OutputPath)$(TargetSName).sm8 -fakeInteger -fakeOutFile$(ProjectSFile).elf -fakeRunConv -fakeStartupcrtsi0.sm8 -fakeSemiAutoGen -fakeVectFilevectors.c -fakeVectAddr0x8000 -customMapFile -customMapFile-m$(OutputPath)$(TargetSName).map -customMapAddress -customCfgFile$(OutputPath)$(TargetSName).lkf -String.3.1=cvdwarf $(OutputPath)$(TargetSName).sm8 -String.4.0=$(OutputPath)$(TargetFName) -String.5.0= -String.6.0=2010,6,5,11,53,48 -String.100.0= -String.101.0=crtsi.st7 -String.102.0=+seg .const -b 0x8080 -m 0x7f80 -n .const -it -String.102.1=+seg .text -a .const -n .text -String.102.2=+seg .eeprom -b 0x4000 -m 0x400 -n .eeprom -String.102.3=+seg .bsct -b 0x0 -m 0x100 -n .bsct -String.102.4=+seg .ubsct -a .bsct -n .ubsct -String.102.5=+seg .bit -a .ubsct -n .bit -id -String.102.6=+seg .share -a .bit -n .share -is -String.102.7=+seg .data -b 0x100 -m 0x700 -n .data -String.102.8=+seg .bss -a .data -n .bss -String.103.0=Code,Constants[0x8080-0xffff]=.const,.text -String.103.1=Eeprom[0x4000-0x43ff]=.eeprom -String.103.2=Zero Page[0x0-0xff]=.bsct,.ubsct,.bit,.share -String.103.3=Ram[0x100-0x7ff]=.data,.bss -String.104.0=0x7ff -String.105.0=libisl0.sm8;libm0.sm8 -Int.0=0 -Int.1=0 - -[Root.Config.1.Settings.7] -String.2.0=Running Post-Build step -String.3.0=chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8 -String.6.0=2010,5,25,14,45,56 - -[Root.Config.1.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files] -ElemType=Folder -PathName=Source Files -Child=Root.Source Files...\demo\main.c -Next=Root.Include Files -Config.0=Root.Source Files.Config.0 -Config.1=Root.Source Files.Config.1 - -[Root.Source Files.Config.0] -Settings.0.0=Root.Source Files.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Config.0.Settings.3 - -[Root.Source Files.Config.1] -Settings.1.0=Root.Source Files.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Config.1.Settings.3 - -[Root.Source Files.Config.0.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Config.1.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files...\demo\main.c] -ElemType=File -PathName=..\demo\main.c -Next=Root.Source Files.vectors.c - -[Root.Source Files.vectors.c] -ElemType=File -PathName=vectors.c -Next=Root.Source Files.Source Files\board - -[Root.Source Files.Source Files\board] -ElemType=Folder -PathName=Source Files\board -Child=Root.Source Files.Source Files\board...\..\..\..\boards\st_stm8s_discovery\board.c -Next=Root.Source Files.Source Files\os -Config.0=Root.Source Files.Source Files\board.Config.0 -Config.1=Root.Source Files.Source Files\board.Config.1 - -[Root.Source Files.Source Files\board.Config.0] -Settings.0.0=Root.Source Files.Source Files\board.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\board.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\board.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\board.Config.0.Settings.3 - -[Root.Source Files.Source Files\board.Config.1] -Settings.1.0=Root.Source Files.Source Files\board.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\board.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\board.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\board.Config.1.Settings.3 - -[Root.Source Files.Source Files\board.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\board.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\board.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\board.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\board...\..\..\..\boards\st_stm8s_discovery\board.c] -ElemType=File -PathName=..\..\..\..\boards\st_stm8s_discovery\board.c - -[Root.Source Files.Source Files\os] -ElemType=Folder -PathName=Source Files\os -Child=Root.Source Files.Source Files\os.Source Files\os\hal - -[Root.Source Files.Source Files\os.Source Files\os\hal] -ElemType=Folder -PathName=Source Files\os\hal -Child=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel -Config.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\adc.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\can.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\can.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\can.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\hal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\hal.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\hal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mac.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mac.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\mac.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mmc_spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mmc_spi.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\mmc_spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pal.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\pal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pwm.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pwm.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\pwm.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\serial.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\serial.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\serial.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\spi.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s] -ElemType=Folder -PathName=Source Files\os\hal\stm8s -Child=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\spi_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\hal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\pal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel] -ElemType=Folder -PathName=Source Files\os\kernel -Child=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c -Next=Root.Source Files.Source Files\os.Source Files\os\port - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chcond.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chdebug.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdynamic.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdynamic.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chdynamic.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chevents.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chheap.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.0] -String.6.0=2010,6,3,11,20,12 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +mods0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,54,38 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.0] -String.6.0=2010,6,3,11,20,12 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +mods0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chlists.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmboxes.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmemcore.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmempools.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmsg.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmtx.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chqueues.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chregistry.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,16 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chschd.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chsem.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chsys.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chthreads.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chvt.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.0] -String.6.0=2010,6,2,17,48,49 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +mods0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,54,38 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.0] -String.6.0=2010,6,2,17,48,49 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +mods0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\port] -ElemType=Folder -PathName=Source Files\os\port -Child=Root.Source Files.Source Files\os.Source Files\os\port...\..\..\..\os\ports\cosmic\stm8\chcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0] -String.6.0=2010,6,3,14,55,17 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Source Files.Source Files\os.Source Files\os\port...\..\..\..\os\ports\cosmic\stm8\chcore.c] -ElemType=File -PathName=..\..\..\..\os\ports\cosmic\stm8\chcore.c - -[Root.Include Files] -ElemType=Folder -PathName=Include Files -Child=Root.Include Files...\demo\halconf.h -Config.0=Root.Include Files.Config.0 -Config.1=Root.Include Files.Config.1 - -[Root.Include Files.Config.0] -Settings.0.0=Root.Include Files.Config.0.Settings.0 -Settings.0.1=Root.Include Files.Config.0.Settings.1 -Settings.0.2=Root.Include Files.Config.0.Settings.2 -Settings.0.3=Root.Include Files.Config.0.Settings.3 - -[Root.Include Files.Config.1] -Settings.1.0=Root.Include Files.Config.1.Settings.0 -Settings.1.1=Root.Include Files.Config.1.Settings.1 -Settings.1.2=Root.Include Files.Config.1.Settings.2 -Settings.1.3=Root.Include Files.Config.1.Settings.3 - -[Root.Include Files.Config.0.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +warn +modsl0 -customDebCompat -customOpt-no -customC-pp -customLst -l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Include Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -xx -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files.Config.1.Settings.0] -String.6.0=2010,5,25,14,45,56 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=cxstm8 +modsl0 -customC-pp -customLst-l -i..\demo -i..\..\..\test -i..\..\..\..\os\hal\include -i..\..\..\..\os\hal\platforms\stm8s -i..\..\..\..\boards\st_stm8s_discovery -i..\..\..\..\os\ports\cosmic\stm8 -i..\..\..\..\os\kernel\include $(ToolsetIncOpts) -cl$(IntermPath) -co$(IntermPath) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,5,11,53,48 - -[Root.Include Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=castm8 -l $(ToolsetIncOpts) -o$(IntermPath)$(InputName).$(ObjectExt) $(InputFile) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).ls -String.6.0=2010,6,2,8,54,4 - -[Root.Include Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,5,25,14,45,56 - -[Root.Include Files...\demo\halconf.h] -ElemType=File -PathName=..\demo\halconf.h -Next=Root.Include Files...\demo\chconf.h - -[Root.Include Files...\demo\chconf.h] -ElemType=File -PathName=..\demo\chconf.h -Next=Root.Include Files...\demo\mcuconf.h - -[Root.Include Files...\demo\mcuconf.h] -ElemType=File -PathName=..\demo\mcuconf.h -Next=Root.Include Files.Include Files\board - -[Root.Include Files.Include Files\board] -ElemType=Folder -PathName=Include Files\board -Child=Root.Include Files.Include Files\board...\..\..\..\boards\st_stm8s_discovery\board.h -Next=Root.Include Files.Include Files\os - -[Root.Include Files.Include Files\board...\..\..\..\boards\st_stm8s_discovery\board.h] -ElemType=File -PathName=..\..\..\..\boards\st_stm8s_discovery\board.h - -[Root.Include Files.Include Files\os] -ElemType=Folder -PathName=Include Files\os -Child=Root.Include Files.Include Files\os.Include Files\os\hal -Next=Root.Include Files.Include Files\test - -[Root.Include Files.Include Files\os.Include Files\os\hal] -ElemType=Folder -PathName=Include Files\os\hal -Child=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\adc.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\can.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\can.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\can.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\hal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\hal.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\hal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mac.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mac.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mac.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mii.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mii.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mii.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mmc_spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mmc_spi.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mmc_spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pal.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\pal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pwm.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pwm.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\pwm.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\serial.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\serial.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\serial.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\spi.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s] -ElemType=Folder -PathName=Include Files\os\hal\stm8s -Child=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\spi_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\hal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\pal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\serial_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\stm8s.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s_type.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s_type.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\stm8s_type.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel] -ElemType=Folder -PathName=Include Files\os\kernel -Child=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\ch.h -Next=Root.Include Files.Include Files\os.Include Files\os\port - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\ch.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\ch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chcond.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chcond.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chcond.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdebug.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdebug.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chdebug.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdynamic.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdynamic.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chdynamic.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chevents.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chevents.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chevents.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chheap.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chheap.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chheap.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chinline.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chinline.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chinline.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chioch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chioch.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chioch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chlists.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chlists.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chlists.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmboxes.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmboxes.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmboxes.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmemcore.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmemcore.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmemcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmempools.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmempools.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmempools.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmsg.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmsg.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmsg.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmtx.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmtx.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmtx.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chqueues.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chqueues.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chqueues.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chregistry.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chregistry.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chregistry.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chschd.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chschd.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chschd.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsem.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsem.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chsem.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chstreams.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chstreams.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chstreams.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsys.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsys.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chsys.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chthreads.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chthreads.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chthreads.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chvt.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chvt.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chvt.h - -[Root.Include Files.Include Files\os.Include Files\os\port] -ElemType=Folder -PathName=Include Files\os\port -Child=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\cosmic\stm8\chcore.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\cosmic\stm8\chcore.h] -ElemType=File -PathName=..\..\..\..\os\ports\cosmic\stm8\chcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\cosmic\stm8\chtypes.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\cosmic\stm8\chtypes.h] -ElemType=File -PathName=..\..\..\..\os\ports\cosmic\stm8\chtypes.h - -[Root.Include Files.Include Files\test] -ElemType=Folder -PathName=Include Files\test \ No newline at end of file diff --git a/testhal/STM8S/SPI/cosmic/vectors.c b/testhal/STM8S/SPI/cosmic/vectors.c deleted file mode 100644 index b6b57dc1d..000000000 --- a/testhal/STM8S/SPI/cosmic/vectors.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/** - * @brief Exception handler type. - */ -typedef void @far @interrupt (*interrupt_handler_t)(void); - -/* - * Various external symbols. - */ -void _stext(void); -@far @interrupt void vector10(void); -@far @interrupt void vector13(void); -@far @interrupt void vector17(void); -@far @interrupt void vector18(void); -@far @interrupt void vector20(void); -@far @interrupt void vector21(void); - -/** - * @brief Exception vector type. - */ -typedef struct { - uint8_t ev_instruction; - interrupt_handler_t ev_handler; -} exception_vector_t; - -/** - * @brief Undefined interrupt handler. - * @note It should never be invoked. - */ -@far @interrupt static void vector (void) -{ - return; -} - -/** - * @brief Exceptions table. - */ -exception_vector_t const _vectab[] = { - {0x82, (interrupt_handler_t)_stext}, /* reset */ - {0x82, vector}, /* trap */ - {0x82, vector}, /* vector0 */ - {0x82, vector}, /* vector1 */ - {0x82, vector}, /* vector2 */ - {0x82, vector}, /* vector3 */ - {0x82, vector}, /* vector4 */ - {0x82, vector}, /* vector5 */ - {0x82, vector}, /* vector6 */ - {0x82, vector}, /* vector7 */ - {0x82, vector}, /* vector8 */ - {0x82, vector}, /* vector9 */ -#if HAL_USE_SPI && STM8S_SPI_USE_SPI - {0x82, vector10}, -#else - {0x82, vector}, /* vector10 */ -#endif - {0x82, vector}, /* vector11 */ - {0x82, vector}, /* vector12 */ - {0x82, vector13}, /* vector13 */ - {0x82, vector}, /* vector14 */ - {0x82, vector}, /* vector15 */ - {0x82, vector}, /* vector16 */ -#if HAL_USE_SERIAL && STM8S_SERIAL_USE_UART1 - {0x82, vector17}, /* vector17 */ - {0x82, vector18}, /* vector18 */ -#else - {0x82, vector}, /* vector17 */ - {0x82, vector}, /* vector18 */ -#endif - {0x82, vector}, /* vector19 */ -#if HAL_USE_SERIAL && (STM8S_SERIAL_USE_UART2 || STM8S_SERIAL_USE_UART3) - {0x82, vector20}, /* vector20 */ - {0x82, vector21}, /* vector21 */ -#else - {0x82, vector}, /* vector20 */ - {0x82, vector}, /* vector21 */ -#endif - {0x82, vector}, /* vector22 */ - {0x82, vector}, /* vector23 */ - {0x82, vector}, /* vector24 */ - {0x82, vector}, /* vector25 */ - {0x82, vector}, /* vector26 */ - {0x82, vector}, /* vector27 */ - {0x82, vector}, /* vector28 */ - {0x82, vector}, /* vector29 */ -}; diff --git a/testhal/STM8S/SPI/demo/chconf.h b/testhal/STM8S/SPI/demo/chconf.h deleted file mode 100644 index f943ea80c..000000000 --- a/testhal/STM8S/SPI/demo/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/STM8S/SPI/demo/halconf.h b/testhal/STM8S/SPI/demo/halconf.h deleted file mode 100644 index fdc079aef..000000000 --- a/testhal/STM8S/SPI/demo/halconf.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/testhal/STM8S/SPI/demo/main.c b/testhal/STM8S/SPI/demo/main.c deleted file mode 100644 index b1e8b6ed1..000000000 --- a/testhal/STM8S/SPI/demo/main.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * SPI configuration (8MHz, CPHA=0, CPOL=0, MSb first). - */ -static ROMCONST SPIConfig spicfg = { - NULL, - GPIOD, - PD_LD10, - 0 -}; - -/* - * Transmit data. - */ -static ROMCONST uint8_t digits[32] = { - 0x24, 0xAF, 0xE0, 0xA2, 0x2B, 0x32, 0x30, 0xA7, - 0x20, 0x22, 0x21, 0x38, 0x74, 0xA8, 0x70, 0x71, - 0x04, 0x8F, 0xC0, 0x82, 0x0B, 0x12, 0x10, 0x87, - 0x00, 0x02, 0x01, 0x18, 0x54, 0x88, 0x50, 0x51 -}; - -/* - * Receive buffer. - */ -static uint8_t buffer[32]; - -/* - * Application entry point. - */ -void main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - /* - * OS initialization. - */ - chSysInit(); - - /* - * Activates the SPI driver 1 using the driver default configuration. - */ - spiStart(&SPID1, &spicfg); - - /* - * Normal main() thread activity. - */ - while (TRUE) { - volatile uint8_t b; - - chThdSleepMilliseconds(1000); - /* Exchanging data, if the pins MISO and MOSI are connected then the - transmitted data is received back into the buffer. On the - STM8S-Discovery board the pins are CN2-9 and CN2-10.*/ - spiSelect(&SPID1); - spiExchange(&SPID1, sizeof(digits), digits, buffer); - /* Polled transfers test.*/ - b = spiPolledExchange(&SPID1, 0x55); - b = spiPolledExchange(&SPID1, 0xAA); - spiUnselect(&SPID1); - } -} diff --git a/testhal/STM8S/SPI/demo/mcuconf.h b/testhal/STM8S/SPI/demo/mcuconf.h deleted file mode 100644 index c09874c9b..000000000 --- a/testhal/STM8S/SPI/demo/mcuconf.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * STM8 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the driver - * is enabled in halconf.h. - */ - -/* - * HAL general settings. - */ -#define STM8S_NO_CLOCK_INIT FALSE -#define STM8S_HSI_ENABLED FALSE -#define STM8S_LSI_ENABLED TRUE -#define STM8S_HSE_ENABLED TRUE -#define STM8S_SYSCLK_SOURCE CLK_SYSSEL_HSE -#define STM8S_HSI_DIVIDER CLK_HSI_DIV1 -#define STM8S_CPU_DIVIDER CLK_CPU_DIV1 - -/* - * SERIAL driver system settings. - */ -#define STM8S_SERIAL_USE_UART1 FALSE -#define STM8S_SERIAL_USE_UART2 TRUE -#define STM8S_SERIAL_USE_UART3 FALSE - -/* - * SPI driver system settings. - */ -#define STM8S_SPI_USE_SPI TRUE -#define STM8S_SPI_ERROR_HOOK(spip) chSysHalt() diff --git a/testhal/STM8S/SPI/raisonance/raisonance.stp b/testhal/STM8S/SPI/raisonance/raisonance.stp deleted file mode 100644 index d9e65a4e0..000000000 --- a/testhal/STM8S/SPI/raisonance/raisonance.stp +++ /dev/null @@ -1,1963 +0,0 @@ -; STMicroelectronics Project file - -[Version] -Keyword=ST7Project -Number=1.3 - -[Project] -Name=raisonance -Toolset=Raisonance - -[Config] -0=Config.0 -1=Config.1 - -[Config.0] -ConfigName=Debug -Target=$(ProjectSFile).elf -OutputFolder=Debug -Debug=$(TargetFName) - -[Config.1] -ConfigName=Release -Target=$(ProjectSFile).elf -OutputFolder=Release -Debug=$(TargetFName) - -[Root] -ElemType=Project -PathName=raisonance -Child=Root.Source Files -Config.0=Root.Config.0 -Config.1=Root.Config.1 - -[Root.Config.0] -Settings.0.0=Root.Config.0.Settings.0 -Settings.0.1=Root.Config.0.Settings.1 -Settings.0.2=Root.Config.0.Settings.2 -Settings.0.3=Root.Config.0.Settings.3 -Settings.0.4=Root.Config.0.Settings.4 -Settings.0.5=Root.Config.0.Settings.5 -Settings.0.6=Root.Config.0.Settings.6 -Settings.0.7=Root.Config.0.Settings.7 -Settings.0.8=Root.Config.0.Settings.8 - -[Root.Config.1] -Settings.1.0=Root.Config.1.Settings.0 -Settings.1.1=Root.Config.1.Settings.1 -Settings.1.2=Root.Config.1.Settings.2 -Settings.1.3=Root.Config.1.Settings.3 -Settings.1.4=Root.Config.1.Settings.4 -Settings.1.5=Root.Config.1.Settings.5 -Settings.1.6=Root.Config.1.Settings.6 -Settings.1.7=Root.Config.1.Settings.7 -Settings.1.8=Root.Config.1.Settings.8 - -[Root.Config.0.Settings.0] -String.6.0=2010,6,4,10,30,46 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=Raisonance -String.102.0=C:\Programmi\Raisonance\Ride -String.103.0=bin -String.104.0=INC\ST7;INC -String.105.0=LIB\ST7 -String.106.0=Debug -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.0.Settings.1] -String.6.0=2010,6,4,10,10,40 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\demo;..\..\..\..\boards\st_stm8s_discovery;..\..\..\..\os\kernel\src;..\..\..\..\os\kernel\include;..\..\..\..\os\hal\include;..\..\..\..\os\hal\platforms\stm8s;..\..\..\..\os\hal\src;..\..\..\test;..\..\..\..\os\ports\rc\stm8; - -[Root.Config.0.Settings.2] -String.2.0= -String.6.0=2010,6,4,10,10,40 -String.100.0=STM8S105C6 - -[Root.Config.0.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Config.0.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Config.0.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,6,4,10,10,40 -String.8.0= - -[Root.Config.0.Settings.6] -String.2.0=Running Linker -String.3.0=rlstm8 -P $(ObjectFiles) TO($(OutputPath)$(TargetSName).aof) $(ToolsetLibOpts) -CustomOutFile[$(ProjectSFile).elf] DEBUGLINES DEBUGPUBLICS DEBUGSYMBOLS -CustomRunHexConv -customMapFile -customMapFilePR($(OutputPath)$(TargetSName).map) -String.3.1=omf2elf $(OutputPath)$(TargetSName).aof -String.4.0=$(OutputPath)$(TargetFName) -String.5.0=$(OutputPath)$(ProjectSFile).elf $(OutputPath)$(TargetSName).map -String.6.0=2010,6,4,12,15,0 -String.100.0= DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x100) EEPROMSTART(0x4000) EEPROMSIZE(0x400) -String.101.0= -String.102.0= -Int.0=0 -Int.1=0 - -[Root.Config.0.Settings.7] -String.2.0=Running Post-Build step -String.3.0=omf2hex $(OutputPath)$(TargetSName).aof HEX -String.6.0=2010,6,4,10,10,40 - -[Root.Config.0.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,6,4,10,10,40 - -[Root.Config.1.Settings.0] -String.6.0=2010,6,4,11,25,50 -String.100.0=ST Assembler Linker -String.100.1=ST7 Cosmic -String.100.2=STM8 Cosmic -String.100.3=ST7 Metrowerks V1.1 -String.100.4=Raisonance -String.101.0=Raisonance -String.102.0=C:\Programmi\Raisonance\Ride -String.103.0=bin -String.104.0=INC\ST7;INC -String.105.0=LIB\ST7 -String.106.0=Release -String.107.0=$(ProjectSFile).elf -Int.108=0 - -[Root.Config.1.Settings.1] -String.6.0=2010,6,4,10,10,40 -String.100.0=$(TargetFName) -String.101.0= -String.102.0= -String.103.0=.\;..\demo;..\..\..\..\boards\st_stm8s_discovery;..\..\..\..\os\kernel\src;..\..\..\..\os\kernel\include;..\..\..\..\os\hal\include;..\..\..\..\os\hal\platforms\stm8s;..\..\..\..\os\hal\src;..\..\..\test;..\..\..\..\os\ports\rc\stm8; - -[Root.Config.1.Settings.2] -String.2.0= -String.6.0=2010,6,4,10,10,40 -String.100.0=STM8S105C6 - -[Root.Config.1.Settings.3] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Config.1.Settings.4] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Config.1.Settings.5] -String.2.0=Running Pre-Link step -String.6.0=2010,6,4,10,10,40 -String.8.0= - -[Root.Config.1.Settings.6] -String.2.0=Running Linker -String.3.0=rlstm8 -P $(ObjectFiles) TO($(OutputPath)$(TargetSName).aof) $(ToolsetLibOpts) -CustomOutFile[$(ProjectSFile).elf] NODEBUGLINES NODEBUGPUBLICS NODEBUGSYMBOLS -CustomRunHexConv -customMapFile -customMapFilePR($(OutputPath)$(TargetSName).map) -String.3.1=omf2elf $(OutputPath)$(TargetSName).aof -String.4.0=$(OutputPath)$(TargetFName) -String.5.0=$(OutputPath)$(ProjectSFile).elf $(OutputPath)$(TargetSName).map -String.6.0=2010,6,4,12,15,0 -String.100.0= DATASTART(0x0) RAMSIZE(0x800) CODESTART(0x8000) CODESIZE(0x8000) STACKTOP(0x800) STACKSIZE(0x100) EEPROMSTART(0x4000) EEPROMSIZE(0x400) -String.101.0= -String.102.0= -Int.0=0 -Int.1=0 - -[Root.Config.1.Settings.7] -String.2.0=Running Post-Build step -String.3.0=omf2hex $(OutputPath)$(TargetSName).aof HEX -String.6.0=2010,6,4,10,10,40 - -[Root.Config.1.Settings.8] -String.2.0=Performing Custom Build on $(InputFile) -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files] -ElemType=Folder -PathName=Source Files -Child=Root.Source Files...\demo\main.c -Next=Root.Include Files -Config.0=Root.Source Files.Config.0 -Config.1=Root.Source Files.Config.1 - -[Root.Source Files.Config.0] -Settings.0.0=Root.Source Files.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Config.0.Settings.3 - -[Root.Source Files.Config.1] -Settings.1.0=Root.Source Files.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Config.1.Settings.3 - -[Root.Source Files.Config.0.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Config.1.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c] -ElemType=File -PathName=..\demo\main.c -Next=Root.Source Files.Source Files\board -Config.0=Root.Source Files...\demo\main.c.Config.0 -Config.1=Root.Source Files...\demo\main.c.Config.1 - -[Root.Source Files...\demo\main.c.Config.0] -Settings.0.0=Root.Source Files...\demo\main.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files...\demo\main.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files...\demo\main.c.Config.0.Settings.2 - -[Root.Source Files...\demo\main.c.Config.1] -Settings.1.0=Root.Source Files...\demo\main.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files...\demo\main.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files...\demo\main.c.Config.1.Settings.2 - -[Root.Source Files...\demo\main.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,12,31 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files...\demo\main.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,12,31 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files...\demo\main.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files...\demo\main.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\board] -ElemType=Folder -PathName=Source Files\board -Child=Root.Source Files.Source Files\board...\..\..\..\boards\st_stm8s_discovery\board.c -Next=Root.Source Files.Source Files\os -Config.0=Root.Source Files.Source Files\board.Config.0 -Config.1=Root.Source Files.Source Files\board.Config.1 - -[Root.Source Files.Source Files\board.Config.0] -Settings.0.0=Root.Source Files.Source Files\board.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\board.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\board.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\board.Config.0.Settings.3 - -[Root.Source Files.Source Files\board.Config.1] -Settings.1.0=Root.Source Files.Source Files\board.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\board.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\board.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\board.Config.1.Settings.3 - -[Root.Source Files.Source Files\board.Config.0.Settings.0] -String.6.0=2010,6,4,10,11,42 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\board.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\board.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\board.Config.1.Settings.0] -String.6.0=2010,6,4,10,11,42 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\board.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\board.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\board.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\board...\..\..\..\boards\st_stm8s_discovery\board.c] -ElemType=File -PathName=..\..\..\..\boards\st_stm8s_discovery\board.c - -[Root.Source Files.Source Files\os] -ElemType=Folder -PathName=Source Files\os -Child=Root.Source Files.Source Files\os.Source Files\os\hal - -[Root.Source Files.Source Files\os.Source Files\os\hal] -ElemType=Folder -PathName=Source Files\os\hal -Child=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel -Config.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.0] -String.6.0=2010,6,4,10,13,32 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.0] -String.6.0=2010,6,4,10,13,32 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\hal.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\spi.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\serial.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\serial.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\serial.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pwm.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pwm.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\pwm.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\pal.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\pal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mmc_spi.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mmc_spi.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\mmc_spi.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mac.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\mac.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\mac.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\hal.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\hal.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\hal.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\can.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\can.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\can.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\adc.c - -[Root.Source Files.Source Files\os.Source Files\os\hal...\..\..\..\os\hal\src\adc.c] -ElemType=File -PathName=..\..\..\..\os\hal\src\adc.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s] -ElemType=Folder -PathName=Source Files\os\hal\stm8s -Child=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\spi_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\pal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\hal_lld.c -Next=Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\hal.Source Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.c] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\serial_lld.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel] -ElemType=Folder -PathName=Source Files\os\kernel -Child=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c -Next=Root.Source Files.Source Files\os.Source Files\os\port - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chvt.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(page0) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chvt.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(page0) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chthreads.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,31 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chthreads.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chsys.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsys.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chsem.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chsem.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chschd.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,30 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chschd.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chregistry.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chregistry.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chqueues.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,29 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chqueues.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmtx.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmtx.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmsg.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmsg.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmempools.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmempools.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmemcore.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,28 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmemcore.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chmboxes.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chmboxes.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chlists.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chlists.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chheap.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(page0) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chheap.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(page0) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chevents.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdynamic.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chevents.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdynamic.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chdynamic.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chdebug.c -Next=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chdebug.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c] -ElemType=File -PathName=..\..\..\..\os\kernel\src\chcond.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.2 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.0.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 -String.8.0=Debug - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.0] -String.6.0=2010,6,4,10,14,27 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.1] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\kernel...\..\..\..\os\kernel\src\chcond.c.Config.1.Settings.2] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 -String.8.0=Release - -[Root.Source Files.Source Files\os.Source Files\os\port] -ElemType=Folder -PathName=Source Files\os\port -Child=Root.Source Files.Source Files\os.Source Files\os\port...\..\..\..\os\ports\rc\stm8\chcore.c -Config.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0 -Config.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0] -Settings.0.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0 -Settings.0.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1 -Settings.0.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2 -Settings.0.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1] -Settings.1.0=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0 -Settings.1.1=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1 -Settings.1.2=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2 -Settings.1.3=Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.0] -String.6.0=2010,6,4,10,13,43 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.0] -String.6.0=2010,6,4,10,13,43 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Source Files.Source Files\os.Source Files\os\port.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Source Files.Source Files\os.Source Files\os\port...\..\..\..\os\ports\rc\stm8\chcore.c] -ElemType=File -PathName=..\..\..\..\os\ports\rc\stm8\chcore.c - -[Root.Include Files] -ElemType=Folder -PathName=Include Files -Child=Root.Include Files...\demo\halconf.h -Config.0=Root.Include Files.Config.0 -Config.1=Root.Include Files.Config.1 - -[Root.Include Files.Config.0] -Settings.0.0=Root.Include Files.Config.0.Settings.0 -Settings.0.1=Root.Include Files.Config.0.Settings.1 -Settings.0.2=Root.Include Files.Config.0.Settings.2 -Settings.0.3=Root.Include Files.Config.0.Settings.3 - -[Root.Include Files.Config.1] -Settings.1.0=Root.Include Files.Config.1.Settings.0 -Settings.1.1=Root.Include Files.Config.1.Settings.1 -Settings.1.2=Root.Include Files.Config.1.Settings.2 -Settings.1.3=Root.Include Files.Config.1.Settings.3 - -[Root.Include Files.Config.0.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Debug -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.0.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DEBUG DGC(data) AUTO -customDebugOpt -CustomOptimOT(0) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB LAOB PIN(..\..\..\test) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\..\..\..\os\ports\RC\stm8) PIN(..\..\..\..\os\kernel\include) PIN(..\demo) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,42,15 - -[Root.Include Files.Config.0.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET DEBUG NOPR ERRORPRINT MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,46,5 - -[Root.Include Files.Config.0.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Include Files.Config.1.Settings.0] -String.6.0=2010,6,4,10,10,40 -String.8.0=Release -Int.0=0 -Int.1=0 - -[Root.Include Files.Config.1.Settings.1] -String.2.0=Compiling $(InputFile)... -String.3.0=rcstm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) WRV(0) STM8(SMALL) DGC(data) AUTO -customSpeedOpt -CustomOptimOT(7,SPEED) -CustomBasicLstPR($(IntermPath)$(InputName).lst) CD CO SB NOIS CD CO SB LAOB PIN(..\..\..\..\boards\st_stm8s_discovery) PIN(..\demo) PIN(..\..\..\..\os\kernel\include) PIN(..\..\..\..\os\hal\include) PIN(..\..\..\..\os\hal\platforms\stm8s) PIN(..\..\..\test) PIN(..\..\..\..\os\ports\rc\stm8) -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Include Files.Config.1.Settings.2] -String.2.0=Assembling $(InputFile)... -String.3.0=mastm8 $(InputFile) OBJECT($(IntermPath)$(InputName).$(ObjectExt)) $(ToolsetIncOpts) QUIET NOPR ERRORPRINT NOCOND NOLIST NOLISTINCLUDE NOGEN NOSB NOXREF MODESTM8 -String.4.0=$(IntermPath)$(InputName).$(ObjectExt) -String.5.0=$(IntermPath)$(InputName).lst -String.6.0=2010,6,26,17,22,23 - -[Root.Include Files.Config.1.Settings.3] -String.2.0=Performing Custom Build on $(InputFile) -String.3.0= -String.4.0= -String.5.0= -String.6.0=2010,6,4,10,10,40 - -[Root.Include Files...\demo\halconf.h] -ElemType=File -PathName=..\demo\halconf.h -Next=Root.Include Files...\demo\chconf.h - -[Root.Include Files...\demo\chconf.h] -ElemType=File -PathName=..\demo\chconf.h -Next=Root.Include Files...\demo\mcuconf.h - -[Root.Include Files...\demo\mcuconf.h] -ElemType=File -PathName=..\demo\mcuconf.h -Next=Root.Include Files.Include Files\board - -[Root.Include Files.Include Files\board] -ElemType=Folder -PathName=Include Files\board -Child=Root.Include Files.Include Files\board...\..\..\..\boards\st_stm8s_discovery\board.h -Next=Root.Include Files.Include Files\os - -[Root.Include Files.Include Files\board...\..\..\..\boards\st_stm8s_discovery\board.h] -ElemType=File -PathName=..\..\..\..\boards\st_stm8s_discovery\board.h - -[Root.Include Files.Include Files\os] -ElemType=Folder -PathName=Include Files\os -Child=Root.Include Files.Include Files\os.Include Files\os\hal - -[Root.Include Files.Include Files\os.Include Files\os\hal] -ElemType=Folder -PathName=Include Files\os\hal -Child=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\spi.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\serial.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\serial.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\serial.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pwm.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pwm.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\pwm.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\pal.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\pal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mmc_spi.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mmc_spi.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mmc_spi.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mii.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mii.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mii.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mac.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\mac.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\mac.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\hal.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\hal.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\hal.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\can.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\can.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\can.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\adc.h - -[Root.Include Files.Include Files\os.Include Files\os\hal...\..\..\..\os\hal\include\adc.h] -ElemType=File -PathName=..\..\..\..\os\hal\include\adc.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s] -ElemType=Folder -PathName=Include Files\os\hal\stm8s -Child=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\spi_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\spi_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s_type.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s_type.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\stm8s_type.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\stm8s.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\stm8s.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\serial_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\serial_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\pal_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\pal_lld.h -Next=Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\hal.Include Files\os\hal\stm8s...\..\..\..\os\hal\platforms\stm8s\hal_lld.h] -ElemType=File -PathName=..\..\..\..\os\hal\platforms\stm8s\hal_lld.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel] -ElemType=Folder -PathName=Include Files\os\kernel -Child=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chvt.h -Next=Root.Include Files.Include Files\os.Include Files\os\port - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chvt.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chvt.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chthreads.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chthreads.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chthreads.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsys.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsys.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chsys.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chstreams.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chstreams.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chstreams.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsem.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chsem.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chsem.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chschd.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chschd.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chschd.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chregistry.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chregistry.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chregistry.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chqueues.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chqueues.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chqueues.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmtx.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmtx.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmtx.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmsg.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmsg.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmsg.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmempools.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmempools.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmempools.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmemcore.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmemcore.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmemcore.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmboxes.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chmboxes.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chmboxes.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chlists.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chlists.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chlists.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chioch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chioch.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chioch.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chinline.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chinline.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chinline.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chheap.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chheap.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chheap.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chevents.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chevents.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chevents.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdynamic.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdynamic.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chdynamic.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdebug.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chdebug.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chdebug.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chcond.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\chcond.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\chcond.h -Next=Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\ch.h - -[Root.Include Files.Include Files\os.Include Files\os\kernel...\..\..\..\os\kernel\include\ch.h] -ElemType=File -PathName=..\..\..\..\os\kernel\include\ch.h - -[Root.Include Files.Include Files\os.Include Files\os\port] -ElemType=Folder -PathName=Include Files\os\port -Child=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\rc\stm8\chtypes.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\rc\stm8\chtypes.h] -ElemType=File -PathName=..\..\..\..\os\ports\rc\stm8\chtypes.h -Next=Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\rc\stm8\chcore.h - -[Root.Include Files.Include Files\os.Include Files\os\port...\..\..\..\os\ports\rc\stm8\chcore.h] -ElemType=File -PathName=..\..\..\..\os\ports\rc\stm8\chcore.h \ No newline at end of file diff --git a/testhal/common/testbuild/.cproject b/testhal/common/testbuild/.cproject deleted file mode 100644 index 1ce473e74..000000000 --- a/testhal/common/testbuild/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testhal/common/testbuild/.project b/testhal/common/testbuild/.project deleted file mode 100644 index 2fd707444..000000000 --- a/testhal/common/testbuild/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - HAL-BUILD_TEST - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - os - 2 - CHIBIOS/os - - - diff --git a/testhal/common/testbuild/Makefile b/testhal/common/testbuild/Makefile deleted file mode 100644 index 280c5f3e3..000000000 --- a/testhal/common/testbuild/Makefile +++ /dev/null @@ -1,221 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4. -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# Enable this if you really want to use the STM FWLib. -ifeq ($(USE_FWLIB),) - USE_FWLIB = no -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = ch - -# Imported source files and paths -CHIBIOS = ../../.. -#include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk -include $(CHIBIOS)/os/hal/templates/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -#include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/STM32F407xG.ld -#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - main.c - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -LD = $(TRGT)gcc -#LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -ifeq ($(USE_FPU),yes) - USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant - DDEFS += -DCORTEX_USE_FPU=TRUE -else - DDEFS += -DCORTEX_USE_FPU=FALSE -endif - -ifeq ($(USE_FWLIB),yes) - include $(CHIBIOS)/ext/stm32lib/stm32lib.mk - CSRC += $(STM32SRC) - INCDIR += $(STM32INC) - USE_OPT += -DUSE_STDPERIPH_DRIVER -endif - -include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/testhal/common/testbuild/board.h b/testhal/common/testbuild/board.h deleted file mode 100644 index 328950186..000000000 --- a/testhal/common/testbuild/board.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for a generic board. - */ - -/* - * Board identifier. - */ -#define BOARD_GENERIC -#define BOARD_NAME "Generic Board" - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/testhal/common/testbuild/chconf.h b/testhal/common/testbuild/chconf.h deleted file mode 100644 index 9ba7b1772..000000000 --- a/testhal/common/testbuild/chconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 20 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0x20000 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/testhal/common/testbuild/main.c b/testhal/common/testbuild/main.c deleted file mode 100644 index e295c1e84..000000000 --- a/testhal/common/testbuild/main.c +++ /dev/null @@ -1,29 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" - -/* - * Simulator main. - */ -int main(int argc, char *argv[]) { - - (void)argc; - (void)argv; - - return 0; -} diff --git a/todo.txt b/todo.txt deleted file mode 100644 index 2af67c22f..000000000 --- a/todo.txt +++ /dev/null @@ -1,91 +0,0 @@ -Status: -- = Planned. -X = In progress, some work done. -* = Done. -? = Not sure if worth the effort or useful at all. -N = Decided against. - -Version 2.5.2 -* STM32 CAN2 support. -* Support for ATSAM4L devices. -* Improve support for STM32F3xx devices. -* Update C++ wrapper. -* Support for STM32F37x devices. -X Restructure and improve documentation. -X Improve support for SPC560BC devices. -X Improve support for SPC560P devices. -X Improve support for SPC563M devices. -X Improve support for SPC56EL devices. -- Support for SPC564A devices. -- Support for SPC560D devices. -- Support for STM32L1xx MD and HD devices. -- Support for STM32F427 and STM32F437 devices. -- Support for STM32F429 and STM32F439 devices. - -Within 2.5.x: -X File System infrastructure. - X FatFs wrapper. -- Recursive mutexes. -X Revision of the RTCv2 driver implementation. -X Streaming DAC/I2S driver model and STM32 implementation. -- Specific I2C driver for STM32F0 and newer devices. -- Unified LPC1xxx HAL. - - LPC11xx and LPC13xx HALs merged in the unified one. - - LPC17xx support. -- NUC140 support. -- Create a null device driver implementing a stream interface. -- Add USARTs support to the STM32 SPI driver. -- Add option to use another counter instead of the systick counter into the - trace buffer. -- Add a chSysIntegrityCheck() API to the kernel. -- Add guard pages as extra stack checking mechanism. Guard pages should be - of the same type of the stack alignment type. -- Add a CH_THREAD macro for threads declaration in order to hide - compiler-specific optimizations for thread functions. All demos will have - to be updated. -- Runtime errors manager in HAL. -- Critical errors manager in HAL (to replace or complement assertions). -- Add ADC3 support to the STM32F1xx ADC driver. -? Add the RTC service inside the kernel and port, remove from HAL. - -Within 2.x.x -- Software I2C implementation using a GPT instance for timings. -- Static memory allocation hook macros in kernel code. -X Implement the "transmission end" serial driver event on those platforms - supporting the feature, so far only done in STM32 driver. -- Test suite overhaul, the API should be more generic in order to be used - with different subsystems and not just the kernel. -- Reduce number of demos globally, add demos to a repository or on web site. - Required in order to reduce support effort. -- New device driver models: Clock, Systick, WDG. -- Add UART4 support to the STM32 UART driver (CL line only, HD has a nasty - shared interrupt). -- Shared DMA channels support in the STM8L HAL. -- Device drivers for STM8/STM8L (ADC, PWM, bring them on par with STM32). -- Device drivers for LPC1xxx (ADC, PWM, bring them on par with STM32). -- Implement USB Mass Storage Class support. -- Batch testing of the ARM7/ARMCMx port using OpenOCD, with reports. -X Transactional flash file system implementation. -- Serial over UART complex driver driver, evaluate from the performance - results if to make obsolete the current dedicated Serial driver. -- Official segmented interrupts support and abstraction in CMx port. -- MAC driver revision in order to support copy-less operations, this will - require changes to lwIP or a new TCP/IP stack however. -- Threads Pools manager in the library. -- Dedicated TCP/IP stack. -? Evaluate if change thread functions to return void is worthwhile. -? Add a *very simple* ADC API for single one shot sampling (implement it as - an injected conversion on the STM32). -? Add a switch to enable/disable the priority inheritance algorithm in mutexes. -? ISO7816 driver over UART driver, both reader and card side. -? Merge the Coldfire branch in mainline (hardware missing). -? Merge the H8S branch in mainline (hardware missing). - -Ideas for 3.x.x: -- MMU/MPU support. -- High resolution timers and tickless kernel. -- Multicore support. - -Side projects: -X ChibiOS Wizard, UML modeling and ChibiOS applications code and - documentation generator. diff --git a/tools/gencfg/.externalToolBuilders/FMPP Builder (Linux).launch b/tools/gencfg/.externalToolBuilders/FMPP Builder (Linux).launch deleted file mode 100644 index 0a4fc898b..000000000 --- a/tools/gencfg/.externalToolBuilders/FMPP Builder (Linux).launch +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tools/gencfg/.externalToolBuilders/FMPP Builder (Windows).launch b/tools/gencfg/.externalToolBuilders/FMPP Builder (Windows).launch deleted file mode 100644 index abf46ff08..000000000 --- a/tools/gencfg/.externalToolBuilders/FMPP Builder (Windows).launch +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tools/gencfg/.project b/tools/gencfg/.project deleted file mode 100644 index 9872c4eef..000000000 --- a/tools/gencfg/.project +++ /dev/null @@ -1,39 +0,0 @@ - - - _Configuration Tool - - - - - - org.eclipse.ui.externaltools.ExternalToolBuilder - full,incremental, - - - LaunchConfigHandle - <project>/.externalToolBuilders/FMPP Builder (Windows).launch - - - incclean - true - - - - - org.eclipse.ui.externaltools.ExternalToolBuilder - full,incremental, - - - LaunchConfigHandle - <project>/.externalToolBuilders/FMPP Builder (Linux).launch - - - incclean - true - - - - - - - diff --git a/tools/gencfg/config.fmpp b/tools/gencfg/config.fmpp deleted file mode 100644 index 0f34b0a03..000000000 --- a/tools/gencfg/config.fmpp +++ /dev/null @@ -1,10 +0,0 @@ -# Change the next line to point to the processor you want to use. Processors -# are identified by a file named "config.fmpp" under the "processors" root -# directory. -inheritConfiguration: processors/boards/stm32f4xx/config.fmpp - -# Settings common to all processors. Do not change the following lines. -freemarkerLinks: { - lib: ./lib -} -logFile: ./log.fmpp diff --git a/tools/gencfg/fmpp.sh b/tools/gencfg/fmpp.sh deleted file mode 100644 index b98398702..000000000 --- a/tools/gencfg/fmpp.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -JAVA_HOME=/usr/lib/jvm/java-6-sun -export JAVA_HOME -PATH=$PATH:$JAVA_HOME/bin -export PATH -fmpp -C config.fmpp - diff --git a/tools/gencfg/lib/libcode.ftl b/tools/gencfg/lib/libcode.ftl deleted file mode 100644 index 45b94a320..000000000 --- a/tools/gencfg/lib/libcode.ftl +++ /dev/null @@ -1,316 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] - -<#-- - -- Coding style global settings. - --> -[#assign indentation = " " /] -[#assign fields_align = 24 /] -[#assign define_value_align = 36 /] -[#assign comments_align = 48 /] -[#assign boundary = 80 /] - -[#-- - -- This macro generates a brief description in DoxyGen format. - --] -[#macro EmitDoxygenBrief object=[]] - [#if object.brief[0]??] -[@utils.FormatStringAsText " * @brief " - " * " - utils.WithDot(object.brief[0]?cap_first) - boundary /] - [/#if] -[/#macro] - -[#-- - -- This macro generates a detailed description in DoxyGen format. - --] -[#macro EmitDoxygenDetails object=[]] - [#if object.details[0]??] -[@utils.FormatStringAsText " * @details " - " * " - utils.WithDot(object.details[0]?cap_first) - boundary /] - [/#if] -[/#macro] - -[#-- - -- This macro generates a notes list in DoxyGen format. - --] -[#macro EmitDoxygenNotes object=[]] - [#list object.* as note] - [#if note?node_name == "note"] - [@utils.FormatStringAsText " * @note " - " * " - utils.WithDot(note[0]?cap_first) - boundary /] - [/#if] - [/#list] -[/#macro] - -[#-- - -- This macro generates a pre-requisites list in DoxyGen format. - --] -[#macro EmitDoxygenPrerequisites object=[]] - [#list object.* as pre] - [#if pre?node_name == "pre"] - [@utils.FormatStringAsText " * @pre " - " * " - utils.WithDot(pre[0]?cap_first) - boundary /] - [/#if] - [/#list] -[/#macro] - -[#-- - -- This macro generates a post-requisites list in DoxyGen format. - --] -[#macro EmitDoxygenPostrequisites object=[]] - [#list object.* as post] - [#if post?node_name == "post"] - [@utils.FormatStringAsText " * @post " - " * " - utils.WithDot(post[0]?cap_first) - boundary /] - [/#if] - [/#list] -[/#macro] - -[#-- - -- This macro generates a complete Doxygen documentation comment. - --] -[#macro EmitDoxygenDocumentationComment object=[]] -/** - [@code.EmitDoxygenBrief object /] - [@code.EmitDoxygenDetails object /] - [@code.EmitDoxygenPrerequisites object /] - [@code.EmitDoxygenPostrequisites object /] - [@code.EmitDoxygenNotes object /] - */ -[/#macro] - -[#-- - -- This macro generates the parameters description in DoxyGen format. - --] -[#macro EmitDoxygenParams params=[]] - [#list params as param] - [#local name = (param.@name[0]!"no-name")?trim /] - [#local brief = (param.@brief[0]!"")?trim /] - [#local dir = (param.@dir[0]!"boh")?trim?lower_case /] - [#if dir == "in"] -[@utils.FormatStringAsText " * @param[in] " - " * " - utils.IntelligentDot(name + " " + brief?uncap_first) - boundary /] - [#elseif dir == "out"] -[@utils.FormatStringAsText " * @param[out] " - " * " - utils.IntelligentDot(name + " " + brief?uncap_first) - boundary /] - [#elseif dir == "both"] -[@utils.FormatStringAsText " * @param[in,out] " - " * " - utils.IntelligentDot(name + " " + brief?uncap_first) - boundary /] - [#elseif dir == "boh"] -[@utils.FormatStringAsText " * @param " - " * " - utils.IntelligentDot(name + " " + brief?uncap_first) - boundary /] - [/#if] - [/#list] -[/#macro] - -[#-- - -- This macro generates a return description followed by a retval list - -- in DoxyGen format. - --] -[#macro EmitDoxygenReturn return=[]] - [#if return[0]?? && ((return[0].@type[0]!"void")?trim != "void")] - [#local brief = (return[0].@brief[0]!"")?trim /] - [#if brief != ""] -[@utils.FormatStringAsText " * @return " - " * " - utils.WithDot(brief?cap_first) - boundary /] - [/#if] - [#list return[0].value as value] - [#local label = (value.@name[0]!"no-val")?trim /] - [#local brief = (value.@brief[0]!"")?trim /] -[@utils.FormatStringAsText " * @retval " - " * " - utils.WithDot(label + " " + brief?uncap_first) - boundary /] - [/#list] - [/#if] -[/#macro] - -[#-- - -- This macro generates the inner function code (if present). - --] -[#macro EmitCode code=[]] - [#if function.code[0]?? && (function.code[0]?trim != "")] -${indentation}${function.code[0]?trim} - [/#if] -[/#macro] - -[#-- - -- Returns true if the module exports some functions. - --] -[#function HasPublicFunctions module=[]] - [#local flag = false /] - [#list module.function as function] - [#if (function.@visibility[0]!"private") == "public"] - [#local flag = true /] - [/#if] - [/#list] - [#return flag /] -[/#function] - -[#-- - -- Returns true if the module has static functions. - --] -[#function HasPrivateFunctions module=[]] - [#local flag = false /] - [#list module.function as function] - [#if (function.@visibility[0]!"private") == "private"] - [#local flag = true /] - [/#if] - [/#list] - [#return flag /] -[/#function] - -[#-- - -- This macro generates a function prototype from an XML "function" - -- node passed as parameter. - -- @note Does not generate the final EOL. - --] -[#macro GeneratePrototype function={}] - [#if function.return?? && function.return[0]??] - [#local rettype = (function.return[0].@type[0]!"void")?trim /] - [#else] - [#local rettype = "void" /] - [/#if] - [#local name = (function.@name[0]!"no-name")?trim /] - [#local visibility = (function.@visibility[0]!"private")?trim /] - [#if function.param?? && function.param[0]??] - [#-- If the function has parameters then generates the parameters list --] - [#local l1 = rettype + " " + name + "(" /] - [#if visibility == "private"] - [#local l1 = "static " + l1 /] - [/#if] - [#local ln = ""?right_pad(l1?length) /] - [#list function.param as param] - [#local type = (param.@type[0]!"no-type")?trim /] - [#if type?contains("$")] - [#local pstring = type?replace("$", (param.@name[0]!"no-name")?trim) /] - [#else] - [#local pstring = type + " " + (param.@name[0]!"no-name")?trim /] - [/#if] - [#local dir = (param.@dir[0]!"boh")?trim?lower_case /] - [#if dir == "in"] - [#local pstring = "const " + pstring /] - [/#if] - [#if param_index == 0] - [#local line = l1 + pstring /] - [#else] - [#if (line + ", " + pstring + " ")?length > boundary] -${line + ","} - [#local line = ln + pstring /] - [#else] - [#local line = line + ", " + pstring /] - [/#if] - [/#if] - [/#list] -${line + ")"}[#rt] - [#else] -${rettype + " " + name}(void)[#rt] - [/#if] -[/#macro] - -[#-- - -- This macro generates a function (and its Doxygen documentation) - -- from an XML "function" node passed as parameter. - --] -[#macro GenerateFunction function={}] -/** -[@EmitDoxygenBrief function.@brief /] -[@EmitDoxygenDetails function.details /] -[@EmitDoxygenParams function.param /] -[@EmitDoxygenReturn function.return /] - * - * @note --Implementer notes here (or remove the tag)-- - * @bug --Known problems please here (or remove the tag)-- - * @todo --Implement this function (then remove the tag)-- - */ -[@GeneratePrototype function /] { - [#if function.code[0]??] - [#-- Makes sure to undef the do_code macro --] - [#assign inline = "[#ftl][#macro do_code function][/#macro]"?interpret /] -[@inline /] - [#-- Interprets the code within the code element --] - [#assign inline = function.code[0]?interpret /] -[@inline /] -[@do_code function /] - [#else] - -${indentation}/* ${function.@name[0]!"no-name"}() Implementation here! */ - [/#if] -} -[/#macro] - -[#-- - -- Generates the implementations for the private functions in the specified - -- module. - --] -[#macro GeneratePrivateFunctionsImplementations module] - [#list module.function as function] - [#if (function.@visibility[0]!"private") == "private"] -[@code.GenerateFunction function /] - - [/#if] - [/#list] -[/#macro] - -[#-- - -- Generates the prototypes of the public functions in the specified - -- module. - --] -[#macro GeneratePublicFunctionsPrototypes indentation module] - [#list module.function as function] - [#if (function.@visibility[0]!"private")?trim == "public"] -${indentation}[@code.GeneratePrototype function /]; - [/#if] - [/#list] -[/#macro] - -[#-- - -- Generates the implementations for the public functions in the specified - -- module. - --] -[#macro GeneratePublicFunctionsImplementations module] - [#list module.function as function] - [#if (function.@visibility[0]!"private") == "public"] -[@code.GenerateFunction function /] - - [/#if] - [/#list] -[/#macro] diff --git a/tools/gencfg/lib/liblicense.ftl b/tools/gencfg/lib/liblicense.ftl deleted file mode 100644 index 18581ee29..000000000 --- a/tools/gencfg/lib/liblicense.ftl +++ /dev/null @@ -1,58 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] - -[#-- - -- Emits the ChibiOS/RT standard license exception text. - -- The license exception text is indented by 4 spaces. - --] -[#macro EmitLicenseExceptionAsText] - - --- - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes ChibiOS/RT, without being obliged to provide - the source code for any proprietary components. See the file exception.txt - for full details of how and when the exception can be applied. -[/#macro] - -[#-- - -- Emits the ChibiOS/RT standard license text. - -- The license text is indented by 4 spaces. - --] -[#macro EmitLicenseAsText] - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -[/#macro] diff --git a/tools/gencfg/lib/libstm32f4xx.ftl b/tools/gencfg/lib/libstm32f4xx.ftl deleted file mode 100644 index 81b8f987c..000000000 --- a/tools/gencfg/lib/libstm32f4xx.ftl +++ /dev/null @@ -1,144 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] - -[#-- - -- Emits the STM32F4xx ADC driver constant configuration structures. - --] -[#macro EmitADCConfig config] - [#local cfg_name = config.name[0]?string /] - [@code.EmitDoxygenDocumentationComment config /] -const ADCConfig ${cfg_name} = {0}; - - [#list config.groups.group as group] - [#local grpcfg_name = group.name[0]?string /] - [@code.EmitDoxygenDocumentationComment group /] -const ADCGroupConfig ${grpcfg_name} = { - /* Circular conversion flag.*/ - ${group.circular[0]?string?upper_case}, - /* Number of channels sampled in the conversion group.*/ - ${group.channels_sequence.channel?size}, - /* End of conversion callback or NULL.*/ - [#if group.conv_callback[0]?string?trim == ""] - NULL, - [#else] - ${group.conv_callback[0]?string?trim}, - [/#if] - /* Error callback or NULL.*/ - [#if group.error_callback[0]?string?trim == ""] - NULL, - [#else] - ${group.error_callback[0]?string?trim}, - [/#if] - /* CR1 register initialization value.*/ - [#local resolution = group.resolution[0]?word_list[0]?number /] - [#local cr1 = "ADC_CR1_RESOLUTION_N(" + resolution?string + ")" /] - [#local disc = group.discontinuous[0]?word_list[0]?number /] - [#if disc > 0] - [#local cr1 = cr1 + " | ADC_CR1_DISCEN" /] - [#local cr1 = cr1 + " | ADC_CR1_DISCNUM_N(" + (disc - 1)?string + ")" /] - [/#if] - ${cr1}, - /* CR2 register initialization value.*/ - [#local exten = group.trigger_mode[0]?word_list[0]?number /] - [#local cr2 = "ADC_CR1_EXTEN_N(" + exten?string + ")" /] - [#local extsel = group.trigger_source[0]?word_list[0]?number /] - [#local cr2 = cr2 + " | ADC_CR1_EXSEL_N(" + extsel?string + ")" /] - [#if group.alignment[0]?word_list[0]?number != 0] - [#local cr2 = cr2 + " | ADC_CR2_ALIGN" /] - [/#if] - ${cr2}, - /* Channels sample time settings.*/ - [#local smpr1 = "" /] - [#local smpr2 = "" /] - [#list group.sample_time.* as input] - [#local sinput = input?node_name] - [#if input_index < 9] - [#local smpr2 = smpr2 + "ADC_SMPR2_SMP_" + input?node_name + - "(" + input?string + ") | " /] - [#elseif input_index == 9] - [#local smpr2 = smpr2 + "ADC_SMPR2_SMP_" + input?node_name + - "(" + input?string + ")," /] - [#elseif input_index < 18] - [#local smpr1 = smpr1 + "ADC_SMPR1_SMP_" + input?node_name + - "(" + input?string + ") | " /] - [#else] - [#local smpr1 = smpr1 + "ADC_SMPR1_SMP_" + input?node_name + - "(" + input?string + ")," /] - [/#if] - [/#list] - [@utils.FormatStringAsText " " " " smpr1 80 /] - [@utils.FormatStringAsText " " " " smpr2 80 /] - /* Channels sequence.*/ - [#local sqr1 = "ADC_SQR1_NUM_CH(" + group.channels_sequence?size + ")" /] - [#local sqr2 = "" /] - [#local sqr3 = "" /] - [#list group.channels_sequence.channel as channel] - [#if channel_index <= 5] - [#local sqr3 = sqr3 + "ADC_SQR3_SQ" + (channel_index + 1) + - "_N(" + channel + ")" /] - [#if channel_has_next && channel_index < 5] - [#local sqr3 = sqr3 + " | " /] - [/#if] - [#elseif channel_index <= 11] - [#local sqr2 = sqr2 + "ADC_SQR2_SQ" + (channel_index + 1) + - "_N(" + channel + ")" /] - [#if channel_has_next && channel_index < 11] - [#local sqr2 = sqr2 + " | " /] - [/#if] - [#else] - [#local sqr1 = sqr1 + " | ADC_SQR2_SQ" + (channel_index + 1) + - "_N(" + channel + ")" /] - [/#if] - [/#list] - [#-- SQR2 could be empty.--] - [#if sqr2 == ""] - [#local sqr2 = "0" /] - [/#if] - [#local sqr1 = sqr1 + "," /] - [#local sqr2 = sqr2 + "," /] - [@utils.FormatStringAsText " " " " sqr1 80 /] - [@utils.FormatStringAsText " " " " sqr2 80 /] - [@utils.FormatStringAsText " " " " sqr3 80 /] -}; - [/#list] -[/#macro] - -[#-- - -- Emits the STM32F4xx ADC driver configuration external declarations. - --] -[#macro EmitADCConfigExtern config] - [#local cfg_name = config.name[0]?string /] - [#list config.groups.group as group] - [#local grpcfg_name = group.name[0]?string /] - [#-- Only emits the comment if there is at least a callback defined.--] - /* ADC configuration "${cfg_name}".*/ - extern const ADCConfig ${cfg_name}; - /* ADC conversion group "${grpcfg_name}".*/ - extern const ADCGroupConfig ${grpcfg_name}; - [#if group.conv_callback[0]?string?trim != ""] - void ${group.conv_callback[0]?string?trim}(ADCDriver *, adcsample_t *, size_t); - [/#if] - [#if group.error_callback[0]?string?trim != ""] - void ${group.error_callback[0]?string?trim}(ADCDriver *, adcerror_t); - [/#if] - - [/#list] -[/#macro] diff --git a/tools/gencfg/lib/libutils.ftl b/tools/gencfg/lib/libutils.ftl deleted file mode 100644 index 03b0622a3..000000000 --- a/tools/gencfg/lib/libutils.ftl +++ /dev/null @@ -1,109 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] - -[#-- - -- Returns the trimmed text "s" making sure it is terminated by a dot. - -- The empty string is always returned as an empty string, the dot is not - -- added. - --] -[#function WithDot s] - [#local s = s?trim /] - [#if s == ""] - [#return s /] - [/#if] - [#if s?ends_with(".")] - [#return s /] - [/#if] - [#return s + "." /] -[/#function] - -[#-- - -- Returns the trimmed text "s" making sure it is not terminated by a dot. - --] -[#function WithoutDot s] - [#local s = s?trim /] - [#if s?ends_with(".")] - [#return s?substring(0, s?length - 2) /] - [/#if] - [#return s /] -[/#function] - -[#-- - -- Returns the trimmed text "s" making sure it is terminated by a dot if the - -- text is composed of multiple phrases, if the text is composed of a single - -- phrase then makes sure it is *not* terminated by a dot. - -- A phrase is recognized by the pattern ". " into the text. - -- The empty string is always returned as an empty string, the dot is never - -- added. - --] -[#function IntelligentDot s] - [#local s = s?trim /] - [#if s?contains(". ")] - [#return WithDot(s) /] - [/#if] - [#return WithoutDot(s) /] -[/#function] - -[#-- - -- Formats a text string in a sequence of strings no longer than "len" (first - -- line) or "lenn" (subsequent lines). - -- White spaces are normalized between words, sequences of white spaces become - -- a single space. - --] -[#function StringToText len1 lenn s] - [#local words=s?word_list /] - [#local line="" /] - [#local lines=[] /] - [#list words as word] - [#if lines?size == 0] - [#local len = len1 /] - [#else] - [#local len = lenn /] - [/#if] - [#if (line?length + word?length + 1 > len)] - [#local lines = lines + [line?trim] /] - [#local line = word + " " /] - [#else] - [#local line = line + word + " " /] - [/#if] - [/#list] - [#if line != ""] - [#local lines = lines + [line?trim] /] - [/#if] - [#return lines /] -[/#function] - -[#-- - -- Emits a string "s" as a formatted text, the first line is prefixed by the - -- "p1" parameter, subsequent lines are prefixed by the "pn" paramenter. - -- Emitted lines are no longer than the "len" parameter. - -- White spaces are normalized between words. - --] -[#macro FormatStringAsText p1 pn s len] - [#local lines = StringToText(len - p1?length, len - pn?length, s) /] - [#list lines as line] - [#if line_index == 0] -${p1}${line} - [#else] -${pn}${line} - [/#if] - [/#list] -[/#macro] diff --git a/tools/gencfg/processors/boards/stm32f4xx/config.fmpp b/tools/gencfg/processors/boards/stm32f4xx/config.fmpp deleted file mode 100644 index 970d936ca..000000000 --- a/tools/gencfg/processors/boards/stm32f4xx/config.fmpp +++ /dev/null @@ -1,5 +0,0 @@ -sourceRoot: templates -outputRoot: output -data: { - doc1: xml(../input/stm32f4board.xml) -} diff --git a/tools/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl b/tools/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl deleted file mode 100644 index f38fd106a..000000000 --- a/tools/gencfg/processors/boards/stm32f4xx/templates/board.c.ftl +++ /dev/null @@ -1,139 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[@pp.changeOutputFile name="board.c" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#include "ch.h" -#include "hal.h" - -#if HAL_USE_PAL || defined(__DOXYGEN__) -/** - * @brief PAL setup. - * @details Digital I/O ports static configuration as defined in @p board.h. - * This variable is used by the HAL when initializing the PAL driver. - */ -const PALConfig pal_default_config = -{ - {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, - VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, - {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, - VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, - {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, - VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, - {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, - VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, - {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, - VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, - {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, - VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, - {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, - VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, - {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, - VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, - {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, - VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} -}; -#endif - -/** - * @brief Early initialization code. - * @details This initialization must be performed just after stack setup - * and before any other initialization. - */ -void __early_init(void) { - - stm32_clock_init(); -[#if doc1.board.board_functions.__early_init[0]??] - ${doc1.board.board_functions.__early_init[0]} -[/#if] -} - -#if HAL_USE_SDC || defined(__DOXYGEN__) -/** - * @brief SDC card detection. - */ -bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) { -[#if doc1.board.board_functions.sdc_lld_is_card_inserted[0]??] -${doc1.board.board_functions.sdc_lld_is_card_inserted[0]} -[#else] - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return TRUE; -[/#if] -} - -/** - * @brief SDC card write protection detection. - */ -bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) { -[#if doc1.board.board_functions.sdc_lld_is_write_protected[0]??] -${doc1.board.board_functions.sdc_lld_is_write_protected[0]} -[#else] - - (void)sdcp; - /* TODO: Fill the implementation.*/ - return FALSE; -[/#if] -} -#endif /* HAL_USE_SDC */ - -#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) -/** - * @brief MMC_SPI card detection. - */ -bool_t mmc_lld_is_card_inserted(MMCDriver *mmcp) { -[#if doc1.board.board_functions.mmc_lld_is_card_inserted[0]??] -${doc1.board.board_functions.mmc_lld_is_card_inserted[0]} -[#else] - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return TRUE; -[/#if] -} - -/** - * @brief MMC_SPI card write protection detection. - */ -bool_t mmc_lld_is_write_protected(MMCDriver *mmcp) { -[#if doc1.board.board_functions.mmc_lld_is_write_protected[0]??] -${doc1.board.board_functions.mmc_lld_is_write_protected[0]} -[#else] - - (void)mmcp; - /* TODO: Fill the implementation.*/ - return FALSE; -[/#if] -} -#endif - -/** - * @brief Board-specific initialization code. - * @todo Add your board-specific code, if any. - */ -void boardInit(void) { -} diff --git a/tools/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl b/tools/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl deleted file mode 100644 index c24c0a355..000000000 --- a/tools/gencfg/processors/boards/stm32f4xx/templates/board.h.ftl +++ /dev/null @@ -1,327 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[@pp.changeOutputFile name="board.h" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#ifndef _BOARD_H_ -#define _BOARD_H_ - -/* - * Setup for ${doc1.board.board_name[0]} board. - */ - -/* - * Board identifier. - */ -#define BOARD_${doc1.board.board_id[0]} -#define BOARD_NAME "${doc1.board.board_name[0]}" - -[#if doc1.board.ethernet_phy[0]??] -/* - * Ethernet PHY type. - */ -#define BOARD_PHY_ID ${doc1.board.ethernet_phy.identifier[0]} -[#if doc1.board.ethernet_phy.bus_type[0]?string == "RMII"] -#define BOARD_PHY_RMII -[/#if] -[/#if] - -/* - * Board oscillators-related settings. -[#if doc1.board.clocks.@LSEFrequency[0]?number == 0] - * NOTE: LSE not fitted. -[/#if] -[#if doc1.board.clocks.@HSEFrequency[0]?number == 0] - * NOTE: HSE not fitted. -[/#if] - */ -#if !defined(STM32_LSECLK) -#define STM32_LSECLK ${doc1.board.clocks.@LSEFrequency[0]} -#endif - -#if !defined(STM32_HSECLK) -#define STM32_HSECLK ${doc1.board.clocks.@HSEFrequency[0]} -#endif - -[#if doc1.board.clocks.@HSEBypass[0]?string == "true"] -#define STM32_HSE_BYPASS -[/#if] - -/* - * Board voltages. - * Required for performance limits calculation. - */ -#define STM32_VDD ${doc1.board.clocks.@VDD[0]} - -/* - * MCU type as defined in the ST header file stm32f4xx.h. - */ -#define STM32F4XX - -/* - * IO pins assignments. - */ -[#list doc1.board.ports.* as port] - [#assign port_name = port?node_name?upper_case /] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] -#define ${(port_name + "_" + name)?right_pad(27, " ")} ${pin_index?string} - [/#list] - -[/#list] -/* - * I/O ports initial setup, this configuration is established soon after reset - * in the initialization code. - * Please refer to the STM32 Reference Manual for details. - */ -#define PIN_MODE_INPUT(n) (0U << ((n) * 2)) -#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2)) -#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2)) -#define PIN_MODE_ANALOG(n) (3U << ((n) * 2)) -#define PIN_ODR_LOW(n) (0U << (n)) -#define PIN_ODR_HIGH(n) (1U << (n)) -#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) -#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) -#define PIN_OSPEED_2M(n) (0U << ((n) * 2)) -#define PIN_OSPEED_25M(n) (1U << ((n) * 2)) -#define PIN_OSPEED_50M(n) (2U << ((n) * 2)) -#define PIN_OSPEED_100M(n) (3U << ((n) * 2)) -#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2)) -#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2)) -#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2)) -#define PIN_AFIO_AF(n, v) ((v##U) << ((n % 8) * 4)) - -[#list doc1.board.ports.* as port] - [#assign port_name = port?node_name?upper_case /] -/* - * ${port_name} setup: - * - [#-- Generating pin descriptions inside the comment.--] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign mode = pin.@Mode[0] /] - [#assign type = pin.@Type[0] /] - [#assign resistor = pin.@Resistor[0] /] - [#assign speed = pin.@Speed[0] /] - [#assign alternate = pin.@Alternate[0] /] - [#if mode == "Input"] - [#assign desc = mode + " " + resistor /] - [#elseif mode == "Output"] - [#assign desc = mode + " " + type + " " + speed /] - [#elseif mode == "Alternate"] - [#assign desc = mode + " " + alternate /] - [#else] - [#assign desc = "Analog" /] - [/#if] - * P${(port?node_name[4..] + pin_index?string)?right_pad(3, " ")} - ${name?right_pad(26, " ")}(${desc?lower_case}). - [/#list] - */ - [#-- - -- Generating MODER register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign mode = pin.@Mode[0] /] - [#if mode == "Input"] - [#assign out = "PIN_MODE_INPUT(" + port_name + "_" + name + ")" /] - [#elseif mode == "Output"] - [#assign out = "PIN_MODE_OUTPUT(" + port_name + "_" + name + ")" /] - [#elseif mode == "Alternate"] - [#assign out = "PIN_MODE_ALTERNATE(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_MODE_ANALOG(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_MODER (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating OTYPER register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign type = pin.@Type[0] /] - [#if type == "PushPull"] - [#assign out = "PIN_OTYPE_PUSHPULL(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_OTYPE_OPENDRAIN(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_OTYPER (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating SPEEDR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign speed = pin.@Speed[0] /] - [#if speed == "Minimum"] - [#assign out = "PIN_OSPEED_2M(" + port_name + "_" + name + ")" /] - [#elseif speed == "Low"] - [#assign out = "PIN_OSPEED_25M(" + port_name + "_" + name + ")" /] - [#elseif speed == "High"] - [#assign out = "PIN_OSPEED_50M(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_OSPEED_100M(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_OSPEEDR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating PUPDR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign resistor = pin.@Resistor[0] /] - [#if resistor == "Floating"] - [#assign out = "PIN_PUPDR_FLOATING(" + port_name + "_" + name + ")" /] - [#elseif resistor == "PullUp"] - [#assign out = "PIN_PUPDR_PULLUP(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_PUPDR_PULLDOWN(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_PUPDR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating ODR register value. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign level = pin.@Level[0] /] - [#if level == "Low"] - [#assign out = "PIN_ODR_LOW(" + port_name + "_" + name + ")" /] - [#else] - [#assign out = "PIN_ODR_HIGH(" + port_name + "_" + name + ")" /] - [/#if] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_ODR (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if pin_index < 15] -${(line + " |")?right_pad(76, " ") + "\\"} - [#else] -${line + ")"} - [/#if] - [/#list] - [#-- - -- Generating AFRx registers values. - --] - [#list port.* as pin] - [#assign pin_name = pin?node_name?upper_case /] - [#assign name = pin.@ID[0]?string?trim /] - [#if name?length == 0] - [#assign name = pin_name /] - [/#if] - [#assign alternate = pin.@Alternate[0]?trim /] - [#assign out = "PIN_AFIO_AF(" + port_name + "_" + name + ", " + alternate + ")" /] - [#if pin_index == 0] - [#assign line = "#define VAL_" + port_name + "_AFRL (" + out /] - [#elseif pin_index == 8] - [#assign line = "#define VAL_" + port_name + "_AFRH (" + out /] - [#else] - [#assign line = " " + out /] - [/#if] - [#if (pin_index == 7) || (pin_index == 15)] -${line + ")"} - [#else] -${(line + " |")?right_pad(76, " ") + "\\"} - [/#if] - [/#list] - -[/#list] - -#if !defined(_FROM_ASM_) -#ifdef __cplusplus -extern "C" { -#endif - void boardInit(void); -#ifdef __cplusplus -} -#endif -#endif /* _FROM_ASM_ */ - -#endif /* _BOARD_H_ */ diff --git a/tools/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl b/tools/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl deleted file mode 100644 index c88471ac3..000000000 --- a/tools/gencfg/processors/boards/stm32f4xx/templates/board.mk.ftl +++ /dev/null @@ -1,28 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[@pp.changeOutputFile name="board.mk" /] -# List of all the board related files. -BOARDSRC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]}/board.c - -# Required include directories -BOARDINC = ${'$'}{CHIBIOS}/boards/${doc1.board.board_id[0]} diff --git a/tools/gencfg/processors/hal/stm32f4xx/config.fmpp b/tools/gencfg/processors/hal/stm32f4xx/config.fmpp deleted file mode 100644 index 307a6f61c..000000000 --- a/tools/gencfg/processors/hal/stm32f4xx/config.fmpp +++ /dev/null @@ -1,5 +0,0 @@ -sourceRoot: templates -outputRoot: output -data: { - doc1: xml(../input/stm32f4xx_cfg.xml) -} diff --git a/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.c.ftl b/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.c.ftl deleted file mode 100644 index eeea09d99..000000000 --- a/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.c.ftl +++ /dev/null @@ -1,66 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[#import "/@lib/libcode.ftl" as code /] -[#import "/@lib/libstm32f4xx.ftl" as stm32f4xx /] -[#assign fname = doc1.configuration.name[0] /] -[@pp.changeOutputFile name = fname + ".c" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#include "ch.h" -#include "hal.h" - -#include "${fname + ".h"}" - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -[#list doc1.configuration.configs.* as config] - [#assign config_type = config?node_name /] - [#if config_type == "adc_config"] - [@stm32f4xx.EmitADCConfig config /] - [/#if] - -[/#list] -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module interrupt handlers. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ diff --git a/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.h.ftl b/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.h.ftl deleted file mode 100644 index 47ea70f7c..000000000 --- a/tools/gencfg/processors/hal/stm32f4xx/templates/hal_cfg.h.ftl +++ /dev/null @@ -1,72 +0,0 @@ -[#ftl] -[#-- - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - --] -[@pp.dropOutputFile /] -[#import "/@lib/libutils.ftl" as utils /] -[#import "/@lib/liblicense.ftl" as license /] -[#import "/@lib/libcode.ftl" as code /] -[#import "/@lib/libstm32f4xx.ftl" as stm32f4xx /] -[#assign fname = doc1.configuration.name[0] /] -[@pp.changeOutputFile name = fname + ".h" /] -/* -[@license.EmitLicenseAsText /] -*/ - -#ifndef _${fname?upper_case}_H_ -#define _${fname?upper_case}_H_ - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif -[#list doc1.configuration.configs.* as config] - [#assign config_type = config?node_name /] - [#if config_type == "adc_config"] - [@stm32f4xx.EmitADCConfigExtern config /] - [/#if] -[/#list] -#ifdef __cplusplus -} -#endif - -#endif /* _${fname?upper_case}_H_ */ diff --git a/tools/gencfg/processors/processors.xml b/tools/gencfg/processors/processors.xml deleted file mode 100644 index cac95cc23..000000000 --- a/tools/gencfg/processors/processors.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - STM32F4xx Board Configuration - resources/gencfg/processors/boards/stm32f4xx/templates - resources/gencfg/xml/stm32f4board.xml - board - - - STM32F0xx Board Configuration - resources/gencfg/processors/boards/stm32f0xx/templates - resources/gencfg/xml/stm32f0board.xml - board - - diff --git a/tools/gencfg/readme.txt b/tools/gencfg/readme.txt deleted file mode 100644 index 5b2b58ba4..000000000 --- a/tools/gencfg/readme.txt +++ /dev/null @@ -1,14 +0,0 @@ -***************************************************************************** -*** Files Organization *** -***************************************************************************** - ---{root} - Configuration Generator tool. - +--readme.txt - This file. - +--config.fmpp - Tool configuration file, tool setup is done here. - +--run.bat - Tool runner batch file. - +--lib/ - FTL library files. - +--processors/ - Various configuration generators. - +--schema/ - Schema files used to validate XML configurations. - +--xml/ - Templates of configuration files. - -Write requirements and setup documentation here. diff --git a/tools/gencfg/run.bat b/tools/gencfg/run.bat deleted file mode 100644 index 460783f39..000000000 --- a/tools/gencfg/run.bat +++ /dev/null @@ -1 +0,0 @@ -fmpp -C config.fmpp diff --git a/tools/gencfg/schema/boards/abstract_board.xsd b/tools/gencfg/schema/boards/abstract_board.xsd deleted file mode 100644 index c4c953240..000000000 --- a/tools/gencfg/schema/boards/abstract_board.xsd +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/gencfg/schema/boards/stm32f4xx_board.xsd b/tools/gencfg/schema/boards/stm32f4xx_board.xsd deleted file mode 100644 index ace3b5acb..000000000 --- a/tools/gencfg/schema/boards/stm32f4xx_board.xsd +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/gencfg/schema/common/doc.xsd b/tools/gencfg/schema/common/doc.xsd deleted file mode 100644 index e5be361d5..000000000 --- a/tools/gencfg/schema/common/doc.xsd +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - >Generic item with optional name and brief - description - - - - - - Name of the object. - - - - - - - - - - - - - - - - >Something that can have a detailed description - attached - - - - - - - - - Brief description of the object. - - - - - - - - - - - - - - Object documentation as text, does not preserve - formatting. - - - - - - - - - - - - Object pre-requisites as text, does not preserve - formatting. - - - - - - - - - - - - Object post-requisites as text, does not preserve - formatting. - - - - - - - - - - - - Object note as text, does not preserve formatting. - - - - - - - - - - - - - - diff --git a/tools/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd b/tools/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd deleted file mode 100644 index c3ac59487..000000000 --- a/tools/gencfg/schema/common/stm32/stm32_gpiov2_port.xsd +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Object representing an STM32 pin for the GPIOv2 - peripheral. - - - - - Pin identifier, used to generate a #define with the - pin name. - - - - - - - - - - - - - - - - Pin mode, as defined for MODER register. - - - - - - - - - - - - - - Logic level for the ODR register. - - - - - - - - - - - - Pin speed as defined in SPEEDR register. - - - - - - - - - - - - - - - Pin type as defined in TYPER register. - - - - - - - - - - - - - Pin pull-up/down resistor as defined in PUDR register. - - - - - - - - - - - - - - Pin alternate function number, only valid if - "Alternate" is selected - in the Mode attribute. - - - - - - - - - - - - diff --git a/tools/gencfg/schema/hal/abstract_adc_cfg.xsd b/tools/gencfg/schema/hal/abstract_adc_cfg.xsd deleted file mode 100644 index 52a6c9096..000000000 --- a/tools/gencfg/schema/hal/abstract_adc_cfg.xsd +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/gencfg/schema/hal/abstract_cfg.xsd b/tools/gencfg/schema/hal/abstract_cfg.xsd deleted file mode 100644 index 72491eea9..000000000 --- a/tools/gencfg/schema/hal/abstract_cfg.xsd +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/gencfg/schema/hal/abstract_driver_cfg.xsd b/tools/gencfg/schema/hal/abstract_driver_cfg.xsd deleted file mode 100644 index d6501ff2a..000000000 --- a/tools/gencfg/schema/hal/abstract_driver_cfg.xsd +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_adc_cfg.xsd b/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_adc_cfg.xsd deleted file mode 100644 index 331933109..000000000 --- a/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_adc_cfg.xsd +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd b/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd deleted file mode 100644 index f846403f3..000000000 --- a/tools/gencfg/schema/hal/stm32f4xx/stm32f4xx_cfg.xsd +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/gencfg/xml/stm32f0board.xml b/tools/gencfg/xml/stm32f0board.xml deleted file mode 100644 index 64420371f..000000000 --- a/tools/gencfg/xml/stm32f0board.xml +++ /dev/null @@ -1,665 +0,0 @@ - - - - -----human readable board name----- - BOARD_IDENTIFIER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/gencfg/xml/stm32f4board.xml b/tools/gencfg/xml/stm32f4board.xml deleted file mode 100644 index 0c6b42106..000000000 --- a/tools/gencfg/xml/stm32f4board.xml +++ /dev/null @@ -1,1190 +0,0 @@ - - - - -----human readable board name----- - BOARD_IDENTIFIER - - - MII_KS8721_ID - RMII - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/gencfg/xml/stm32f4xx_cfg.xml b/tools/gencfg/xml/stm32f4xx_cfg.xml deleted file mode 100644 index 896cc2614..000000000 --- a/tools/gencfg/xml/stm32f4xx_cfg.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - hal_configs - Application HAL-related settings. - - - adccfg1 - Example ADC configuration. - - - adcgrpcfg1 - Example ADC conversion group configuration. - true - conv_callback - error_callback - 0 Samples are Right Aligned - 0 12 bits - 0 Software - 0 Timer 1 CC1 event - 2 Two discontinous conversions - - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - ADC_SAMPLE_3 - - - ADC_CHANNEL_IN0 - ADC_CHANNEL_IN8 - - - - - -

    Zq7L`v}Nh0crCJ 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