From 9f97b3404b6eea46643978f79284074db5d7e6e3 Mon Sep 17 00:00:00 2001 From: wuyangyong Date: Mon, 5 Apr 2010 13:33:12 +0000 Subject: [PATCH] remove stm32_radio.see /branches/rtt_0_3_1/bsp/stm32_radio git-svn-id: https://rt-thread.googlecode.com/svn/trunk@578 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- .../CMSIS/CM3/CoreSupport/core_cm3.c | 784 -- .../CMSIS/CM3/CoreSupport/core_cm3.h | 1818 ---- .../ST/Release_Notes_for_STM32F10x_CMSIS.html | 204 - .../startup/arm/startup_stm32f10x_cl.s | 368 - .../startup/arm/startup_stm32f10x_hd.s | 358 - .../startup/arm/startup_stm32f10x_ld.s | 297 - .../startup/arm/startup_stm32f10x_ld_vl.s | 304 - .../startup/arm/startup_stm32f10x_md.s | 307 - .../startup/arm/startup_stm32f10x_md_vl.s | 315 - .../startup/gcc_ride7/startup_stm32f10x_cl.s | 467 - .../startup/gcc_ride7/startup_stm32f10x_hd.s | 464 - .../startup/gcc_ride7/startup_stm32f10x_ld.s | 342 - .../gcc_ride7/startup_stm32f10x_ld_vl.s | 382 - .../startup/gcc_ride7/startup_stm32f10x_md.s | 357 - .../gcc_ride7/startup_stm32f10x_md_vl.s | 395 - .../startup/iar/startup_stm32f10x_cl.s | 507 -- .../startup/iar/startup_stm32f10x_hd.s | 496 - .../startup/iar/startup_stm32f10x_ld.s | 366 - .../startup/iar/startup_stm32f10x_ld_vl.s | 369 - .../startup/iar/startup_stm32f10x_md.s | 391 - .../startup/iar/startup_stm32f10x_md_vl.s | 394 - .../DeviceSupport/ST/STM32F10x/stm32f10x.h | 8112 ----------------- .../ST/STM32F10x/system_stm32f10x.c | 1020 --- .../ST/STM32F10x/system_stm32f10x.h | 97 - .../Libraries/CMSIS/CMSIS debug support.htm | 243 - .../Libraries/CMSIS/CMSIS_changes.htm | 320 - .../CMSIS/Documentation/CMSIS_Core.htm | 1337 --- bsp/stm32_radio/Libraries/CMSIS/License.doc | Bin 39936 -> 0 bytes .../Libraries/Mass_Storage/inc/fsmc_nand.h | 99 - .../Libraries/Mass_Storage/inc/hw_config.h | 49 - .../Libraries/Mass_Storage/inc/mass_mal.h | 35 - .../Libraries/Mass_Storage/inc/memory.h | 33 - .../Libraries/Mass_Storage/inc/nand_if.h | 67 - .../Mass_Storage/inc/platform_config.h | 37 - .../Mass_Storage/inc/stm32f10x_conf.h | 72 - .../Libraries/Mass_Storage/inc/usb_bot.h | 87 - .../Libraries/Mass_Storage/inc/usb_conf.h | 132 - .../Libraries/Mass_Storage/inc/usb_desc.h | 49 - .../Libraries/Mass_Storage/inc/usb_istr.h | 121 - .../Libraries/Mass_Storage/inc/usb_prop.h | 58 - .../Libraries/Mass_Storage/inc/usb_pwr.h | 58 - .../Libraries/Mass_Storage/inc/usb_scsi.h | 140 - .../Libraries/Mass_Storage/src/fsmc_nand.c | 490 - .../Libraries/Mass_Storage/src/hw_config.c | 260 - .../Libraries/Mass_Storage/src/mass_mal.c | 119 - .../Libraries/Mass_Storage/src/memory.c | 168 - .../Libraries/Mass_Storage/src/nand_if.c | 544 -- .../Libraries/Mass_Storage/src/scsi_data.c | 164 - .../Libraries/Mass_Storage/src/usb_bot.c | 335 - .../Libraries/Mass_Storage/src/usb_desc.c | 161 - .../Libraries/Mass_Storage/src/usb_endp.c | 55 - .../Libraries/Mass_Storage/src/usb_istr.c | 174 - .../Libraries/Mass_Storage/src/usb_main.c | 116 - .../Libraries/Mass_Storage/src/usb_prop.c | 392 - .../Libraries/Mass_Storage/src/usb_pwr.c | 224 - .../Libraries/Mass_Storage/src/usb_scsi.c | 438 - ..._Notes_for_STM32F10x_StdPeriph_Driver.html | 179 - .../STM32F10x_StdPeriph_Driver/inc/misc.h | 219 - .../inc/stm32f10x_adc.h | 479 - .../inc/stm32f10x_bkp.h | 194 - .../inc/stm32f10x_can.h | 535 -- .../inc/stm32f10x_cec.h | 209 - .../inc/stm32f10x_crc.h | 93 - .../inc/stm32f10x_dac.h | 316 - .../inc/stm32f10x_dbgmcu.h | 112 - .../inc/stm32f10x_dma.h | 437 - .../inc/stm32f10x_exti.h | 183 - .../inc/stm32f10x_flash.h | 346 - .../inc/stm32f10x_fsmc.h | 716 -- .../inc/stm32f10x_gpio.h | 369 - .../inc/stm32f10x_i2c.h | 472 - .../inc/stm32f10x_iwdg.h | 139 - .../inc/stm32f10x_pwr.h | 155 - .../inc/stm32f10x_rcc.h | 720 -- .../inc/stm32f10x_rtc.h | 134 - .../inc/stm32f10x_sdio.h | 530 -- .../inc/stm32f10x_spi.h | 490 - .../inc/stm32f10x_tim.h | 1067 --- .../inc/stm32f10x_usart.h | 411 - .../inc/stm32f10x_wwdg.h | 114 - .../STM32F10x_StdPeriph_Driver/src/misc.c | 223 - .../src/stm32f10x_adc.c | 1306 --- .../src/stm32f10x_bkp.c | 311 - .../src/stm32f10x_can.c | 990 -- .../src/stm32f10x_cec.c | 432 - .../src/stm32f10x_crc.c | 163 - .../src/stm32f10x_dac.c | 579 -- .../src/stm32f10x_dbgmcu.c | 155 - .../src/stm32f10x_dma.c | 693 -- .../src/stm32f10x_exti.c | 268 - .../src/stm32f10x_flash.c | 869 -- .../src/stm32f10x_fsmc.c | 858 -- .../src/stm32f10x_gpio.c | 636 -- .../src/stm32f10x_i2c.c | 1162 --- .../src/stm32f10x_iwdg.c | 189 - .../src/stm32f10x_pwr.c | 316 - .../src/stm32f10x_rcc.c | 1473 --- .../src/stm32f10x_rtc.c | 341 - .../src/stm32f10x_sdio.c | 798 -- .../src/stm32f10x_spi.c | 907 -- .../src/stm32f10x_tim.c | 2832 ------ .../src/stm32f10x_usart.c | 1054 --- .../src/stm32f10x_wwdg.c | 223 - .../inc/otgd_fs_cal.h | 259 - .../inc/otgd_fs_dev.h | 121 - .../inc/otgd_fs_int.h | 54 - .../inc/otgd_fs_pcd.h | 87 - .../inc/otgd_fs_regs.h | 1597 ---- .../STM32_USB-FS-Device_Driver/inc/usb_core.h | 243 - .../STM32_USB-FS-Device_Driver/inc/usb_def.h | 80 - .../STM32_USB-FS-Device_Driver/inc/usb_init.h | 49 - .../STM32_USB-FS-Device_Driver/inc/usb_int.h | 33 - .../STM32_USB-FS-Device_Driver/inc/usb_lib.h | 50 - .../STM32_USB-FS-Device_Driver/inc/usb_mem.h | 32 - .../STM32_USB-FS-Device_Driver/inc/usb_regs.h | 671 -- .../STM32_USB-FS-Device_Driver/inc/usb_sil.h | 34 - .../STM32_USB-FS-Device_Driver/inc/usb_type.h | 74 - .../src/otgd_fs_cal.c | 1273 --- .../src/otgd_fs_dev.c | 385 - .../src/otgd_fs_int.c | 876 -- .../src/otgd_fs_pcd.c | 445 - .../STM32_USB-FS-Device_Driver/src/usb_core.c | 1088 --- .../STM32_USB-FS-Device_Driver/src/usb_init.c | 63 - .../STM32_USB-FS-Device_Driver/src/usb_int.c | 188 - .../STM32_USB-FS-Device_Driver/src/usb_mem.c | 75 - .../STM32_USB-FS-Device_Driver/src/usb_regs.c | 750 -- .../STM32_USB-FS-Device_Driver/src/usb_sil.c | 126 - bsp/stm32_radio/application.c | 130 - bsp/stm32_radio/board.c | 293 - bsp/stm32_radio/board.h | 76 - bsp/stm32_radio/codec.c | 657 -- bsp/stm32_radio/codec.h | 645 -- bsp/stm32_radio/device_info.c | 239 - bsp/stm32_radio/dm9000.c | 677 -- bsp/stm32_radio/dm9000.h | 151 - bsp/stm32_radio/fmt0371/fmt0371.c | 209 - bsp/stm32_radio/fmt0371/fmt0371.h | 45 - bsp/stm32_radio/fsmc_nand.c | 467 - bsp/stm32_radio/fsmc_nand.h | 106 - bsp/stm32_radio/fsmc_sram.c | 74 - bsp/stm32_radio/http.c | 671 -- bsp/stm32_radio/http.h | 39 - bsp/stm32_radio/ili9325/ili9325.c | 508 -- bsp/stm32_radio/ili9325/ili9325.h | 23 - bsp/stm32_radio/info.c | 91 - bsp/stm32_radio/key.c | 139 - bsp/stm32_radio/lcd.c | 463 - bsp/stm32_radio/lcd.h | 20 - bsp/stm32_radio/libwma/SOURCES | 3 - bsp/stm32_radio/libwma/asf.h | 24 - bsp/stm32_radio/libwma/asm_arm.h | 39 - bsp/stm32_radio/libwma/bswap.h | 150 - bsp/stm32_radio/libwma/codeclib.h | 79 - bsp/stm32_radio/libwma/ffmpeg_config.h | 23 - bsp/stm32_radio/libwma/libwma.make | 18 - bsp/stm32_radio/libwma/mdct2.c | 375 - bsp/stm32_radio/libwma/mdct2.h | 75 - bsp/stm32_radio/libwma/mdct_arm.S | 415 - bsp/stm32_radio/libwma/mdct_lookup.h | 544 -- bsp/stm32_radio/libwma/types.h | 4 - bsp/stm32_radio/libwma/wma_arm.S | 96 - bsp/stm32_radio/libwma/wmabitstream.c | 271 - bsp/stm32_radio/libwma/wmabitstream.h | 989 -- bsp/stm32_radio/libwma/wmadata.h | 2609 ------ bsp/stm32_radio/libwma/wmadec.h | 149 - bsp/stm32_radio/libwma/wmadeci.c | 1586 ---- bsp/stm32_radio/libwma/wmafixed.c | 231 - bsp/stm32_radio/libwma/wmafixed.h | 144 - bsp/stm32_radio/mp3.c | 626 -- bsp/stm32_radio/mp3.h | 12 - bsp/stm32_radio/mp3/mp3dec.c | 417 - bsp/stm32_radio/mp3/mp3tabs.c | 181 - bsp/stm32_radio/mp3/pub/LICENSE.txt | 30 - bsp/stm32_radio/mp3/pub/RCSL.txt | 948 -- bsp/stm32_radio/mp3/pub/RPSL.txt | 518 -- bsp/stm32_radio/mp3/pub/mp3common.h | 123 - bsp/stm32_radio/mp3/pub/mp3dec.h | 137 - bsp/stm32_radio/mp3/pub/mp3dec.h.bak | 133 - bsp/stm32_radio/mp3/pub/mpadecobjfixpt.h | 108 - bsp/stm32_radio/mp3/pub/statname.h | 88 - bsp/stm32_radio/mp3/real/LICENSE.txt | 30 - bsp/stm32_radio/mp3/real/RCSL.txt | 948 -- bsp/stm32_radio/mp3/real/RPSL.txt | 518 -- bsp/stm32_radio/mp3/real/arm/LICENSE.txt | 30 - bsp/stm32_radio/mp3/real/arm/RCSL.txt | 948 -- bsp/stm32_radio/mp3/real/arm/RPSL.txt | 518 -- bsp/stm32_radio/mp3/real/arm/asmmisc.s | 69 - bsp/stm32_radio/mp3/real/arm/asmpoly.s | 428 - bsp/stm32_radio/mp3/real/arm/asmpoly_thumb2.s | 384 - bsp/stm32_radio/mp3/real/assembly.h | 282 - bsp/stm32_radio/mp3/real/bitstream.c | 389 - bsp/stm32_radio/mp3/real/buffers.c | 220 - bsp/stm32_radio/mp3/real/buffers.c.bak | 170 - bsp/stm32_radio/mp3/real/coder.h | 306 - bsp/stm32_radio/mp3/real/dct32.c | 278 - bsp/stm32_radio/mp3/real/dequant.c | 158 - bsp/stm32_radio/mp3/real/dqchan.c | 375 - bsp/stm32_radio/mp3/real/huffman.c | 458 - bsp/stm32_radio/mp3/real/hufftabs.c | 755 -- bsp/stm32_radio/mp3/real/hufftabs.c.bak | 755 -- bsp/stm32_radio/mp3/real/imdct.c | 779 -- bsp/stm32_radio/mp3/real/polyphase.c | 295 - .../mp3/real/projects/armads/LICENSE.txt | 30 - .../mp3/real/projects/armads/RCSL.txt | 948 -- .../mp3/real/projects/armads/RPSL.txt | 518 -- .../mp3/real/projects/armads/mp3dec.mcp | Bin 190427 -> 0 bytes .../mp3/real/projects/armads/testwrap.mcp | Bin 191044 -> 0 bytes .../mp3/real/projects/armwince/LICENSE.txt | 30 - .../mp3/real/projects/armwince/RCSL.txt | 948 -- .../mp3/real/projects/armwince/RPSL.txt | 518 -- .../mp3/real/projects/armwince/mp3dec.vcp | 335 - .../mp3/real/projects/armwince/mp3dec.vcw | 44 - .../mp3/real/projects/armwince/testwrap.vcp | 146 - .../mp3/real/projects/visualc/LICENSE.txt | 30 - .../mp3/real/projects/visualc/RCSL.txt | 948 -- .../mp3/real/projects/visualc/RPSL.txt | 518 -- .../mp3/real/projects/visualc/mp3dec.dsp | 158 - .../mp3/real/projects/visualc/mp3dec.dsw | 44 - .../mp3/real/projects/visualc/testwrap.dsp | 174 - bsp/stm32_radio/mp3/real/scalfact.c | 391 - bsp/stm32_radio/mp3/real/stproc.c | 296 - bsp/stm32_radio/mp3/real/subband.c | 96 - bsp/stm32_radio/mp3/real/trigtabs.c | 311 - bsp/stm32_radio/netbuffer.c | 385 - bsp/stm32_radio/netbuffer.h | 25 - bsp/stm32_radio/network.xpm | 172 - bsp/stm32_radio/network_disconnect.xpm | 98 - bsp/stm32_radio/picture.c | 283 - bsp/stm32_radio/picture.h | 8 - bsp/stm32_radio/play.hdh | 107 - bsp/stm32_radio/play_list.c | 103 - bsp/stm32_radio/play_list.h | 25 - bsp/stm32_radio/player_bg.c | 105 - bsp/stm32_radio/player_bg.h | 32 - bsp/stm32_radio/player_ui.c | 966 -- bsp/stm32_radio/player_ui.h | 56 - bsp/stm32_radio/project.Opt | 265 - bsp/stm32_radio/project.Uv2 | 385 - bsp/stm32_radio/radio_list_update.c | 368 - bsp/stm32_radio/remote.c | 507 -- bsp/stm32_radio/resource/RTT.hdc | Bin 5492 -> 0 bytes bsp/stm32_radio/resource/bg.hdc | Bin 141620 -> 0 bytes bsp/stm32_radio/resource/hzk12.fnt | Bin 196272 -> 0 bytes bsp/stm32_radio/resource/hzk16.fnt | Bin 267616 -> 0 bytes bsp/stm32_radio/rtc.c | 227 - bsp/stm32_radio/rtc.h | 6 - bsp/stm32_radio/rtconfig.h | 184 - .../sch/module/codec/codec_layout_size.pdf | Bin 16280 -> 0 bytes .../sch/module/codec/codec_model.pdf | Bin 96614 -> 0 bytes .../sch/module/lcd/lcd_layout_size.pdf | Bin 12859 -> 0 bytes bsp/stm32_radio/sch/module/lcd/lcd_model.pdf | Bin 94078 -> 0 bytes .../sch/module/sch/sch_codec_wm8978.pdf | Bin 22234 -> 0 bytes .../sch/module/sch/sch_lcd_fmt0371.pdf | Bin 14902 -> 0 bytes .../sch/module/sch/sch_lcd_ili9325.pdf | Bin 17368 -> 0 bytes bsp/stm32_radio/sch/sch_rev0.01.pdf | Bin 41756 -> 0 bytes bsp/stm32_radio/sch/sch_rev0.02.pdf | Bin 70105 -> 0 bytes bsp/stm32_radio/sch/sch_rev0.03.pdf | Bin 68134 -> 0 bytes bsp/stm32_radio/sch/sch_rev2.01.pdf | Bin 53802 -> 0 bytes bsp/stm32_radio/sdcard.c | 3190 ------- bsp/stm32_radio/sdcard.h | 285 - bsp/stm32_radio/spi_flash.c | 317 - bsp/stm32_radio/spi_flash.h | 26 - bsp/stm32_radio/startup.c | 149 - bsp/stm32_radio/station_list.c | 221 - bsp/stm32_radio/station_list.h | 31 - bsp/stm32_radio/stm32f10x_conf.h | 76 - bsp/stm32_radio/stm32f10x_it.c | 668 -- bsp/stm32_radio/stm32f10x_it.h | 110 - bsp/stm32_radio/stop.hdh | 107 - bsp/stm32_radio/today.c | 73 - bsp/stm32_radio/touch.c | 143 - bsp/stm32_radio/usart.c | 340 - bsp/stm32_radio/usart.h | 23 - bsp/stm32_radio/wav.c | 48 - bsp/stm32_radio/wma.c | 1049 --- 275 files changed, 103148 deletions(-) delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/Release_Notes_for_STM32F10x_CMSIS.html delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_cl.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld_vl.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md_vl.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_cl.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld_vl.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md_vl.s delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CMSIS debug support.htm delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/CMSIS_changes.htm delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/Documentation/CMSIS_Core.htm delete mode 100644 bsp/stm32_radio/Libraries/CMSIS/License.doc delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/fsmc_nand.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/hw_config.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/mass_mal.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/memory.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/nand_if.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/platform_config.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/stm32f10x_conf.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_bot.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_conf.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_desc.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_istr.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_prop.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_pwr.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_scsi.h delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/fsmc_nand.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/hw_config.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/mass_mal.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/memory.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/nand_if.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/scsi_data.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/usb_bot.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/usb_desc.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/usb_endp.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/usb_istr.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/usb_main.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/usb_prop.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/usb_pwr.c delete mode 100644 bsp/stm32_radio/Libraries/Mass_Storage/src/usb_scsi.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/Release_Notes_for_STM32F10x_StdPeriph_Driver.html delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c delete mode 100644 bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_cal.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_dev.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_int.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_pcd.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_regs.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_def.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_init.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_int.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_lib.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_regs.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_sil.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_cal.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_dev.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_int.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_pcd.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_init.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_int.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_regs.c delete mode 100644 bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_sil.c delete mode 100644 bsp/stm32_radio/application.c delete mode 100644 bsp/stm32_radio/board.c delete mode 100644 bsp/stm32_radio/board.h delete mode 100644 bsp/stm32_radio/codec.c delete mode 100644 bsp/stm32_radio/codec.h delete mode 100644 bsp/stm32_radio/device_info.c delete mode 100644 bsp/stm32_radio/dm9000.c delete mode 100644 bsp/stm32_radio/dm9000.h delete mode 100644 bsp/stm32_radio/fmt0371/fmt0371.c delete mode 100644 bsp/stm32_radio/fmt0371/fmt0371.h delete mode 100644 bsp/stm32_radio/fsmc_nand.c delete mode 100644 bsp/stm32_radio/fsmc_nand.h delete mode 100644 bsp/stm32_radio/fsmc_sram.c delete mode 100644 bsp/stm32_radio/http.c delete mode 100644 bsp/stm32_radio/http.h delete mode 100644 bsp/stm32_radio/ili9325/ili9325.c delete mode 100644 bsp/stm32_radio/ili9325/ili9325.h delete mode 100644 bsp/stm32_radio/info.c delete mode 100644 bsp/stm32_radio/key.c delete mode 100644 bsp/stm32_radio/lcd.c delete mode 100644 bsp/stm32_radio/lcd.h delete mode 100644 bsp/stm32_radio/libwma/SOURCES delete mode 100644 bsp/stm32_radio/libwma/asf.h delete mode 100644 bsp/stm32_radio/libwma/asm_arm.h delete mode 100644 bsp/stm32_radio/libwma/bswap.h delete mode 100644 bsp/stm32_radio/libwma/codeclib.h delete mode 100644 bsp/stm32_radio/libwma/ffmpeg_config.h delete mode 100644 bsp/stm32_radio/libwma/libwma.make delete mode 100644 bsp/stm32_radio/libwma/mdct2.c delete mode 100644 bsp/stm32_radio/libwma/mdct2.h delete mode 100644 bsp/stm32_radio/libwma/mdct_arm.S delete mode 100644 bsp/stm32_radio/libwma/mdct_lookup.h delete mode 100644 bsp/stm32_radio/libwma/types.h delete mode 100644 bsp/stm32_radio/libwma/wma_arm.S delete mode 100644 bsp/stm32_radio/libwma/wmabitstream.c delete mode 100644 bsp/stm32_radio/libwma/wmabitstream.h delete mode 100644 bsp/stm32_radio/libwma/wmadata.h delete mode 100644 bsp/stm32_radio/libwma/wmadec.h delete mode 100644 bsp/stm32_radio/libwma/wmadeci.c delete mode 100644 bsp/stm32_radio/libwma/wmafixed.c delete mode 100644 bsp/stm32_radio/libwma/wmafixed.h delete mode 100644 bsp/stm32_radio/mp3.c delete mode 100644 bsp/stm32_radio/mp3.h delete mode 100644 bsp/stm32_radio/mp3/mp3dec.c delete mode 100644 bsp/stm32_radio/mp3/mp3tabs.c delete mode 100644 bsp/stm32_radio/mp3/pub/LICENSE.txt delete mode 100644 bsp/stm32_radio/mp3/pub/RCSL.txt delete mode 100644 bsp/stm32_radio/mp3/pub/RPSL.txt delete mode 100644 bsp/stm32_radio/mp3/pub/mp3common.h delete mode 100644 bsp/stm32_radio/mp3/pub/mp3dec.h delete mode 100644 bsp/stm32_radio/mp3/pub/mp3dec.h.bak delete mode 100644 bsp/stm32_radio/mp3/pub/mpadecobjfixpt.h delete mode 100644 bsp/stm32_radio/mp3/pub/statname.h delete mode 100644 bsp/stm32_radio/mp3/real/LICENSE.txt delete mode 100644 bsp/stm32_radio/mp3/real/RCSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/RPSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/arm/LICENSE.txt delete mode 100644 bsp/stm32_radio/mp3/real/arm/RCSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/arm/RPSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/arm/asmmisc.s delete mode 100644 bsp/stm32_radio/mp3/real/arm/asmpoly.s delete mode 100644 bsp/stm32_radio/mp3/real/arm/asmpoly_thumb2.s delete mode 100644 bsp/stm32_radio/mp3/real/assembly.h delete mode 100644 bsp/stm32_radio/mp3/real/bitstream.c delete mode 100644 bsp/stm32_radio/mp3/real/buffers.c delete mode 100644 bsp/stm32_radio/mp3/real/buffers.c.bak delete mode 100644 bsp/stm32_radio/mp3/real/coder.h delete mode 100644 bsp/stm32_radio/mp3/real/dct32.c delete mode 100644 bsp/stm32_radio/mp3/real/dequant.c delete mode 100644 bsp/stm32_radio/mp3/real/dqchan.c delete mode 100644 bsp/stm32_radio/mp3/real/huffman.c delete mode 100644 bsp/stm32_radio/mp3/real/hufftabs.c delete mode 100644 bsp/stm32_radio/mp3/real/hufftabs.c.bak delete mode 100644 bsp/stm32_radio/mp3/real/imdct.c delete mode 100644 bsp/stm32_radio/mp3/real/polyphase.c delete mode 100644 bsp/stm32_radio/mp3/real/projects/armads/LICENSE.txt delete mode 100644 bsp/stm32_radio/mp3/real/projects/armads/RCSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/projects/armads/RPSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/projects/armads/mp3dec.mcp delete mode 100644 bsp/stm32_radio/mp3/real/projects/armads/testwrap.mcp delete mode 100644 bsp/stm32_radio/mp3/real/projects/armwince/LICENSE.txt delete mode 100644 bsp/stm32_radio/mp3/real/projects/armwince/RCSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/projects/armwince/RPSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/projects/armwince/mp3dec.vcp delete mode 100644 bsp/stm32_radio/mp3/real/projects/armwince/mp3dec.vcw delete mode 100644 bsp/stm32_radio/mp3/real/projects/armwince/testwrap.vcp delete mode 100644 bsp/stm32_radio/mp3/real/projects/visualc/LICENSE.txt delete mode 100644 bsp/stm32_radio/mp3/real/projects/visualc/RCSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/projects/visualc/RPSL.txt delete mode 100644 bsp/stm32_radio/mp3/real/projects/visualc/mp3dec.dsp delete mode 100644 bsp/stm32_radio/mp3/real/projects/visualc/mp3dec.dsw delete mode 100644 bsp/stm32_radio/mp3/real/projects/visualc/testwrap.dsp delete mode 100644 bsp/stm32_radio/mp3/real/scalfact.c delete mode 100644 bsp/stm32_radio/mp3/real/stproc.c delete mode 100644 bsp/stm32_radio/mp3/real/subband.c delete mode 100644 bsp/stm32_radio/mp3/real/trigtabs.c delete mode 100644 bsp/stm32_radio/netbuffer.c delete mode 100644 bsp/stm32_radio/netbuffer.h delete mode 100644 bsp/stm32_radio/network.xpm delete mode 100644 bsp/stm32_radio/network_disconnect.xpm delete mode 100644 bsp/stm32_radio/picture.c delete mode 100644 bsp/stm32_radio/picture.h delete mode 100644 bsp/stm32_radio/play.hdh delete mode 100644 bsp/stm32_radio/play_list.c delete mode 100644 bsp/stm32_radio/play_list.h delete mode 100644 bsp/stm32_radio/player_bg.c delete mode 100644 bsp/stm32_radio/player_bg.h delete mode 100644 bsp/stm32_radio/player_ui.c delete mode 100644 bsp/stm32_radio/player_ui.h delete mode 100644 bsp/stm32_radio/project.Opt delete mode 100644 bsp/stm32_radio/project.Uv2 delete mode 100644 bsp/stm32_radio/radio_list_update.c delete mode 100644 bsp/stm32_radio/remote.c delete mode 100644 bsp/stm32_radio/resource/RTT.hdc delete mode 100644 bsp/stm32_radio/resource/bg.hdc delete mode 100644 bsp/stm32_radio/resource/hzk12.fnt delete mode 100644 bsp/stm32_radio/resource/hzk16.fnt delete mode 100644 bsp/stm32_radio/rtc.c delete mode 100644 bsp/stm32_radio/rtc.h delete mode 100644 bsp/stm32_radio/rtconfig.h delete mode 100644 bsp/stm32_radio/sch/module/codec/codec_layout_size.pdf delete mode 100644 bsp/stm32_radio/sch/module/codec/codec_model.pdf delete mode 100644 bsp/stm32_radio/sch/module/lcd/lcd_layout_size.pdf delete mode 100644 bsp/stm32_radio/sch/module/lcd/lcd_model.pdf delete mode 100644 bsp/stm32_radio/sch/module/sch/sch_codec_wm8978.pdf delete mode 100644 bsp/stm32_radio/sch/module/sch/sch_lcd_fmt0371.pdf delete mode 100644 bsp/stm32_radio/sch/module/sch/sch_lcd_ili9325.pdf delete mode 100644 bsp/stm32_radio/sch/sch_rev0.01.pdf delete mode 100644 bsp/stm32_radio/sch/sch_rev0.02.pdf delete mode 100644 bsp/stm32_radio/sch/sch_rev0.03.pdf delete mode 100644 bsp/stm32_radio/sch/sch_rev2.01.pdf delete mode 100644 bsp/stm32_radio/sdcard.c delete mode 100644 bsp/stm32_radio/sdcard.h delete mode 100644 bsp/stm32_radio/spi_flash.c delete mode 100644 bsp/stm32_radio/spi_flash.h delete mode 100644 bsp/stm32_radio/startup.c delete mode 100644 bsp/stm32_radio/station_list.c delete mode 100644 bsp/stm32_radio/station_list.h delete mode 100644 bsp/stm32_radio/stm32f10x_conf.h delete mode 100644 bsp/stm32_radio/stm32f10x_it.c delete mode 100644 bsp/stm32_radio/stm32f10x_it.h delete mode 100644 bsp/stm32_radio/stop.hdh delete mode 100644 bsp/stm32_radio/today.c delete mode 100644 bsp/stm32_radio/touch.c delete mode 100644 bsp/stm32_radio/usart.c delete mode 100644 bsp/stm32_radio/usart.h delete mode 100644 bsp/stm32_radio/wav.c delete mode 100644 bsp/stm32_radio/wma.c diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c b/bsp/stm32_radio/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c deleted file mode 100644 index 56fddc52bf..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c +++ /dev/null @@ -1,784 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.c - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Source File - * @version V1.30 - * @date 30. October 2009 - * - * @note - * Copyright (C) 2009 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#include - -/* define compiler specific symbols */ -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - -#endif - - -/* ################### Compiler specific Intrinsics ########################### */ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -/** - * @brief Return the Process Stack Pointer - * - * @return ProcessStackPointer - * - * Return the actual process stack pointer - */ -__ASM uint32_t __get_PSP(void) -{ - mrs r0, psp - bx lr -} - -/** - * @brief Set the Process Stack Pointer - * - * @param topOfProcStack Process Stack Pointer - * - * Assign the value ProcessStackPointer to the MSP - * (process stack pointer) Cortex processor register - */ -__ASM void __set_PSP(uint32_t topOfProcStack) -{ - msr psp, r0 - bx lr -} - -/** - * @brief Return the Main Stack Pointer - * - * @return Main Stack Pointer - * - * Return the current value of the MSP (main stack pointer) - * Cortex processor register - */ -__ASM uint32_t __get_MSP(void) -{ - mrs r0, msp - bx lr -} - -/** - * @brief Set the Main Stack Pointer - * - * @param topOfMainStack Main Stack Pointer - * - * Assign the value mainStackPointer to the MSP - * (main stack pointer) Cortex processor register - */ -__ASM void __set_MSP(uint32_t mainStackPointer) -{ - msr msp, r0 - bx lr -} - -/** - * @brief Reverse byte order in unsigned short value - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in unsigned short value - */ -__ASM uint32_t __REV16(uint16_t value) -{ - rev16 r0, r0 - bx lr -} - -/** - * @brief Reverse byte order in signed short value with sign extension to integer - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in signed short value with sign extension to integer - */ -__ASM int32_t __REVSH(int16_t value) -{ - revsh r0, r0 - bx lr -} - - -#if (__ARMCC_VERSION < 400000) - -/** - * @brief Remove the exclusive lock created by ldrex - * - * Removes the exclusive lock which is created by ldrex. - */ -__ASM void __CLREX(void) -{ - clrex -} - -/** - * @brief Return the Base Priority value - * - * @return BasePriority - * - * Return the content of the base priority register - */ -__ASM uint32_t __get_BASEPRI(void) -{ - mrs r0, basepri - bx lr -} - -/** - * @brief Set the Base Priority value - * - * @param basePri BasePriority - * - * Set the base priority register - */ -__ASM void __set_BASEPRI(uint32_t basePri) -{ - msr basepri, r0 - bx lr -} - -/** - * @brief Return the Priority Mask value - * - * @return PriMask - * - * Return state of the priority mask bit from the priority mask register - */ -__ASM uint32_t __get_PRIMASK(void) -{ - mrs r0, primask - bx lr -} - -/** - * @brief Set the Priority Mask value - * - * @param priMask PriMask - * - * Set the priority mask bit in the priority mask register - */ -__ASM void __set_PRIMASK(uint32_t priMask) -{ - msr primask, r0 - bx lr -} - -/** - * @brief Return the Fault Mask value - * - * @return FaultMask - * - * Return the content of the fault mask register - */ -__ASM uint32_t __get_FAULTMASK(void) -{ - mrs r0, faultmask - bx lr -} - -/** - * @brief Set the Fault Mask value - * - * @param faultMask faultMask value - * - * Set the fault mask register - */ -__ASM void __set_FAULTMASK(uint32_t faultMask) -{ - msr faultmask, r0 - bx lr -} - -/** - * @brief Return the Control Register value - * - * @return Control value - * - * Return the content of the control register - */ -__ASM uint32_t __get_CONTROL(void) -{ - mrs r0, control - bx lr -} - -/** - * @brief Set the Control Register value - * - * @param control Control value - * - * Set the control register - */ -__ASM void __set_CONTROL(uint32_t control) -{ - msr control, r0 - bx lr -} - -#endif /* __ARMCC_VERSION */ - - - -#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ -#pragma diag_suppress=Pe940 - -/** - * @brief Return the Process Stack Pointer - * - * @return ProcessStackPointer - * - * Return the actual process stack pointer - */ -uint32_t __get_PSP(void) -{ - __ASM("mrs r0, psp"); - __ASM("bx lr"); -} - -/** - * @brief Set the Process Stack Pointer - * - * @param topOfProcStack Process Stack Pointer - * - * Assign the value ProcessStackPointer to the MSP - * (process stack pointer) Cortex processor register - */ -void __set_PSP(uint32_t topOfProcStack) -{ - __ASM("msr psp, r0"); - __ASM("bx lr"); -} - -/** - * @brief Return the Main Stack Pointer - * - * @return Main Stack Pointer - * - * Return the current value of the MSP (main stack pointer) - * Cortex processor register - */ -uint32_t __get_MSP(void) -{ - __ASM("mrs r0, msp"); - __ASM("bx lr"); -} - -/** - * @brief Set the Main Stack Pointer - * - * @param topOfMainStack Main Stack Pointer - * - * Assign the value mainStackPointer to the MSP - * (main stack pointer) Cortex processor register - */ -void __set_MSP(uint32_t topOfMainStack) -{ - __ASM("msr msp, r0"); - __ASM("bx lr"); -} - -/** - * @brief Reverse byte order in unsigned short value - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in unsigned short value - */ -uint32_t __REV16(uint16_t value) -{ - __ASM("rev16 r0, r0"); - __ASM("bx lr"); -} - -/** - * @brief Reverse bit order of value - * - * @param value value to reverse - * @return reversed value - * - * Reverse bit order of value - */ -uint32_t __RBIT(uint32_t value) -{ - __ASM("rbit r0, r0"); - __ASM("bx lr"); -} - -/** - * @brief LDR Exclusive (8 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 8 bit values) - */ -uint8_t __LDREXB(uint8_t *addr) -{ - __ASM("ldrexb r0, [r0]"); - __ASM("bx lr"); -} - -/** - * @brief LDR Exclusive (16 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 16 bit values - */ -uint16_t __LDREXH(uint16_t *addr) -{ - __ASM("ldrexh r0, [r0]"); - __ASM("bx lr"); -} - -/** - * @brief LDR Exclusive (32 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 32 bit values - */ -uint32_t __LDREXW(uint32_t *addr) -{ - __ASM("ldrex r0, [r0]"); - __ASM("bx lr"); -} - -/** - * @brief STR Exclusive (8 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 8 bit values - */ -uint32_t __STREXB(uint8_t value, uint8_t *addr) -{ - __ASM("strexb r0, r0, [r1]"); - __ASM("bx lr"); -} - -/** - * @brief STR Exclusive (16 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 16 bit values - */ -uint32_t __STREXH(uint16_t value, uint16_t *addr) -{ - __ASM("strexh r0, r0, [r1]"); - __ASM("bx lr"); -} - -/** - * @brief STR Exclusive (32 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 32 bit values - */ -uint32_t __STREXW(uint32_t value, uint32_t *addr) -{ - __ASM("strex r0, r0, [r1]"); - __ASM("bx lr"); -} - -#pragma diag_default=Pe940 - - -#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/** - * @brief Return the Process Stack Pointer - * - * @return ProcessStackPointer - * - * Return the actual process stack pointer - */ -uint32_t __get_PSP(void) __attribute__( ( naked ) ); -uint32_t __get_PSP(void) -{ - uint32_t result=0; - - __ASM volatile ("MRS %0, psp\n\t" - "MOV r0, %0 \n\t" - "BX lr \n\t" : "=r" (result) ); - return(result); -} - -/** - * @brief Set the Process Stack Pointer - * - * @param topOfProcStack Process Stack Pointer - * - * Assign the value ProcessStackPointer to the MSP - * (process stack pointer) Cortex processor register - */ -void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) ); -void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0\n\t" - "BX lr \n\t" : : "r" (topOfProcStack) ); -} - -/** - * @brief Return the Main Stack Pointer - * - * @return Main Stack Pointer - * - * Return the current value of the MSP (main stack pointer) - * Cortex processor register - */ -uint32_t __get_MSP(void) __attribute__( ( naked ) ); -uint32_t __get_MSP(void) -{ - uint32_t result=0; - - __ASM volatile ("MRS %0, msp\n\t" - "MOV r0, %0 \n\t" - "BX lr \n\t" : "=r" (result) ); - return(result); -} - -/** - * @brief Set the Main Stack Pointer - * - * @param topOfMainStack Main Stack Pointer - * - * Assign the value mainStackPointer to the MSP - * (main stack pointer) Cortex processor register - */ -void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) ); -void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0\n\t" - "BX lr \n\t" : : "r" (topOfMainStack) ); -} - -/** - * @brief Return the Base Priority value - * - * @return BasePriority - * - * Return the content of the base priority register - */ -uint32_t __get_BASEPRI(void) -{ - uint32_t result=0; - - __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); - return(result); -} - -/** - * @brief Set the Base Priority value - * - * @param basePri BasePriority - * - * Set the base priority register - */ -void __set_BASEPRI(uint32_t value) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (value) ); -} - -/** - * @brief Return the Priority Mask value - * - * @return PriMask - * - * Return state of the priority mask bit from the priority mask register - */ -uint32_t __get_PRIMASK(void) -{ - uint32_t result=0; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - -/** - * @brief Set the Priority Mask value - * - * @param priMask PriMask - * - * Set the priority mask bit in the priority mask register - */ -void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); -} - -/** - * @brief Return the Fault Mask value - * - * @return FaultMask - * - * Return the content of the fault mask register - */ -uint32_t __get_FAULTMASK(void) -{ - uint32_t result=0; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - -/** - * @brief Set the Fault Mask value - * - * @param faultMask faultMask value - * - * Set the fault mask register - */ -void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); -} - -/** - * @brief Return the Control Register value -* -* @return Control value - * - * Return the content of the control register - */ -uint32_t __get_CONTROL(void) -{ - uint32_t result=0; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - -/** - * @brief Set the Control Register value - * - * @param control Control value - * - * Set the control register - */ -void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) ); -} - - -/** - * @brief Reverse byte order in integer value - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in integer value - */ -uint32_t __REV(uint32_t value) -{ - uint32_t result=0; - - __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - -/** - * @brief Reverse byte order in unsigned short value - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in unsigned short value - */ -uint32_t __REV16(uint16_t value) -{ - uint32_t result=0; - - __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - -/** - * @brief Reverse byte order in signed short value with sign extension to integer - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in signed short value with sign extension to integer - */ -int32_t __REVSH(int16_t value) -{ - uint32_t result=0; - - __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - -/** - * @brief Reverse bit order of value - * - * @param value value to reverse - * @return reversed value - * - * Reverse bit order of value - */ -uint32_t __RBIT(uint32_t value) -{ - uint32_t result=0; - - __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - -/** - * @brief LDR Exclusive (8 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 8 bit value - */ -uint8_t __LDREXB(uint8_t *addr) -{ - uint8_t result=0; - - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - -/** - * @brief LDR Exclusive (16 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 16 bit values - */ -uint16_t __LDREXH(uint16_t *addr) -{ - uint16_t result=0; - - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - -/** - * @brief LDR Exclusive (32 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 32 bit values - */ -uint32_t __LDREXW(uint32_t *addr) -{ - uint32_t result=0; - - __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - -/** - * @brief STR Exclusive (8 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 8 bit values - */ -uint32_t __STREXB(uint8_t value, uint8_t *addr) -{ - uint32_t result=0; - - __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); - return(result); -} - -/** - * @brief STR Exclusive (16 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 16 bit values - */ -uint32_t __STREXH(uint16_t value, uint16_t *addr) -{ - uint32_t result=0; - - __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); - return(result); -} - -/** - * @brief STR Exclusive (32 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 32 bit values - */ -uint32_t __STREXW(uint32_t value, uint32_t *addr) -{ - uint32_t result=0; - - __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all instrinsics, - * Including the CMSIS ones. - */ - -#endif diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h b/bsp/stm32_radio/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h deleted file mode 100644 index 2b6b51a7d5..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h +++ /dev/null @@ -1,1818 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V1.30 - * @date 30. October 2009 - * - * @note - * Copyright (C) 2009 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#ifndef __CM3_CORE_H__ -#define __CM3_CORE_H__ - -/** @addtogroup CMSIS_CM3_core_LintCinfiguration CMSIS CM3 Core Lint Configuration - * - * List of Lint messages which will be suppressed and not shown: - * - Error 10: \n - * register uint32_t __regBasePri __asm("basepri"); \n - * Error 10: Expecting ';' - * . - * - Error 530: \n - * return(__regBasePri); \n - * Warning 530: Symbol '__regBasePri' (line 264) not initialized - * . - * - Error 550: \n - * __regBasePri = (basePri & 0x1ff); \n - * Warning 550: Symbol '__regBasePri' (line 271) not accessed - * . - * - Error 754: \n - * uint32_t RESERVED0[24]; \n - * Info 754: local structure member '' (line 109, file ./cm3_core.h) not referenced - * . - * - Error 750: \n - * #define __CM3_CORE_H__ \n - * Info 750: local macro '__CM3_CORE_H__' (line 43, file./cm3_core.h) not referenced - * . - * - Error 528: \n - * static __INLINE void NVIC_DisableIRQ(uint32_t IRQn) \n - * Warning 528: Symbol 'NVIC_DisableIRQ(unsigned int)' (line 419, file ./cm3_core.h) not referenced - * . - * - Error 751: \n - * } InterruptType_Type; \n - * Info 751: local typedef 'InterruptType_Type' (line 170, file ./cm3_core.h) not referenced - * . - * Note: To re-enable a Message, insert a space before 'lint' * - * - */ - -/*lint -save */ -/*lint -e10 */ -/*lint -e530 */ -/*lint -e550 */ -/*lint -e754 */ -/*lint -e750 */ -/*lint -e528 */ -/*lint -e751 */ - - -/** @addtogroup CMSIS_CM3_core_definitions CM3 Core Definitions - This file defines all structures and symbols for CMSIS core: - - CMSIS version number - - Cortex-M core registers and bitfields - - Cortex-M core peripheral base address - @{ - */ - -#ifdef __cplusplus - extern "C" { -#endif - -#define __CM3_CMSIS_VERSION_MAIN (0x01) /*!< [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (0x30) /*!< [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x03) /*!< Cortex core */ - -#include /* Include standard types */ - -#if defined (__ICCARM__) - #include /* IAR Intrinsics */ -#endif - - -#ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 /*!< standard definition for NVIC Priority Bits */ -#endif - - - - -/** - * IO definitions - * - * define access restrictions to peripheral registers - */ - -#ifdef __cplusplus - #define __I volatile /*!< defines 'read only' permissions */ -#else - #define __I volatile const /*!< defines 'read only' permissions */ -#endif -#define __O volatile /*!< defines 'write only' permissions */ -#define __IO volatile /*!< defines 'read / write' permissions */ - - - -/******************************************************************************* - * Register Abstraction - ******************************************************************************/ -/** @addtogroup CMSIS_CM3_core_register CMSIS CM3 Core Register - @{ -*/ - - -/** @addtogroup CMSIS_CM3_NVIC CMSIS CM3 NVIC - memory mapped structure for Nested Vectored Interrupt Controller (NVIC) - @{ - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt Register */ -} NVIC_Type; -/*@}*/ /* end of group CMSIS_CM3_NVIC */ - - -/** @addtogroup CMSIS_CM3_SCB CMSIS CM3 SCB - memory mapped structure for System Control Block (SCB) - @{ - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x00 CPU ID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x04 Interrupt Control State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x08 Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x0C Application Interrupt / Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x10 System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x14 Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x18 System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x24 System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x28 Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x2C Hard Fault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x30 Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x34 Mem Manage Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x38 Bus Fault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x3C Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x40 Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x48 Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x4C Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x50 Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x60 ISA Feature Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFul << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFul << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFul << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFul << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1ul << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1ul << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1ul << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1ul << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1ul << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1ul << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1ul << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFul << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1ul << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFul << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (0x1FFul << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFul << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFul << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFul << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1ul << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7ul << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1ul << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1ul << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1ul << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1ul << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1ul << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1ul << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1ul << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1ul << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1ul << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1ul << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1ul << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1ul << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1ul << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1ul << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1ul << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1ul << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1ul << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1ul << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1ul << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1ul << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1ul << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1ul << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1ul << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1ul << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1ul << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1ul << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFul << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFul << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFul << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1ul << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1ul << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1ul << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1ul << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1ul << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1ul << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1ul << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1ul << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ -/*@}*/ /* end of group CMSIS_CM3_SCB */ - - -/** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTick - memory mapped structure for SysTick - @{ - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x04 SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x08 SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x0C SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1ul << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1ul << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1ul << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFul << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1ul << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1ul << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFul << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ -/*@}*/ /* end of group CMSIS_CM3_SysTick */ - - -/** @addtogroup CMSIS_CM3_ITM CMSIS CM3 ITM - memory mapped structure for Instrumentation Trace Macrocell (ITM) - @{ - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x00 ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __IO uint32_t IWR; /*!< Offset: ITM Integration Write Register */ - __IO uint32_t IRR; /*!< Offset: ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __IO uint32_t LAR; /*!< Offset: ITM Lock Access Register */ - __IO uint32_t LSR; /*!< Offset: ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFul << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1ul << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_ATBID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_ATBID_Msk (0x7Ful << ITM_TCR_ATBID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3ul << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1ul << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1ul << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1ul << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1ul << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1ul << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1ul << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1ul << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1ul << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1ul << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1ul << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1ul << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ -/*@}*/ /* end of group CMSIS_CM3_ITM */ - - -/** @addtogroup CMSIS_CM3_InterruptType CMSIS CM3 Interrupt Type - memory mapped structure for Interrupt Type - @{ - */ -typedef struct -{ - uint32_t RESERVED0; - __I uint32_t ICTR; /*!< Offset: 0x04 Interrupt Control Type Register */ -#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) - __IO uint32_t ACTLR; /*!< Offset: 0x08 Auxiliary Control Register */ -#else - uint32_t RESERVED1; -#endif -} InterruptType_Type; - -/* Interrupt Controller Type Register Definitions */ -#define InterruptType_ICTR_INTLINESNUM_Pos 0 /*!< InterruptType ICTR: INTLINESNUM Position */ -#define InterruptType_ICTR_INTLINESNUM_Msk (0x1Ful << InterruptType_ICTR_INTLINESNUM_Pos) /*!< InterruptType ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define InterruptType_ACTLR_DISFOLD_Pos 2 /*!< InterruptType ACTLR: DISFOLD Position */ -#define InterruptType_ACTLR_DISFOLD_Msk (1ul << InterruptType_ACTLR_DISFOLD_Pos) /*!< InterruptType ACTLR: DISFOLD Mask */ - -#define InterruptType_ACTLR_DISDEFWBUF_Pos 1 /*!< InterruptType ACTLR: DISDEFWBUF Position */ -#define InterruptType_ACTLR_DISDEFWBUF_Msk (1ul << InterruptType_ACTLR_DISDEFWBUF_Pos) /*!< InterruptType ACTLR: DISDEFWBUF Mask */ - -#define InterruptType_ACTLR_DISMCYCINT_Pos 0 /*!< InterruptType ACTLR: DISMCYCINT Position */ -#define InterruptType_ACTLR_DISMCYCINT_Msk (1ul << InterruptType_ACTLR_DISMCYCINT_Pos) /*!< InterruptType ACTLR: DISMCYCINT Mask */ -/*@}*/ /* end of group CMSIS_CM3_InterruptType */ - - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1) -/** @addtogroup CMSIS_CM3_MPU CMSIS CM3 MPU - memory mapped structure for Memory Protection Unit (MPU) - @{ - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x00 MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x04 MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x08 MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x0C MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x10 MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x14 MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x18 MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x1C MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x20 MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x24 MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x28 MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFul << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFul << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1ul << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1ul << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1ul << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1ul << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFul << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFul << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1ul << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFul << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: XN Position */ -#define MPU_RASR_XN_Msk (1ul << MPU_RASR_XN_Pos) /*!< MPU RASR: XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: AP Position */ -#define MPU_RASR_AP_Msk (7ul << MPU_RASR_AP_Pos) /*!< MPU RASR: AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: TEX Position */ -#define MPU_RASR_TEX_Msk (7ul << MPU_RASR_TEX_Pos) /*!< MPU RASR: TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: Shareable bit Position */ -#define MPU_RASR_S_Msk (1ul << MPU_RASR_S_Pos) /*!< MPU RASR: Shareable bit Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: Cacheable bit Position */ -#define MPU_RASR_C_Msk (1ul << MPU_RASR_C_Pos) /*!< MPU RASR: Cacheable bit Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: Bufferable bit Position */ -#define MPU_RASR_B_Msk (1ul << MPU_RASR_B_Pos) /*!< MPU RASR: Bufferable bit Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFul << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1Ful << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENA_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENA_Msk (0x1Ful << MPU_RASR_ENA_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@}*/ /* end of group CMSIS_CM3_MPU */ -#endif - - -/** @addtogroup CMSIS_CM3_CoreDebug CMSIS CM3 Core Debug - memory mapped structure for Core Debug Register - @{ - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x00 Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x04 Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x08 Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x0C Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFul << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1ul << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1ul << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1ul << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1ul << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1ul << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1ul << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1ul << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1ul << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1ul << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1ul << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1ul << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1ul << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1Ful << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1ul << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1ul << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1ul << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1ul << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1ul << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1ul << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1ul << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1ul << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1ul << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1ul << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1ul << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1ul << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1ul << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ -/*@}*/ /* end of group CMSIS_CM3_CoreDebug */ - - -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000) /*!< ITM Base Address */ -#define CoreDebug_BASE (0xE000EDF0) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00) /*!< System Control Block Base Address */ - -#define InterruptType ((InterruptType_Type *) SCS_BASE) /*!< Interrupt Type Register */ -#define SCB ((SCB_Type *) SCB_BASE) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE) /*!< ITM configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type*) MPU_BASE) /*!< Memory Protection Unit */ -#endif - -/*@}*/ /* end of group CMSIS_CM3_core_register */ - - -/******************************************************************************* - * Hardware Abstraction Layer - ******************************************************************************/ - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - -#endif - - -/* ################### Compiler specific Intrinsics ########################### */ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -#define __enable_fault_irq __enable_fiq -#define __disable_fault_irq __disable_fiq - -#define __NOP __nop -#define __WFI __wfi -#define __WFE __wfe -#define __SEV __sev -#define __ISB() __isb(0) -#define __DSB() __dsb(0) -#define __DMB() __dmb(0) -#define __REV __rev -#define __RBIT __rbit -#define __LDREXB(ptr) ((unsigned char ) __ldrex(ptr)) -#define __LDREXH(ptr) ((unsigned short) __ldrex(ptr)) -#define __LDREXW(ptr) ((unsigned int ) __ldrex(ptr)) -#define __STREXB(value, ptr) __strex(value, ptr) -#define __STREXH(value, ptr) __strex(value, ptr) -#define __STREXW(value, ptr) __strex(value, ptr) - - -/* intrinsic unsigned long long __ldrexd(volatile void *ptr) */ -/* intrinsic int __strexd(unsigned long long val, volatile void *ptr) */ -/* intrinsic void __enable_irq(); */ -/* intrinsic void __disable_irq(); */ - - -/** - * @brief Return the Process Stack Pointer - * - * @return ProcessStackPointer - * - * Return the actual process stack pointer - */ -extern uint32_t __get_PSP(void); - -/** - * @brief Set the Process Stack Pointer - * - * @param topOfProcStack Process Stack Pointer - * - * Assign the value ProcessStackPointer to the MSP - * (process stack pointer) Cortex processor register - */ -extern void __set_PSP(uint32_t topOfProcStack); - -/** - * @brief Return the Main Stack Pointer - * - * @return Main Stack Pointer - * - * Return the current value of the MSP (main stack pointer) - * Cortex processor register - */ -extern uint32_t __get_MSP(void); - -/** - * @brief Set the Main Stack Pointer - * - * @param topOfMainStack Main Stack Pointer - * - * Assign the value mainStackPointer to the MSP - * (main stack pointer) Cortex processor register - */ -extern void __set_MSP(uint32_t topOfMainStack); - -/** - * @brief Reverse byte order in unsigned short value - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in unsigned short value - */ -extern uint32_t __REV16(uint16_t value); - -/** - * @brief Reverse byte order in signed short value with sign extension to integer - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in signed short value with sign extension to integer - */ -extern int32_t __REVSH(int16_t value); - - -#if (__ARMCC_VERSION < 400000) - -/** - * @brief Remove the exclusive lock created by ldrex - * - * Removes the exclusive lock which is created by ldrex. - */ -extern void __CLREX(void); - -/** - * @brief Return the Base Priority value - * - * @return BasePriority - * - * Return the content of the base priority register - */ -extern uint32_t __get_BASEPRI(void); - -/** - * @brief Set the Base Priority value - * - * @param basePri BasePriority - * - * Set the base priority register - */ -extern void __set_BASEPRI(uint32_t basePri); - -/** - * @brief Return the Priority Mask value - * - * @return PriMask - * - * Return state of the priority mask bit from the priority mask register - */ -extern uint32_t __get_PRIMASK(void); - -/** - * @brief Set the Priority Mask value - * - * @param priMask PriMask - * - * Set the priority mask bit in the priority mask register - */ -extern void __set_PRIMASK(uint32_t priMask); - -/** - * @brief Return the Fault Mask value - * - * @return FaultMask - * - * Return the content of the fault mask register - */ -extern uint32_t __get_FAULTMASK(void); - -/** - * @brief Set the Fault Mask value - * - * @param faultMask faultMask value - * - * Set the fault mask register - */ -extern void __set_FAULTMASK(uint32_t faultMask); - -/** - * @brief Return the Control Register value - * - * @return Control value - * - * Return the content of the control register - */ -extern uint32_t __get_CONTROL(void); - -/** - * @brief Set the Control Register value - * - * @param control Control value - * - * Set the control register - */ -extern void __set_CONTROL(uint32_t control); - -#else /* (__ARMCC_VERSION >= 400000) */ - -/** - * @brief Remove the exclusive lock created by ldrex - * - * Removes the exclusive lock which is created by ldrex. - */ -#define __CLREX __clrex - -/** - * @brief Return the Base Priority value - * - * @return BasePriority - * - * Return the content of the base priority register - */ -static __INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - -/** - * @brief Set the Base Priority value - * - * @param basePri BasePriority - * - * Set the base priority register - */ -static __INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xff); -} - -/** - * @brief Return the Priority Mask value - * - * @return PriMask - * - * Return state of the priority mask bit from the priority mask register - */ -static __INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - -/** - * @brief Set the Priority Mask value - * - * @param priMask PriMask - * - * Set the priority mask bit in the priority mask register - */ -static __INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - -/** - * @brief Return the Fault Mask value - * - * @return FaultMask - * - * Return the content of the fault mask register - */ -static __INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - -/** - * @brief Set the Fault Mask value - * - * @param faultMask faultMask value - * - * Set the fault mask register - */ -static __INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & 1); -} - -/** - * @brief Return the Control Register value - * - * @return Control value - * - * Return the content of the control register - */ -static __INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - -/** - * @brief Set the Control Register value - * - * @param control Control value - * - * Set the control register - */ -static __INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; -} - -#endif /* __ARMCC_VERSION */ - - - -#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#define __enable_irq __enable_interrupt /*!< global Interrupt enable */ -#define __disable_irq __disable_interrupt /*!< global Interrupt disable */ - -static __INLINE void __enable_fault_irq() { __ASM ("cpsie f"); } -static __INLINE void __disable_fault_irq() { __ASM ("cpsid f"); } - -#define __NOP __no_operation /*!< no operation intrinsic in IAR Compiler */ -static __INLINE void __WFI() { __ASM ("wfi"); } -static __INLINE void __WFE() { __ASM ("wfe"); } -static __INLINE void __SEV() { __ASM ("sev"); } -static __INLINE void __CLREX() { __ASM ("clrex"); } - -/* intrinsic void __ISB(void) */ -/* intrinsic void __DSB(void) */ -/* intrinsic void __DMB(void) */ -/* intrinsic void __set_PRIMASK(); */ -/* intrinsic void __get_PRIMASK(); */ -/* intrinsic void __set_FAULTMASK(); */ -/* intrinsic void __get_FAULTMASK(); */ -/* intrinsic uint32_t __REV(uint32_t value); */ -/* intrinsic uint32_t __REVSH(uint32_t value); */ -/* intrinsic unsigned long __STREX(unsigned long, unsigned long); */ -/* intrinsic unsigned long __LDREX(unsigned long *); */ - - -/** - * @brief Return the Process Stack Pointer - * - * @return ProcessStackPointer - * - * Return the actual process stack pointer - */ -extern uint32_t __get_PSP(void); - -/** - * @brief Set the Process Stack Pointer - * - * @param topOfProcStack Process Stack Pointer - * - * Assign the value ProcessStackPointer to the MSP - * (process stack pointer) Cortex processor register - */ -extern void __set_PSP(uint32_t topOfProcStack); - -/** - * @brief Return the Main Stack Pointer - * - * @return Main Stack Pointer - * - * Return the current value of the MSP (main stack pointer) - * Cortex processor register - */ -extern uint32_t __get_MSP(void); - -/** - * @brief Set the Main Stack Pointer - * - * @param topOfMainStack Main Stack Pointer - * - * Assign the value mainStackPointer to the MSP - * (main stack pointer) Cortex processor register - */ -extern void __set_MSP(uint32_t topOfMainStack); - -/** - * @brief Reverse byte order in unsigned short value - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in unsigned short value - */ -extern uint32_t __REV16(uint16_t value); - -/** - * @brief Reverse bit order of value - * - * @param value value to reverse - * @return reversed value - * - * Reverse bit order of value - */ -extern uint32_t __RBIT(uint32_t value); - -/** - * @brief LDR Exclusive (8 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 8 bit values) - */ -extern uint8_t __LDREXB(uint8_t *addr); - -/** - * @brief LDR Exclusive (16 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 16 bit values - */ -extern uint16_t __LDREXH(uint16_t *addr); - -/** - * @brief LDR Exclusive (32 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 32 bit values - */ -extern uint32_t __LDREXW(uint32_t *addr); - -/** - * @brief STR Exclusive (8 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 8 bit values - */ -extern uint32_t __STREXB(uint8_t value, uint8_t *addr); - -/** - * @brief STR Exclusive (16 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 16 bit values - */ -extern uint32_t __STREXH(uint16_t value, uint16_t *addr); - -/** - * @brief STR Exclusive (32 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 32 bit values - */ -extern uint32_t __STREXW(uint32_t value, uint32_t *addr); - - - -#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -static __INLINE void __enable_irq() { __ASM volatile ("cpsie i"); } -static __INLINE void __disable_irq() { __ASM volatile ("cpsid i"); } - -static __INLINE void __enable_fault_irq() { __ASM volatile ("cpsie f"); } -static __INLINE void __disable_fault_irq() { __ASM volatile ("cpsid f"); } - -static __INLINE void __NOP() { __ASM volatile ("nop"); } -static __INLINE void __WFI() { __ASM volatile ("wfi"); } -static __INLINE void __WFE() { __ASM volatile ("wfe"); } -static __INLINE void __SEV() { __ASM volatile ("sev"); } -static __INLINE void __ISB() { __ASM volatile ("isb"); } -static __INLINE void __DSB() { __ASM volatile ("dsb"); } -static __INLINE void __DMB() { __ASM volatile ("dmb"); } -static __INLINE void __CLREX() { __ASM volatile ("clrex"); } - - -/** - * @brief Return the Process Stack Pointer - * - * @return ProcessStackPointer - * - * Return the actual process stack pointer - */ -extern uint32_t __get_PSP(void); - -/** - * @brief Set the Process Stack Pointer - * - * @param topOfProcStack Process Stack Pointer - * - * Assign the value ProcessStackPointer to the MSP - * (process stack pointer) Cortex processor register - */ -extern void __set_PSP(uint32_t topOfProcStack); - -/** - * @brief Return the Main Stack Pointer - * - * @return Main Stack Pointer - * - * Return the current value of the MSP (main stack pointer) - * Cortex processor register - */ -extern uint32_t __get_MSP(void); - -/** - * @brief Set the Main Stack Pointer - * - * @param topOfMainStack Main Stack Pointer - * - * Assign the value mainStackPointer to the MSP - * (main stack pointer) Cortex processor register - */ -extern void __set_MSP(uint32_t topOfMainStack); - -/** - * @brief Return the Base Priority value - * - * @return BasePriority - * - * Return the content of the base priority register - */ -extern uint32_t __get_BASEPRI(void); - -/** - * @brief Set the Base Priority value - * - * @param basePri BasePriority - * - * Set the base priority register - */ -extern void __set_BASEPRI(uint32_t basePri); - -/** - * @brief Return the Priority Mask value - * - * @return PriMask - * - * Return state of the priority mask bit from the priority mask register - */ -extern uint32_t __get_PRIMASK(void); - -/** - * @brief Set the Priority Mask value - * - * @param priMask PriMask - * - * Set the priority mask bit in the priority mask register - */ -extern void __set_PRIMASK(uint32_t priMask); - -/** - * @brief Return the Fault Mask value - * - * @return FaultMask - * - * Return the content of the fault mask register - */ -extern uint32_t __get_FAULTMASK(void); - -/** - * @brief Set the Fault Mask value - * - * @param faultMask faultMask value - * - * Set the fault mask register - */ -extern void __set_FAULTMASK(uint32_t faultMask); - -/** - * @brief Return the Control Register value -* -* @return Control value - * - * Return the content of the control register - */ -extern uint32_t __get_CONTROL(void); - -/** - * @brief Set the Control Register value - * - * @param control Control value - * - * Set the control register - */ -extern void __set_CONTROL(uint32_t control); - -/** - * @brief Reverse byte order in integer value - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in integer value - */ -extern uint32_t __REV(uint32_t value); - -/** - * @brief Reverse byte order in unsigned short value - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in unsigned short value - */ -extern uint32_t __REV16(uint16_t value); - -/** - * @brief Reverse byte order in signed short value with sign extension to integer - * - * @param value value to reverse - * @return reversed value - * - * Reverse byte order in signed short value with sign extension to integer - */ -extern int32_t __REVSH(int16_t value); - -/** - * @brief Reverse bit order of value - * - * @param value value to reverse - * @return reversed value - * - * Reverse bit order of value - */ -extern uint32_t __RBIT(uint32_t value); - -/** - * @brief LDR Exclusive (8 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 8 bit value - */ -extern uint8_t __LDREXB(uint8_t *addr); - -/** - * @brief LDR Exclusive (16 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 16 bit values - */ -extern uint16_t __LDREXH(uint16_t *addr); - -/** - * @brief LDR Exclusive (32 bit) - * - * @param *addr address pointer - * @return value of (*address) - * - * Exclusive LDR command for 32 bit values - */ -extern uint32_t __LDREXW(uint32_t *addr); - -/** - * @brief STR Exclusive (8 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 8 bit values - */ -extern uint32_t __STREXB(uint8_t value, uint8_t *addr); - -/** - * @brief STR Exclusive (16 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 16 bit values - */ -extern uint32_t __STREXH(uint16_t value, uint16_t *addr); - -/** - * @brief STR Exclusive (32 bit) - * - * @param value value to store - * @param *addr address pointer - * @return successful / failed - * - * Exclusive STR command for 32 bit values - */ -extern uint32_t __STREXW(uint32_t value, uint32_t *addr); - - -#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all instrinsics, - * Including the CMSIS ones. - */ - -#endif - - -/** @addtogroup CMSIS_CM3_Core_FunctionInterface CMSIS CM3 Core Function Interface - Core Function Interface containing: - - Core NVIC Functions - - Core SysTick Functions - - Core Reset Functions -*/ -/*@{*/ - -/* ########################## NVIC functions #################################### */ - -/** - * @brief Set the Priority Grouping in NVIC Interrupt Controller - * - * @param PriorityGroup is priority grouping field - * - * Set the priority grouping field using the required unlock sequence. - * The parameter priority_grouping is assigned to the field - * SCB->AIRCR [10:8] PRIGROUP field. Only values from 0..7 are used. - * In case of a conflict between priority grouping and available - * priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - */ -static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - (0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - -/** - * @brief Get the Priority Grouping from NVIC Interrupt Controller - * - * @return priority grouping field - * - * Get the priority grouping from NVIC Interrupt Controller. - * priority grouping is SCB->AIRCR [10:8] PRIGROUP field. - */ -static __INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - -/** - * @brief Enable Interrupt in NVIC Interrupt Controller - * - * @param IRQn The positive number of the external interrupt to enable - * - * Enable a device specific interupt in the NVIC interrupt controller. - * The interrupt number cannot be a negative value. - */ -static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ -} - -/** - * @brief Disable the interrupt line for external interrupt specified - * - * @param IRQn The positive number of the external interrupt to disable - * - * Disable a device specific interupt in the NVIC interrupt controller. - * The interrupt number cannot be a negative value. - */ -static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - -/** - * @brief Read the interrupt pending bit for a device specific interrupt source - * - * @param IRQn The number of the device specifc interrupt - * @return 1 = interrupt pending, 0 = interrupt not pending - * - * Read the pending register in NVIC and return 1 if its status is pending, - * otherwise it returns 0 - */ -static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - -/** - * @brief Set the pending bit for an external interrupt - * - * @param IRQn The number of the interrupt for set pending - * - * Set the pending bit for the specified interrupt. - * The interrupt number cannot be a negative value. - */ -static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - -/** - * @brief Clear the pending bit for an external interrupt - * - * @param IRQn The number of the interrupt for clear pending - * - * Clear the pending bit for the specified interrupt. - * The interrupt number cannot be a negative value. - */ -static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - -/** - * @brief Read the active bit for an external interrupt - * - * @param IRQn The number of the interrupt for read active bit - * @return 1 = interrupt active, 0 = interrupt not active - * - * Read the active register in NVIC and returns 1 if its status is active, - * otherwise it returns 0. - */ -static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - -/** - * @brief Set the priority for an interrupt - * - * @param IRQn The number of the interrupt for set priority - * @param priority The priority to set - * - * Set the priority for the specified interrupt. The interrupt - * number can be positive to specify an external (device specific) - * interrupt, or negative to specify an internal (core) interrupt. - * - * Note: The priority cannot be set for every core interrupt. - */ -static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - -/** - * @brief Read the priority for an interrupt - * - * @param IRQn The number of the interrupt for get priority - * @return The priority for the interrupt - * - * Read the priority for the specified interrupt. The interrupt - * number can be positive to specify an external (device specific) - * interrupt, or negative to specify an internal (core) interrupt. - * - * The returned priority value is automatically aligned to the implemented - * priority bits of the microcontroller. - * - * Note: The priority cannot be set for every core interrupt. - */ -static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M3 system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** - * @brief Encode the priority for an interrupt - * - * @param PriorityGroup The used priority group - * @param PreemptPriority The preemptive priority value (starting from 0) - * @param SubPriority The sub priority value (starting from 0) - * @return The encoded priority for the interrupt - * - * Encode the priority for an interrupt with the given priority group, - * preemptive priority value and sub priority value. - * In case of a conflict between priority grouping and available - * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - * - * The returned priority value can be used for NVIC_SetPriority(...) function - */ -static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** - * @brief Decode the priority of an interrupt - * - * @param Priority The priority for the interrupt - * @param PriorityGroup The used priority group - * @param pPreemptPriority The preemptive priority value (starting from 0) - * @param pSubPriority The sub priority value (starting from 0) - * - * Decode an interrupt priority value with the given priority group to - * preemptive priority value and sub priority value. - * In case of a conflict between priority grouping and available - * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - * - * The priority value can be retrieved with NVIC_GetPriority(...) function - */ -static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - - -/* ################################## SysTick function ############################################ */ - -#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0) - -/** - * @brief Initialize and start the SysTick counter and its interrupt. - * - * @param ticks number of ticks between two interrupts - * @return 1 = failed, 0 = successful - * - * Initialise the system tick timer and its interrupt and start the - * system tick timer / counter in free running mode to generate - * periodical interrupts. - */ -static __INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - - - - -/* ################################## Reset function ############################################ */ - -/** - * @brief Initiate a system reset request. - * - * Initiate a system reset request to reset the MCU - */ -static __INLINE void NVIC_SystemReset(void) -{ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@}*/ /* end of group CMSIS_CM3_Core_FunctionInterface */ - - - -/* ##################################### Debug In/Output function ########################################### */ - -/** @addtogroup CMSIS_CM3_CoreDebugInterface CMSIS CM3 Core Debug Interface - Core Debug Interface containing: - - Core Debug Receive / Transmit Functions - - Core Debug Defines - - Core Debug Variables -*/ -/*@{*/ - -extern volatile int ITM_RxBuffer; /*!< variable to receive characters */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< value identifying ITM_RxBuffer is ready for next character */ - - -/** - * @brief Outputs a character via the ITM channel 0 - * - * @param ch character to output - * @return character to output - * - * The function outputs a character via the ITM channel 0. - * The function returns when no debugger is connected that has booked the output. - * It is blocking when a debugger is connected, but the previous character send is not transmitted. - */ -static __INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && /* Trace enabled */ - (ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1ul << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** - * @brief Inputs a character via variable ITM_RxBuffer - * - * @return received character, -1 = no character received - * - * The function inputs a character via variable ITM_RxBuffer. - * The function returns when no debugger is connected that has booked the output. - * It is blocking when a debugger is connected, but the previous character send is not transmitted. - */ -static __INLINE int ITM_ReceiveChar (void) { - int ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - * @brief Check if a character via variable ITM_RxBuffer is available - * - * @return 1 = character available, 0 = no character available - * - * The function checks variable ITM_RxBuffer whether a character is available or not. - * The function returns '1' if a character is available and '0' if no character is available. - */ -static __INLINE int ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@}*/ /* end of group CMSIS_CM3_core_DebugInterface */ - - -#ifdef __cplusplus -} -#endif - -/*@}*/ /* end of group CMSIS_CM3_core_definitions */ - -#endif /* __CM3_CORE_H__ */ - -/*lint -restore */ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/Release_Notes_for_STM32F10x_CMSIS.html b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/Release_Notes_for_STM32F10x_CMSIS.html deleted file mode 100644 index 407e7b6b41..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/Release_Notes_for_STM32F10x_CMSIS.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - -Release Notes for STM32F10x CMSIS - - - - -
-


-

-
- - - - - - -
- - - - - - - - - -
Back to Release page
-

Release -Notes for STM32F10x CMSIS

-

Copyright 2010 STMicroelectronics

-

-
-

 

- - - - - - -
-

Contents

-
    -
  1. STM32F10x CMSIS -update History
  2. -
  3. License
  4. -
- -

STM32F10x CMSIS -update History

-

3.2.0 -- 03/01/2010

-
    -
  1. General
  2. -
-
    - -
  • STM32F10x CMSIS files updated to CMSIS V1.30 release
  • -
  • Directory structure updated to be aligned with CMSIS V1.30
    -
  • -
  • Add support -for STM32 Low-density Value line (STM32F100x4/6) and -Medium-density Value line (STM32F100x8/B) devices
  • - -
-
    -
  1. CMSIS Core Peripheral Access Layer
- -
    -
  1. STM32F10x CMSIS Device Peripheral Access Layer
  2. - -
- -
    - -
  • STM32F10x CMSIS Cortex-M3 Device Peripheral Access Layer Header File: stm32f10x.h
    -
  • -
      -
    • Update -the stm32f10x.h file to support new Value line devices features: CEC -peripheral, new General purpose timers TIM15, TIM16 and TIM17.
    • -
    • Peripherals Bits definitions updated to be in line with Value line devices available features.
      -
    • -
    • HSE_Value, -HSI_Value and HSEStartup_TimeOut changed to upper case: HSE_VALUE, -HSI_VALUE and HSE_STARTUP_TIMEOUT. Old names are kept for legacy -purposes.
      -
    • -
    -
  • STM32F10x CMSIS Cortex-M3 Device Peripheral Access Layer System Files: system_stm32f10x.h and system_stm32f10x.c
    -
  • -
      -
    • SystemFrequency variable name changed to SystemCoreClock
      -
    • -
    • Default - SystemCoreClock is changed to 24MHz when Value line devices are selected and to 72MHz on other devices.
      -
    • -
    • All while(1) loop were removed from all clock setting functions. User has to handle the HSE startup failure.
      -
    • -
    • Additional function void SystemCoreClockUpdate (void) is provided.
      -
    • -
    -
  • STM32F10x CMSIS Startup files: startup_stm32f10x_xx.s
  • -
      -
    • Add new -startup files for STM32 Low-density Value line devices: - startup_stm32f10x_ld_vl.s
    • -
    • Add new startup -files for STM32 Medium-density Value line devices: - startup_stm32f10x_md_vl.s
    • -
    • SystemInit() function is called from startup file (startup_stm32f10x_xx.s) before to branch to application main.
      -To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file
      -
    • -
    • GNU startup file for Low density devices (startup_stm32f10x_ld.s) is updated to fix compilation errors.
      -
    • -
    - -
- -
    -
-

License

-

The -enclosed firmware and all the related documentation are not covered by -a License Agreement, if you need such License you can contact your -local STMicroelectronics office.

-

THE -PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO -SAVE TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR -ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY -CLAIMS ARISING FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY -CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH -THEIR PRODUCTS.

-

 

-
-
-

For -complete documentation on STM32(CORTEX M3) 32-Bit Microcontrollers -visit www.st.com/STM32

-
-

-
-
-

 

-
- \ No newline at end of file diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_cl.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_cl.s deleted file mode 100644 index 1796d1c40c..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_cl.s +++ /dev/null @@ -1,368 +0,0 @@ -;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_cl.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Connectivity line devices vector table for RVMDK -;* toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the clock system -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;******************************************************************************* - -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1 and ADC2 - DCD CAN1_TX_IRQHandler ; CAN1 TX - DCD CAN1_RX0_IRQHandler ; CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_IRQHandler ; TIM1 Break - DCD TIM1_UP_IRQHandler ; TIM1 Update - DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C1 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC alarm through EXTI line - DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM5_IRQHandler ; TIM5 - DCD SPI3_IRQHandler ; SPI3 - DCD UART4_IRQHandler ; UART4 - DCD UART5_IRQHandler ; UART5 - DCD TIM6_IRQHandler ; TIM6 - DCD TIM7_IRQHandler ; TIM7 - DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 - DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 - DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 - DCD DMA2_Channel4_IRQHandler ; DMA2 Channel4 - DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5 - DCD ETH_IRQHandler ; Ethernet - DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line - DCD CAN2_TX_IRQHandler ; CAN2 TX - DCD CAN2_RX0_IRQHandler ; CAN2 RX0 - DCD CAN2_RX1_IRQHandler ; CAN2 RX1 - DCD CAN2_SCE_IRQHandler ; CAN2 SCE - DCD OTG_FS_IRQHandler ; USB OTG FS -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT SystemInit - IMPORT __main - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMPER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT ADC1_2_IRQHandler [WEAK] - EXPORT CAN1_TX_IRQHandler [WEAK] - EXPORT CAN1_RX0_IRQHandler [WEAK] - EXPORT CAN1_RX1_IRQHandler [WEAK] - EXPORT CAN1_SCE_IRQHandler [WEAK] - EXPORT EXTI9_5_IRQHandler [WEAK] - EXPORT TIM1_BRK_IRQHandler [WEAK] - EXPORT TIM1_UP_IRQHandler [WEAK] - EXPORT TIM1_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM4_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT USART3_IRQHandler [WEAK] - EXPORT EXTI15_10_IRQHandler [WEAK] - EXPORT RTCAlarm_IRQHandler [WEAK] - EXPORT OTG_FS_WKUP_IRQHandler [WEAK] - EXPORT TIM5_IRQHandler [WEAK] - EXPORT SPI3_IRQHandler [WEAK] - EXPORT UART4_IRQHandler [WEAK] - EXPORT UART5_IRQHandler [WEAK] - EXPORT TIM6_IRQHandler [WEAK] - EXPORT TIM7_IRQHandler [WEAK] - EXPORT DMA2_Channel1_IRQHandler [WEAK] - EXPORT DMA2_Channel2_IRQHandler [WEAK] - EXPORT DMA2_Channel3_IRQHandler [WEAK] - EXPORT DMA2_Channel4_IRQHandler [WEAK] - EXPORT DMA2_Channel5_IRQHandler [WEAK] - EXPORT ETH_IRQHandler [WEAK] - EXPORT ETH_WKUP_IRQHandler [WEAK] - EXPORT CAN2_TX_IRQHandler [WEAK] - EXPORT CAN2_RX0_IRQHandler [WEAK] - EXPORT CAN2_RX1_IRQHandler [WEAK] - EXPORT CAN2_SCE_IRQHandler [WEAK] - EXPORT OTG_FS_IRQHandler [WEAK] - -WWDG_IRQHandler -PVD_IRQHandler -TAMPER_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_IRQHandler -DMA1_Channel3_IRQHandler -DMA1_Channel4_IRQHandler -DMA1_Channel5_IRQHandler -DMA1_Channel6_IRQHandler -DMA1_Channel7_IRQHandler -ADC1_2_IRQHandler -CAN1_TX_IRQHandler -CAN1_RX0_IRQHandler -CAN1_RX1_IRQHandler -CAN1_SCE_IRQHandler -EXTI9_5_IRQHandler -TIM1_BRK_IRQHandler -TIM1_UP_IRQHandler -TIM1_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM4_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -I2C2_EV_IRQHandler -I2C2_ER_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -USART3_IRQHandler -EXTI15_10_IRQHandler -RTCAlarm_IRQHandler -OTG_FS_WKUP_IRQHandler -TIM5_IRQHandler -SPI3_IRQHandler -UART4_IRQHandler -UART5_IRQHandler -TIM6_IRQHandler -TIM7_IRQHandler -DMA2_Channel1_IRQHandler -DMA2_Channel2_IRQHandler -DMA2_Channel3_IRQHandler -DMA2_Channel4_IRQHandler -DMA2_Channel5_IRQHandler -ETH_IRQHandler -ETH_WKUP_IRQHandler -CAN2_TX_IRQHandler -CAN2_RX0_IRQHandler -CAN2_RX1_IRQHandler -CAN2_SCE_IRQHandler -OTG_FS_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE***** diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s deleted file mode 100644 index 1d7df99b48..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s +++ /dev/null @@ -1,358 +0,0 @@ -;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_hd.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x High Density Devices vector table for RVMDK -;* toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the clock system and also configure the external -;* SRAM mounted on STM3210E-EVAL board to be used as data -;* memory (optional, to be enabled by user) -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;******************************************************************************* - -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1 & ADC2 - DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX - DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_IRQHandler ; TIM1 Break - DCD TIM1_UP_IRQHandler ; TIM1 Update - DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend - DCD TIM8_BRK_IRQHandler ; TIM8 Break - DCD TIM8_UP_IRQHandler ; TIM8 Update - DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation - DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare - DCD ADC3_IRQHandler ; ADC3 - DCD FSMC_IRQHandler ; FSMC - DCD SDIO_IRQHandler ; SDIO - DCD TIM5_IRQHandler ; TIM5 - DCD SPI3_IRQHandler ; SPI3 - DCD UART4_IRQHandler ; UART4 - DCD UART5_IRQHandler ; UART5 - DCD TIM6_IRQHandler ; TIM6 - DCD TIM7_IRQHandler ; TIM7 - DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 - DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 - DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 - DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMPER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT ADC1_2_IRQHandler [WEAK] - EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] - EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] - EXPORT CAN1_RX1_IRQHandler [WEAK] - EXPORT CAN1_SCE_IRQHandler [WEAK] - EXPORT EXTI9_5_IRQHandler [WEAK] - EXPORT TIM1_BRK_IRQHandler [WEAK] - EXPORT TIM1_UP_IRQHandler [WEAK] - EXPORT TIM1_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM4_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT USART3_IRQHandler [WEAK] - EXPORT EXTI15_10_IRQHandler [WEAK] - EXPORT RTCAlarm_IRQHandler [WEAK] - EXPORT USBWakeUp_IRQHandler [WEAK] - EXPORT TIM8_BRK_IRQHandler [WEAK] - EXPORT TIM8_UP_IRQHandler [WEAK] - EXPORT TIM8_TRG_COM_IRQHandler [WEAK] - EXPORT TIM8_CC_IRQHandler [WEAK] - EXPORT ADC3_IRQHandler [WEAK] - EXPORT FSMC_IRQHandler [WEAK] - EXPORT SDIO_IRQHandler [WEAK] - EXPORT TIM5_IRQHandler [WEAK] - EXPORT SPI3_IRQHandler [WEAK] - EXPORT UART4_IRQHandler [WEAK] - EXPORT UART5_IRQHandler [WEAK] - EXPORT TIM6_IRQHandler [WEAK] - EXPORT TIM7_IRQHandler [WEAK] - EXPORT DMA2_Channel1_IRQHandler [WEAK] - EXPORT DMA2_Channel2_IRQHandler [WEAK] - EXPORT DMA2_Channel3_IRQHandler [WEAK] - EXPORT DMA2_Channel4_5_IRQHandler [WEAK] - -WWDG_IRQHandler -PVD_IRQHandler -TAMPER_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_IRQHandler -DMA1_Channel3_IRQHandler -DMA1_Channel4_IRQHandler -DMA1_Channel5_IRQHandler -DMA1_Channel6_IRQHandler -DMA1_Channel7_IRQHandler -ADC1_2_IRQHandler -USB_HP_CAN1_TX_IRQHandler -USB_LP_CAN1_RX0_IRQHandler -CAN1_RX1_IRQHandler -CAN1_SCE_IRQHandler -EXTI9_5_IRQHandler -TIM1_BRK_IRQHandler -TIM1_UP_IRQHandler -TIM1_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM4_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -I2C2_EV_IRQHandler -I2C2_ER_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -USART3_IRQHandler -EXTI15_10_IRQHandler -RTCAlarm_IRQHandler -USBWakeUp_IRQHandler -TIM8_BRK_IRQHandler -TIM8_UP_IRQHandler -TIM8_TRG_COM_IRQHandler -TIM8_CC_IRQHandler -ADC3_IRQHandler -FSMC_IRQHandler -SDIO_IRQHandler -TIM5_IRQHandler -SPI3_IRQHandler -UART4_IRQHandler -UART5_IRQHandler -TIM6_IRQHandler -TIM7_IRQHandler -DMA2_Channel1_IRQHandler -DMA2_Channel2_IRQHandler -DMA2_Channel3_IRQHandler -DMA2_Channel4_5_IRQHandler - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE***** diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld.s deleted file mode 100644 index 2e3573b400..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld.s +++ /dev/null @@ -1,297 +0,0 @@ -;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_ld.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Low Density Devices vector table for RVMDK -;* toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the clock system -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;******************************************************************************* - -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1_2 - DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX - DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_IRQHandler ; TIM1 Break - DCD TIM1_UP_IRQHandler ; TIM1 Update - DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD 0 ; Reserved - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler routine -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMPER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT ADC1_2_IRQHandler [WEAK] - EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] - EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] - EXPORT CAN1_RX1_IRQHandler [WEAK] - EXPORT CAN1_SCE_IRQHandler [WEAK] - EXPORT EXTI9_5_IRQHandler [WEAK] - EXPORT TIM1_BRK_IRQHandler [WEAK] - EXPORT TIM1_UP_IRQHandler [WEAK] - EXPORT TIM1_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT EXTI15_10_IRQHandler [WEAK] - EXPORT RTCAlarm_IRQHandler [WEAK] - EXPORT USBWakeUp_IRQHandler [WEAK] - -WWDG_IRQHandler -PVD_IRQHandler -TAMPER_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_IRQHandler -DMA1_Channel3_IRQHandler -DMA1_Channel4_IRQHandler -DMA1_Channel5_IRQHandler -DMA1_Channel6_IRQHandler -DMA1_Channel7_IRQHandler -ADC1_2_IRQHandler -USB_HP_CAN1_TX_IRQHandler -USB_LP_CAN1_RX0_IRQHandler -CAN1_RX1_IRQHandler -CAN1_SCE_IRQHandler -EXTI9_5_IRQHandler -TIM1_BRK_IRQHandler -TIM1_UP_IRQHandler -TIM1_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -SPI1_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -EXTI15_10_IRQHandler -RTCAlarm_IRQHandler -USBWakeUp_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE***** diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld_vl.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld_vl.s deleted file mode 100644 index f1e5cf9752..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_ld_vl.s +++ /dev/null @@ -1,304 +0,0 @@ -;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_ld_vl.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Low Density Value Line Devices vector table -;* for RVMDK toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the clock system -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;******************************************************************************* - -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_IRQHandler ; ADC1 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 - DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 - DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD 0 ; Reserved - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD CEC_IRQHandler ; HDMI-CEC - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun - DCD TIM7_IRQHandler ; TIM7 -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMPER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT ADC1_IRQHandler [WEAK] - EXPORT EXTI9_5_IRQHandler [WEAK] - EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK] - EXPORT TIM1_UP_TIM16_IRQHandler [WEAK] - EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT EXTI15_10_IRQHandler [WEAK] - EXPORT RTCAlarm_IRQHandler [WEAK] - EXPORT CEC_IRQHandler [WEAK] - EXPORT TIM6_DAC_IRQHandler [WEAK] - EXPORT TIM7_IRQHandler [WEAK] -WWDG_IRQHandler -PVD_IRQHandler -TAMPER_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_IRQHandler -DMA1_Channel3_IRQHandler -DMA1_Channel4_IRQHandler -DMA1_Channel5_IRQHandler -DMA1_Channel6_IRQHandler -DMA1_Channel7_IRQHandler -ADC1_IRQHandler -EXTI9_5_IRQHandler -TIM1_BRK_TIM15_IRQHandler -TIM1_UP_TIM16_IRQHandler -TIM1_TRG_COM_TIM17_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -SPI1_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -EXTI15_10_IRQHandler -RTCAlarm_IRQHandler -CEC_IRQHandler -TIM6_DAC_IRQHandler -TIM7_IRQHandler - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE***** diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md.s deleted file mode 100644 index 7c4e8eaa0c..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md.s +++ /dev/null @@ -1,307 +0,0 @@ -;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_md.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Medium Density Devices vector table for RVMDK -;* toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the clock system -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;******************************************************************************* - -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1_2 - DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX - DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_IRQHandler ; TIM1 Break - DCD TIM1_UP_IRQHandler ; TIM1 Update - DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMPER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT ADC1_2_IRQHandler [WEAK] - EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] - EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] - EXPORT CAN1_RX1_IRQHandler [WEAK] - EXPORT CAN1_SCE_IRQHandler [WEAK] - EXPORT EXTI9_5_IRQHandler [WEAK] - EXPORT TIM1_BRK_IRQHandler [WEAK] - EXPORT TIM1_UP_IRQHandler [WEAK] - EXPORT TIM1_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM4_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT USART3_IRQHandler [WEAK] - EXPORT EXTI15_10_IRQHandler [WEAK] - EXPORT RTCAlarm_IRQHandler [WEAK] - EXPORT USBWakeUp_IRQHandler [WEAK] - -WWDG_IRQHandler -PVD_IRQHandler -TAMPER_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_IRQHandler -DMA1_Channel3_IRQHandler -DMA1_Channel4_IRQHandler -DMA1_Channel5_IRQHandler -DMA1_Channel6_IRQHandler -DMA1_Channel7_IRQHandler -ADC1_2_IRQHandler -USB_HP_CAN1_TX_IRQHandler -USB_LP_CAN1_RX0_IRQHandler -CAN1_RX1_IRQHandler -CAN1_SCE_IRQHandler -EXTI9_5_IRQHandler -TIM1_BRK_IRQHandler -TIM1_UP_IRQHandler -TIM1_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM4_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -I2C2_EV_IRQHandler -I2C2_ER_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -USART3_IRQHandler -EXTI15_10_IRQHandler -RTCAlarm_IRQHandler -USBWakeUp_IRQHandler - - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE***** diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md_vl.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md_vl.s deleted file mode 100644 index 8956fb6716..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_md_vl.s +++ /dev/null @@ -1,315 +0,0 @@ -;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_md_vl.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Medium Density Value Line Devices vector table -;* for RVMDK toolchain. -;* This module performs: -;* - Set the initial SP -;* - Set the initial PC == Reset_Handler -;* - Set the vector table entries with the exceptions ISR address -;* - Configure the clock system -;* - Branches to __main in the C library (which eventually -;* calls main()). -;* After Reset the CortexM3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;******************************************************************************* - -; Amount of memory (in bytes) allocated for Stack -; Tailor this value to your application needs -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Stack_Size EQU 0x00000400 - - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp - - -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; - -Heap_Size EQU 0x00000200 - - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB - - -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size - -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_IRQHandler ; ADC1 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 - DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 - DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD CEC_IRQHandler ; HDMI-CEC - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun - DCD TIM7_IRQHandler ; TIM7 -__Vectors_End - -__Vectors_Size EQU __Vectors_End - __Vectors - - AREA |.text|, CODE, READONLY - -; Reset handler -Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMPER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT ADC1_IRQHandler [WEAK] - EXPORT EXTI9_5_IRQHandler [WEAK] - EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK] - EXPORT TIM1_UP_TIM16_IRQHandler [WEAK] - EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM4_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT USART3_IRQHandler [WEAK] - EXPORT EXTI15_10_IRQHandler [WEAK] - EXPORT RTCAlarm_IRQHandler [WEAK] - EXPORT CEC_IRQHandler [WEAK] - EXPORT TIM6_DAC_IRQHandler [WEAK] - EXPORT TIM7_IRQHandler [WEAK] - -WWDG_IRQHandler -PVD_IRQHandler -TAMPER_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_IRQHandler -DMA1_Channel3_IRQHandler -DMA1_Channel4_IRQHandler -DMA1_Channel5_IRQHandler -DMA1_Channel6_IRQHandler -DMA1_Channel7_IRQHandler -ADC1_IRQHandler -EXTI9_5_IRQHandler -TIM1_BRK_TIM15_IRQHandler -TIM1_UP_TIM16_IRQHandler -TIM1_TRG_COM_TIM17_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM4_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -I2C2_EV_IRQHandler -I2C2_ER_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -USART3_IRQHandler -EXTI15_10_IRQHandler -RTCAlarm_IRQHandler -CEC_IRQHandler -TIM6_DAC_IRQHandler -TIM7_IRQHandler - B . - - ENDP - - ALIGN - -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB - - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF - - END - -;******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE***** diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s deleted file mode 100644 index bb37cd6552..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s +++ /dev/null @@ -1,467 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f10x_cl.s - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief STM32F10x Connectivity line Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR - * address. - * - Configure the clock system - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M3 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ******************************************************************************* - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - - .syntax unified - .cpu cortex-m3 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF1E0F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss - -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call the application's entry point.*/ - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler - -/****************************************************************************** -* -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -*******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word TAMPER_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_IRQHandler - .word EXTI1_IRQHandler - .word EXTI2_IRQHandler - .word EXTI3_IRQHandler - .word EXTI4_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_IRQHandler - .word DMA1_Channel3_IRQHandler - .word DMA1_Channel4_IRQHandler - .word DMA1_Channel5_IRQHandler - .word DMA1_Channel6_IRQHandler - .word DMA1_Channel7_IRQHandler - .word ADC1_2_IRQHandler - .word CAN1_TX_IRQHandler - .word CAN1_RX0_IRQHandler - .word CAN1_RX1_IRQHandler - .word CAN1_SCE_IRQHandler - .word EXTI9_5_IRQHandler - .word TIM1_BRK_IRQHandler - .word TIM1_UP_IRQHandler - .word TIM1_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM4_IRQHandler - .word I2C1_EV_IRQHandler - .word I2C1_ER_IRQHandler - .word I2C2_EV_IRQHandler - .word I2C2_ER_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word USART3_IRQHandler - .word EXTI15_10_IRQHandler - .word RTCAlarm_IRQHandler - .word OTG_FS_WKUP_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word TIM5_IRQHandler - .word SPI3_IRQHandler - .word UART4_IRQHandler - .word UART5_IRQHandler - .word TIM6_IRQHandler - .word TIM7_IRQHandler - .word DMA2_Channel1_IRQHandler - .word DMA2_Channel2_IRQHandler - .word DMA2_Channel3_IRQHandler - .word DMA2_Channel4_IRQHandler - .word DMA2_Channel5_IRQHandler - .word ETH_IRQHandler - .word ETH_WKUP_IRQHandler - .word CAN2_TX_IRQHandler - .word CAN2_RX0_IRQHandler - .word CAN2_RX1_IRQHandler - .word CAN2_SCE_IRQHandler - .word OTG_FS_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word BootRAM /* @0x1E0. This is for boot in RAM mode for - STM32F10x Connectivity line Devices. */ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMPER_IRQHandler - .thumb_set TAMPER_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_IRQHandler - .thumb_set DMA1_Channel2_IRQHandler,Default_Handler - - .weak DMA1_Channel3_IRQHandler - .thumb_set DMA1_Channel3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_IRQHandler - .thumb_set DMA1_Channel4_IRQHandler,Default_Handler - - .weak DMA1_Channel5_IRQHandler - .thumb_set DMA1_Channel5_IRQHandler,Default_Handler - - .weak DMA1_Channel6_IRQHandler - .thumb_set DMA1_Channel6_IRQHandler,Default_Handler - - .weak DMA1_Channel7_IRQHandler - .thumb_set DMA1_Channel7_IRQHandler,Default_Handler - - .weak ADC1_2_IRQHandler - .thumb_set ADC1_2_IRQHandler,Default_Handler - - .weak CAN1_TX_IRQHandler - .thumb_set CAN1_TX_IRQHandler,Default_Handler - - .weak CAN1_RX0_IRQHandler - .thumb_set CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_IRQHandler - .thumb_set TIM1_BRK_IRQHandler,Default_Handler - - .weak TIM1_UP_IRQHandler - .thumb_set TIM1_UP_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_IRQHandler - .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTCAlarm_IRQHandler - .thumb_set RTCAlarm_IRQHandler,Default_Handler - - .weak OTG_FS_WKUP_IRQHandler - .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler - - .weak TIM5_IRQHandler - .thumb_set TIM5_IRQHandler,Default_Handler - - .weak SPI3_IRQHandler - .thumb_set SPI3_IRQHandler,Default_Handler - - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler - - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler - - .weak TIM6_IRQHandler - .thumb_set TIM6_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak DMA2_Channel1_IRQHandler - .thumb_set DMA2_Channel1_IRQHandler,Default_Handler - - .weak DMA2_Channel2_IRQHandler - .thumb_set DMA2_Channel2_IRQHandler,Default_Handler - - .weak DMA2_Channel3_IRQHandler - .thumb_set DMA2_Channel3_IRQHandler,Default_Handler - - .weak DMA2_Channel4_IRQHandler - .thumb_set DMA2_Channel4_IRQHandler,Default_Handler - - .weak DMA2_Channel5_IRQHandler - .thumb_set DMA2_Channel5_IRQHandler,Default_Handler - - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler - - .weak ETH_WKUP_IRQHandler - .thumb_set ETH_WKUP_IRQHandler,Default_Handler - - .weak CAN2_TX_IRQHandler - .thumb_set CAN2_TX_IRQHandler,Default_Handler - - .weak CAN2_RX0_IRQHandler - .thumb_set CAN2_RX0_IRQHandler,Default_Handler - - .weak CAN2_RX1_IRQHandler - .thumb_set CAN2_RX1_IRQHandler,Default_Handler - - .weak CAN2_SCE_IRQHandler - .thumb_set CAN2_SCE_IRQHandler,Default_Handler - - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler ,Default_Handler - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s deleted file mode 100644 index cce913b184..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s +++ /dev/null @@ -1,464 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f10x_hd.s - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief STM32F10x High Density Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the clock system and the external SRAM mounted on - * STM3210E-EVAL board to be used as data memory (optional, - * to be enabled by user) - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M3 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ******************************************************************************* - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - - .syntax unified - .cpu cortex-m3 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss -/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - -.equ BootRAM, 0xF1E0F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call the application's entry point.*/ - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -*******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word TAMPER_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_IRQHandler - .word EXTI1_IRQHandler - .word EXTI2_IRQHandler - .word EXTI3_IRQHandler - .word EXTI4_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_IRQHandler - .word DMA1_Channel3_IRQHandler - .word DMA1_Channel4_IRQHandler - .word DMA1_Channel5_IRQHandler - .word DMA1_Channel6_IRQHandler - .word DMA1_Channel7_IRQHandler - .word ADC1_2_IRQHandler - .word USB_HP_CAN1_TX_IRQHandler - .word USB_LP_CAN1_RX0_IRQHandler - .word CAN1_RX1_IRQHandler - .word CAN1_SCE_IRQHandler - .word EXTI9_5_IRQHandler - .word TIM1_BRK_IRQHandler - .word TIM1_UP_IRQHandler - .word TIM1_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM4_IRQHandler - .word I2C1_EV_IRQHandler - .word I2C1_ER_IRQHandler - .word I2C2_EV_IRQHandler - .word I2C2_ER_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word USART3_IRQHandler - .word EXTI15_10_IRQHandler - .word RTCAlarm_IRQHandler - .word USBWakeUp_IRQHandler - .word TIM8_BRK_IRQHandler - .word TIM8_UP_IRQHandler - .word TIM8_TRG_COM_IRQHandler - .word TIM8_CC_IRQHandler - .word ADC3_IRQHandler - .word FSMC_IRQHandler - .word SDIO_IRQHandler - .word TIM5_IRQHandler - .word SPI3_IRQHandler - .word UART4_IRQHandler - .word UART5_IRQHandler - .word TIM6_IRQHandler - .word TIM7_IRQHandler - .word DMA2_Channel1_IRQHandler - .word DMA2_Channel2_IRQHandler - .word DMA2_Channel3_IRQHandler - .word DMA2_Channel4_5_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word BootRAM /* @0x1E0. This is for boot in RAM mode for - STM32F10x High Density devices. */ -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMPER_IRQHandler - .thumb_set TAMPER_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_IRQHandler - .thumb_set DMA1_Channel2_IRQHandler,Default_Handler - - .weak DMA1_Channel3_IRQHandler - .thumb_set DMA1_Channel3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_IRQHandler - .thumb_set DMA1_Channel4_IRQHandler,Default_Handler - - .weak DMA1_Channel5_IRQHandler - .thumb_set DMA1_Channel5_IRQHandler,Default_Handler - - .weak DMA1_Channel6_IRQHandler - .thumb_set DMA1_Channel6_IRQHandler,Default_Handler - - .weak DMA1_Channel7_IRQHandler - .thumb_set DMA1_Channel7_IRQHandler,Default_Handler - - .weak ADC1_2_IRQHandler - .thumb_set ADC1_2_IRQHandler,Default_Handler - - .weak USB_HP_CAN1_TX_IRQHandler - .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler - - .weak USB_LP_CAN1_RX0_IRQHandler - .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_IRQHandler - .thumb_set TIM1_BRK_IRQHandler,Default_Handler - - .weak TIM1_UP_IRQHandler - .thumb_set TIM1_UP_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_IRQHandler - .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTCAlarm_IRQHandler - .thumb_set RTCAlarm_IRQHandler,Default_Handler - - .weak USBWakeUp_IRQHandler - .thumb_set USBWakeUp_IRQHandler,Default_Handler - - .weak TIM8_BRK_IRQHandler - .thumb_set TIM8_BRK_IRQHandler,Default_Handler - - .weak TIM8_UP_IRQHandler - .thumb_set TIM8_UP_IRQHandler,Default_Handler - - .weak TIM8_TRG_COM_IRQHandler - .thumb_set TIM8_TRG_COM_IRQHandler,Default_Handler - - .weak TIM8_CC_IRQHandler - .thumb_set TIM8_CC_IRQHandler,Default_Handler - - .weak ADC3_IRQHandler - .thumb_set ADC3_IRQHandler,Default_Handler - - .weak FSMC_IRQHandler - .thumb_set FSMC_IRQHandler,Default_Handler - - .weak SDIO_IRQHandler - .thumb_set SDIO_IRQHandler,Default_Handler - - .weak TIM5_IRQHandler - .thumb_set TIM5_IRQHandler,Default_Handler - - .weak SPI3_IRQHandler - .thumb_set SPI3_IRQHandler,Default_Handler - - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler - - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler - - .weak TIM6_IRQHandler - .thumb_set TIM6_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak DMA2_Channel1_IRQHandler - .thumb_set DMA2_Channel1_IRQHandler,Default_Handler - - .weak DMA2_Channel2_IRQHandler - .thumb_set DMA2_Channel2_IRQHandler,Default_Handler - - .weak DMA2_Channel3_IRQHandler - .thumb_set DMA2_Channel3_IRQHandler,Default_Handler - - .weak DMA2_Channel4_5_IRQHandler - .thumb_set DMA2_Channel4_5_IRQHandler,Default_Handler - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s deleted file mode 100644 index ed7917ed18..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s +++ /dev/null @@ -1,342 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f10x_ld.s - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief STM32F10x Low Density Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the clock system - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M3 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ******************************************************************************* - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - - .syntax unified - .cpu cortex-m3 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call the application's entry point.*/ - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word TAMPER_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_IRQHandler - .word EXTI1_IRQHandler - .word EXTI2_IRQHandler - .word EXTI3_IRQHandler - .word EXTI4_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_IRQHandler - .word DMA1_Channel3_IRQHandler - .word DMA1_Channel4_IRQHandler - .word DMA1_Channel5_IRQHandler - .word DMA1_Channel6_IRQHandler - .word DMA1_Channel7_IRQHandler - .word ADC1_2_IRQHandler - .word USB_HP_CAN1_TX_IRQHandler - .word USB_LP_CAN1_RX0_IRQHandler - .word CAN1_RX1_IRQHandler - .word CAN1_SCE_IRQHandler - .word EXTI9_5_IRQHandler - .word TIM1_BRK_IRQHandler - .word TIM1_UP_IRQHandler - .word TIM1_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word 0 - .word I2C1_EV_IRQHandler - .word I2C1_ER_IRQHandler - .word 0 - .word 0 - .word SPI1_IRQHandler - .word 0 - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word EXTI15_10_IRQHandler - .word RTCAlarm_IRQHandler - .word USBWakeUp_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word BootRAM /* @0x108. This is for boot in RAM mode for - STM32F10x Low Density devices.*/ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMPER_IRQHandler - .thumb_set TAMPER_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_IRQHandler - .thumb_set DMA1_Channel2_IRQHandler,Default_Handler - - .weak DMA1_Channel3_IRQHandler - .thumb_set DMA1_Channel3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_IRQHandler - .thumb_set DMA1_Channel4_IRQHandler,Default_Handler - - .weak DMA1_Channel5_IRQHandler - .thumb_set DMA1_Channel5_IRQHandler,Default_Handler - - .weak DMA1_Channel6_IRQHandler - .thumb_set DMA1_Channel6_IRQHandler,Default_Handler - - .weak DMA1_Channel7_IRQHandler - .thumb_set DMA1_Channel7_IRQHandler,Default_Handler - - .weak ADC1_2_IRQHandler - .thumb_set ADC1_2_IRQHandler,Default_Handler - - .weak USB_HP_CAN1_TX_IRQHandler - .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler - - .weak USB_LP_CAN1_RX0_IRQHandler - .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_IRQHandler - .thumb_set TIM1_BRK_IRQHandler,Default_Handler - - .weak TIM1_UP_IRQHandler - .thumb_set TIM1_UP_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_IRQHandler - .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTCAlarm_IRQHandler - .thumb_set RTCAlarm_IRQHandler,Default_Handler - - .weak USBWakeUp_IRQHandler - .thumb_set USBWakeUp_IRQHandler,Default_Handler - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s deleted file mode 100644 index 0e80bde51a..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s +++ /dev/null @@ -1,382 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f10x_ld_vl.s - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief STM32F10x Low Density Value Line Devices vector table for RIDE7 - * toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the clock system - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M3 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ******************************************************************************* - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - - .syntax unified - .cpu cortex-m3 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call the application's entry point.*/ - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word TAMPER_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_IRQHandler - .word EXTI1_IRQHandler - .word EXTI2_IRQHandler - .word EXTI3_IRQHandler - .word EXTI4_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_IRQHandler - .word DMA1_Channel3_IRQHandler - .word DMA1_Channel4_IRQHandler - .word DMA1_Channel5_IRQHandler - .word DMA1_Channel6_IRQHandler - .word DMA1_Channel7_IRQHandler - .word ADC1_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word EXTI9_5_IRQHandler - .word TIM1_BRK_TIM15_IRQHandler - .word TIM1_UP_TIM16_IRQHandler - .word TIM1_TRG_COM_TIM17_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word 0 - .word I2C1_EV_IRQHandler - .word I2C1_ER_IRQHandler - .word 0 - .word 0 - .word SPI1_IRQHandler - .word 0 - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word EXTI15_10_IRQHandler - .word RTCAlarm_IRQHandler - .word CEC_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word TIM6_DAC_IRQHandler - .word TIM7_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word BootRAM /* @0x01CC. This is for boot in RAM mode for - STM32F10x Low Density Value Line devices. */ - -/******************************************************************************* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMPER_IRQHandler - .thumb_set TAMPER_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_IRQHandler - .thumb_set DMA1_Channel2_IRQHandler,Default_Handler - - .weak DMA1_Channel3_IRQHandler - .thumb_set DMA1_Channel3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_IRQHandler - .thumb_set DMA1_Channel4_IRQHandler,Default_Handler - - .weak DMA1_Channel5_IRQHandler - .thumb_set DMA1_Channel5_IRQHandler,Default_Handler - - .weak DMA1_Channel6_IRQHandler - .thumb_set DMA1_Channel6_IRQHandler,Default_Handler - - .weak DMA1_Channel7_IRQHandler - .thumb_set DMA1_Channel7_IRQHandler,Default_Handler - - .weak ADC1_IRQHandler - .thumb_set ADC1_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_TIM15_IRQHandler - .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler - - .weak TIM1_UP_TIM16_IRQHandler - .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_TIM17_IRQHandler - .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTCAlarm_IRQHandler - .thumb_set RTCAlarm_IRQHandler,Default_Handler - - .weak CEC_IRQHandler - .thumb_set CEC_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s deleted file mode 100644 index 4d7d37aa28..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s +++ /dev/null @@ -1,357 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f10x_md.s - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief STM32F10x Medium Density Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the clock system - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M3 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ******************************************************************************* - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - - .syntax unified - .cpu cortex-m3 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call the application's entry point.*/ - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word TAMPER_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_IRQHandler - .word EXTI1_IRQHandler - .word EXTI2_IRQHandler - .word EXTI3_IRQHandler - .word EXTI4_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_IRQHandler - .word DMA1_Channel3_IRQHandler - .word DMA1_Channel4_IRQHandler - .word DMA1_Channel5_IRQHandler - .word DMA1_Channel6_IRQHandler - .word DMA1_Channel7_IRQHandler - .word ADC1_2_IRQHandler - .word USB_HP_CAN1_TX_IRQHandler - .word USB_LP_CAN1_RX0_IRQHandler - .word CAN1_RX1_IRQHandler - .word CAN1_SCE_IRQHandler - .word EXTI9_5_IRQHandler - .word TIM1_BRK_IRQHandler - .word TIM1_UP_IRQHandler - .word TIM1_TRG_COM_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM4_IRQHandler - .word I2C1_EV_IRQHandler - .word I2C1_ER_IRQHandler - .word I2C2_EV_IRQHandler - .word I2C2_ER_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word USART3_IRQHandler - .word EXTI15_10_IRQHandler - .word RTCAlarm_IRQHandler - .word USBWakeUp_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word BootRAM /* @0x108. This is for boot in RAM mode for - STM32F10x Medium Density devices. */ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMPER_IRQHandler - .thumb_set TAMPER_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_IRQHandler - .thumb_set DMA1_Channel2_IRQHandler,Default_Handler - - .weak DMA1_Channel3_IRQHandler - .thumb_set DMA1_Channel3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_IRQHandler - .thumb_set DMA1_Channel4_IRQHandler,Default_Handler - - .weak DMA1_Channel5_IRQHandler - .thumb_set DMA1_Channel5_IRQHandler,Default_Handler - - .weak DMA1_Channel6_IRQHandler - .thumb_set DMA1_Channel6_IRQHandler,Default_Handler - - .weak DMA1_Channel7_IRQHandler - .thumb_set DMA1_Channel7_IRQHandler,Default_Handler - - .weak ADC1_2_IRQHandler - .thumb_set ADC1_2_IRQHandler,Default_Handler - - .weak USB_HP_CAN1_TX_IRQHandler - .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler - - .weak USB_LP_CAN1_RX0_IRQHandler - .thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_IRQHandler - .thumb_set TIM1_BRK_IRQHandler,Default_Handler - - .weak TIM1_UP_IRQHandler - .thumb_set TIM1_UP_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_IRQHandler - .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTCAlarm_IRQHandler - .thumb_set RTCAlarm_IRQHandler,Default_Handler - - .weak USBWakeUp_IRQHandler - .thumb_set USBWakeUp_IRQHandler,Default_Handler - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s deleted file mode 100644 index e158a992ef..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s +++ /dev/null @@ -1,395 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f10x_md_vl.s - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief STM32F10x Medium Density Value Line Devices vector table for RIDE7 - * toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the clock system - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M3 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ******************************************************************************* - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - - .syntax unified - .cpu cortex-m3 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss - -.equ BootRAM, 0xF108F85F -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call the application's entry point.*/ - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - .word WWDG_IRQHandler - .word PVD_IRQHandler - .word TAMPER_IRQHandler - .word RTC_IRQHandler - .word FLASH_IRQHandler - .word RCC_IRQHandler - .word EXTI0_IRQHandler - .word EXTI1_IRQHandler - .word EXTI2_IRQHandler - .word EXTI3_IRQHandler - .word EXTI4_IRQHandler - .word DMA1_Channel1_IRQHandler - .word DMA1_Channel2_IRQHandler - .word DMA1_Channel3_IRQHandler - .word DMA1_Channel4_IRQHandler - .word DMA1_Channel5_IRQHandler - .word DMA1_Channel6_IRQHandler - .word DMA1_Channel7_IRQHandler - .word ADC1_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word EXTI9_5_IRQHandler - .word TIM1_BRK_TIM15_IRQHandler - .word TIM1_UP_TIM16_IRQHandler - .word TIM1_TRG_COM_TIM17_IRQHandler - .word TIM1_CC_IRQHandler - .word TIM2_IRQHandler - .word TIM3_IRQHandler - .word TIM4_IRQHandler - .word I2C1_EV_IRQHandler - .word I2C1_ER_IRQHandler - .word I2C2_EV_IRQHandler - .word I2C2_ER_IRQHandler - .word SPI1_IRQHandler - .word SPI2_IRQHandler - .word USART1_IRQHandler - .word USART2_IRQHandler - .word 0 - .word EXTI15_10_IRQHandler - .word RTCAlarm_IRQHandler - .word CEC_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word TIM6_DAC_IRQHandler - .word TIM7_IRQHandler - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word BootRAM /* @0x01CC. This is for boot in RAM mode for - STM32F10x Medium Value Line Density devices. */ - -/******************************************************************************* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -*******************************************************************************/ - - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMPER_IRQHandler - .thumb_set TAMPER_IRQHandler,Default_Handler - - .weak RTC_IRQHandler - .thumb_set RTC_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Channel1_IRQHandler - .thumb_set DMA1_Channel1_IRQHandler,Default_Handler - - .weak DMA1_Channel2_IRQHandler - .thumb_set DMA1_Channel2_IRQHandler,Default_Handler - - .weak DMA1_Channel3_IRQHandler - .thumb_set DMA1_Channel3_IRQHandler,Default_Handler - - .weak DMA1_Channel4_IRQHandler - .thumb_set DMA1_Channel4_IRQHandler,Default_Handler - - .weak DMA1_Channel5_IRQHandler - .thumb_set DMA1_Channel5_IRQHandler,Default_Handler - - .weak DMA1_Channel6_IRQHandler - .thumb_set DMA1_Channel6_IRQHandler,Default_Handler - - .weak DMA1_Channel7_IRQHandler - .thumb_set DMA1_Channel7_IRQHandler,Default_Handler - - .weak ADC1_IRQHandler - .thumb_set ADC1_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_TIM15_IRQHandler - .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler - - .weak TIM1_UP_TIM16_IRQHandler - .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_TIM17_IRQHandler - .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTCAlarm_IRQHandler - .thumb_set RTCAlarm_IRQHandler,Default_Handler - - .weak CEC_IRQHandler - .thumb_set CEC_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_cl.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_cl.s deleted file mode 100644 index 729be8d5c6..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_cl.s +++ /dev/null @@ -1,507 +0,0 @@ -;/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_cl.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Connectivity line devices vector table for -;* EWARM5.x toolchain. -;* This module performs: -;* - Set the initial SP -;* - Configure the clock system -;* - Set the initial PC == __iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address. -;* After Reset the Cortex-M3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;*******************************************************************************/ -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1 and ADC2 - DCD CAN1_TX_IRQHandler ; CAN1 TX - DCD CAN1_RX0_IRQHandler ; CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_IRQHandler ; TIM1 Break - DCD TIM1_UP_IRQHandler ; TIM1 Update - DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C1 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC alarm through EXTI line - DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM5_IRQHandler ; TIM5 - DCD SPI3_IRQHandler ; SPI3 - DCD UART4_IRQHandler ; UART4 - DCD UART5_IRQHandler ; UART5 - DCD TIM6_IRQHandler ; TIM6 - DCD TIM7_IRQHandler ; TIM7 - DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 - DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 - DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 - DCD DMA2_Channel4_IRQHandler ; DMA2 Channel4 - DCD DMA2_Channel5_IRQHandler ; DMA2 Channel5 - DCD ETH_IRQHandler ; Ethernet - DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line - DCD CAN2_TX_IRQHandler ; CAN2 TX - DCD CAN2_RX0_IRQHandler ; CAN2 RX0 - DCD CAN2_RX1_IRQHandler ; CAN2 RX1 - DCD CAN2_SCE_IRQHandler ; CAN2 SCE - DCD OTG_FS_IRQHandler ; USB OTG FS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:REORDER(1) -NMI_Handler - B NMI_Handler - - PUBWEAK HardFault_Handler - SECTION .text:CODE:REORDER(1) -HardFault_Handler - B HardFault_Handler - - PUBWEAK MemManage_Handler - SECTION .text:CODE:REORDER(1) -MemManage_Handler - B MemManage_Handler - - PUBWEAK BusFault_Handler - SECTION .text:CODE:REORDER(1) -BusFault_Handler - B BusFault_Handler - - PUBWEAK UsageFault_Handler - SECTION .text:CODE:REORDER(1) -UsageFault_Handler - B UsageFault_Handler - - PUBWEAK SVC_Handler - SECTION .text:CODE:REORDER(1) -SVC_Handler - B SVC_Handler - - PUBWEAK DebugMon_Handler - SECTION .text:CODE:REORDER(1) -DebugMon_Handler - B DebugMon_Handler - - PUBWEAK PendSV_Handler - SECTION .text:CODE:REORDER(1) -PendSV_Handler - B PendSV_Handler - - PUBWEAK SysTick_Handler - SECTION .text:CODE:REORDER(1) -SysTick_Handler - B SysTick_Handler - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - PUBWEAK TAMPER_IRQHandler - SECTION .text:CODE:REORDER(1) -TAMPER_IRQHandler - B TAMPER_IRQHandler - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - PUBWEAK EXTI0_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI0_IRQHandler - B EXTI0_IRQHandler - - PUBWEAK EXTI1_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI1_IRQHandler - B EXTI1_IRQHandler - - PUBWEAK EXTI2_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI2_IRQHandler - B EXTI2_IRQHandler - - PUBWEAK EXTI3_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI3_IRQHandler - B EXTI3_IRQHandler - - - PUBWEAK EXTI4_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI4_IRQHandler - B EXTI4_IRQHandler - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - PUBWEAK DMA1_Channel2_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel2_IRQHandler - B DMA1_Channel2_IRQHandler - - PUBWEAK DMA1_Channel3_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel3_IRQHandler - B DMA1_Channel3_IRQHandler - - PUBWEAK DMA1_Channel4_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel4_IRQHandler - B DMA1_Channel4_IRQHandler - - PUBWEAK DMA1_Channel5_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel5_IRQHandler - B DMA1_Channel5_IRQHandler - - PUBWEAK DMA1_Channel6_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel6_IRQHandler - B DMA1_Channel6_IRQHandler - - PUBWEAK DMA1_Channel7_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel7_IRQHandler - B DMA1_Channel7_IRQHandler - - PUBWEAK ADC1_2_IRQHandler - SECTION .text:CODE:REORDER(1) -ADC1_2_IRQHandler - B ADC1_2_IRQHandler - - PUBWEAK CAN1_TX_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_TX_IRQHandler - B CAN1_TX_IRQHandler - - PUBWEAK CAN1_RX0_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_RX0_IRQHandler - B CAN1_RX0_IRQHandler - - PUBWEAK CAN1_RX1_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_RX1_IRQHandler - B CAN1_RX1_IRQHandler - - PUBWEAK CAN1_SCE_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_SCE_IRQHandler - B CAN1_SCE_IRQHandler - - PUBWEAK EXTI9_5_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI9_5_IRQHandler - B EXTI9_5_IRQHandler - - PUBWEAK TIM1_BRK_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_BRK_IRQHandler - B TIM1_BRK_IRQHandler - - PUBWEAK TIM1_UP_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_UP_IRQHandler - B TIM1_UP_IRQHandler - - PUBWEAK TIM1_TRG_COM_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_TRG_COM_IRQHandler - B TIM1_TRG_COM_IRQHandler - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - PUBWEAK TIM4_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM4_IRQHandler - B TIM4_IRQHandler - - PUBWEAK I2C1_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_EV_IRQHandler - B I2C1_EV_IRQHandler - - PUBWEAK I2C1_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_ER_IRQHandler - B I2C1_ER_IRQHandler - - PUBWEAK I2C2_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C2_EV_IRQHandler - B I2C2_EV_IRQHandler - - PUBWEAK I2C2_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C2_ER_IRQHandler - B I2C2_ER_IRQHandler - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - PUBWEAK USART3_IRQHandler - SECTION .text:CODE:REORDER(1) -USART3_IRQHandler - B USART3_IRQHandler - - PUBWEAK EXTI15_10_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI15_10_IRQHandler - B EXTI15_10_IRQHandler - - PUBWEAK RTCAlarm_IRQHandler - SECTION .text:CODE:REORDER(1) -RTCAlarm_IRQHandler - B RTCAlarm_IRQHandler - - PUBWEAK OTG_FS_WKUP_IRQHandler - SECTION .text:CODE:REORDER(1) -OTG_FS_WKUP_IRQHandler - B OTG_FS_WKUP_IRQHandler - - PUBWEAK TIM5_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM5_IRQHandler - B TIM5_IRQHandler - - PUBWEAK SPI3_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI3_IRQHandler - B SPI3_IRQHandler - - PUBWEAK UART4_IRQHandler - SECTION .text:CODE:REORDER(1) -UART4_IRQHandler - B UART4_IRQHandler - - PUBWEAK UART5_IRQHandler - SECTION .text:CODE:REORDER(1) -UART5_IRQHandler - B UART5_IRQHandler - - PUBWEAK TIM6_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM6_IRQHandler - B TIM6_IRQHandler - - PUBWEAK TIM7_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM7_IRQHandler - B TIM7_IRQHandler - - PUBWEAK DMA2_Channel1_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA2_Channel1_IRQHandler - B DMA2_Channel1_IRQHandler - - PUBWEAK DMA2_Channel2_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA2_Channel2_IRQHandler - B DMA2_Channel2_IRQHandler - - PUBWEAK DMA2_Channel3_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA2_Channel3_IRQHandler - B DMA2_Channel3_IRQHandler - - PUBWEAK DMA2_Channel4_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA2_Channel4_IRQHandler - B DMA2_Channel4_IRQHandler - - PUBWEAK DMA2_Channel5_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA2_Channel5_IRQHandler - B DMA2_Channel5_IRQHandler - - PUBWEAK ETH_IRQHandler - SECTION .text:CODE:REORDER(1) -ETH_IRQHandler - B ETH_IRQHandler - - PUBWEAK ETH_WKUP_IRQHandler - SECTION .text:CODE:REORDER(1) -ETH_WKUP_IRQHandler - B ETH_WKUP_IRQHandler - - PUBWEAK CAN2_TX_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN2_TX_IRQHandler - B CAN2_TX_IRQHandler - - PUBWEAK CAN2_RX0_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN2_RX0_IRQHandler - B CAN2_RX0_IRQHandler - - PUBWEAK CAN2_RX1_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN2_RX1_IRQHandler - B CAN2_RX1_IRQHandler - - PUBWEAK CAN2_SCE_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN2_SCE_IRQHandler - B CAN2_SCE_IRQHandler - - PUBWEAK OTG_FS_IRQHandler - SECTION .text:CODE:REORDER(1) -OTG_FS_IRQHandler - B OTG_FS_IRQHandler - - END -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd.s deleted file mode 100644 index 2e8c0ba228..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_hd.s +++ /dev/null @@ -1,496 +0,0 @@ -;/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_hd.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x High Density Devices vector table for EWARM5.x -;* toolchain. -;* This module performs: -;* - Set the initial SP -;* - Configure the clock system and the external SRAM -;* mounted on STM3210E-EVAL board to be used as data -;* memory (optional, to be enabled by user) -;* - Set the initial PC == __iar_program_start, -;* - Set the vector table entries with the exceptions ISR address, -;* After Reset the Cortex-M3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;*******************************************************************************/ -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA - -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1 & ADC2 - DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX - DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_IRQHandler ; TIM1 Break - DCD TIM1_UP_IRQHandler ; TIM1 Update - DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend - DCD TIM8_BRK_IRQHandler ; TIM8 Break - DCD TIM8_UP_IRQHandler ; TIM8 Update - DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation - DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare - DCD ADC3_IRQHandler ; ADC3 - DCD FSMC_IRQHandler ; FSMC - DCD SDIO_IRQHandler ; SDIO - DCD TIM5_IRQHandler ; TIM5 - DCD SPI3_IRQHandler ; SPI3 - DCD UART4_IRQHandler ; UART4 - DCD UART5_IRQHandler ; UART5 - DCD TIM6_IRQHandler ; TIM6 - DCD TIM7_IRQHandler ; TIM7 - DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 - DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 - DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 - DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:REORDER(1) -NMI_Handler - B NMI_Handler - - PUBWEAK HardFault_Handler - SECTION .text:CODE:REORDER(1) -HardFault_Handler - B HardFault_Handler - - PUBWEAK MemManage_Handler - SECTION .text:CODE:REORDER(1) -MemManage_Handler - B MemManage_Handler - - PUBWEAK BusFault_Handler - SECTION .text:CODE:REORDER(1) -BusFault_Handler - B BusFault_Handler - - PUBWEAK UsageFault_Handler - SECTION .text:CODE:REORDER(1) -UsageFault_Handler - B UsageFault_Handler - - PUBWEAK SVC_Handler - SECTION .text:CODE:REORDER(1) -SVC_Handler - B SVC_Handler - - PUBWEAK DebugMon_Handler - SECTION .text:CODE:REORDER(1) -DebugMon_Handler - B DebugMon_Handler - - PUBWEAK PendSV_Handler - SECTION .text:CODE:REORDER(1) -PendSV_Handler - B PendSV_Handler - - PUBWEAK SysTick_Handler - SECTION .text:CODE:REORDER(1) -SysTick_Handler - B SysTick_Handler - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - PUBWEAK TAMPER_IRQHandler - SECTION .text:CODE:REORDER(1) -TAMPER_IRQHandler - B TAMPER_IRQHandler - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - PUBWEAK EXTI0_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI0_IRQHandler - B EXTI0_IRQHandler - - PUBWEAK EXTI1_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI1_IRQHandler - B EXTI1_IRQHandler - - PUBWEAK EXTI2_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI2_IRQHandler - B EXTI2_IRQHandler - - PUBWEAK EXTI3_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI3_IRQHandler - B EXTI3_IRQHandler - - PUBWEAK EXTI4_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI4_IRQHandler - B EXTI4_IRQHandler - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - PUBWEAK DMA1_Channel2_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel2_IRQHandler - B DMA1_Channel2_IRQHandler - - PUBWEAK DMA1_Channel3_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel3_IRQHandler - B DMA1_Channel3_IRQHandler - - PUBWEAK DMA1_Channel4_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel4_IRQHandler - B DMA1_Channel4_IRQHandler - - PUBWEAK DMA1_Channel5_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel5_IRQHandler - B DMA1_Channel5_IRQHandler - - PUBWEAK DMA1_Channel6_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel6_IRQHandler - B DMA1_Channel6_IRQHandler - - PUBWEAK DMA1_Channel7_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel7_IRQHandler - B DMA1_Channel7_IRQHandler - - PUBWEAK ADC1_2_IRQHandler - SECTION .text:CODE:REORDER(1) -ADC1_2_IRQHandler - B ADC1_2_IRQHandler - - PUBWEAK USB_HP_CAN1_TX_IRQHandler - SECTION .text:CODE:REORDER(1) -USB_HP_CAN1_TX_IRQHandler - B USB_HP_CAN1_TX_IRQHandler - - PUBWEAK USB_LP_CAN1_RX0_IRQHandler - SECTION .text:CODE:REORDER(1) -USB_LP_CAN1_RX0_IRQHandler - B USB_LP_CAN1_RX0_IRQHandler - - PUBWEAK CAN1_RX1_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_RX1_IRQHandler - B CAN1_RX1_IRQHandler - - PUBWEAK CAN1_SCE_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_SCE_IRQHandler - B CAN1_SCE_IRQHandler - - PUBWEAK EXTI9_5_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI9_5_IRQHandler - B EXTI9_5_IRQHandler - - PUBWEAK TIM1_BRK_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_BRK_IRQHandler - B TIM1_BRK_IRQHandler - - PUBWEAK TIM1_UP_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_UP_IRQHandler - B TIM1_UP_IRQHandler - - PUBWEAK TIM1_TRG_COM_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_TRG_COM_IRQHandler - B TIM1_TRG_COM_IRQHandler - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - PUBWEAK TIM4_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM4_IRQHandler - B TIM4_IRQHandler - - PUBWEAK I2C1_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_EV_IRQHandler - B I2C1_EV_IRQHandler - - PUBWEAK I2C1_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_ER_IRQHandler - B I2C1_ER_IRQHandler - - PUBWEAK I2C2_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C2_EV_IRQHandler - B I2C2_EV_IRQHandler - - PUBWEAK I2C2_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C2_ER_IRQHandler - B I2C2_ER_IRQHandler - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - PUBWEAK USART3_IRQHandler - SECTION .text:CODE:REORDER(1) -USART3_IRQHandler - B USART3_IRQHandler - - PUBWEAK EXTI15_10_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI15_10_IRQHandler - B EXTI15_10_IRQHandler - - PUBWEAK RTCAlarm_IRQHandler - SECTION .text:CODE:REORDER(1) -RTCAlarm_IRQHandler - B RTCAlarm_IRQHandler - - PUBWEAK USBWakeUp_IRQHandler - SECTION .text:CODE:REORDER(1) -USBWakeUp_IRQHandler - B USBWakeUp_IRQHandler - - PUBWEAK TIM8_BRK_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM8_BRK_IRQHandler - B TIM8_BRK_IRQHandler - - PUBWEAK TIM8_UP_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM8_UP_IRQHandler - B TIM8_UP_IRQHandler - - PUBWEAK TIM8_TRG_COM_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM8_TRG_COM_IRQHandler - B TIM8_TRG_COM_IRQHandler - - PUBWEAK TIM8_CC_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM8_CC_IRQHandler - B TIM8_CC_IRQHandler - - PUBWEAK ADC3_IRQHandler - SECTION .text:CODE:REORDER(1) -ADC3_IRQHandler - B ADC3_IRQHandler - - PUBWEAK FSMC_IRQHandler - SECTION .text:CODE:REORDER(1) -FSMC_IRQHandler - B FSMC_IRQHandler - - PUBWEAK SDIO_IRQHandler - SECTION .text:CODE:REORDER(1) -SDIO_IRQHandler - B SDIO_IRQHandler - - PUBWEAK TIM5_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM5_IRQHandler - B TIM5_IRQHandler - - PUBWEAK SPI3_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI3_IRQHandler - B SPI3_IRQHandler - - PUBWEAK UART4_IRQHandler - SECTION .text:CODE:REORDER(1) -UART4_IRQHandler - B UART4_IRQHandler - - PUBWEAK UART5_IRQHandler - SECTION .text:CODE:REORDER(1) -UART5_IRQHandler - B UART5_IRQHandler - - PUBWEAK TIM6_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM6_IRQHandler - B TIM6_IRQHandler - - PUBWEAK TIM7_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM7_IRQHandler - B TIM7_IRQHandler - - PUBWEAK DMA2_Channel1_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA2_Channel1_IRQHandler - B DMA2_Channel1_IRQHandler - - PUBWEAK DMA2_Channel2_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA2_Channel2_IRQHandler - B DMA2_Channel2_IRQHandler - - PUBWEAK DMA2_Channel3_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA2_Channel3_IRQHandler - B DMA2_Channel3_IRQHandler - - PUBWEAK DMA2_Channel4_5_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA2_Channel4_5_IRQHandler - B DMA2_Channel4_5_IRQHandler - - - END - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld.s deleted file mode 100644 index 9c709518f2..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld.s +++ /dev/null @@ -1,366 +0,0 @@ -;/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_ld.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Low Density Devices vector table for EWARM5.x -;* toolchain. -;* This module performs: -;* - Set the initial SP -;* - Configure the clock system -;* - Set the initial PC == __iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address. -;* After Reset the Cortex-M3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;*******************************************************************************/ -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1 & ADC2 - DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX - DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_IRQHandler ; TIM1 Break - DCD TIM1_UP_IRQHandler ; TIM1 Update - DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD 0 ; Reserved - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:REORDER(1) -NMI_Handler - B NMI_Handler - - PUBWEAK HardFault_Handler - SECTION .text:CODE:REORDER(1) -HardFault_Handler - B HardFault_Handler - - PUBWEAK MemManage_Handler - SECTION .text:CODE:REORDER(1) -MemManage_Handler - B MemManage_Handler - - PUBWEAK BusFault_Handler - SECTION .text:CODE:REORDER(1) -BusFault_Handler - B BusFault_Handler - - PUBWEAK UsageFault_Handler - SECTION .text:CODE:REORDER(1) -UsageFault_Handler - B UsageFault_Handler - - PUBWEAK SVC_Handler - SECTION .text:CODE:REORDER(1) -SVC_Handler - B SVC_Handler - - PUBWEAK DebugMon_Handler - SECTION .text:CODE:REORDER(1) -DebugMon_Handler - B DebugMon_Handler - - PUBWEAK PendSV_Handler - SECTION .text:CODE:REORDER(1) -PendSV_Handler - B PendSV_Handler - - PUBWEAK SysTick_Handler - SECTION .text:CODE:REORDER(1) -SysTick_Handler - B SysTick_Handler - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - PUBWEAK TAMPER_IRQHandler - SECTION .text:CODE:REORDER(1) -TAMPER_IRQHandler - B TAMPER_IRQHandler - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - PUBWEAK EXTI0_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI0_IRQHandler - B EXTI0_IRQHandler - - PUBWEAK EXTI1_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI1_IRQHandler - B EXTI1_IRQHandler - - PUBWEAK EXTI2_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI2_IRQHandler - B EXTI2_IRQHandler - - PUBWEAK EXTI3_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI3_IRQHandler - B EXTI3_IRQHandler - - PUBWEAK EXTI4_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI4_IRQHandler - B EXTI4_IRQHandler - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - PUBWEAK DMA1_Channel2_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel2_IRQHandler - B DMA1_Channel2_IRQHandler - - PUBWEAK DMA1_Channel3_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel3_IRQHandler - B DMA1_Channel3_IRQHandler - - PUBWEAK DMA1_Channel4_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel4_IRQHandler - B DMA1_Channel4_IRQHandler - - PUBWEAK DMA1_Channel5_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel5_IRQHandler - B DMA1_Channel5_IRQHandler - - PUBWEAK DMA1_Channel6_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel6_IRQHandler - B DMA1_Channel6_IRQHandler - - PUBWEAK DMA1_Channel7_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel7_IRQHandler - B DMA1_Channel7_IRQHandler - - PUBWEAK ADC1_2_IRQHandler - SECTION .text:CODE:REORDER(1) -ADC1_2_IRQHandler - B ADC1_2_IRQHandler - - PUBWEAK USB_HP_CAN1_TX_IRQHandler - SECTION .text:CODE:REORDER(1) -USB_HP_CAN1_TX_IRQHandler - B USB_HP_CAN1_TX_IRQHandler - - PUBWEAK USB_LP_CAN1_RX0_IRQHandler - SECTION .text:CODE:REORDER(1) -USB_LP_CAN1_RX0_IRQHandler - B USB_LP_CAN1_RX0_IRQHandler - - PUBWEAK CAN1_RX1_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_RX1_IRQHandler - B CAN1_RX1_IRQHandler - - PUBWEAK CAN1_SCE_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_SCE_IRQHandler - B CAN1_SCE_IRQHandler - - PUBWEAK EXTI9_5_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI9_5_IRQHandler - B EXTI9_5_IRQHandler - - PUBWEAK TIM1_BRK_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_BRK_IRQHandler - B TIM1_BRK_IRQHandler - - PUBWEAK TIM1_UP_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_UP_IRQHandler - B TIM1_UP_IRQHandler - - PUBWEAK TIM1_TRG_COM_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_TRG_COM_IRQHandler - B TIM1_TRG_COM_IRQHandler - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - PUBWEAK I2C1_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_EV_IRQHandler - B I2C1_EV_IRQHandler - - PUBWEAK I2C1_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_ER_IRQHandler - B I2C1_ER_IRQHandler - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - PUBWEAK EXTI15_10_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI15_10_IRQHandler - B EXTI15_10_IRQHandler - - PUBWEAK RTCAlarm_IRQHandler - SECTION .text:CODE:REORDER(1) -RTCAlarm_IRQHandler - B RTCAlarm_IRQHandler - - PUBWEAK USBWakeUp_IRQHandler - SECTION .text:CODE:REORDER(1) -USBWakeUp_IRQHandler - B USBWakeUp_IRQHandler - - END -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld_vl.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld_vl.s deleted file mode 100644 index 511a4746c1..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_ld_vl.s +++ /dev/null @@ -1,369 +0,0 @@ -;/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_ld_vl.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Low Density Value Line Devices vector table -;* for EWARM5.x toolchain. -;* This module performs: -;* - Set the initial SP -;* - Configure the clock system -;* - Set the initial PC == __iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address. -;* After Reset the Cortex-M3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;*******************************************************************************/ -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_IRQHandler ; ADC1 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 - DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 - DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD 0 ; Reserved - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SPI1_IRQHandler ; SPI1 - DCD 0 ; Reserved - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD 0 ; Reserved - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD CEC_IRQHandler ; HDMI-CEC - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun - DCD TIM7_IRQHandler ; TIM7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:REORDER(1) -NMI_Handler - B NMI_Handler - - PUBWEAK HardFault_Handler - SECTION .text:CODE:REORDER(1) -HardFault_Handler - B HardFault_Handler - - PUBWEAK MemManage_Handler - SECTION .text:CODE:REORDER(1) -MemManage_Handler - B MemManage_Handler - - PUBWEAK BusFault_Handler - SECTION .text:CODE:REORDER(1) -BusFault_Handler - B BusFault_Handler - - PUBWEAK UsageFault_Handler - SECTION .text:CODE:REORDER(1) -UsageFault_Handler - B UsageFault_Handler - - PUBWEAK SVC_Handler - SECTION .text:CODE:REORDER(1) -SVC_Handler - B SVC_Handler - - PUBWEAK DebugMon_Handler - SECTION .text:CODE:REORDER(1) -DebugMon_Handler - B DebugMon_Handler - - PUBWEAK PendSV_Handler - SECTION .text:CODE:REORDER(1) -PendSV_Handler - B PendSV_Handler - - PUBWEAK SysTick_Handler - SECTION .text:CODE:REORDER(1) -SysTick_Handler - B SysTick_Handler - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - PUBWEAK TAMPER_IRQHandler - SECTION .text:CODE:REORDER(1) -TAMPER_IRQHandler - B TAMPER_IRQHandler - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - PUBWEAK EXTI0_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI0_IRQHandler - B EXTI0_IRQHandler - - PUBWEAK EXTI1_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI1_IRQHandler - B EXTI1_IRQHandler - - PUBWEAK EXTI2_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI2_IRQHandler - B EXTI2_IRQHandler - - PUBWEAK EXTI3_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI3_IRQHandler - B EXTI3_IRQHandler - - PUBWEAK EXTI4_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI4_IRQHandler - B EXTI4_IRQHandler - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - PUBWEAK DMA1_Channel2_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel2_IRQHandler - B DMA1_Channel2_IRQHandler - - PUBWEAK DMA1_Channel3_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel3_IRQHandler - B DMA1_Channel3_IRQHandler - - PUBWEAK DMA1_Channel4_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel4_IRQHandler - B DMA1_Channel4_IRQHandler - - PUBWEAK DMA1_Channel5_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel5_IRQHandler - B DMA1_Channel5_IRQHandler - - PUBWEAK DMA1_Channel6_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel6_IRQHandler - B DMA1_Channel6_IRQHandler - - PUBWEAK DMA1_Channel7_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel7_IRQHandler - B DMA1_Channel7_IRQHandler - - PUBWEAK ADC1_IRQHandler - SECTION .text:CODE:REORDER(1) -ADC1_IRQHandler - B ADC1_IRQHandler - - PUBWEAK EXTI9_5_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI9_5_IRQHandler - B EXTI9_5_IRQHandler - - PUBWEAK TIM1_BRK_TIM15_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_BRK_TIM15_IRQHandler - B TIM1_BRK_TIM15_IRQHandler - - PUBWEAK TIM1_UP_TIM16_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_UP_TIM16_IRQHandler - B TIM1_UP_TIM16_IRQHandler - - PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_TRG_COM_TIM17_IRQHandler - B TIM1_TRG_COM_TIM17_IRQHandler - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - PUBWEAK I2C1_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_EV_IRQHandler - B I2C1_EV_IRQHandler - - PUBWEAK I2C1_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_ER_IRQHandler - B I2C1_ER_IRQHandler - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - PUBWEAK EXTI15_10_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI15_10_IRQHandler - B EXTI15_10_IRQHandler - - PUBWEAK RTCAlarm_IRQHandler - SECTION .text:CODE:REORDER(1) -RTCAlarm_IRQHandler - B RTCAlarm_IRQHandler - - PUBWEAK CEC_IRQHandler - SECTION .text:CODE:REORDER(1) -CEC_IRQHandler - B CEC_IRQHandler - - PUBWEAK TIM6_DAC_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM6_DAC_IRQHandler - B TIM6_DAC_IRQHandler - - PUBWEAK TIM7_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM7_IRQHandler - B TIM7_IRQHandler - - END -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md.s deleted file mode 100644 index b767c0e216..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md.s +++ /dev/null @@ -1,391 +0,0 @@ -;/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_md.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Medium Density Devices vector table for -;* EWARM5.x toolchain. -;* This module performs: -;* - Set the initial SP -;* - Configure the clock system -;* - Set the initial PC == __iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address. -;* After Reset the Cortex-M3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;*******************************************************************************/ -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1 & ADC2 - DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX - DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_IRQHandler ; TIM1 Break - DCD TIM1_UP_IRQHandler ; TIM1 Update - DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:REORDER(1) -NMI_Handler - B NMI_Handler - - PUBWEAK HardFault_Handler - SECTION .text:CODE:REORDER(1) -HardFault_Handler - B HardFault_Handler - - PUBWEAK MemManage_Handler - SECTION .text:CODE:REORDER(1) -MemManage_Handler - B MemManage_Handler - - PUBWEAK BusFault_Handler - SECTION .text:CODE:REORDER(1) -BusFault_Handler - B BusFault_Handler - - PUBWEAK UsageFault_Handler - SECTION .text:CODE:REORDER(1) -UsageFault_Handler - B UsageFault_Handler - - PUBWEAK SVC_Handler - SECTION .text:CODE:REORDER(1) -SVC_Handler - B SVC_Handler - - PUBWEAK DebugMon_Handler - SECTION .text:CODE:REORDER(1) -DebugMon_Handler - B DebugMon_Handler - - PUBWEAK PendSV_Handler - SECTION .text:CODE:REORDER(1) -PendSV_Handler - B PendSV_Handler - - PUBWEAK SysTick_Handler - SECTION .text:CODE:REORDER(1) -SysTick_Handler - B SysTick_Handler - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - PUBWEAK TAMPER_IRQHandler - SECTION .text:CODE:REORDER(1) -TAMPER_IRQHandler - B TAMPER_IRQHandler - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - PUBWEAK EXTI0_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI0_IRQHandler - B EXTI0_IRQHandler - - PUBWEAK EXTI1_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI1_IRQHandler - B EXTI1_IRQHandler - - PUBWEAK EXTI2_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI2_IRQHandler - B EXTI2_IRQHandler - - PUBWEAK EXTI3_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI3_IRQHandler - B EXTI3_IRQHandler - - PUBWEAK EXTI4_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI4_IRQHandler - B EXTI4_IRQHandler - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - PUBWEAK DMA1_Channel2_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel2_IRQHandler - B DMA1_Channel2_IRQHandler - - PUBWEAK DMA1_Channel3_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel3_IRQHandler - B DMA1_Channel3_IRQHandler - - PUBWEAK DMA1_Channel4_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel4_IRQHandler - B DMA1_Channel4_IRQHandler - - PUBWEAK DMA1_Channel5_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel5_IRQHandler - B DMA1_Channel5_IRQHandler - - PUBWEAK DMA1_Channel6_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel6_IRQHandler - B DMA1_Channel6_IRQHandler - - PUBWEAK DMA1_Channel7_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel7_IRQHandler - B DMA1_Channel7_IRQHandler - - PUBWEAK ADC1_2_IRQHandler - SECTION .text:CODE:REORDER(1) -ADC1_2_IRQHandler - B ADC1_2_IRQHandler - - PUBWEAK USB_HP_CAN1_TX_IRQHandler - SECTION .text:CODE:REORDER(1) -USB_HP_CAN1_TX_IRQHandler - B USB_HP_CAN1_TX_IRQHandler - - PUBWEAK USB_LP_CAN1_RX0_IRQHandler - SECTION .text:CODE:REORDER(1) -USB_LP_CAN1_RX0_IRQHandler - B USB_LP_CAN1_RX0_IRQHandler - - PUBWEAK CAN1_RX1_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_RX1_IRQHandler - B CAN1_RX1_IRQHandler - - PUBWEAK CAN1_SCE_IRQHandler - SECTION .text:CODE:REORDER(1) -CAN1_SCE_IRQHandler - B CAN1_SCE_IRQHandler - - PUBWEAK EXTI9_5_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI9_5_IRQHandler - B EXTI9_5_IRQHandler - - PUBWEAK TIM1_BRK_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_BRK_IRQHandler - B TIM1_BRK_IRQHandler - - PUBWEAK TIM1_UP_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_UP_IRQHandler - B TIM1_UP_IRQHandler - - PUBWEAK TIM1_TRG_COM_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_TRG_COM_IRQHandler - B TIM1_TRG_COM_IRQHandler - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - PUBWEAK TIM4_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM4_IRQHandler - B TIM4_IRQHandler - - PUBWEAK I2C1_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_EV_IRQHandler - B I2C1_EV_IRQHandler - - PUBWEAK I2C1_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_ER_IRQHandler - B I2C1_ER_IRQHandler - - PUBWEAK I2C2_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C2_EV_IRQHandler - B I2C2_EV_IRQHandler - - PUBWEAK I2C2_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C2_ER_IRQHandler - B I2C2_ER_IRQHandler - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - PUBWEAK USART3_IRQHandler - SECTION .text:CODE:REORDER(1) -USART3_IRQHandler - B USART3_IRQHandler - - PUBWEAK EXTI15_10_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI15_10_IRQHandler - B EXTI15_10_IRQHandler - - PUBWEAK RTCAlarm_IRQHandler - SECTION .text:CODE:REORDER(1) -RTCAlarm_IRQHandler - B RTCAlarm_IRQHandler - - PUBWEAK USBWakeUp_IRQHandler - SECTION .text:CODE:REORDER(1) -USBWakeUp_IRQHandler - B USBWakeUp_IRQHandler - - END -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md_vl.s b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md_vl.s deleted file mode 100644 index e72a294013..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/iar/startup_stm32f10x_md_vl.s +++ /dev/null @@ -1,394 +0,0 @@ -;/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -;* File Name : startup_stm32f10x_md_vl.s -;* Author : MCD Application Team -;* Version : V3.2.0 -;* Date : 03/01/2010 -;* Description : STM32F10x Medium Density Value Line Devices vector table -;* for EWARM5.x toolchain. -;* This module performs: -;* - Set the initial SP -;* - Configure the clock system -;* - Set the initial PC == __iar_program_start, -;* - Set the vector table entries with the exceptions ISR -;* address. -;* After Reset the Cortex-M3 processor is in Thread mode, -;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -;*******************************************************************************/ -; -; -; The modules in this file are included in the libraries, and may be replaced -; by any user-defined modules that define the PUBLIC symbol _program_start or -; a user defined start symbol. -; To override the cstartup defined in the library, simply add your modified -; version to the workbench project. -; -; The vector table is normally located at address 0. -; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. -; The name "__vector_table" has special meaning for C-SPY: -; it is where the SP start value is found, and the NVIC vector -; table register (VTOR) is initialized to this address if != 0. -; -; Cortex-M version -; - - MODULE ?cstartup - - ;; Forward declaration of sections. - SECTION CSTACK:DATA:NOROOT(3) - - SECTION .intvec:CODE:NOROOT(2) - - EXTERN __iar_program_start - EXTERN SystemInit - PUBLIC __vector_table - - DATA -__vector_table - DCD sfe(CSTACK) - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler - - ; External Interrupts - DCD WWDG_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EXTI Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FLASH_IRQHandler ; Flash - DCD RCC_IRQHandler ; RCC - DCD EXTI0_IRQHandler ; EXTI Line 0 - DCD EXTI1_IRQHandler ; EXTI Line 1 - DCD EXTI2_IRQHandler ; EXTI Line 2 - DCD EXTI3_IRQHandler ; EXTI Line 3 - DCD EXTI4_IRQHandler ; EXTI Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_IRQHandler ; ADC1 - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 - DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 - DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 - DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Commutation and TIM17 - DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare - DCD TIM2_IRQHandler ; TIM2 - DCD TIM3_IRQHandler ; TIM3 - DCD TIM4_IRQHandler ; TIM4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line - DCD CEC_IRQHandler ; HDMI-CEC - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD TIM6_DAC_IRQHandler ; TIM6 and DAC underrun - DCD TIM7_IRQHandler ; TIM7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; Default interrupt handlers. -;; - THUMB - - PUBWEAK Reset_Handler - SECTION .text:CODE:REORDER(2) -Reset_Handler - LDR R0, =SystemInit - BLX R0 - LDR R0, =__iar_program_start - BX R0 - - PUBWEAK NMI_Handler - SECTION .text:CODE:REORDER(1) -NMI_Handler - B NMI_Handler - - PUBWEAK HardFault_Handler - SECTION .text:CODE:REORDER(1) -HardFault_Handler - B HardFault_Handler - - PUBWEAK MemManage_Handler - SECTION .text:CODE:REORDER(1) -MemManage_Handler - B MemManage_Handler - - PUBWEAK BusFault_Handler - SECTION .text:CODE:REORDER(1) -BusFault_Handler - B BusFault_Handler - - PUBWEAK UsageFault_Handler - SECTION .text:CODE:REORDER(1) -UsageFault_Handler - B UsageFault_Handler - - PUBWEAK SVC_Handler - SECTION .text:CODE:REORDER(1) -SVC_Handler - B SVC_Handler - - PUBWEAK DebugMon_Handler - SECTION .text:CODE:REORDER(1) -DebugMon_Handler - B DebugMon_Handler - - PUBWEAK PendSV_Handler - SECTION .text:CODE:REORDER(1) -PendSV_Handler - B PendSV_Handler - - PUBWEAK SysTick_Handler - SECTION .text:CODE:REORDER(1) -SysTick_Handler - B SysTick_Handler - - PUBWEAK WWDG_IRQHandler - SECTION .text:CODE:REORDER(1) -WWDG_IRQHandler - B WWDG_IRQHandler - - PUBWEAK PVD_IRQHandler - SECTION .text:CODE:REORDER(1) -PVD_IRQHandler - B PVD_IRQHandler - - PUBWEAK TAMPER_IRQHandler - SECTION .text:CODE:REORDER(1) -TAMPER_IRQHandler - B TAMPER_IRQHandler - - PUBWEAK RTC_IRQHandler - SECTION .text:CODE:REORDER(1) -RTC_IRQHandler - B RTC_IRQHandler - - PUBWEAK FLASH_IRQHandler - SECTION .text:CODE:REORDER(1) -FLASH_IRQHandler - B FLASH_IRQHandler - - PUBWEAK RCC_IRQHandler - SECTION .text:CODE:REORDER(1) -RCC_IRQHandler - B RCC_IRQHandler - - PUBWEAK EXTI0_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI0_IRQHandler - B EXTI0_IRQHandler - - PUBWEAK EXTI1_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI1_IRQHandler - B EXTI1_IRQHandler - - PUBWEAK EXTI2_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI2_IRQHandler - B EXTI2_IRQHandler - - PUBWEAK EXTI3_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI3_IRQHandler - B EXTI3_IRQHandler - - PUBWEAK EXTI4_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI4_IRQHandler - B EXTI4_IRQHandler - - PUBWEAK DMA1_Channel1_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel1_IRQHandler - B DMA1_Channel1_IRQHandler - - PUBWEAK DMA1_Channel2_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel2_IRQHandler - B DMA1_Channel2_IRQHandler - - PUBWEAK DMA1_Channel3_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel3_IRQHandler - B DMA1_Channel3_IRQHandler - - PUBWEAK DMA1_Channel4_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel4_IRQHandler - B DMA1_Channel4_IRQHandler - - PUBWEAK DMA1_Channel5_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel5_IRQHandler - B DMA1_Channel5_IRQHandler - - PUBWEAK DMA1_Channel6_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel6_IRQHandler - B DMA1_Channel6_IRQHandler - - PUBWEAK DMA1_Channel7_IRQHandler - SECTION .text:CODE:REORDER(1) -DMA1_Channel7_IRQHandler - B DMA1_Channel7_IRQHandler - - PUBWEAK ADC1_IRQHandler - SECTION .text:CODE:REORDER(1) -ADC1_IRQHandler - B ADC1_IRQHandler - - PUBWEAK EXTI9_5_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI9_5_IRQHandler - B EXTI9_5_IRQHandler - - PUBWEAK TIM1_BRK_TIM15_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_BRK_TIM15_IRQHandler - B TIM1_BRK_TIM15_IRQHandler - - PUBWEAK TIM1_UP_TIM16_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_UP_TIM16_IRQHandler - B TIM1_UP_TIM16_IRQHandler - - PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_TRG_COM_TIM17_IRQHandler - B TIM1_TRG_COM_TIM17_IRQHandler - - PUBWEAK TIM1_CC_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM1_CC_IRQHandler - B TIM1_CC_IRQHandler - - PUBWEAK TIM2_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM2_IRQHandler - B TIM2_IRQHandler - - PUBWEAK TIM3_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM3_IRQHandler - B TIM3_IRQHandler - - PUBWEAK TIM4_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM4_IRQHandler - B TIM4_IRQHandler - - PUBWEAK I2C1_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_EV_IRQHandler - B I2C1_EV_IRQHandler - - PUBWEAK I2C1_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C1_ER_IRQHandler - B I2C1_ER_IRQHandler - - PUBWEAK I2C2_EV_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C2_EV_IRQHandler - B I2C2_EV_IRQHandler - - PUBWEAK I2C2_ER_IRQHandler - SECTION .text:CODE:REORDER(1) -I2C2_ER_IRQHandler - B I2C2_ER_IRQHandler - - PUBWEAK SPI1_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI1_IRQHandler - B SPI1_IRQHandler - - PUBWEAK SPI2_IRQHandler - SECTION .text:CODE:REORDER(1) -SPI2_IRQHandler - B SPI2_IRQHandler - - PUBWEAK USART1_IRQHandler - SECTION .text:CODE:REORDER(1) -USART1_IRQHandler - B USART1_IRQHandler - - PUBWEAK USART2_IRQHandler - SECTION .text:CODE:REORDER(1) -USART2_IRQHandler - B USART2_IRQHandler - - PUBWEAK USART3_IRQHandler - SECTION .text:CODE:REORDER(1) -USART3_IRQHandler - B USART3_IRQHandler - - PUBWEAK EXTI15_10_IRQHandler - SECTION .text:CODE:REORDER(1) -EXTI15_10_IRQHandler - B EXTI15_10_IRQHandler - - PUBWEAK RTCAlarm_IRQHandler - SECTION .text:CODE:REORDER(1) -RTCAlarm_IRQHandler - B RTCAlarm_IRQHandler - - PUBWEAK CEC_IRQHandler - SECTION .text:CODE:REORDER(1) -CEC_IRQHandler - B CEC_IRQHandler - - PUBWEAK TIM6_DAC_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM6_DAC_IRQHandler - B TIM6_DAC_IRQHandler - - PUBWEAK TIM7_IRQHandler - SECTION .text:CODE:REORDER(1) -TIM7_IRQHandler - B TIM7_IRQHandler - - END -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h deleted file mode 100644 index 46098c283e..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h +++ /dev/null @@ -1,8112 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. - * This file contains all the peripheral register's definitions, bits - * definitions and memory mapping for STM32F10x Connectivity line, High - * density, Medium density, Medium density Value line, Low density - * and Low density Value line devices. - ****************************************************************************** - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f10x - * @{ - */ - -#ifndef __STM32F10x_H -#define __STM32F10x_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup Library_configuration_section - * @{ - */ - -/* Uncomment the line below according to the target STM32 device used in your - application - */ - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_CL) - /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */ - /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ - /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */ - #define STM32F10X_MD_VL /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ - /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */ - /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */ -#endif -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - - - Low density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers - where the Flash memory density ranges between 16 and 32 Kbytes. - - Low-density value line devices are STM32F100xx microcontrollers where the Flash - memory density ranges between 16 and 32 Kbytes. - - Medium density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers - where the Flash memory density ranges between 64 and 128 Kbytes. - - Medium-density value line devices are STM32F100xx microcontrollers where the - Flash memory density ranges between 64 and 128 Kbytes. - - High density devices are STM32F101xx and STM32F103xx microcontrollers where - the Flash memory density ranges between 256 and 512 Kbytes. - - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers. - */ - -#if !defined USE_STDPERIPH_DRIVER -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_STDPERIPH_DRIVER*/ -#endif - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ -#if !defined HSE_VALUE - #ifdef STM32F10X_CL - #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ - #else - #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ - #endif /* STM32F10X_CL */ -#endif /* HSE_VALUE */ - - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - Timeout value - */ -#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ - -#define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ - -/** - * @brief STM32F10x Standard Peripheral Library version number - */ -#define __STM32F10X_STDPERIPH_VERSION_MAIN (0x03) /*!< [31:16] STM32F10x Standard Peripheral Library main version */ -#define __STM32F10X_STDPERIPH_VERSION_SUB1 (0x02) /*!< [15:8] STM32F10x Standard Peripheral Library sub1 version */ -#define __STM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [7:0] STM32F10x Standard Peripheral Library sub2 version */ -#define __STM32F10X_STDPERIPH_VERSION ((__STM32F10X_STDPERIPH_VERSION_MAIN << 16)\ - | (__STM32F10X_STDPERIPH_VERSION_SUB1 << 8)\ - | __STM32F10X_STDPERIPH_VERSION_SUB2) - -/** - * @} - */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M3 Processor and Core Peripherals - */ -#define __MPU_PRESENT 0 /*!< STM32 does not provide an MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32 uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/** - * @brief STM32F10x Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum IRQn -{ -/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ - -/****** STM32 specific Interrupt Numbers *********************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMPER_IRQn = 2, /*!< Tamper Interrupt */ - RTC_IRQn = 3, /*!< RTC global Interrupt */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ - DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ - DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ - DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ - DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ - DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ - DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ - -#ifdef STM32F10X_LD - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ - TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ - TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ -#endif /* STM32F10X_LD */ - -#ifdef STM32F10X_LD_VL - ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ - TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ - TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ - TIM7_IRQn = 55, /*!< TIM7 Interrupt */ -#endif /* STM32F10X_LD_VL */ - -#ifdef STM32F10X_MD - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ - TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ - TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ -#endif /* STM32F10X_MD */ - -#ifdef STM32F10X_MD_VL - ADC1_IRQn = 18, /*!< ADC1 global Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM15_IRQn = 24, /*!< TIM1 Break and TIM15 Interrupts */ - TIM1_UP_TIM16_IRQn = 25, /*!< TIM1 Update and TIM16 Interrupts */ - TIM1_TRG_COM_TIM17_IRQn = 26, /*!< TIM1 Trigger and Commutation and TIM17 Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - CEC_IRQn = 42, /*!< HDMI-CEC Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 and DAC underrun Interrupt */ - TIM7_IRQn = 55, /*!< TIM7 Interrupt */ -#endif /* STM32F10X_MD_VL */ - -#ifdef STM32F10X_HD - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ - TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ - TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ - TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ - TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */ - TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ - TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ - DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ - DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ - DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ - DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ -#endif /* STM32F10X_HD */ - -#ifdef STM32F10X_CL - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ - CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ - TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ - TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ - TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ - DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ - DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ - DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ - DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */ - DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67 /*!< USB OTG FS global Interrupt */ -#endif /* STM32F10X_CL */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm3.h" -#include "system_stm32f10x.h" -#include - -/** @addtogroup Exported_types - * @{ - */ - -/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef const int32_t sc32; /*!< Read Only */ -typedef const int16_t sc16; /*!< Read Only */ -typedef const int8_t sc8; /*!< Read Only */ - -typedef __IO int32_t vs32; -typedef __IO int16_t vs16; -typedef __IO int8_t vs8; - -typedef __I int32_t vsc32; /*!< Read Only */ -typedef __I int16_t vsc16; /*!< Read Only */ -typedef __I int8_t vsc8; /*!< Read Only */ - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - -typedef const uint32_t uc32; /*!< Read Only */ -typedef const uint16_t uc16; /*!< Read Only */ -typedef const uint8_t uc8; /*!< Read Only */ - -typedef __IO uint32_t vu32; -typedef __IO uint16_t vu16; -typedef __IO uint8_t vu8; - -typedef __I uint32_t vuc32; /*!< Read Only */ -typedef __I uint16_t vuc16; /*!< Read Only */ -typedef __I uint8_t vuc8; /*!< Read Only */ - -#ifndef __cplusplus -typedef enum {FALSE = 0, TRUE = !FALSE} bool; -#endif - -typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; - -typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; -#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) - -typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; - -/*!< STM32F10x Standard Peripheral Library old definitions (maintained for legacy purpose) */ -#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT -#define HSE_Value HSE_VALUE -#define HSI_Value HSI_VALUE -/** - * @} - */ - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; - __IO uint32_t CR1; - __IO uint32_t CR2; - __IO uint32_t SMPR1; - __IO uint32_t SMPR2; - __IO uint32_t JOFR1; - __IO uint32_t JOFR2; - __IO uint32_t JOFR3; - __IO uint32_t JOFR4; - __IO uint32_t HTR; - __IO uint32_t LTR; - __IO uint32_t SQR1; - __IO uint32_t SQR2; - __IO uint32_t SQR3; - __IO uint32_t JSQR; - __IO uint32_t JDR1; - __IO uint32_t JDR2; - __IO uint32_t JDR3; - __IO uint32_t JDR4; - __IO uint32_t DR; -} ADC_TypeDef; - -/** - * @brief Backup Registers - */ - -typedef struct -{ - uint32_t RESERVED0; - __IO uint16_t DR1; - uint16_t RESERVED1; - __IO uint16_t DR2; - uint16_t RESERVED2; - __IO uint16_t DR3; - uint16_t RESERVED3; - __IO uint16_t DR4; - uint16_t RESERVED4; - __IO uint16_t DR5; - uint16_t RESERVED5; - __IO uint16_t DR6; - uint16_t RESERVED6; - __IO uint16_t DR7; - uint16_t RESERVED7; - __IO uint16_t DR8; - uint16_t RESERVED8; - __IO uint16_t DR9; - uint16_t RESERVED9; - __IO uint16_t DR10; - uint16_t RESERVED10; - __IO uint16_t RTCCR; - uint16_t RESERVED11; - __IO uint16_t CR; - uint16_t RESERVED12; - __IO uint16_t CSR; - uint16_t RESERVED13[5]; - __IO uint16_t DR11; - uint16_t RESERVED14; - __IO uint16_t DR12; - uint16_t RESERVED15; - __IO uint16_t DR13; - uint16_t RESERVED16; - __IO uint16_t DR14; - uint16_t RESERVED17; - __IO uint16_t DR15; - uint16_t RESERVED18; - __IO uint16_t DR16; - uint16_t RESERVED19; - __IO uint16_t DR17; - uint16_t RESERVED20; - __IO uint16_t DR18; - uint16_t RESERVED21; - __IO uint16_t DR19; - uint16_t RESERVED22; - __IO uint16_t DR20; - uint16_t RESERVED23; - __IO uint16_t DR21; - uint16_t RESERVED24; - __IO uint16_t DR22; - uint16_t RESERVED25; - __IO uint16_t DR23; - uint16_t RESERVED26; - __IO uint16_t DR24; - uint16_t RESERVED27; - __IO uint16_t DR25; - uint16_t RESERVED28; - __IO uint16_t DR26; - uint16_t RESERVED29; - __IO uint16_t DR27; - uint16_t RESERVED30; - __IO uint16_t DR28; - uint16_t RESERVED31; - __IO uint16_t DR29; - uint16_t RESERVED32; - __IO uint16_t DR30; - uint16_t RESERVED33; - __IO uint16_t DR31; - uint16_t RESERVED34; - __IO uint16_t DR32; - uint16_t RESERVED35; - __IO uint16_t DR33; - uint16_t RESERVED36; - __IO uint16_t DR34; - uint16_t RESERVED37; - __IO uint16_t DR35; - uint16_t RESERVED38; - __IO uint16_t DR36; - uint16_t RESERVED39; - __IO uint16_t DR37; - uint16_t RESERVED40; - __IO uint16_t DR38; - uint16_t RESERVED41; - __IO uint16_t DR39; - uint16_t RESERVED42; - __IO uint16_t DR40; - uint16_t RESERVED43; - __IO uint16_t DR41; - uint16_t RESERVED44; - __IO uint16_t DR42; - uint16_t RESERVED45; -} BKP_TypeDef; - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; - __IO uint32_t TDTR; - __IO uint32_t TDLR; - __IO uint32_t TDHR; -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; - __IO uint32_t RDTR; - __IO uint32_t RDLR; - __IO uint32_t RDHR; -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; - __IO uint32_t FR2; -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; - __IO uint32_t MSR; - __IO uint32_t TSR; - __IO uint32_t RF0R; - __IO uint32_t RF1R; - __IO uint32_t IER; - __IO uint32_t ESR; - __IO uint32_t BTR; - uint32_t RESERVED0[88]; - CAN_TxMailBox_TypeDef sTxMailBox[3]; - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; - uint32_t RESERVED1[12]; - __IO uint32_t FMR; - __IO uint32_t FM1R; - uint32_t RESERVED2; - __IO uint32_t FS1R; - uint32_t RESERVED3; - __IO uint32_t FFA1R; - uint32_t RESERVED4; - __IO uint32_t FA1R; - uint32_t RESERVED5[8]; -#ifndef STM32F10X_CL - CAN_FilterRegister_TypeDef sFilterRegister[14]; -#else - CAN_FilterRegister_TypeDef sFilterRegister[28]; -#endif /* STM32F10X_CL */ -} CAN_TypeDef; - -/** - * @brief Consumer Electronics Control (CEC) - */ -typedef struct -{ - __IO uint32_t CFGR; - __IO uint32_t OAR; - __IO uint32_t PRES; - __IO uint32_t ESR; - __IO uint32_t CSR; - __IO uint32_t TXD; - __IO uint32_t RXD; -} CEC_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; - __IO uint8_t IDR; - uint8_t RESERVED0; - uint16_t RESERVED1; - __IO uint32_t CR; -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t SWTRIGR; - __IO uint32_t DHR12R1; - __IO uint32_t DHR12L1; - __IO uint32_t DHR8R1; - __IO uint32_t DHR12R2; - __IO uint32_t DHR12L2; - __IO uint32_t DHR8R2; - __IO uint32_t DHR12RD; - __IO uint32_t DHR12LD; - __IO uint32_t DHR8RD; - __IO uint32_t DOR1; - __IO uint32_t DOR2; -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - __IO uint32_t SR; -#endif -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; - __IO uint32_t CR; -}DBGMCU_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CCR; - __IO uint32_t CNDTR; - __IO uint32_t CPAR; - __IO uint32_t CMAR; -} DMA_Channel_TypeDef; - -typedef struct -{ - __IO uint32_t ISR; - __IO uint32_t IFCR; -} DMA_TypeDef; - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1[2]; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - uint32_t RESERVED8[567]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - uint32_t RESERVED9[9]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; - __IO uint32_t EMR; - __IO uint32_t RTSR; - __IO uint32_t FTSR; - __IO uint32_t SWIER; - __IO uint32_t PR; -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; - __IO uint32_t KEYR; - __IO uint32_t OPTKEYR; - __IO uint32_t SR; - __IO uint32_t CR; - __IO uint32_t AR; - __IO uint32_t RESERVED; - __IO uint32_t OBR; - __IO uint32_t WRPR; -} FLASH_TypeDef; - -/** - * @brief Option Bytes Registers - */ - -typedef struct -{ - __IO uint16_t RDP; - __IO uint16_t USER; - __IO uint16_t Data0; - __IO uint16_t Data1; - __IO uint16_t WRP0; - __IO uint16_t WRP1; - __IO uint16_t WRP2; - __IO uint16_t WRP3; -} OB_TypeDef; - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; - __IO uint32_t SR2; - __IO uint32_t PMEM2; - __IO uint32_t PATT2; - uint32_t RESERVED0; - __IO uint32_t ECCR2; -} FSMC_Bank2_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank3 - */ - -typedef struct -{ - __IO uint32_t PCR3; - __IO uint32_t SR3; - __IO uint32_t PMEM3; - __IO uint32_t PATT3; - uint32_t RESERVED0; - __IO uint32_t ECCR3; -} FSMC_Bank3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; - __IO uint32_t SR4; - __IO uint32_t PMEM4; - __IO uint32_t PATT4; - __IO uint32_t PIO4; -} FSMC_Bank4_TypeDef; - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t CRL; - __IO uint32_t CRH; - __IO uint32_t IDR; - __IO uint32_t ODR; - __IO uint32_t BSRR; - __IO uint32_t BRR; - __IO uint32_t LCKR; -} GPIO_TypeDef; - -/** - * @brief Alternate Function I/O - */ - -typedef struct -{ - __IO uint32_t EVCR; - __IO uint32_t MAPR; - __IO uint32_t EXTICR[4]; - uint32_t RESERVED0; - __IO uint32_t MAPR2; -} AFIO_TypeDef; -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint16_t CR1; - uint16_t RESERVED0; - __IO uint16_t CR2; - uint16_t RESERVED1; - __IO uint16_t OAR1; - uint16_t RESERVED2; - __IO uint16_t OAR2; - uint16_t RESERVED3; - __IO uint16_t DR; - uint16_t RESERVED4; - __IO uint16_t SR1; - uint16_t RESERVED5; - __IO uint16_t SR2; - uint16_t RESERVED6; - __IO uint16_t CCR; - uint16_t RESERVED7; - __IO uint16_t TRISE; - uint16_t RESERVED8; -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; - __IO uint32_t PR; - __IO uint32_t RLR; - __IO uint32_t SR; -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t CSR; -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t CFGR; - __IO uint32_t CIR; - __IO uint32_t APB2RSTR; - __IO uint32_t APB1RSTR; - __IO uint32_t AHBENR; - __IO uint32_t APB2ENR; - __IO uint32_t APB1ENR; - __IO uint32_t BDCR; - __IO uint32_t CSR; - -#ifdef STM32F10X_CL - __IO uint32_t AHBRSTR; - __IO uint32_t CFGR2; -#endif /* STM32F10X_CL */ - -#if defined STM32F10X_LD_VL || defined STM32F10X_MD_VL - uint32_t RESERVED0; - __IO uint32_t CFGR2; -#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint16_t CRH; - uint16_t RESERVED0; - __IO uint16_t CRL; - uint16_t RESERVED1; - __IO uint16_t PRLH; - uint16_t RESERVED2; - __IO uint16_t PRLL; - uint16_t RESERVED3; - __IO uint16_t DIVH; - uint16_t RESERVED4; - __IO uint16_t DIVL; - uint16_t RESERVED5; - __IO uint16_t CNTH; - uint16_t RESERVED6; - __IO uint16_t CNTL; - uint16_t RESERVED7; - __IO uint16_t ALRH; - uint16_t RESERVED8; - __IO uint16_t ALRL; - uint16_t RESERVED9; -} RTC_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; - __IO uint32_t CLKCR; - __IO uint32_t ARG; - __IO uint32_t CMD; - __I uint32_t RESPCMD; - __I uint32_t RESP1; - __I uint32_t RESP2; - __I uint32_t RESP3; - __I uint32_t RESP4; - __IO uint32_t DTIMER; - __IO uint32_t DLEN; - __IO uint32_t DCTRL; - __I uint32_t DCOUNT; - __I uint32_t STA; - __IO uint32_t ICR; - __IO uint32_t MASK; - uint32_t RESERVED0[2]; - __I uint32_t FIFOCNT; - uint32_t RESERVED1[13]; - __IO uint32_t FIFO; -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint16_t CR1; - uint16_t RESERVED0; - __IO uint16_t CR2; - uint16_t RESERVED1; - __IO uint16_t SR; - uint16_t RESERVED2; - __IO uint16_t DR; - uint16_t RESERVED3; - __IO uint16_t CRCPR; - uint16_t RESERVED4; - __IO uint16_t RXCRCR; - uint16_t RESERVED5; - __IO uint16_t TXCRCR; - uint16_t RESERVED6; - __IO uint16_t I2SCFGR; - uint16_t RESERVED7; - __IO uint16_t I2SPR; - uint16_t RESERVED8; -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint16_t CR1; - uint16_t RESERVED0; - __IO uint16_t CR2; - uint16_t RESERVED1; - __IO uint16_t SMCR; - uint16_t RESERVED2; - __IO uint16_t DIER; - uint16_t RESERVED3; - __IO uint16_t SR; - uint16_t RESERVED4; - __IO uint16_t EGR; - uint16_t RESERVED5; - __IO uint16_t CCMR1; - uint16_t RESERVED6; - __IO uint16_t CCMR2; - uint16_t RESERVED7; - __IO uint16_t CCER; - uint16_t RESERVED8; - __IO uint16_t CNT; - uint16_t RESERVED9; - __IO uint16_t PSC; - uint16_t RESERVED10; - __IO uint16_t ARR; - uint16_t RESERVED11; - __IO uint16_t RCR; - uint16_t RESERVED12; - __IO uint16_t CCR1; - uint16_t RESERVED13; - __IO uint16_t CCR2; - uint16_t RESERVED14; - __IO uint16_t CCR3; - uint16_t RESERVED15; - __IO uint16_t CCR4; - uint16_t RESERVED16; - __IO uint16_t BDTR; - uint16_t RESERVED17; - __IO uint16_t DCR; - uint16_t RESERVED18; - __IO uint16_t DMAR; - uint16_t RESERVED19; -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint16_t SR; - uint16_t RESERVED0; - __IO uint16_t DR; - uint16_t RESERVED1; - __IO uint16_t BRR; - uint16_t RESERVED2; - __IO uint16_t CR1; - uint16_t RESERVED3; - __IO uint16_t CR2; - uint16_t RESERVED4; - __IO uint16_t CR3; - uint16_t RESERVED5; - __IO uint16_t GTPR; - uint16_t RESERVED6; -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; - __IO uint32_t CFR; - __IO uint32_t SR; -} WWDG_TypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ - -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the alias region */ -#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the alias region */ - -#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the bit-band region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the bit-band region */ - -#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) -#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) - -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) -#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) -#define CEC_BASE (APB1PERIPH_BASE + 0x7800) - -#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) -#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) -#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) -#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) -#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) -#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) -#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) -#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) -#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) -#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define TIM8_BASE (APB2PERIPH_BASE + 0x3400) -#define USART1_BASE (APB2PERIPH_BASE + 0x3800) -#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00) -#define TIM15_BASE (APB2PERIPH_BASE + 0x4000) -#define TIM16_BASE (APB2PERIPH_BASE + 0x4400) -#define TIM17_BASE (APB2PERIPH_BASE + 0x4800) - -#define SDIO_BASE (PERIPH_BASE + 0x18000) - -#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) -#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) -#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) -#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) -#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) -#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) -#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) -#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) -#define DMA2_BASE (AHBPERIPH_BASE + 0x0400) -#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408) -#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C) -#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430) -#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444) -#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458) -#define RCC_BASE (AHBPERIPH_BASE + 0x1000) -#define CRC_BASE (AHBPERIPH_BASE + 0x3000) - -#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) /*!< Flash registers base address */ -#define OB_BASE ((uint32_t)0x1FFFF800) /*!< Flash Option Bytes base address */ - -#define ETH_BASE (AHBPERIPH_BASE + 0x8000) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100) -#define ETH_PTP_BASE (ETH_BASE + 0x0700) -#define ETH_DMA_BASE (ETH_BASE + 0x1000) - -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) /*!< FSMC Bank1 registers base address */ -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) /*!< FSMC Bank1E registers base address */ -#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) /*!< FSMC Bank2 registers base address */ -#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) /*!< FSMC Bank3 registers base address */ -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) /*!< FSMC Bank4 registers base address */ - -#define DBGMCU_BASE ((uint32_t)0xE0042000) /*!< Debug MCU registers base address */ - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ - -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define BKP ((BKP_TypeDef *) BKP_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define CEC ((CEC_TypeDef *) CEC_BASE) -#define AFIO ((AFIO_TypeDef *) AFIO_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define TIM15 ((TIM_TypeDef *) TIM15_BASE) -#define TIM16 ((TIM_TypeDef *) TIM16_BASE) -#define TIM17 ((TIM_TypeDef *) TIM17_BASE) -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) -#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) -#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) -#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) -#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) -#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) -#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) -#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE) -#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE) -#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE) -#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE) -#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define OB ((OB_TypeDef *) OB_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) -#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* CRC calculation unit */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for CRC_DR register *********************/ -#define CRC_DR_DR ((uint32_t)0xFFFFFFFF) /*!< Data register bits */ - - -/******************* Bit definition for CRC_IDR register ********************/ -#define CRC_IDR_IDR ((uint8_t)0xFF) /*!< General-purpose 8-bit data register bits */ - - -/******************** Bit definition for CRC_CR register ********************/ -#define CRC_CR_RESET ((uint8_t)0x01) /*!< RESET bit */ - -/******************************************************************************/ -/* */ -/* Power Control */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for PWR_CR register ********************/ -#define PWR_CR_LPDS ((uint16_t)0x0001) /*!< Low-Power Deepsleep */ -#define PWR_CR_PDDS ((uint16_t)0x0002) /*!< Power Down Deepsleep */ -#define PWR_CR_CWUF ((uint16_t)0x0004) /*!< Clear Wakeup Flag */ -#define PWR_CR_CSBF ((uint16_t)0x0008) /*!< Clear Standby Flag */ -#define PWR_CR_PVDE ((uint16_t)0x0010) /*!< Power Voltage Detector Enable */ - -#define PWR_CR_PLS ((uint16_t)0x00E0) /*!< PLS[2:0] bits (PVD Level Selection) */ -#define PWR_CR_PLS_0 ((uint16_t)0x0020) /*!< Bit 0 */ -#define PWR_CR_PLS_1 ((uint16_t)0x0040) /*!< Bit 1 */ -#define PWR_CR_PLS_2 ((uint16_t)0x0080) /*!< Bit 2 */ - -/*!< PVD level configuration */ -#define PWR_CR_PLS_2V2 ((uint16_t)0x0000) /*!< PVD level 2.2V */ -#define PWR_CR_PLS_2V3 ((uint16_t)0x0020) /*!< PVD level 2.3V */ -#define PWR_CR_PLS_2V4 ((uint16_t)0x0040) /*!< PVD level 2.4V */ -#define PWR_CR_PLS_2V5 ((uint16_t)0x0060) /*!< PVD level 2.5V */ -#define PWR_CR_PLS_2V6 ((uint16_t)0x0080) /*!< PVD level 2.6V */ -#define PWR_CR_PLS_2V7 ((uint16_t)0x00A0) /*!< PVD level 2.7V */ -#define PWR_CR_PLS_2V8 ((uint16_t)0x00C0) /*!< PVD level 2.8V */ -#define PWR_CR_PLS_2V9 ((uint16_t)0x00E0) /*!< PVD level 2.9V */ - -#define PWR_CR_DBP ((uint16_t)0x0100) /*!< Disable Backup Domain write protection */ - - -/******************* Bit definition for PWR_CSR register ********************/ -#define PWR_CSR_WUF ((uint16_t)0x0001) /*!< Wakeup Flag */ -#define PWR_CSR_SBF ((uint16_t)0x0002) /*!< Standby Flag */ -#define PWR_CSR_PVDO ((uint16_t)0x0004) /*!< PVD Output */ -#define PWR_CSR_EWUP ((uint16_t)0x0100) /*!< Enable WKUP pin */ - -/******************************************************************************/ -/* */ -/* Backup registers */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for BKP_DR1 register ********************/ -#define BKP_DR1_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR2 register ********************/ -#define BKP_DR2_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR3 register ********************/ -#define BKP_DR3_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR4 register ********************/ -#define BKP_DR4_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR5 register ********************/ -#define BKP_DR5_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR6 register ********************/ -#define BKP_DR6_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR7 register ********************/ -#define BKP_DR7_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR8 register ********************/ -#define BKP_DR8_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR9 register ********************/ -#define BKP_DR9_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR10 register *******************/ -#define BKP_DR10_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR11 register *******************/ -#define BKP_DR11_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR12 register *******************/ -#define BKP_DR12_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR13 register *******************/ -#define BKP_DR13_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR14 register *******************/ -#define BKP_DR14_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR15 register *******************/ -#define BKP_DR15_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR16 register *******************/ -#define BKP_DR16_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR17 register *******************/ -#define BKP_DR17_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/****************** Bit definition for BKP_DR18 register ********************/ -#define BKP_DR18_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR19 register *******************/ -#define BKP_DR19_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR20 register *******************/ -#define BKP_DR20_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR21 register *******************/ -#define BKP_DR21_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR22 register *******************/ -#define BKP_DR22_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR23 register *******************/ -#define BKP_DR23_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR24 register *******************/ -#define BKP_DR24_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR25 register *******************/ -#define BKP_DR25_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR26 register *******************/ -#define BKP_DR26_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR27 register *******************/ -#define BKP_DR27_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR28 register *******************/ -#define BKP_DR28_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR29 register *******************/ -#define BKP_DR29_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR30 register *******************/ -#define BKP_DR30_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR31 register *******************/ -#define BKP_DR31_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR32 register *******************/ -#define BKP_DR32_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR33 register *******************/ -#define BKP_DR33_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR34 register *******************/ -#define BKP_DR34_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR35 register *******************/ -#define BKP_DR35_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR36 register *******************/ -#define BKP_DR36_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR37 register *******************/ -#define BKP_DR37_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR38 register *******************/ -#define BKP_DR38_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR39 register *******************/ -#define BKP_DR39_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR40 register *******************/ -#define BKP_DR40_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR41 register *******************/ -#define BKP_DR41_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/******************* Bit definition for BKP_DR42 register *******************/ -#define BKP_DR42_D ((uint16_t)0xFFFF) /*!< Backup data */ - -/****************** Bit definition for BKP_RTCCR register *******************/ -#define BKP_RTCCR_CAL ((uint16_t)0x007F) /*!< Calibration value */ -#define BKP_RTCCR_CCO ((uint16_t)0x0080) /*!< Calibration Clock Output */ -#define BKP_RTCCR_ASOE ((uint16_t)0x0100) /*!< Alarm or Second Output Enable */ -#define BKP_RTCCR_ASOS ((uint16_t)0x0200) /*!< Alarm or Second Output Selection */ - -/******************** Bit definition for BKP_CR register ********************/ -#define BKP_CR_TPE ((uint8_t)0x01) /*!< TAMPER pin enable */ -#define BKP_CR_TPAL ((uint8_t)0x02) /*!< TAMPER pin active level */ - -/******************* Bit definition for BKP_CSR register ********************/ -#define BKP_CSR_CTE ((uint16_t)0x0001) /*!< Clear Tamper event */ -#define BKP_CSR_CTI ((uint16_t)0x0002) /*!< Clear Tamper Interrupt */ -#define BKP_CSR_TPIE ((uint16_t)0x0004) /*!< TAMPER Pin interrupt enable */ -#define BKP_CSR_TEF ((uint16_t)0x0100) /*!< Tamper Event Flag */ -#define BKP_CSR_TIF ((uint16_t)0x0200) /*!< Tamper Interrupt Flag */ - -/******************************************************************************/ -/* */ -/* Reset and Clock Control */ -/* */ -/******************************************************************************/ - -/******************** Bit definition for RCC_CR register ********************/ -#define RCC_CR_HSION ((uint32_t)0x00000001) /*!< Internal High Speed clock enable */ -#define RCC_CR_HSIRDY ((uint32_t)0x00000002) /*!< Internal High Speed clock ready flag */ -#define RCC_CR_HSITRIM ((uint32_t)0x000000F8) /*!< Internal High Speed clock trimming */ -#define RCC_CR_HSICAL ((uint32_t)0x0000FF00) /*!< Internal High Speed clock Calibration */ -#define RCC_CR_HSEON ((uint32_t)0x00010000) /*!< External High Speed clock enable */ -#define RCC_CR_HSERDY ((uint32_t)0x00020000) /*!< External High Speed clock ready flag */ -#define RCC_CR_HSEBYP ((uint32_t)0x00040000) /*!< External High Speed clock Bypass */ -#define RCC_CR_CSSON ((uint32_t)0x00080000) /*!< Clock Security System enable */ -#define RCC_CR_PLLON ((uint32_t)0x01000000) /*!< PLL enable */ -#define RCC_CR_PLLRDY ((uint32_t)0x02000000) /*!< PLL clock ready flag */ - -#ifdef STM32F10X_CL - #define RCC_CR_PLL2ON ((uint32_t)0x04000000) /*!< PLL2 enable */ - #define RCC_CR_PLL2RDY ((uint32_t)0x08000000) /*!< PLL2 clock ready flag */ - #define RCC_CR_PLL3ON ((uint32_t)0x10000000) /*!< PLL3 enable */ - #define RCC_CR_PLL3RDY ((uint32_t)0x20000000) /*!< PLL3 clock ready flag */ -#endif /* STM32F10X_CL */ - -/******************* Bit definition for RCC_CFGR register *******************/ -/*!< SW configuration */ -#define RCC_CFGR_SW ((uint32_t)0x00000003) /*!< SW[1:0] bits (System clock Switch) */ -#define RCC_CFGR_SW_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define RCC_CFGR_SW_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - -#define RCC_CFGR_SW_HSI ((uint32_t)0x00000000) /*!< HSI selected as system clock */ -#define RCC_CFGR_SW_HSE ((uint32_t)0x00000001) /*!< HSE selected as system clock */ -#define RCC_CFGR_SW_PLL ((uint32_t)0x00000002) /*!< PLL selected as system clock */ - -/*!< SWS configuration */ -#define RCC_CFGR_SWS ((uint32_t)0x0000000C) /*!< SWS[1:0] bits (System Clock Switch Status) */ -#define RCC_CFGR_SWS_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define RCC_CFGR_SWS_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define RCC_CFGR_SWS_HSI ((uint32_t)0x00000000) /*!< HSI oscillator used as system clock */ -#define RCC_CFGR_SWS_HSE ((uint32_t)0x00000004) /*!< HSE oscillator used as system clock */ -#define RCC_CFGR_SWS_PLL ((uint32_t)0x00000008) /*!< PLL used as system clock */ - -/*!< HPRE configuration */ -#define RCC_CFGR_HPRE ((uint32_t)0x000000F0) /*!< HPRE[3:0] bits (AHB prescaler) */ -#define RCC_CFGR_HPRE_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define RCC_CFGR_HPRE_1 ((uint32_t)0x00000020) /*!< Bit 1 */ -#define RCC_CFGR_HPRE_2 ((uint32_t)0x00000040) /*!< Bit 2 */ -#define RCC_CFGR_HPRE_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - -#define RCC_CFGR_HPRE_DIV1 ((uint32_t)0x00000000) /*!< SYSCLK not divided */ -#define RCC_CFGR_HPRE_DIV2 ((uint32_t)0x00000080) /*!< SYSCLK divided by 2 */ -#define RCC_CFGR_HPRE_DIV4 ((uint32_t)0x00000090) /*!< SYSCLK divided by 4 */ -#define RCC_CFGR_HPRE_DIV8 ((uint32_t)0x000000A0) /*!< SYSCLK divided by 8 */ -#define RCC_CFGR_HPRE_DIV16 ((uint32_t)0x000000B0) /*!< SYSCLK divided by 16 */ -#define RCC_CFGR_HPRE_DIV64 ((uint32_t)0x000000C0) /*!< SYSCLK divided by 64 */ -#define RCC_CFGR_HPRE_DIV128 ((uint32_t)0x000000D0) /*!< SYSCLK divided by 128 */ -#define RCC_CFGR_HPRE_DIV256 ((uint32_t)0x000000E0) /*!< SYSCLK divided by 256 */ -#define RCC_CFGR_HPRE_DIV512 ((uint32_t)0x000000F0) /*!< SYSCLK divided by 512 */ - -/*!< PPRE1 configuration */ -#define RCC_CFGR_PPRE1 ((uint32_t)0x00000700) /*!< PRE1[2:0] bits (APB1 prescaler) */ -#define RCC_CFGR_PPRE1_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define RCC_CFGR_PPRE1_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define RCC_CFGR_PPRE1_2 ((uint32_t)0x00000400) /*!< Bit 2 */ - -#define RCC_CFGR_PPRE1_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ -#define RCC_CFGR_PPRE1_DIV2 ((uint32_t)0x00000400) /*!< HCLK divided by 2 */ -#define RCC_CFGR_PPRE1_DIV4 ((uint32_t)0x00000500) /*!< HCLK divided by 4 */ -#define RCC_CFGR_PPRE1_DIV8 ((uint32_t)0x00000600) /*!< HCLK divided by 8 */ -#define RCC_CFGR_PPRE1_DIV16 ((uint32_t)0x00000700) /*!< HCLK divided by 16 */ - -/*!< PPRE2 configuration */ -#define RCC_CFGR_PPRE2 ((uint32_t)0x00003800) /*!< PRE2[2:0] bits (APB2 prescaler) */ -#define RCC_CFGR_PPRE2_0 ((uint32_t)0x00000800) /*!< Bit 0 */ -#define RCC_CFGR_PPRE2_1 ((uint32_t)0x00001000) /*!< Bit 1 */ -#define RCC_CFGR_PPRE2_2 ((uint32_t)0x00002000) /*!< Bit 2 */ - -#define RCC_CFGR_PPRE2_DIV1 ((uint32_t)0x00000000) /*!< HCLK not divided */ -#define RCC_CFGR_PPRE2_DIV2 ((uint32_t)0x00002000) /*!< HCLK divided by 2 */ -#define RCC_CFGR_PPRE2_DIV4 ((uint32_t)0x00002800) /*!< HCLK divided by 4 */ -#define RCC_CFGR_PPRE2_DIV8 ((uint32_t)0x00003000) /*!< HCLK divided by 8 */ -#define RCC_CFGR_PPRE2_DIV16 ((uint32_t)0x00003800) /*!< HCLK divided by 16 */ - -/*!< ADCPPRE configuration */ -#define RCC_CFGR_ADCPRE ((uint32_t)0x0000C000) /*!< ADCPRE[1:0] bits (ADC prescaler) */ -#define RCC_CFGR_ADCPRE_0 ((uint32_t)0x00004000) /*!< Bit 0 */ -#define RCC_CFGR_ADCPRE_1 ((uint32_t)0x00008000) /*!< Bit 1 */ - -#define RCC_CFGR_ADCPRE_DIV2 ((uint32_t)0x00000000) /*!< PCLK2 divided by 2 */ -#define RCC_CFGR_ADCPRE_DIV4 ((uint32_t)0x00004000) /*!< PCLK2 divided by 4 */ -#define RCC_CFGR_ADCPRE_DIV6 ((uint32_t)0x00008000) /*!< PCLK2 divided by 6 */ -#define RCC_CFGR_ADCPRE_DIV8 ((uint32_t)0x0000C000) /*!< PCLK2 divided by 8 */ - -#define RCC_CFGR_PLLSRC ((uint32_t)0x00010000) /*!< PLL entry clock source */ - -#define RCC_CFGR_PLLXTPRE ((uint32_t)0x00020000) /*!< HSE divider for PLL entry */ - -/*!< PLLMUL configuration */ -#define RCC_CFGR_PLLMULL ((uint32_t)0x003C0000) /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ -#define RCC_CFGR_PLLMULL_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define RCC_CFGR_PLLMULL_1 ((uint32_t)0x00080000) /*!< Bit 1 */ -#define RCC_CFGR_PLLMULL_2 ((uint32_t)0x00100000) /*!< Bit 2 */ -#define RCC_CFGR_PLLMULL_3 ((uint32_t)0x00200000) /*!< Bit 3 */ - -#ifdef STM32F10X_CL - #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ - #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ - - #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ - #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ - - #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock * 4 */ - #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock * 5 */ - #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock * 6 */ - #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock * 7 */ - #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock * 8 */ - #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock * 9 */ - #define RCC_CFGR_PLLMULL6_5 ((uint32_t)0x00340000) /*!< PLL input clock * 6.5 */ - - #define RCC_CFGR_OTGFSPRE ((uint32_t)0x00400000) /*!< USB OTG FS prescaler */ - -/*!< MCO configuration */ - #define RCC_CFGR_MCO ((uint32_t)0x0F000000) /*!< MCO[3:0] bits (Microcontroller Clock Output) */ - #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ - #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - #define RCC_CFGR_MCO_3 ((uint32_t)0x08000000) /*!< Bit 3 */ - - #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ - #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ - #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ - #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ - #define RCC_CFGR_MCO_PLLCLK_Div2 ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ - #define RCC_CFGR_MCO_PLL2CLK ((uint32_t)0x08000000) /*!< PLL2 clock selected as MCO source*/ - #define RCC_CFGR_MCO_PLL3CLK_Div2 ((uint32_t)0x09000000) /*!< PLL3 clock divided by 2 selected as MCO source*/ - #define RCC_CFGR_MCO_Ext_HSE ((uint32_t)0x0A000000) /*!< XT1 external 3-25 MHz oscillator clock selected as MCO source */ - #define RCC_CFGR_MCO_PLL3CLK ((uint32_t)0x0B000000) /*!< PLL3 clock selected as MCO source */ -#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ - #define RCC_CFGR_PLLSRC_PREDIV1 ((uint32_t)0x00010000) /*!< PREDIV1 clock selected as PLL entry clock source */ - - #define RCC_CFGR_PLLXTPRE_PREDIV1 ((uint32_t)0x00000000) /*!< PREDIV1 clock not divided for PLL entry */ - #define RCC_CFGR_PLLXTPRE_PREDIV1_Div2 ((uint32_t)0x00020000) /*!< PREDIV1 clock divided by 2 for PLL entry */ - - #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ - #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ - #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ - #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ - #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ - #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ - #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ - #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ - #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ - #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ - #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ - #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ - #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ - #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ - #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ - -/*!< MCO configuration */ - #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ - #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ - #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - - #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ - #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ - #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ - #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ - #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ -#else - #define RCC_CFGR_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /*!< HSI clock divided by 2 selected as PLL entry clock source */ - #define RCC_CFGR_PLLSRC_HSE ((uint32_t)0x00010000) /*!< HSE clock selected as PLL entry clock source */ - - #define RCC_CFGR_PLLXTPRE_HSE ((uint32_t)0x00000000) /*!< HSE clock not divided for PLL entry */ - #define RCC_CFGR_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /*!< HSE clock divided by 2 for PLL entry */ - - #define RCC_CFGR_PLLMULL2 ((uint32_t)0x00000000) /*!< PLL input clock*2 */ - #define RCC_CFGR_PLLMULL3 ((uint32_t)0x00040000) /*!< PLL input clock*3 */ - #define RCC_CFGR_PLLMULL4 ((uint32_t)0x00080000) /*!< PLL input clock*4 */ - #define RCC_CFGR_PLLMULL5 ((uint32_t)0x000C0000) /*!< PLL input clock*5 */ - #define RCC_CFGR_PLLMULL6 ((uint32_t)0x00100000) /*!< PLL input clock*6 */ - #define RCC_CFGR_PLLMULL7 ((uint32_t)0x00140000) /*!< PLL input clock*7 */ - #define RCC_CFGR_PLLMULL8 ((uint32_t)0x00180000) /*!< PLL input clock*8 */ - #define RCC_CFGR_PLLMULL9 ((uint32_t)0x001C0000) /*!< PLL input clock*9 */ - #define RCC_CFGR_PLLMULL10 ((uint32_t)0x00200000) /*!< PLL input clock10 */ - #define RCC_CFGR_PLLMULL11 ((uint32_t)0x00240000) /*!< PLL input clock*11 */ - #define RCC_CFGR_PLLMULL12 ((uint32_t)0x00280000) /*!< PLL input clock*12 */ - #define RCC_CFGR_PLLMULL13 ((uint32_t)0x002C0000) /*!< PLL input clock*13 */ - #define RCC_CFGR_PLLMULL14 ((uint32_t)0x00300000) /*!< PLL input clock*14 */ - #define RCC_CFGR_PLLMULL15 ((uint32_t)0x00340000) /*!< PLL input clock*15 */ - #define RCC_CFGR_PLLMULL16 ((uint32_t)0x00380000) /*!< PLL input clock*16 */ - #define RCC_CFGR_USBPRE ((uint32_t)0x00400000) /*!< USB Device prescaler */ - -/*!< MCO configuration */ - #define RCC_CFGR_MCO ((uint32_t)0x07000000) /*!< MCO[2:0] bits (Microcontroller Clock Output) */ - #define RCC_CFGR_MCO_0 ((uint32_t)0x01000000) /*!< Bit 0 */ - #define RCC_CFGR_MCO_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - #define RCC_CFGR_MCO_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - - #define RCC_CFGR_MCO_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ - #define RCC_CFGR_MCO_SYSCLK ((uint32_t)0x04000000) /*!< System clock selected as MCO source */ - #define RCC_CFGR_MCO_HSI ((uint32_t)0x05000000) /*!< HSI clock selected as MCO source */ - #define RCC_CFGR_MCO_HSE ((uint32_t)0x06000000) /*!< HSE clock selected as MCO source */ - #define RCC_CFGR_MCO_PLL ((uint32_t)0x07000000) /*!< PLL clock divided by 2 selected as MCO source */ -#endif /* STM32F10X_CL */ - -/*!<****************** Bit definition for RCC_CIR register ********************/ -#define RCC_CIR_LSIRDYF ((uint32_t)0x00000001) /*!< LSI Ready Interrupt flag */ -#define RCC_CIR_LSERDYF ((uint32_t)0x00000002) /*!< LSE Ready Interrupt flag */ -#define RCC_CIR_HSIRDYF ((uint32_t)0x00000004) /*!< HSI Ready Interrupt flag */ -#define RCC_CIR_HSERDYF ((uint32_t)0x00000008) /*!< HSE Ready Interrupt flag */ -#define RCC_CIR_PLLRDYF ((uint32_t)0x00000010) /*!< PLL Ready Interrupt flag */ -#define RCC_CIR_CSSF ((uint32_t)0x00000080) /*!< Clock Security System Interrupt flag */ -#define RCC_CIR_LSIRDYIE ((uint32_t)0x00000100) /*!< LSI Ready Interrupt Enable */ -#define RCC_CIR_LSERDYIE ((uint32_t)0x00000200) /*!< LSE Ready Interrupt Enable */ -#define RCC_CIR_HSIRDYIE ((uint32_t)0x00000400) /*!< HSI Ready Interrupt Enable */ -#define RCC_CIR_HSERDYIE ((uint32_t)0x00000800) /*!< HSE Ready Interrupt Enable */ -#define RCC_CIR_PLLRDYIE ((uint32_t)0x00001000) /*!< PLL Ready Interrupt Enable */ -#define RCC_CIR_LSIRDYC ((uint32_t)0x00010000) /*!< LSI Ready Interrupt Clear */ -#define RCC_CIR_LSERDYC ((uint32_t)0x00020000) /*!< LSE Ready Interrupt Clear */ -#define RCC_CIR_HSIRDYC ((uint32_t)0x00040000) /*!< HSI Ready Interrupt Clear */ -#define RCC_CIR_HSERDYC ((uint32_t)0x00080000) /*!< HSE Ready Interrupt Clear */ -#define RCC_CIR_PLLRDYC ((uint32_t)0x00100000) /*!< PLL Ready Interrupt Clear */ -#define RCC_CIR_CSSC ((uint32_t)0x00800000) /*!< Clock Security System Interrupt Clear */ - -#ifdef STM32F10X_CL - #define RCC_CIR_PLL2RDYF ((uint32_t)0x00000020) /*!< PLL2 Ready Interrupt flag */ - #define RCC_CIR_PLL3RDYF ((uint32_t)0x00000040) /*!< PLL3 Ready Interrupt flag */ - #define RCC_CIR_PLL2RDYIE ((uint32_t)0x00002000) /*!< PLL2 Ready Interrupt Enable */ - #define RCC_CIR_PLL3RDYIE ((uint32_t)0x00004000) /*!< PLL3 Ready Interrupt Enable */ - #define RCC_CIR_PLL2RDYC ((uint32_t)0x00200000) /*!< PLL2 Ready Interrupt Clear */ - #define RCC_CIR_PLL3RDYC ((uint32_t)0x00400000) /*!< PLL3 Ready Interrupt Clear */ -#endif /* STM32F10X_CL */ - -/***************** Bit definition for RCC_APB2RSTR register *****************/ -#define RCC_APB2RSTR_AFIORST ((uint32_t)0x00000001) /*!< Alternate Function I/O reset */ -#define RCC_APB2RSTR_IOPARST ((uint32_t)0x00000004) /*!< I/O port A reset */ -#define RCC_APB2RSTR_IOPBRST ((uint32_t)0x00000008) /*!< I/O port B reset */ -#define RCC_APB2RSTR_IOPCRST ((uint32_t)0x00000010) /*!< I/O port C reset */ -#define RCC_APB2RSTR_IOPDRST ((uint32_t)0x00000020) /*!< I/O port D reset */ -#define RCC_APB2RSTR_ADC1RST ((uint32_t)0x00000200) /*!< ADC 1 interface reset */ - -#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) -#define RCC_APB2RSTR_ADC2RST ((uint32_t)0x00000400) /*!< ADC 2 interface reset */ -#endif - -#define RCC_APB2RSTR_TIM1RST ((uint32_t)0x00000800) /*!< TIM1 Timer reset */ -#define RCC_APB2RSTR_SPI1RST ((uint32_t)0x00001000) /*!< SPI 1 reset */ -#define RCC_APB2RSTR_USART1RST ((uint32_t)0x00004000) /*!< USART1 reset */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -#define RCC_APB2RSTR_TIM15RST ((uint32_t)0x00010000) /*!< TIM15 Timer reset */ -#define RCC_APB2RSTR_TIM16RST ((uint32_t)0x00020000) /*!< TIM16 Timer reset */ -#define RCC_APB2RSTR_TIM17RST ((uint32_t)0x00040000) /*!< TIM17 Timer reset */ -#endif - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) - #define RCC_APB2RSTR_IOPERST ((uint32_t)0x00000040) /*!< I/O port E reset */ -#endif /* STM32F10X_LD && STM32F10X_LD_VL */ - -#ifdef STM32F10X_HD - #define RCC_APB2RSTR_IOPFRST ((uint32_t)0x00000080) /*!< I/O port F reset */ - #define RCC_APB2RSTR_IOPGRST ((uint32_t)0x00000100) /*!< I/O port G reset */ - #define RCC_APB2RSTR_TIM8RST ((uint32_t)0x00002000) /*!< TIM8 Timer reset */ - #define RCC_APB2RSTR_ADC3RST ((uint32_t)0x00008000) /*!< ADC3 interface reset */ -#endif /* STM32F10X_HD */ - -/***************** Bit definition for RCC_APB1RSTR register *****************/ -#define RCC_APB1RSTR_TIM2RST ((uint32_t)0x00000001) /*!< Timer 2 reset */ -#define RCC_APB1RSTR_TIM3RST ((uint32_t)0x00000002) /*!< Timer 3 reset */ -#define RCC_APB1RSTR_WWDGRST ((uint32_t)0x00000800) /*!< Window Watchdog reset */ -#define RCC_APB1RSTR_USART2RST ((uint32_t)0x00020000) /*!< USART 2 reset */ -#define RCC_APB1RSTR_I2C1RST ((uint32_t)0x00200000) /*!< I2C 1 reset */ - -#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) -#define RCC_APB1RSTR_CAN1RST ((uint32_t)0x02000000) /*!< CAN1 reset */ -#endif - -#define RCC_APB1RSTR_BKPRST ((uint32_t)0x08000000) /*!< Backup interface reset */ -#define RCC_APB1RSTR_PWRRST ((uint32_t)0x10000000) /*!< Power interface reset */ - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) - #define RCC_APB1RSTR_TIM4RST ((uint32_t)0x00000004) /*!< Timer 4 reset */ - #define RCC_APB1RSTR_SPI2RST ((uint32_t)0x00004000) /*!< SPI 2 reset */ - #define RCC_APB1RSTR_USART3RST ((uint32_t)0x00040000) /*!< RUSART 3 reset */ - #define RCC_APB1RSTR_I2C2RST ((uint32_t)0x00400000) /*!< I2C 2 reset */ -#endif /* STM32F10X_LD && STM32F10X_LD_VL */ - -#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) - #define RCC_APB1RSTR_USBRST ((uint32_t)0x00800000) /*!< USB Device reset */ -#endif - -#if defined (STM32F10X_HD) || defined (STM32F10X_CL) - #define RCC_APB1RSTR_TIM5RST ((uint32_t)0x00000008) /*!< Timer 5 reset */ - #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ - #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ - #define RCC_APB1RSTR_SPI3RST ((uint32_t)0x00008000) /*!< SPI 3 reset */ - #define RCC_APB1RSTR_UART4RST ((uint32_t)0x00080000) /*!< UART 4 reset */ - #define RCC_APB1RSTR_UART5RST ((uint32_t)0x00100000) /*!< UART 5 reset */ - #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ -#endif - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - #define RCC_APB1RSTR_TIM6RST ((uint32_t)0x00000010) /*!< Timer 6 reset */ - #define RCC_APB1RSTR_TIM7RST ((uint32_t)0x00000020) /*!< Timer 7 reset */ - #define RCC_APB1RSTR_DACRST ((uint32_t)0x20000000) /*!< DAC interface reset */ - #define RCC_APB1RSTR_CECRST ((uint32_t)0x40000000) /*!< CEC interface reset */ -#endif - -#ifdef STM32F10X_CL - #define RCC_APB1RSTR_CAN2RST ((uint32_t)0x04000000) /*!< CAN2 reset */ -#endif /* STM32F10X_CL */ - -/****************** Bit definition for RCC_AHBENR register ******************/ -#define RCC_AHBENR_DMA1EN ((uint16_t)0x0001) /*!< DMA1 clock enable */ -#define RCC_AHBENR_SRAMEN ((uint16_t)0x0004) /*!< SRAM interface clock enable */ -#define RCC_AHBENR_FLITFEN ((uint16_t)0x0010) /*!< FLITF clock enable */ -#define RCC_AHBENR_CRCEN ((uint16_t)0x0040) /*!< CRC clock enable */ - -#if defined (STM32F10X_HD) || defined (STM32F10X_CL) - #define RCC_AHBENR_DMA2EN ((uint16_t)0x0002) /*!< DMA2 clock enable */ -#endif - -#ifdef STM32F10X_HD - #define RCC_AHBENR_FSMCEN ((uint16_t)0x0100) /*!< FSMC clock enable */ - #define RCC_AHBENR_SDIOEN ((uint16_t)0x0400) /*!< SDIO clock enable */ -#endif /* STM32F10X_HD */ - -#ifdef STM32F10X_CL - #define RCC_AHBENR_OTGFSEN ((uint32_t)0x00001000) /*!< USB OTG FS clock enable */ - #define RCC_AHBENR_ETHMACEN ((uint32_t)0x00004000) /*!< ETHERNET MAC clock enable */ - #define RCC_AHBENR_ETHMACTXEN ((uint32_t)0x00008000) /*!< ETHERNET MAC Tx clock enable */ - #define RCC_AHBENR_ETHMACRXEN ((uint32_t)0x00010000) /*!< ETHERNET MAC Rx clock enable */ -#endif /* STM32F10X_CL */ - -/****************** Bit definition for RCC_APB2ENR register *****************/ -#define RCC_APB2ENR_AFIOEN ((uint32_t)0x00000001) /*!< Alternate Function I/O clock enable */ -#define RCC_APB2ENR_IOPAEN ((uint32_t)0x00000004) /*!< I/O port A clock enable */ -#define RCC_APB2ENR_IOPBEN ((uint32_t)0x00000008) /*!< I/O port B clock enable */ -#define RCC_APB2ENR_IOPCEN ((uint32_t)0x00000010) /*!< I/O port C clock enable */ -#define RCC_APB2ENR_IOPDEN ((uint32_t)0x00000020) /*!< I/O port D clock enable */ -#define RCC_APB2ENR_ADC1EN ((uint32_t)0x00000200) /*!< ADC 1 interface clock enable */ - -#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) -#define RCC_APB2ENR_ADC2EN ((uint32_t)0x00000400) /*!< ADC 2 interface clock enable */ -#endif - -#define RCC_APB2ENR_TIM1EN ((uint32_t)0x00000800) /*!< TIM1 Timer clock enable */ -#define RCC_APB2ENR_SPI1EN ((uint32_t)0x00001000) /*!< SPI 1 clock enable */ -#define RCC_APB2ENR_USART1EN ((uint32_t)0x00004000) /*!< USART1 clock enable */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -#define RCC_APB2ENR_TIM15EN ((uint32_t)0x00010000) /*!< TIM15 Timer clock enable */ -#define RCC_APB2ENR_TIM16EN ((uint32_t)0x00020000) /*!< TIM16 Timer clock enable */ -#define RCC_APB2ENR_TIM17EN ((uint32_t)0x00040000) /*!< TIM17 Timer clock enable */ -#endif - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) - #define RCC_APB2ENR_IOPEEN ((uint32_t)0x00000040) /*!< I/O port E clock enable */ -#endif /* STM32F10X_LD && STM32F10X_LD_VL */ - -#ifdef STM32F10X_HD - #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ - #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ - #define RCC_APB2ENR_TIM8EN ((uint32_t)0x00002000) /*!< TIM8 Timer clock enable */ - #define RCC_APB2ENR_ADC3EN ((uint32_t)0x00008000) /*!< DMA1 clock enable */ -#endif /* STM32F10X_HD */ - -/***************** Bit definition for RCC_APB1ENR register ******************/ -#define RCC_APB1ENR_TIM2EN ((uint32_t)0x00000001) /*!< Timer 2 clock enabled*/ -#define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002) /*!< Timer 3 clock enable */ -#define RCC_APB1ENR_WWDGEN ((uint32_t)0x00000800) /*!< Window Watchdog clock enable */ -#define RCC_APB1ENR_USART2EN ((uint32_t)0x00020000) /*!< USART 2 clock enable */ -#define RCC_APB1ENR_I2C1EN ((uint32_t)0x00200000) /*!< I2C 1 clock enable */ - -#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) -#define RCC_APB1ENR_CAN1EN ((uint32_t)0x02000000) /*!< CAN1 clock enable */ -#endif - -#define RCC_APB1ENR_BKPEN ((uint32_t)0x08000000) /*!< Backup interface clock enable */ -#define RCC_APB1ENR_PWREN ((uint32_t)0x10000000) /*!< Power interface clock enable */ - -#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) - #define RCC_APB1ENR_TIM4EN ((uint32_t)0x00000004) /*!< Timer 4 clock enable */ - #define RCC_APB1ENR_SPI2EN ((uint32_t)0x00004000) /*!< SPI 2 clock enable */ - #define RCC_APB1ENR_USART3EN ((uint32_t)0x00040000) /*!< USART 3 clock enable */ - #define RCC_APB1ENR_I2C2EN ((uint32_t)0x00400000) /*!< I2C 2 clock enable */ -#endif /* STM32F10X_LD && STM32F10X_LD_VL */ - -#if defined (STM32F10X_HD) || defined (STM32F10X_MD) || defined (STM32F10X_LD) - #define RCC_APB1ENR_USBEN ((uint32_t)0x00800000) /*!< USB Device clock enable */ -#endif - -#if defined (STM32F10X_HD) || defined (STM32F10X_CL) - #define RCC_APB1ENR_TIM5EN ((uint32_t)0x00000008) /*!< Timer 5 clock enable */ - #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ - #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ - #define RCC_APB1ENR_SPI3EN ((uint32_t)0x00008000) /*!< SPI 3 clock enable */ - #define RCC_APB1ENR_UART4EN ((uint32_t)0x00080000) /*!< UART 4 clock enable */ - #define RCC_APB1ENR_UART5EN ((uint32_t)0x00100000) /*!< UART 5 clock enable */ - #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ -#endif - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - #define RCC_APB1ENR_TIM6EN ((uint32_t)0x00000010) /*!< Timer 6 clock enable */ - #define RCC_APB1ENR_TIM7EN ((uint32_t)0x00000020) /*!< Timer 7 clock enable */ - #define RCC_APB1ENR_DACEN ((uint32_t)0x20000000) /*!< DAC interface clock enable */ - #define RCC_APB1ENR_CECEN ((uint32_t)0x40000000) /*!< CEC interface clock enable */ -#endif - -#ifdef STM32F10X_CL - #define RCC_APB1ENR_CAN2EN ((uint32_t)0x04000000) /*!< CAN2 clock enable */ -#endif /* STM32F10X_CL */ - -/******************* Bit definition for RCC_BDCR register *******************/ -#define RCC_BDCR_LSEON ((uint32_t)0x00000001) /*!< External Low Speed oscillator enable */ -#define RCC_BDCR_LSERDY ((uint32_t)0x00000002) /*!< External Low Speed oscillator Ready */ -#define RCC_BDCR_LSEBYP ((uint32_t)0x00000004) /*!< External Low Speed oscillator Bypass */ - -#define RCC_BDCR_RTCSEL ((uint32_t)0x00000300) /*!< RTCSEL[1:0] bits (RTC clock source selection) */ -#define RCC_BDCR_RTCSEL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define RCC_BDCR_RTCSEL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -/*!< RTC congiguration */ -#define RCC_BDCR_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /*!< No clock */ -#define RCC_BDCR_RTCSEL_LSE ((uint32_t)0x00000100) /*!< LSE oscillator clock used as RTC clock */ -#define RCC_BDCR_RTCSEL_LSI ((uint32_t)0x00000200) /*!< LSI oscillator clock used as RTC clock */ -#define RCC_BDCR_RTCSEL_HSE ((uint32_t)0x00000300) /*!< HSE oscillator clock divided by 128 used as RTC clock */ - -#define RCC_BDCR_RTCEN ((uint32_t)0x00008000) /*!< RTC clock enable */ -#define RCC_BDCR_BDRST ((uint32_t)0x00010000) /*!< Backup domain software reset */ - -/******************* Bit definition for RCC_CSR register ********************/ -#define RCC_CSR_LSION ((uint32_t)0x00000001) /*!< Internal Low Speed oscillator enable */ -#define RCC_CSR_LSIRDY ((uint32_t)0x00000002) /*!< Internal Low Speed oscillator Ready */ -#define RCC_CSR_RMVF ((uint32_t)0x01000000) /*!< Remove reset flag */ -#define RCC_CSR_PINRSTF ((uint32_t)0x04000000) /*!< PIN reset flag */ -#define RCC_CSR_PORRSTF ((uint32_t)0x08000000) /*!< POR/PDR reset flag */ -#define RCC_CSR_SFTRSTF ((uint32_t)0x10000000) /*!< Software Reset flag */ -#define RCC_CSR_IWDGRSTF ((uint32_t)0x20000000) /*!< Independent Watchdog reset flag */ -#define RCC_CSR_WWDGRSTF ((uint32_t)0x40000000) /*!< Window watchdog reset flag */ -#define RCC_CSR_LPWRRSTF ((uint32_t)0x80000000) /*!< Low-Power reset flag */ - -#ifdef STM32F10X_CL -/******************* Bit definition for RCC_AHBRSTR register ****************/ - #define RCC_AHBRSTR_OTGFSRST ((uint32_t)0x00001000) /*!< USB OTG FS reset */ - #define RCC_AHBRSTR_ETHMACRST ((uint32_t)0x00004000) /*!< ETHERNET MAC reset */ - -/******************* Bit definition for RCC_CFGR2 register ******************/ -/*!< PREDIV1 configuration */ - #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ - #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ - #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - - #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ - #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ - #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ - #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ - #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ - #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ - #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ - #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ - #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ - #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ - #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ - #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ - #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ - #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ - #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ - #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ - -/*!< PREDIV2 configuration */ - #define RCC_CFGR2_PREDIV2 ((uint32_t)0x000000F0) /*!< PREDIV2[3:0] bits */ - #define RCC_CFGR2_PREDIV2_0 ((uint32_t)0x00000010) /*!< Bit 0 */ - #define RCC_CFGR2_PREDIV2_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - #define RCC_CFGR2_PREDIV2_2 ((uint32_t)0x00000040) /*!< Bit 2 */ - #define RCC_CFGR2_PREDIV2_3 ((uint32_t)0x00000080) /*!< Bit 3 */ - - #define RCC_CFGR2_PREDIV2_DIV1 ((uint32_t)0x00000000) /*!< PREDIV2 input clock not divided */ - #define RCC_CFGR2_PREDIV2_DIV2 ((uint32_t)0x00000010) /*!< PREDIV2 input clock divided by 2 */ - #define RCC_CFGR2_PREDIV2_DIV3 ((uint32_t)0x00000020) /*!< PREDIV2 input clock divided by 3 */ - #define RCC_CFGR2_PREDIV2_DIV4 ((uint32_t)0x00000030) /*!< PREDIV2 input clock divided by 4 */ - #define RCC_CFGR2_PREDIV2_DIV5 ((uint32_t)0x00000040) /*!< PREDIV2 input clock divided by 5 */ - #define RCC_CFGR2_PREDIV2_DIV6 ((uint32_t)0x00000050) /*!< PREDIV2 input clock divided by 6 */ - #define RCC_CFGR2_PREDIV2_DIV7 ((uint32_t)0x00000060) /*!< PREDIV2 input clock divided by 7 */ - #define RCC_CFGR2_PREDIV2_DIV8 ((uint32_t)0x00000070) /*!< PREDIV2 input clock divided by 8 */ - #define RCC_CFGR2_PREDIV2_DIV9 ((uint32_t)0x00000080) /*!< PREDIV2 input clock divided by 9 */ - #define RCC_CFGR2_PREDIV2_DIV10 ((uint32_t)0x00000090) /*!< PREDIV2 input clock divided by 10 */ - #define RCC_CFGR2_PREDIV2_DIV11 ((uint32_t)0x000000A0) /*!< PREDIV2 input clock divided by 11 */ - #define RCC_CFGR2_PREDIV2_DIV12 ((uint32_t)0x000000B0) /*!< PREDIV2 input clock divided by 12 */ - #define RCC_CFGR2_PREDIV2_DIV13 ((uint32_t)0x000000C0) /*!< PREDIV2 input clock divided by 13 */ - #define RCC_CFGR2_PREDIV2_DIV14 ((uint32_t)0x000000D0) /*!< PREDIV2 input clock divided by 14 */ - #define RCC_CFGR2_PREDIV2_DIV15 ((uint32_t)0x000000E0) /*!< PREDIV2 input clock divided by 15 */ - #define RCC_CFGR2_PREDIV2_DIV16 ((uint32_t)0x000000F0) /*!< PREDIV2 input clock divided by 16 */ - -/*!< PLL2MUL configuration */ - #define RCC_CFGR2_PLL2MUL ((uint32_t)0x00000F00) /*!< PLL2MUL[3:0] bits */ - #define RCC_CFGR2_PLL2MUL_0 ((uint32_t)0x00000100) /*!< Bit 0 */ - #define RCC_CFGR2_PLL2MUL_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - #define RCC_CFGR2_PLL2MUL_2 ((uint32_t)0x00000400) /*!< Bit 2 */ - #define RCC_CFGR2_PLL2MUL_3 ((uint32_t)0x00000800) /*!< Bit 3 */ - - #define RCC_CFGR2_PLL2MUL8 ((uint32_t)0x00000600) /*!< PLL2 input clock * 8 */ - #define RCC_CFGR2_PLL2MUL9 ((uint32_t)0x00000700) /*!< PLL2 input clock * 9 */ - #define RCC_CFGR2_PLL2MUL10 ((uint32_t)0x00000800) /*!< PLL2 input clock * 10 */ - #define RCC_CFGR2_PLL2MUL11 ((uint32_t)0x00000900) /*!< PLL2 input clock * 11 */ - #define RCC_CFGR2_PLL2MUL12 ((uint32_t)0x00000A00) /*!< PLL2 input clock * 12 */ - #define RCC_CFGR2_PLL2MUL13 ((uint32_t)0x00000B00) /*!< PLL2 input clock * 13 */ - #define RCC_CFGR2_PLL2MUL14 ((uint32_t)0x00000C00) /*!< PLL2 input clock * 14 */ - #define RCC_CFGR2_PLL2MUL16 ((uint32_t)0x00000E00) /*!< PLL2 input clock * 16 */ - #define RCC_CFGR2_PLL2MUL20 ((uint32_t)0x00000F00) /*!< PLL2 input clock * 20 */ - -/*!< PLL3MUL configuration */ - #define RCC_CFGR2_PLL3MUL ((uint32_t)0x0000F000) /*!< PLL3MUL[3:0] bits */ - #define RCC_CFGR2_PLL3MUL_0 ((uint32_t)0x00001000) /*!< Bit 0 */ - #define RCC_CFGR2_PLL3MUL_1 ((uint32_t)0x00002000) /*!< Bit 1 */ - #define RCC_CFGR2_PLL3MUL_2 ((uint32_t)0x00004000) /*!< Bit 2 */ - #define RCC_CFGR2_PLL3MUL_3 ((uint32_t)0x00008000) /*!< Bit 3 */ - - #define RCC_CFGR2_PLL3MUL8 ((uint32_t)0x00006000) /*!< PLL3 input clock * 8 */ - #define RCC_CFGR2_PLL3MUL9 ((uint32_t)0x00007000) /*!< PLL3 input clock * 9 */ - #define RCC_CFGR2_PLL3MUL10 ((uint32_t)0x00008000) /*!< PLL3 input clock * 10 */ - #define RCC_CFGR2_PLL3MUL11 ((uint32_t)0x00009000) /*!< PLL3 input clock * 11 */ - #define RCC_CFGR2_PLL3MUL12 ((uint32_t)0x0000A000) /*!< PLL3 input clock * 12 */ - #define RCC_CFGR2_PLL3MUL13 ((uint32_t)0x0000B000) /*!< PLL3 input clock * 13 */ - #define RCC_CFGR2_PLL3MUL14 ((uint32_t)0x0000C000) /*!< PLL3 input clock * 14 */ - #define RCC_CFGR2_PLL3MUL16 ((uint32_t)0x0000E000) /*!< PLL3 input clock * 16 */ - #define RCC_CFGR2_PLL3MUL20 ((uint32_t)0x0000F000) /*!< PLL3 input clock * 20 */ - - #define RCC_CFGR2_PREDIV1SRC ((uint32_t)0x00010000) /*!< PREDIV1 entry clock source */ - #define RCC_CFGR2_PREDIV1SRC_PLL2 ((uint32_t)0x00010000) /*!< PLL2 selected as PREDIV1 entry clock source */ - #define RCC_CFGR2_PREDIV1SRC_HSE ((uint32_t)0x00000000) /*!< HSE selected as PREDIV1 entry clock source */ - #define RCC_CFGR2_I2S2SRC ((uint32_t)0x00020000) /*!< I2S2 entry clock source */ - #define RCC_CFGR2_I2S3SRC ((uint32_t)0x00040000) /*!< I2S3 clock source */ -#endif /* STM32F10X_CL */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -/******************* Bit definition for RCC_CFGR2 register ******************/ -/*!< PREDIV1 configuration */ - #define RCC_CFGR2_PREDIV1 ((uint32_t)0x0000000F) /*!< PREDIV1[3:0] bits */ - #define RCC_CFGR2_PREDIV1_0 ((uint32_t)0x00000001) /*!< Bit 0 */ - #define RCC_CFGR2_PREDIV1_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - #define RCC_CFGR2_PREDIV1_2 ((uint32_t)0x00000004) /*!< Bit 2 */ - #define RCC_CFGR2_PREDIV1_3 ((uint32_t)0x00000008) /*!< Bit 3 */ - - #define RCC_CFGR2_PREDIV1_DIV1 ((uint32_t)0x00000000) /*!< PREDIV1 input clock not divided */ - #define RCC_CFGR2_PREDIV1_DIV2 ((uint32_t)0x00000001) /*!< PREDIV1 input clock divided by 2 */ - #define RCC_CFGR2_PREDIV1_DIV3 ((uint32_t)0x00000002) /*!< PREDIV1 input clock divided by 3 */ - #define RCC_CFGR2_PREDIV1_DIV4 ((uint32_t)0x00000003) /*!< PREDIV1 input clock divided by 4 */ - #define RCC_CFGR2_PREDIV1_DIV5 ((uint32_t)0x00000004) /*!< PREDIV1 input clock divided by 5 */ - #define RCC_CFGR2_PREDIV1_DIV6 ((uint32_t)0x00000005) /*!< PREDIV1 input clock divided by 6 */ - #define RCC_CFGR2_PREDIV1_DIV7 ((uint32_t)0x00000006) /*!< PREDIV1 input clock divided by 7 */ - #define RCC_CFGR2_PREDIV1_DIV8 ((uint32_t)0x00000007) /*!< PREDIV1 input clock divided by 8 */ - #define RCC_CFGR2_PREDIV1_DIV9 ((uint32_t)0x00000008) /*!< PREDIV1 input clock divided by 9 */ - #define RCC_CFGR2_PREDIV1_DIV10 ((uint32_t)0x00000009) /*!< PREDIV1 input clock divided by 10 */ - #define RCC_CFGR2_PREDIV1_DIV11 ((uint32_t)0x0000000A) /*!< PREDIV1 input clock divided by 11 */ - #define RCC_CFGR2_PREDIV1_DIV12 ((uint32_t)0x0000000B) /*!< PREDIV1 input clock divided by 12 */ - #define RCC_CFGR2_PREDIV1_DIV13 ((uint32_t)0x0000000C) /*!< PREDIV1 input clock divided by 13 */ - #define RCC_CFGR2_PREDIV1_DIV14 ((uint32_t)0x0000000D) /*!< PREDIV1 input clock divided by 14 */ - #define RCC_CFGR2_PREDIV1_DIV15 ((uint32_t)0x0000000E) /*!< PREDIV1 input clock divided by 15 */ - #define RCC_CFGR2_PREDIV1_DIV16 ((uint32_t)0x0000000F) /*!< PREDIV1 input clock divided by 16 */ -#endif - -/******************************************************************************/ -/* */ -/* General Purpose and Alternate Function I/O */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for GPIO_CRL register *******************/ -#define GPIO_CRL_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ - -#define GPIO_CRL_MODE0 ((uint32_t)0x00000003) /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */ -#define GPIO_CRL_MODE0_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define GPIO_CRL_MODE0_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - -#define GPIO_CRL_MODE1 ((uint32_t)0x00000030) /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */ -#define GPIO_CRL_MODE1_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define GPIO_CRL_MODE1_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define GPIO_CRL_MODE2 ((uint32_t)0x00000300) /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */ -#define GPIO_CRL_MODE2_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define GPIO_CRL_MODE2_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -#define GPIO_CRL_MODE3 ((uint32_t)0x00003000) /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */ -#define GPIO_CRL_MODE3_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define GPIO_CRL_MODE3_1 ((uint32_t)0x00002000) /*!< Bit 1 */ - -#define GPIO_CRL_MODE4 ((uint32_t)0x00030000) /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */ -#define GPIO_CRL_MODE4_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define GPIO_CRL_MODE4_1 ((uint32_t)0x00020000) /*!< Bit 1 */ - -#define GPIO_CRL_MODE5 ((uint32_t)0x00300000) /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */ -#define GPIO_CRL_MODE5_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define GPIO_CRL_MODE5_1 ((uint32_t)0x00200000) /*!< Bit 1 */ - -#define GPIO_CRL_MODE6 ((uint32_t)0x03000000) /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */ -#define GPIO_CRL_MODE6_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define GPIO_CRL_MODE6_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - -#define GPIO_CRL_MODE7 ((uint32_t)0x30000000) /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */ -#define GPIO_CRL_MODE7_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define GPIO_CRL_MODE7_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ - -#define GPIO_CRL_CNF0 ((uint32_t)0x0000000C) /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */ -#define GPIO_CRL_CNF0_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define GPIO_CRL_CNF0_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define GPIO_CRL_CNF1 ((uint32_t)0x000000C0) /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */ -#define GPIO_CRL_CNF1_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define GPIO_CRL_CNF1_1 ((uint32_t)0x00000080) /*!< Bit 1 */ - -#define GPIO_CRL_CNF2 ((uint32_t)0x00000C00) /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */ -#define GPIO_CRL_CNF2_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define GPIO_CRL_CNF2_1 ((uint32_t)0x00000800) /*!< Bit 1 */ - -#define GPIO_CRL_CNF3 ((uint32_t)0x0000C000) /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */ -#define GPIO_CRL_CNF3_0 ((uint32_t)0x00004000) /*!< Bit 0 */ -#define GPIO_CRL_CNF3_1 ((uint32_t)0x00008000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF4 ((uint32_t)0x000C0000) /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */ -#define GPIO_CRL_CNF4_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define GPIO_CRL_CNF4_1 ((uint32_t)0x00080000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF5 ((uint32_t)0x00C00000) /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */ -#define GPIO_CRL_CNF5_0 ((uint32_t)0x00400000) /*!< Bit 0 */ -#define GPIO_CRL_CNF5_1 ((uint32_t)0x00800000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF6 ((uint32_t)0x0C000000) /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */ -#define GPIO_CRL_CNF6_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define GPIO_CRL_CNF6_1 ((uint32_t)0x08000000) /*!< Bit 1 */ - -#define GPIO_CRL_CNF7 ((uint32_t)0xC0000000) /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */ -#define GPIO_CRL_CNF7_0 ((uint32_t)0x40000000) /*!< Bit 0 */ -#define GPIO_CRL_CNF7_1 ((uint32_t)0x80000000) /*!< Bit 1 */ - -/******************* Bit definition for GPIO_CRH register *******************/ -#define GPIO_CRH_MODE ((uint32_t)0x33333333) /*!< Port x mode bits */ - -#define GPIO_CRH_MODE8 ((uint32_t)0x00000003) /*!< MODE8[1:0] bits (Port x mode bits, pin 8) */ -#define GPIO_CRH_MODE8_0 ((uint32_t)0x00000001) /*!< Bit 0 */ -#define GPIO_CRH_MODE8_1 ((uint32_t)0x00000002) /*!< Bit 1 */ - -#define GPIO_CRH_MODE9 ((uint32_t)0x00000030) /*!< MODE9[1:0] bits (Port x mode bits, pin 9) */ -#define GPIO_CRH_MODE9_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define GPIO_CRH_MODE9_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -#define GPIO_CRH_MODE10 ((uint32_t)0x00000300) /*!< MODE10[1:0] bits (Port x mode bits, pin 10) */ -#define GPIO_CRH_MODE10_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define GPIO_CRH_MODE10_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -#define GPIO_CRH_MODE11 ((uint32_t)0x00003000) /*!< MODE11[1:0] bits (Port x mode bits, pin 11) */ -#define GPIO_CRH_MODE11_0 ((uint32_t)0x00001000) /*!< Bit 0 */ -#define GPIO_CRH_MODE11_1 ((uint32_t)0x00002000) /*!< Bit 1 */ - -#define GPIO_CRH_MODE12 ((uint32_t)0x00030000) /*!< MODE12[1:0] bits (Port x mode bits, pin 12) */ -#define GPIO_CRH_MODE12_0 ((uint32_t)0x00010000) /*!< Bit 0 */ -#define GPIO_CRH_MODE12_1 ((uint32_t)0x00020000) /*!< Bit 1 */ - -#define GPIO_CRH_MODE13 ((uint32_t)0x00300000) /*!< MODE13[1:0] bits (Port x mode bits, pin 13) */ -#define GPIO_CRH_MODE13_0 ((uint32_t)0x00100000) /*!< Bit 0 */ -#define GPIO_CRH_MODE13_1 ((uint32_t)0x00200000) /*!< Bit 1 */ - -#define GPIO_CRH_MODE14 ((uint32_t)0x03000000) /*!< MODE14[1:0] bits (Port x mode bits, pin 14) */ -#define GPIO_CRH_MODE14_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define GPIO_CRH_MODE14_1 ((uint32_t)0x02000000) /*!< Bit 1 */ - -#define GPIO_CRH_MODE15 ((uint32_t)0x30000000) /*!< MODE15[1:0] bits (Port x mode bits, pin 15) */ -#define GPIO_CRH_MODE15_0 ((uint32_t)0x10000000) /*!< Bit 0 */ -#define GPIO_CRH_MODE15_1 ((uint32_t)0x20000000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF ((uint32_t)0xCCCCCCCC) /*!< Port x configuration bits */ - -#define GPIO_CRH_CNF8 ((uint32_t)0x0000000C) /*!< CNF8[1:0] bits (Port x configuration bits, pin 8) */ -#define GPIO_CRH_CNF8_0 ((uint32_t)0x00000004) /*!< Bit 0 */ -#define GPIO_CRH_CNF8_1 ((uint32_t)0x00000008) /*!< Bit 1 */ - -#define GPIO_CRH_CNF9 ((uint32_t)0x000000C0) /*!< CNF9[1:0] bits (Port x configuration bits, pin 9) */ -#define GPIO_CRH_CNF9_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define GPIO_CRH_CNF9_1 ((uint32_t)0x00000080) /*!< Bit 1 */ - -#define GPIO_CRH_CNF10 ((uint32_t)0x00000C00) /*!< CNF10[1:0] bits (Port x configuration bits, pin 10) */ -#define GPIO_CRH_CNF10_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define GPIO_CRH_CNF10_1 ((uint32_t)0x00000800) /*!< Bit 1 */ - -#define GPIO_CRH_CNF11 ((uint32_t)0x0000C000) /*!< CNF11[1:0] bits (Port x configuration bits, pin 11) */ -#define GPIO_CRH_CNF11_0 ((uint32_t)0x00004000) /*!< Bit 0 */ -#define GPIO_CRH_CNF11_1 ((uint32_t)0x00008000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF12 ((uint32_t)0x000C0000) /*!< CNF12[1:0] bits (Port x configuration bits, pin 12) */ -#define GPIO_CRH_CNF12_0 ((uint32_t)0x00040000) /*!< Bit 0 */ -#define GPIO_CRH_CNF12_1 ((uint32_t)0x00080000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF13 ((uint32_t)0x00C00000) /*!< CNF13[1:0] bits (Port x configuration bits, pin 13) */ -#define GPIO_CRH_CNF13_0 ((uint32_t)0x00400000) /*!< Bit 0 */ -#define GPIO_CRH_CNF13_1 ((uint32_t)0x00800000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF14 ((uint32_t)0x0C000000) /*!< CNF14[1:0] bits (Port x configuration bits, pin 14) */ -#define GPIO_CRH_CNF14_0 ((uint32_t)0x04000000) /*!< Bit 0 */ -#define GPIO_CRH_CNF14_1 ((uint32_t)0x08000000) /*!< Bit 1 */ - -#define GPIO_CRH_CNF15 ((uint32_t)0xC0000000) /*!< CNF15[1:0] bits (Port x configuration bits, pin 15) */ -#define GPIO_CRH_CNF15_0 ((uint32_t)0x40000000) /*!< Bit 0 */ -#define GPIO_CRH_CNF15_1 ((uint32_t)0x80000000) /*!< Bit 1 */ - -/*!<****************** Bit definition for GPIO_IDR register *******************/ -#define GPIO_IDR_IDR0 ((uint16_t)0x0001) /*!< Port input data, bit 0 */ -#define GPIO_IDR_IDR1 ((uint16_t)0x0002) /*!< Port input data, bit 1 */ -#define GPIO_IDR_IDR2 ((uint16_t)0x0004) /*!< Port input data, bit 2 */ -#define GPIO_IDR_IDR3 ((uint16_t)0x0008) /*!< Port input data, bit 3 */ -#define GPIO_IDR_IDR4 ((uint16_t)0x0010) /*!< Port input data, bit 4 */ -#define GPIO_IDR_IDR5 ((uint16_t)0x0020) /*!< Port input data, bit 5 */ -#define GPIO_IDR_IDR6 ((uint16_t)0x0040) /*!< Port input data, bit 6 */ -#define GPIO_IDR_IDR7 ((uint16_t)0x0080) /*!< Port input data, bit 7 */ -#define GPIO_IDR_IDR8 ((uint16_t)0x0100) /*!< Port input data, bit 8 */ -#define GPIO_IDR_IDR9 ((uint16_t)0x0200) /*!< Port input data, bit 9 */ -#define GPIO_IDR_IDR10 ((uint16_t)0x0400) /*!< Port input data, bit 10 */ -#define GPIO_IDR_IDR11 ((uint16_t)0x0800) /*!< Port input data, bit 11 */ -#define GPIO_IDR_IDR12 ((uint16_t)0x1000) /*!< Port input data, bit 12 */ -#define GPIO_IDR_IDR13 ((uint16_t)0x2000) /*!< Port input data, bit 13 */ -#define GPIO_IDR_IDR14 ((uint16_t)0x4000) /*!< Port input data, bit 14 */ -#define GPIO_IDR_IDR15 ((uint16_t)0x8000) /*!< Port input data, bit 15 */ - -/******************* Bit definition for GPIO_ODR register *******************/ -#define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */ -#define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */ -#define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */ -#define GPIO_ODR_ODR3 ((uint16_t)0x0008) /*!< Port output data, bit 3 */ -#define GPIO_ODR_ODR4 ((uint16_t)0x0010) /*!< Port output data, bit 4 */ -#define GPIO_ODR_ODR5 ((uint16_t)0x0020) /*!< Port output data, bit 5 */ -#define GPIO_ODR_ODR6 ((uint16_t)0x0040) /*!< Port output data, bit 6 */ -#define GPIO_ODR_ODR7 ((uint16_t)0x0080) /*!< Port output data, bit 7 */ -#define GPIO_ODR_ODR8 ((uint16_t)0x0100) /*!< Port output data, bit 8 */ -#define GPIO_ODR_ODR9 ((uint16_t)0x0200) /*!< Port output data, bit 9 */ -#define GPIO_ODR_ODR10 ((uint16_t)0x0400) /*!< Port output data, bit 10 */ -#define GPIO_ODR_ODR11 ((uint16_t)0x0800) /*!< Port output data, bit 11 */ -#define GPIO_ODR_ODR12 ((uint16_t)0x1000) /*!< Port output data, bit 12 */ -#define GPIO_ODR_ODR13 ((uint16_t)0x2000) /*!< Port output data, bit 13 */ -#define GPIO_ODR_ODR14 ((uint16_t)0x4000) /*!< Port output data, bit 14 */ -#define GPIO_ODR_ODR15 ((uint16_t)0x8000) /*!< Port output data, bit 15 */ - -/****************** Bit definition for GPIO_BSRR register *******************/ -#define GPIO_BSRR_BS0 ((uint32_t)0x00000001) /*!< Port x Set bit 0 */ -#define GPIO_BSRR_BS1 ((uint32_t)0x00000002) /*!< Port x Set bit 1 */ -#define GPIO_BSRR_BS2 ((uint32_t)0x00000004) /*!< Port x Set bit 2 */ -#define GPIO_BSRR_BS3 ((uint32_t)0x00000008) /*!< Port x Set bit 3 */ -#define GPIO_BSRR_BS4 ((uint32_t)0x00000010) /*!< Port x Set bit 4 */ -#define GPIO_BSRR_BS5 ((uint32_t)0x00000020) /*!< Port x Set bit 5 */ -#define GPIO_BSRR_BS6 ((uint32_t)0x00000040) /*!< Port x Set bit 6 */ -#define GPIO_BSRR_BS7 ((uint32_t)0x00000080) /*!< Port x Set bit 7 */ -#define GPIO_BSRR_BS8 ((uint32_t)0x00000100) /*!< Port x Set bit 8 */ -#define GPIO_BSRR_BS9 ((uint32_t)0x00000200) /*!< Port x Set bit 9 */ -#define GPIO_BSRR_BS10 ((uint32_t)0x00000400) /*!< Port x Set bit 10 */ -#define GPIO_BSRR_BS11 ((uint32_t)0x00000800) /*!< Port x Set bit 11 */ -#define GPIO_BSRR_BS12 ((uint32_t)0x00001000) /*!< Port x Set bit 12 */ -#define GPIO_BSRR_BS13 ((uint32_t)0x00002000) /*!< Port x Set bit 13 */ -#define GPIO_BSRR_BS14 ((uint32_t)0x00004000) /*!< Port x Set bit 14 */ -#define GPIO_BSRR_BS15 ((uint32_t)0x00008000) /*!< Port x Set bit 15 */ - -#define GPIO_BSRR_BR0 ((uint32_t)0x00010000) /*!< Port x Reset bit 0 */ -#define GPIO_BSRR_BR1 ((uint32_t)0x00020000) /*!< Port x Reset bit 1 */ -#define GPIO_BSRR_BR2 ((uint32_t)0x00040000) /*!< Port x Reset bit 2 */ -#define GPIO_BSRR_BR3 ((uint32_t)0x00080000) /*!< Port x Reset bit 3 */ -#define GPIO_BSRR_BR4 ((uint32_t)0x00100000) /*!< Port x Reset bit 4 */ -#define GPIO_BSRR_BR5 ((uint32_t)0x00200000) /*!< Port x Reset bit 5 */ -#define GPIO_BSRR_BR6 ((uint32_t)0x00400000) /*!< Port x Reset bit 6 */ -#define GPIO_BSRR_BR7 ((uint32_t)0x00800000) /*!< Port x Reset bit 7 */ -#define GPIO_BSRR_BR8 ((uint32_t)0x01000000) /*!< Port x Reset bit 8 */ -#define GPIO_BSRR_BR9 ((uint32_t)0x02000000) /*!< Port x Reset bit 9 */ -#define GPIO_BSRR_BR10 ((uint32_t)0x04000000) /*!< Port x Reset bit 10 */ -#define GPIO_BSRR_BR11 ((uint32_t)0x08000000) /*!< Port x Reset bit 11 */ -#define GPIO_BSRR_BR12 ((uint32_t)0x10000000) /*!< Port x Reset bit 12 */ -#define GPIO_BSRR_BR13 ((uint32_t)0x20000000) /*!< Port x Reset bit 13 */ -#define GPIO_BSRR_BR14 ((uint32_t)0x40000000) /*!< Port x Reset bit 14 */ -#define GPIO_BSRR_BR15 ((uint32_t)0x80000000) /*!< Port x Reset bit 15 */ - -/******************* Bit definition for GPIO_BRR register *******************/ -#define GPIO_BRR_BR0 ((uint16_t)0x0001) /*!< Port x Reset bit 0 */ -#define GPIO_BRR_BR1 ((uint16_t)0x0002) /*!< Port x Reset bit 1 */ -#define GPIO_BRR_BR2 ((uint16_t)0x0004) /*!< Port x Reset bit 2 */ -#define GPIO_BRR_BR3 ((uint16_t)0x0008) /*!< Port x Reset bit 3 */ -#define GPIO_BRR_BR4 ((uint16_t)0x0010) /*!< Port x Reset bit 4 */ -#define GPIO_BRR_BR5 ((uint16_t)0x0020) /*!< Port x Reset bit 5 */ -#define GPIO_BRR_BR6 ((uint16_t)0x0040) /*!< Port x Reset bit 6 */ -#define GPIO_BRR_BR7 ((uint16_t)0x0080) /*!< Port x Reset bit 7 */ -#define GPIO_BRR_BR8 ((uint16_t)0x0100) /*!< Port x Reset bit 8 */ -#define GPIO_BRR_BR9 ((uint16_t)0x0200) /*!< Port x Reset bit 9 */ -#define GPIO_BRR_BR10 ((uint16_t)0x0400) /*!< Port x Reset bit 10 */ -#define GPIO_BRR_BR11 ((uint16_t)0x0800) /*!< Port x Reset bit 11 */ -#define GPIO_BRR_BR12 ((uint16_t)0x1000) /*!< Port x Reset bit 12 */ -#define GPIO_BRR_BR13 ((uint16_t)0x2000) /*!< Port x Reset bit 13 */ -#define GPIO_BRR_BR14 ((uint16_t)0x4000) /*!< Port x Reset bit 14 */ -#define GPIO_BRR_BR15 ((uint16_t)0x8000) /*!< Port x Reset bit 15 */ - -/****************** Bit definition for GPIO_LCKR register *******************/ -#define GPIO_LCKR_LCK0 ((uint32_t)0x00000001) /*!< Port x Lock bit 0 */ -#define GPIO_LCKR_LCK1 ((uint32_t)0x00000002) /*!< Port x Lock bit 1 */ -#define GPIO_LCKR_LCK2 ((uint32_t)0x00000004) /*!< Port x Lock bit 2 */ -#define GPIO_LCKR_LCK3 ((uint32_t)0x00000008) /*!< Port x Lock bit 3 */ -#define GPIO_LCKR_LCK4 ((uint32_t)0x00000010) /*!< Port x Lock bit 4 */ -#define GPIO_LCKR_LCK5 ((uint32_t)0x00000020) /*!< Port x Lock bit 5 */ -#define GPIO_LCKR_LCK6 ((uint32_t)0x00000040) /*!< Port x Lock bit 6 */ -#define GPIO_LCKR_LCK7 ((uint32_t)0x00000080) /*!< Port x Lock bit 7 */ -#define GPIO_LCKR_LCK8 ((uint32_t)0x00000100) /*!< Port x Lock bit 8 */ -#define GPIO_LCKR_LCK9 ((uint32_t)0x00000200) /*!< Port x Lock bit 9 */ -#define GPIO_LCKR_LCK10 ((uint32_t)0x00000400) /*!< Port x Lock bit 10 */ -#define GPIO_LCKR_LCK11 ((uint32_t)0x00000800) /*!< Port x Lock bit 11 */ -#define GPIO_LCKR_LCK12 ((uint32_t)0x00001000) /*!< Port x Lock bit 12 */ -#define GPIO_LCKR_LCK13 ((uint32_t)0x00002000) /*!< Port x Lock bit 13 */ -#define GPIO_LCKR_LCK14 ((uint32_t)0x00004000) /*!< Port x Lock bit 14 */ -#define GPIO_LCKR_LCK15 ((uint32_t)0x00008000) /*!< Port x Lock bit 15 */ -#define GPIO_LCKR_LCKK ((uint32_t)0x00010000) /*!< Lock key */ - -/*----------------------------------------------------------------------------*/ - -/****************** Bit definition for AFIO_EVCR register *******************/ -#define AFIO_EVCR_PIN ((uint8_t)0x0F) /*!< PIN[3:0] bits (Pin selection) */ -#define AFIO_EVCR_PIN_0 ((uint8_t)0x01) /*!< Bit 0 */ -#define AFIO_EVCR_PIN_1 ((uint8_t)0x02) /*!< Bit 1 */ -#define AFIO_EVCR_PIN_2 ((uint8_t)0x04) /*!< Bit 2 */ -#define AFIO_EVCR_PIN_3 ((uint8_t)0x08) /*!< Bit 3 */ - -/*!< PIN configuration */ -#define AFIO_EVCR_PIN_PX0 ((uint8_t)0x00) /*!< Pin 0 selected */ -#define AFIO_EVCR_PIN_PX1 ((uint8_t)0x01) /*!< Pin 1 selected */ -#define AFIO_EVCR_PIN_PX2 ((uint8_t)0x02) /*!< Pin 2 selected */ -#define AFIO_EVCR_PIN_PX3 ((uint8_t)0x03) /*!< Pin 3 selected */ -#define AFIO_EVCR_PIN_PX4 ((uint8_t)0x04) /*!< Pin 4 selected */ -#define AFIO_EVCR_PIN_PX5 ((uint8_t)0x05) /*!< Pin 5 selected */ -#define AFIO_EVCR_PIN_PX6 ((uint8_t)0x06) /*!< Pin 6 selected */ -#define AFIO_EVCR_PIN_PX7 ((uint8_t)0x07) /*!< Pin 7 selected */ -#define AFIO_EVCR_PIN_PX8 ((uint8_t)0x08) /*!< Pin 8 selected */ -#define AFIO_EVCR_PIN_PX9 ((uint8_t)0x09) /*!< Pin 9 selected */ -#define AFIO_EVCR_PIN_PX10 ((uint8_t)0x0A) /*!< Pin 10 selected */ -#define AFIO_EVCR_PIN_PX11 ((uint8_t)0x0B) /*!< Pin 11 selected */ -#define AFIO_EVCR_PIN_PX12 ((uint8_t)0x0C) /*!< Pin 12 selected */ -#define AFIO_EVCR_PIN_PX13 ((uint8_t)0x0D) /*!< Pin 13 selected */ -#define AFIO_EVCR_PIN_PX14 ((uint8_t)0x0E) /*!< Pin 14 selected */ -#define AFIO_EVCR_PIN_PX15 ((uint8_t)0x0F) /*!< Pin 15 selected */ - -#define AFIO_EVCR_PORT ((uint8_t)0x70) /*!< PORT[2:0] bits (Port selection) */ -#define AFIO_EVCR_PORT_0 ((uint8_t)0x10) /*!< Bit 0 */ -#define AFIO_EVCR_PORT_1 ((uint8_t)0x20) /*!< Bit 1 */ -#define AFIO_EVCR_PORT_2 ((uint8_t)0x40) /*!< Bit 2 */ - -/*!< PORT configuration */ -#define AFIO_EVCR_PORT_PA ((uint8_t)0x00) /*!< Port A selected */ -#define AFIO_EVCR_PORT_PB ((uint8_t)0x10) /*!< Port B selected */ -#define AFIO_EVCR_PORT_PC ((uint8_t)0x20) /*!< Port C selected */ -#define AFIO_EVCR_PORT_PD ((uint8_t)0x30) /*!< Port D selected */ -#define AFIO_EVCR_PORT_PE ((uint8_t)0x40) /*!< Port E selected */ - -#define AFIO_EVCR_EVOE ((uint8_t)0x80) /*!< Event Output Enable */ - -/****************** Bit definition for AFIO_MAPR register *******************/ -#define AFIO_MAPR_SPI1_REMAP ((uint32_t)0x00000001) /*!< SPI1 remapping */ -#define AFIO_MAPR_I2C1_REMAP ((uint32_t)0x00000002) /*!< I2C1 remapping */ -#define AFIO_MAPR_USART1_REMAP ((uint32_t)0x00000004) /*!< USART1 remapping */ -#define AFIO_MAPR_USART2_REMAP ((uint32_t)0x00000008) /*!< USART2 remapping */ - -#define AFIO_MAPR_USART3_REMAP ((uint32_t)0x00000030) /*!< USART3_REMAP[1:0] bits (USART3 remapping) */ -#define AFIO_MAPR_USART3_REMAP_0 ((uint32_t)0x00000010) /*!< Bit 0 */ -#define AFIO_MAPR_USART3_REMAP_1 ((uint32_t)0x00000020) /*!< Bit 1 */ - -/* USART3_REMAP configuration */ -#define AFIO_MAPR_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ -#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP ((uint32_t)0x00000010) /*!< Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ -#define AFIO_MAPR_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /*!< Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ - -#define AFIO_MAPR_TIM1_REMAP ((uint32_t)0x000000C0) /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */ -#define AFIO_MAPR_TIM1_REMAP_0 ((uint32_t)0x00000040) /*!< Bit 0 */ -#define AFIO_MAPR_TIM1_REMAP_1 ((uint32_t)0x00000080) /*!< Bit 1 */ - -/*!< TIM1_REMAP configuration */ -#define AFIO_MAPR_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ -#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /*!< Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ -#define AFIO_MAPR_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /*!< Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ - -#define AFIO_MAPR_TIM2_REMAP ((uint32_t)0x00000300) /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */ -#define AFIO_MAPR_TIM2_REMAP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define AFIO_MAPR_TIM2_REMAP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ - -/*!< TIM2_REMAP configuration */ -#define AFIO_MAPR_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ -#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /*!< Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ -#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /*!< Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ -#define AFIO_MAPR_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /*!< Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ - -#define AFIO_MAPR_TIM3_REMAP ((uint32_t)0x00000C00) /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */ -#define AFIO_MAPR_TIM3_REMAP_0 ((uint32_t)0x00000400) /*!< Bit 0 */ -#define AFIO_MAPR_TIM3_REMAP_1 ((uint32_t)0x00000800) /*!< Bit 1 */ - -/*!< TIM3_REMAP configuration */ -#define AFIO_MAPR_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /*!< No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ -#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /*!< Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ -#define AFIO_MAPR_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /*!< Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ - -#define AFIO_MAPR_TIM4_REMAP ((uint32_t)0x00001000) /*!< TIM4_REMAP bit (TIM4 remapping) */ - -#define AFIO_MAPR_CAN_REMAP ((uint32_t)0x00006000) /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ -#define AFIO_MAPR_CAN_REMAP_0 ((uint32_t)0x00002000) /*!< Bit 0 */ -#define AFIO_MAPR_CAN_REMAP_1 ((uint32_t)0x00004000) /*!< Bit 1 */ - -/*!< CAN_REMAP configuration */ -#define AFIO_MAPR_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /*!< CANRX mapped to PA11, CANTX mapped to PA12 */ -#define AFIO_MAPR_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /*!< CANRX mapped to PB8, CANTX mapped to PB9 */ -#define AFIO_MAPR_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /*!< CANRX mapped to PD0, CANTX mapped to PD1 */ - -#define AFIO_MAPR_PD01_REMAP ((uint32_t)0x00008000) /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ -#define AFIO_MAPR_TIM5CH4_IREMAP ((uint32_t)0x00010000) /*!< TIM5 Channel4 Internal Remap */ -#define AFIO_MAPR_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /*!< ADC 1 External Trigger Injected Conversion remapping */ -#define AFIO_MAPR_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /*!< ADC 1 External Trigger Regular Conversion remapping */ -#define AFIO_MAPR_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /*!< ADC 2 External Trigger Injected Conversion remapping */ -#define AFIO_MAPR_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /*!< ADC 2 External Trigger Regular Conversion remapping */ - -/*!< SWJ_CFG configuration */ -#define AFIO_MAPR_SWJ_CFG ((uint32_t)0x07000000) /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ -#define AFIO_MAPR_SWJ_CFG_0 ((uint32_t)0x01000000) /*!< Bit 0 */ -#define AFIO_MAPR_SWJ_CFG_1 ((uint32_t)0x02000000) /*!< Bit 1 */ -#define AFIO_MAPR_SWJ_CFG_2 ((uint32_t)0x04000000) /*!< Bit 2 */ - -#define AFIO_MAPR_SWJ_CFG_RESET ((uint32_t)0x00000000) /*!< Full SWJ (JTAG-DP + SW-DP) : Reset State */ -#define AFIO_MAPR_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /*!< Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ -#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /*!< JTAG-DP Disabled and SW-DP Enabled */ -#define AFIO_MAPR_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /*!< JTAG-DP Disabled and SW-DP Disabled */ - -#ifdef STM32F10X_CL -/*!< ETH_REMAP configuration */ - #define AFIO_MAPR_ETH_REMAP ((uint32_t)0x00200000) /*!< SPI3_REMAP bit (Ethernet MAC I/O remapping) */ - -/*!< CAN2_REMAP configuration */ - #define AFIO_MAPR_CAN2_REMAP ((uint32_t)0x00400000) /*!< CAN2_REMAP bit (CAN2 I/O remapping) */ - -/*!< MII_RMII_SEL configuration */ - #define AFIO_MAPR_MII_RMII_SEL ((uint32_t)0x00800000) /*!< MII_RMII_SEL bit (Ethernet MII or RMII selection) */ - -/*!< SPI3_REMAP configuration */ - #define AFIO_MAPR_SPI3_REMAP ((uint32_t)0x10000000) /*!< SPI3_REMAP bit (SPI3 remapping) */ - -/*!< TIM2ITR1_IREMAP configuration */ - #define AFIO_MAPR_TIM2ITR1_IREMAP ((uint32_t)0x20000000) /*!< TIM2ITR1_IREMAP bit (TIM2 internal trigger 1 remapping) */ - -/*!< PTP_PPS_REMAP configuration */ - #define AFIO_MAPR_PTP_PPS_REMAP ((uint32_t)0x20000000) /*!< PTP_PPS_REMAP bit (Ethernet PTP PPS remapping) */ -#endif - -/***************** Bit definition for AFIO_EXTICR1 register *****************/ -#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /*!< EXTI 0 configuration */ -#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /*!< EXTI 1 configuration */ -#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /*!< EXTI 2 configuration */ -#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /*!< EXTI 3 configuration */ - -/*!< EXTI0 configuration */ -#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /*!< PA[0] pin */ -#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /*!< PB[0] pin */ -#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /*!< PC[0] pin */ -#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /*!< PD[0] pin */ -#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /*!< PE[0] pin */ -#define AFIO_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /*!< PF[0] pin */ -#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /*!< PG[0] pin */ - -/*!< EXTI1 configuration */ -#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /*!< PA[1] pin */ -#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /*!< PB[1] pin */ -#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /*!< PC[1] pin */ -#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /*!< PD[1] pin */ -#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /*!< PE[1] pin */ -#define AFIO_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /*!< PF[1] pin */ -#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /*!< PG[1] pin */ - -/*!< EXTI2 configuration */ -#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /*!< PA[2] pin */ -#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /*!< PB[2] pin */ -#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /*!< PC[2] pin */ -#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /*!< PD[2] pin */ -#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /*!< PE[2] pin */ -#define AFIO_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /*!< PF[2] pin */ -#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /*!< PG[2] pin */ - -/*!< EXTI3 configuration */ -#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /*!< PA[3] pin */ -#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /*!< PB[3] pin */ -#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /*!< PC[3] pin */ -#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /*!< PD[3] pin */ -#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /*!< PE[3] pin */ -#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /*!< PF[3] pin */ -#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /*!< PG[3] pin */ - -/***************** Bit definition for AFIO_EXTICR2 register *****************/ -#define AFIO_EXTICR2_EXTI4 ((uint16_t)0x000F) /*!< EXTI 4 configuration */ -#define AFIO_EXTICR2_EXTI5 ((uint16_t)0x00F0) /*!< EXTI 5 configuration */ -#define AFIO_EXTICR2_EXTI6 ((uint16_t)0x0F00) /*!< EXTI 6 configuration */ -#define AFIO_EXTICR2_EXTI7 ((uint16_t)0xF000) /*!< EXTI 7 configuration */ - -/*!< EXTI4 configuration */ -#define AFIO_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /*!< PA[4] pin */ -#define AFIO_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /*!< PB[4] pin */ -#define AFIO_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /*!< PC[4] pin */ -#define AFIO_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /*!< PD[4] pin */ -#define AFIO_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /*!< PE[4] pin */ -#define AFIO_EXTICR2_EXTI4_PF ((uint16_t)0x0005) /*!< PF[4] pin */ -#define AFIO_EXTICR2_EXTI4_PG ((uint16_t)0x0006) /*!< PG[4] pin */ - -/* EXTI5 configuration */ -#define AFIO_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /*!< PA[5] pin */ -#define AFIO_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /*!< PB[5] pin */ -#define AFIO_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /*!< PC[5] pin */ -#define AFIO_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /*!< PD[5] pin */ -#define AFIO_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /*!< PE[5] pin */ -#define AFIO_EXTICR2_EXTI5_PF ((uint16_t)0x0050) /*!< PF[5] pin */ -#define AFIO_EXTICR2_EXTI5_PG ((uint16_t)0x0060) /*!< PG[5] pin */ - -/*!< EXTI6 configuration */ -#define AFIO_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /*!< PA[6] pin */ -#define AFIO_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /*!< PB[6] pin */ -#define AFIO_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /*!< PC[6] pin */ -#define AFIO_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /*!< PD[6] pin */ -#define AFIO_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /*!< PE[6] pin */ -#define AFIO_EXTICR2_EXTI6_PF ((uint16_t)0x0500) /*!< PF[6] pin */ -#define AFIO_EXTICR2_EXTI6_PG ((uint16_t)0x0600) /*!< PG[6] pin */ - -/*!< EXTI7 configuration */ -#define AFIO_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /*!< PA[7] pin */ -#define AFIO_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /*!< PB[7] pin */ -#define AFIO_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /*!< PC[7] pin */ -#define AFIO_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /*!< PD[7] pin */ -#define AFIO_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /*!< PE[7] pin */ -#define AFIO_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /*!< PF[7] pin */ -#define AFIO_EXTICR2_EXTI7_PG ((uint16_t)0x6000) /*!< PG[7] pin */ - -/***************** Bit definition for AFIO_EXTICR3 register *****************/ -#define AFIO_EXTICR3_EXTI8 ((uint16_t)0x000F) /*!< EXTI 8 configuration */ -#define AFIO_EXTICR3_EXTI9 ((uint16_t)0x00F0) /*!< EXTI 9 configuration */ -#define AFIO_EXTICR3_EXTI10 ((uint16_t)0x0F00) /*!< EXTI 10 configuration */ -#define AFIO_EXTICR3_EXTI11 ((uint16_t)0xF000) /*!< EXTI 11 configuration */ - -/*!< EXTI8 configuration */ -#define AFIO_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /*!< PA[8] pin */ -#define AFIO_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /*!< PB[8] pin */ -#define AFIO_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /*!< PC[8] pin */ -#define AFIO_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /*!< PD[8] pin */ -#define AFIO_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /*!< PE[8] pin */ -#define AFIO_EXTICR3_EXTI8_PF ((uint16_t)0x0005) /*!< PF[8] pin */ -#define AFIO_EXTICR3_EXTI8_PG ((uint16_t)0x0006) /*!< PG[8] pin */ - -/*!< EXTI9 configuration */ -#define AFIO_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /*!< PA[9] pin */ -#define AFIO_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /*!< PB[9] pin */ -#define AFIO_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /*!< PC[9] pin */ -#define AFIO_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /*!< PD[9] pin */ -#define AFIO_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /*!< PE[9] pin */ -#define AFIO_EXTICR3_EXTI9_PF ((uint16_t)0x0050) /*!< PF[9] pin */ -#define AFIO_EXTICR3_EXTI9_PG ((uint16_t)0x0060) /*!< PG[9] pin */ - -/*!< EXTI10 configuration */ -#define AFIO_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /*!< PA[10] pin */ -#define AFIO_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /*!< PB[10] pin */ -#define AFIO_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /*!< PC[10] pin */ -#define AFIO_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /*!< PD[10] pin */ -#define AFIO_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /*!< PE[10] pin */ -#define AFIO_EXTICR3_EXTI10_PF ((uint16_t)0x0500) /*!< PF[10] pin */ -#define AFIO_EXTICR3_EXTI10_PG ((uint16_t)0x0600) /*!< PG[10] pin */ - -/*!< EXTI11 configuration */ -#define AFIO_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /*!< PA[11] pin */ -#define AFIO_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /*!< PB[11] pin */ -#define AFIO_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /*!< PC[11] pin */ -#define AFIO_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /*!< PD[11] pin */ -#define AFIO_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /*!< PE[11] pin */ -#define AFIO_EXTICR3_EXTI11_PF ((uint16_t)0x5000) /*!< PF[11] pin */ -#define AFIO_EXTICR3_EXTI11_PG ((uint16_t)0x6000) /*!< PG[11] pin */ - -/***************** Bit definition for AFIO_EXTICR4 register *****************/ -#define AFIO_EXTICR4_EXTI12 ((uint16_t)0x000F) /*!< EXTI 12 configuration */ -#define AFIO_EXTICR4_EXTI13 ((uint16_t)0x00F0) /*!< EXTI 13 configuration */ -#define AFIO_EXTICR4_EXTI14 ((uint16_t)0x0F00) /*!< EXTI 14 configuration */ -#define AFIO_EXTICR4_EXTI15 ((uint16_t)0xF000) /*!< EXTI 15 configuration */ - -/* EXTI12 configuration */ -#define AFIO_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /*!< PA[12] pin */ -#define AFIO_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /*!< PB[12] pin */ -#define AFIO_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /*!< PC[12] pin */ -#define AFIO_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /*!< PD[12] pin */ -#define AFIO_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /*!< PE[12] pin */ -#define AFIO_EXTICR4_EXTI12_PF ((uint16_t)0x0005) /*!< PF[12] pin */ -#define AFIO_EXTICR4_EXTI12_PG ((uint16_t)0x0006) /*!< PG[12] pin */ - -/* EXTI13 configuration */ -#define AFIO_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /*!< PA[13] pin */ -#define AFIO_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /*!< PB[13] pin */ -#define AFIO_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /*!< PC[13] pin */ -#define AFIO_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /*!< PD[13] pin */ -#define AFIO_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /*!< PE[13] pin */ -#define AFIO_EXTICR4_EXTI13_PF ((uint16_t)0x0050) /*!< PF[13] pin */ -#define AFIO_EXTICR4_EXTI13_PG ((uint16_t)0x0060) /*!< PG[13] pin */ - -/*!< EXTI14 configuration */ -#define AFIO_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /*!< PA[14] pin */ -#define AFIO_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /*!< PB[14] pin */ -#define AFIO_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /*!< PC[14] pin */ -#define AFIO_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /*!< PD[14] pin */ -#define AFIO_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /*!< PE[14] pin */ -#define AFIO_EXTICR4_EXTI14_PF ((uint16_t)0x0500) /*!< PF[14] pin */ -#define AFIO_EXTICR4_EXTI14_PG ((uint16_t)0x0600) /*!< PG[14] pin */ - -/*!< EXTI15 configuration */ -#define AFIO_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /*!< PA[15] pin */ -#define AFIO_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /*!< PB[15] pin */ -#define AFIO_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /*!< PC[15] pin */ -#define AFIO_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /*!< PD[15] pin */ -#define AFIO_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /*!< PE[15] pin */ -#define AFIO_EXTICR4_EXTI15_PF ((uint16_t)0x5000) /*!< PF[15] pin */ -#define AFIO_EXTICR4_EXTI15_PG ((uint16_t)0x6000) /*!< PG[15] pin */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -/****************** Bit definition for AFIO_MAPR2 register ******************/ -#define AFIO_MAPR2_TIM15_REMAP ((uint32_t)0x00000001) /*!< TIM15 remapping */ -#define AFIO_MAPR2_TIM16_REMAP ((uint32_t)0x00000002) /*!< TIM16 remapping */ -#define AFIO_MAPR2_TIM17_REMAP ((uint32_t)0x00000004) /*!< TIM17 remapping */ -#define AFIO_MAPR2_CEC_REMAP ((uint32_t)0x00000008) /*!< CEC remapping */ -#define AFIO_MAPR2_TIM1_DMA_REMAP ((uint32_t)0x00000010) /*!< TIM1_DMA remapping */ -#endif - -/******************************************************************************/ -/* */ -/* SystemTick */ -/* */ -/******************************************************************************/ - -/***************** Bit definition for SysTick_CTRL register *****************/ -#define SysTick_CTRL_ENABLE ((uint32_t)0x00000001) /*!< Counter enable */ -#define SysTick_CTRL_TICKINT ((uint32_t)0x00000002) /*!< Counting down to 0 pends the SysTick handler */ -#define SysTick_CTRL_CLKSOURCE ((uint32_t)0x00000004) /*!< Clock source */ -#define SysTick_CTRL_COUNTFLAG ((uint32_t)0x00010000) /*!< Count Flag */ - -/***************** Bit definition for SysTick_LOAD register *****************/ -#define SysTick_LOAD_RELOAD ((uint32_t)0x00FFFFFF) /*!< Value to load into the SysTick Current Value Register when the counter reaches 0 */ - -/***************** Bit definition for SysTick_VAL register ******************/ -#define SysTick_VAL_CURRENT ((uint32_t)0x00FFFFFF) /*!< Current value at the time the register is accessed */ - -/***************** Bit definition for SysTick_CALIB register ****************/ -#define SysTick_CALIB_TENMS ((uint32_t)0x00FFFFFF) /*!< Reload value to use for 10ms timing */ -#define SysTick_CALIB_SKEW ((uint32_t)0x40000000) /*!< Calibration value is not exactly 10 ms */ -#define SysTick_CALIB_NOREF ((uint32_t)0x80000000) /*!< The reference clock is not provided */ - -/******************************************************************************/ -/* */ -/* Nested Vectored Interrupt Controller */ -/* */ -/******************************************************************************/ - -/****************** Bit definition for NVIC_ISER register *******************/ -#define NVIC_ISER_SETENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt set enable bits */ -#define NVIC_ISER_SETENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_ISER_SETENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_ISER_SETENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_ISER_SETENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_ISER_SETENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_ISER_SETENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_ISER_SETENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_ISER_SETENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_ISER_SETENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_ISER_SETENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_ISER_SETENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_ISER_SETENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_ISER_SETENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_ISER_SETENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_ISER_SETENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_ISER_SETENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_ISER_SETENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_ISER_SETENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_ISER_SETENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_ISER_SETENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_ISER_SETENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_ISER_SETENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_ISER_SETENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_ISER_SETENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_ISER_SETENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_ISER_SETENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_ISER_SETENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_ISER_SETENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_ISER_SETENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_ISER_SETENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_ISER_SETENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_ISER_SETENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_ICER register *******************/ -#define NVIC_ICER_CLRENA ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-enable bits */ -#define NVIC_ICER_CLRENA_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_ICER_CLRENA_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_ICER_CLRENA_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_ICER_CLRENA_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_ICER_CLRENA_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_ICER_CLRENA_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_ICER_CLRENA_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_ICER_CLRENA_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_ICER_CLRENA_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_ICER_CLRENA_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_ICER_CLRENA_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_ICER_CLRENA_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_ICER_CLRENA_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_ICER_CLRENA_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_ICER_CLRENA_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_ICER_CLRENA_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_ICER_CLRENA_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_ICER_CLRENA_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_ICER_CLRENA_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_ICER_CLRENA_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_ICER_CLRENA_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_ICER_CLRENA_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_ICER_CLRENA_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_ICER_CLRENA_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_ICER_CLRENA_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_ICER_CLRENA_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_ICER_CLRENA_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_ICER_CLRENA_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_ICER_CLRENA_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_ICER_CLRENA_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_ICER_CLRENA_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_ICER_CLRENA_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_ISPR register *******************/ -#define NVIC_ISPR_SETPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt set-pending bits */ -#define NVIC_ISPR_SETPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_ISPR_SETPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_ISPR_SETPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_ISPR_SETPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_ISPR_SETPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_ISPR_SETPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_ISPR_SETPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_ISPR_SETPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_ISPR_SETPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_ISPR_SETPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_ISPR_SETPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_ISPR_SETPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_ISPR_SETPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_ISPR_SETPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_ISPR_SETPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_ISPR_SETPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_ISPR_SETPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_ISPR_SETPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_ISPR_SETPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_ISPR_SETPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_ISPR_SETPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_ISPR_SETPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_ISPR_SETPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_ISPR_SETPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_ISPR_SETPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_ISPR_SETPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_ISPR_SETPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_ISPR_SETPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_ISPR_SETPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_ISPR_SETPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_ISPR_SETPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_ISPR_SETPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_ICPR register *******************/ -#define NVIC_ICPR_CLRPEND ((uint32_t)0xFFFFFFFF) /*!< Interrupt clear-pending bits */ -#define NVIC_ICPR_CLRPEND_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_ICPR_CLRPEND_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_ICPR_CLRPEND_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_ICPR_CLRPEND_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_ICPR_CLRPEND_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_ICPR_CLRPEND_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_ICPR_CLRPEND_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_ICPR_CLRPEND_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_ICPR_CLRPEND_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_ICPR_CLRPEND_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_ICPR_CLRPEND_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_ICPR_CLRPEND_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_ICPR_CLRPEND_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_ICPR_CLRPEND_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_ICPR_CLRPEND_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_ICPR_CLRPEND_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_ICPR_CLRPEND_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_ICPR_CLRPEND_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_ICPR_CLRPEND_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_ICPR_CLRPEND_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_ICPR_CLRPEND_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_ICPR_CLRPEND_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_ICPR_CLRPEND_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_ICPR_CLRPEND_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_ICPR_CLRPEND_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_ICPR_CLRPEND_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_ICPR_CLRPEND_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_ICPR_CLRPEND_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_ICPR_CLRPEND_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_ICPR_CLRPEND_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_ICPR_CLRPEND_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_ICPR_CLRPEND_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_IABR register *******************/ -#define NVIC_IABR_ACTIVE ((uint32_t)0xFFFFFFFF) /*!< Interrupt active flags */ -#define NVIC_IABR_ACTIVE_0 ((uint32_t)0x00000001) /*!< bit 0 */ -#define NVIC_IABR_ACTIVE_1 ((uint32_t)0x00000002) /*!< bit 1 */ -#define NVIC_IABR_ACTIVE_2 ((uint32_t)0x00000004) /*!< bit 2 */ -#define NVIC_IABR_ACTIVE_3 ((uint32_t)0x00000008) /*!< bit 3 */ -#define NVIC_IABR_ACTIVE_4 ((uint32_t)0x00000010) /*!< bit 4 */ -#define NVIC_IABR_ACTIVE_5 ((uint32_t)0x00000020) /*!< bit 5 */ -#define NVIC_IABR_ACTIVE_6 ((uint32_t)0x00000040) /*!< bit 6 */ -#define NVIC_IABR_ACTIVE_7 ((uint32_t)0x00000080) /*!< bit 7 */ -#define NVIC_IABR_ACTIVE_8 ((uint32_t)0x00000100) /*!< bit 8 */ -#define NVIC_IABR_ACTIVE_9 ((uint32_t)0x00000200) /*!< bit 9 */ -#define NVIC_IABR_ACTIVE_10 ((uint32_t)0x00000400) /*!< bit 10 */ -#define NVIC_IABR_ACTIVE_11 ((uint32_t)0x00000800) /*!< bit 11 */ -#define NVIC_IABR_ACTIVE_12 ((uint32_t)0x00001000) /*!< bit 12 */ -#define NVIC_IABR_ACTIVE_13 ((uint32_t)0x00002000) /*!< bit 13 */ -#define NVIC_IABR_ACTIVE_14 ((uint32_t)0x00004000) /*!< bit 14 */ -#define NVIC_IABR_ACTIVE_15 ((uint32_t)0x00008000) /*!< bit 15 */ -#define NVIC_IABR_ACTIVE_16 ((uint32_t)0x00010000) /*!< bit 16 */ -#define NVIC_IABR_ACTIVE_17 ((uint32_t)0x00020000) /*!< bit 17 */ -#define NVIC_IABR_ACTIVE_18 ((uint32_t)0x00040000) /*!< bit 18 */ -#define NVIC_IABR_ACTIVE_19 ((uint32_t)0x00080000) /*!< bit 19 */ -#define NVIC_IABR_ACTIVE_20 ((uint32_t)0x00100000) /*!< bit 20 */ -#define NVIC_IABR_ACTIVE_21 ((uint32_t)0x00200000) /*!< bit 21 */ -#define NVIC_IABR_ACTIVE_22 ((uint32_t)0x00400000) /*!< bit 22 */ -#define NVIC_IABR_ACTIVE_23 ((uint32_t)0x00800000) /*!< bit 23 */ -#define NVIC_IABR_ACTIVE_24 ((uint32_t)0x01000000) /*!< bit 24 */ -#define NVIC_IABR_ACTIVE_25 ((uint32_t)0x02000000) /*!< bit 25 */ -#define NVIC_IABR_ACTIVE_26 ((uint32_t)0x04000000) /*!< bit 26 */ -#define NVIC_IABR_ACTIVE_27 ((uint32_t)0x08000000) /*!< bit 27 */ -#define NVIC_IABR_ACTIVE_28 ((uint32_t)0x10000000) /*!< bit 28 */ -#define NVIC_IABR_ACTIVE_29 ((uint32_t)0x20000000) /*!< bit 29 */ -#define NVIC_IABR_ACTIVE_30 ((uint32_t)0x40000000) /*!< bit 30 */ -#define NVIC_IABR_ACTIVE_31 ((uint32_t)0x80000000) /*!< bit 31 */ - -/****************** Bit definition for NVIC_PRI0 register *******************/ -#define NVIC_IPR0_PRI_0 ((uint32_t)0x000000FF) /*!< Priority of interrupt 0 */ -#define NVIC_IPR0_PRI_1 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 1 */ -#define NVIC_IPR0_PRI_2 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 2 */ -#define NVIC_IPR0_PRI_3 ((uint32_t)0xFF000000) /*!< Priority of interrupt 3 */ - -/****************** Bit definition for NVIC_PRI1 register *******************/ -#define NVIC_IPR1_PRI_4 ((uint32_t)0x000000FF) /*!< Priority of interrupt 4 */ -#define NVIC_IPR1_PRI_5 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 5 */ -#define NVIC_IPR1_PRI_6 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 6 */ -#define NVIC_IPR1_PRI_7 ((uint32_t)0xFF000000) /*!< Priority of interrupt 7 */ - -/****************** Bit definition for NVIC_PRI2 register *******************/ -#define NVIC_IPR2_PRI_8 ((uint32_t)0x000000FF) /*!< Priority of interrupt 8 */ -#define NVIC_IPR2_PRI_9 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 9 */ -#define NVIC_IPR2_PRI_10 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 10 */ -#define NVIC_IPR2_PRI_11 ((uint32_t)0xFF000000) /*!< Priority of interrupt 11 */ - -/****************** Bit definition for NVIC_PRI3 register *******************/ -#define NVIC_IPR3_PRI_12 ((uint32_t)0x000000FF) /*!< Priority of interrupt 12 */ -#define NVIC_IPR3_PRI_13 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 13 */ -#define NVIC_IPR3_PRI_14 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 14 */ -#define NVIC_IPR3_PRI_15 ((uint32_t)0xFF000000) /*!< Priority of interrupt 15 */ - -/****************** Bit definition for NVIC_PRI4 register *******************/ -#define NVIC_IPR4_PRI_16 ((uint32_t)0x000000FF) /*!< Priority of interrupt 16 */ -#define NVIC_IPR4_PRI_17 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 17 */ -#define NVIC_IPR4_PRI_18 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 18 */ -#define NVIC_IPR4_PRI_19 ((uint32_t)0xFF000000) /*!< Priority of interrupt 19 */ - -/****************** Bit definition for NVIC_PRI5 register *******************/ -#define NVIC_IPR5_PRI_20 ((uint32_t)0x000000FF) /*!< Priority of interrupt 20 */ -#define NVIC_IPR5_PRI_21 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 21 */ -#define NVIC_IPR5_PRI_22 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 22 */ -#define NVIC_IPR5_PRI_23 ((uint32_t)0xFF000000) /*!< Priority of interrupt 23 */ - -/****************** Bit definition for NVIC_PRI6 register *******************/ -#define NVIC_IPR6_PRI_24 ((uint32_t)0x000000FF) /*!< Priority of interrupt 24 */ -#define NVIC_IPR6_PRI_25 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 25 */ -#define NVIC_IPR6_PRI_26 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 26 */ -#define NVIC_IPR6_PRI_27 ((uint32_t)0xFF000000) /*!< Priority of interrupt 27 */ - -/****************** Bit definition for NVIC_PRI7 register *******************/ -#define NVIC_IPR7_PRI_28 ((uint32_t)0x000000FF) /*!< Priority of interrupt 28 */ -#define NVIC_IPR7_PRI_29 ((uint32_t)0x0000FF00) /*!< Priority of interrupt 29 */ -#define NVIC_IPR7_PRI_30 ((uint32_t)0x00FF0000) /*!< Priority of interrupt 30 */ -#define NVIC_IPR7_PRI_31 ((uint32_t)0xFF000000) /*!< Priority of interrupt 31 */ - -/****************** Bit definition for SCB_CPUID register *******************/ -#define SCB_CPUID_REVISION ((uint32_t)0x0000000F) /*!< Implementation defined revision number */ -#define SCB_CPUID_PARTNO ((uint32_t)0x0000FFF0) /*!< Number of processor within family */ -#define SCB_CPUID_Constant ((uint32_t)0x000F0000) /*!< Reads as 0x0F */ -#define SCB_CPUID_VARIANT ((uint32_t)0x00F00000) /*!< Implementation defined variant number */ -#define SCB_CPUID_IMPLEMENTER ((uint32_t)0xFF000000) /*!< Implementer code. ARM is 0x41 */ - -/******************* Bit definition for SCB_ICSR register *******************/ -#define SCB_ICSR_VECTACTIVE ((uint32_t)0x000001FF) /*!< Active ISR number field */ -#define SCB_ICSR_RETTOBASE ((uint32_t)0x00000800) /*!< All active exceptions minus the IPSR_current_exception yields the empty set */ -#define SCB_ICSR_VECTPENDING ((uint32_t)0x003FF000) /*!< Pending ISR number field */ -#define SCB_ICSR_ISRPENDING ((uint32_t)0x00400000) /*!< Interrupt pending flag */ -#define SCB_ICSR_ISRPREEMPT ((uint32_t)0x00800000) /*!< It indicates that a pending interrupt becomes active in the next running cycle */ -#define SCB_ICSR_PENDSTCLR ((uint32_t)0x02000000) /*!< Clear pending SysTick bit */ -#define SCB_ICSR_PENDSTSET ((uint32_t)0x04000000) /*!< Set pending SysTick bit */ -#define SCB_ICSR_PENDSVCLR ((uint32_t)0x08000000) /*!< Clear pending pendSV bit */ -#define SCB_ICSR_PENDSVSET ((uint32_t)0x10000000) /*!< Set pending pendSV bit */ -#define SCB_ICSR_NMIPENDSET ((uint32_t)0x80000000) /*!< Set pending NMI bit */ - -/******************* Bit definition for SCB_VTOR register *******************/ -#define SCB_VTOR_TBLOFF ((uint32_t)0x1FFFFF80) /*!< Vector table base offset field */ -#define SCB_VTOR_TBLBASE ((uint32_t)0x20000000) /*!< Table base in code(0) or RAM(1) */ - -/*!<***************** Bit definition for SCB_AIRCR register *******************/ -#define SCB_AIRCR_VECTRESET ((uint32_t)0x00000001) /*!< System Reset bit */ -#define SCB_AIRCR_VECTCLRACTIVE ((uint32_t)0x00000002) /*!< Clear active vector bit */ -#define SCB_AIRCR_SYSRESETREQ ((uint32_t)0x00000004) /*!< Requests chip control logic to generate a reset */ - -#define SCB_AIRCR_PRIGROUP ((uint32_t)0x00000700) /*!< PRIGROUP[2:0] bits (Priority group) */ -#define SCB_AIRCR_PRIGROUP_0 ((uint32_t)0x00000100) /*!< Bit 0 */ -#define SCB_AIRCR_PRIGROUP_1 ((uint32_t)0x00000200) /*!< Bit 1 */ -#define SCB_AIRCR_PRIGROUP_2 ((uint32_t)0x00000400) /*!< Bit 2 */ - -/* prority group configuration */ -#define SCB_AIRCR_PRIGROUP0 ((uint32_t)0x00000000) /*!< Priority group=0 (7 bits of pre-emption priority, 1 bit of subpriority) */ -#define SCB_AIRCR_PRIGROUP1 ((uint32_t)0x00000100) /*!< Priority group=1 (6 bits of pre-emption priority, 2 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP2 ((uint32_t)0x00000200) /*!< Priority group=2 (5 bits of pre-emption priority, 3 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP3 ((uint32_t)0x00000300) /*!< Priority group=3 (4 bits of pre-emption priority, 4 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP4 ((uint32_t)0x00000400) /*!< Priority group=4 (3 bits of pre-emption priority, 5 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP5 ((uint32_t)0x00000500) /*!< Priority group=5 (2 bits of pre-emption priority, 6 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP6 ((uint32_t)0x00000600) /*!< Priority group=6 (1 bit of pre-emption priority, 7 bits of subpriority) */ -#define SCB_AIRCR_PRIGROUP7 ((uint32_t)0x00000700) /*!< Priority group=7 (no pre-emption priority, 8 bits of subpriority) */ - -#define SCB_AIRCR_ENDIANESS ((uint32_t)0x00008000) /*!< Data endianness bit */ -#define SCB_AIRCR_VECTKEY ((uint32_t)0xFFFF0000) /*!< Register key (VECTKEY) - Reads as 0xFA05 (VECTKEYSTAT) */ - -/******************* Bit definition for SCB_SCR register ********************/ -#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< Sleep on exit bit */ -#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< Sleep deep bit */ -#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< Wake up from WFE */ - -/******************** Bit definition for SCB_CCR register *******************/ -#define SCB_CCR_NONBASETHRDENA ((uint16_t)0x0001) /*!< Thread mode can be entered from any level in Handler mode by controlled return value */ -#define SCB_CCR_USERSETMPEND ((uint16_t)0x0002) /*!< Enables user code to write the Software Trigger Interrupt register to trigger (pend) a Main exception */ -#define SCB_CCR_UNALIGN_TRP ((uint16_t)0x0008) /*!< Trap for unaligned access */ -#define SCB_CCR_DIV_0_TRP ((uint16_t)0x0010) /*!< Trap on Divide by 0 */ -#define SCB_CCR_BFHFNMIGN ((uint16_t)0x0100) /*!< Handlers running at priority -1 and -2 */ -#define SCB_CCR_STKALIGN ((uint16_t)0x0200) /*!< On exception entry, the SP used prior to the exception is adjusted to be 8-byte aligned */ - -/******************* Bit definition for SCB_SHPR register ********************/ -#define SCB_SHPR_PRI_N ((uint32_t)0x000000FF) /*!< Priority of system handler 4,8, and 12. Mem Manage, reserved and Debug Monitor */ -#define SCB_SHPR_PRI_N1 ((uint32_t)0x0000FF00) /*!< Priority of system handler 5,9, and 13. Bus Fault, reserved and reserved */ -#define SCB_SHPR_PRI_N2 ((uint32_t)0x00FF0000) /*!< Priority of system handler 6,10, and 14. Usage Fault, reserved and PendSV */ -#define SCB_SHPR_PRI_N3 ((uint32_t)0xFF000000) /*!< Priority of system handler 7,11, and 15. Reserved, SVCall and SysTick */ - -/****************** Bit definition for SCB_SHCSR register *******************/ -#define SCB_SHCSR_MEMFAULTACT ((uint32_t)0x00000001) /*!< MemManage is active */ -#define SCB_SHCSR_BUSFAULTACT ((uint32_t)0x00000002) /*!< BusFault is active */ -#define SCB_SHCSR_USGFAULTACT ((uint32_t)0x00000008) /*!< UsageFault is active */ -#define SCB_SHCSR_SVCALLACT ((uint32_t)0x00000080) /*!< SVCall is active */ -#define SCB_SHCSR_MONITORACT ((uint32_t)0x00000100) /*!< Monitor is active */ -#define SCB_SHCSR_PENDSVACT ((uint32_t)0x00000400) /*!< PendSV is active */ -#define SCB_SHCSR_SYSTICKACT ((uint32_t)0x00000800) /*!< SysTick is active */ -#define SCB_SHCSR_USGFAULTPENDED ((uint32_t)0x00001000) /*!< Usage Fault is pended */ -#define SCB_SHCSR_MEMFAULTPENDED ((uint32_t)0x00002000) /*!< MemManage is pended */ -#define SCB_SHCSR_BUSFAULTPENDED ((uint32_t)0x00004000) /*!< Bus Fault is pended */ -#define SCB_SHCSR_SVCALLPENDED ((uint32_t)0x00008000) /*!< SVCall is pended */ -#define SCB_SHCSR_MEMFAULTENA ((uint32_t)0x00010000) /*!< MemManage enable */ -#define SCB_SHCSR_BUSFAULTENA ((uint32_t)0x00020000) /*!< Bus Fault enable */ -#define SCB_SHCSR_USGFAULTENA ((uint32_t)0x00040000) /*!< UsageFault enable */ - -/******************* Bit definition for SCB_CFSR register *******************/ -/*!< MFSR */ -#define SCB_CFSR_IACCVIOL ((uint32_t)0x00000001) /*!< Instruction access violation */ -#define SCB_CFSR_DACCVIOL ((uint32_t)0x00000002) /*!< Data access violation */ -#define SCB_CFSR_MUNSTKERR ((uint32_t)0x00000008) /*!< Unstacking error */ -#define SCB_CFSR_MSTKERR ((uint32_t)0x00000010) /*!< Stacking error */ -#define SCB_CFSR_MMARVALID ((uint32_t)0x00000080) /*!< Memory Manage Address Register address valid flag */ -/*!< BFSR */ -#define SCB_CFSR_IBUSERR ((uint32_t)0x00000100) /*!< Instruction bus error flag */ -#define SCB_CFSR_PRECISERR ((uint32_t)0x00000200) /*!< Precise data bus error */ -#define SCB_CFSR_IMPRECISERR ((uint32_t)0x00000400) /*!< Imprecise data bus error */ -#define SCB_CFSR_UNSTKERR ((uint32_t)0x00000800) /*!< Unstacking error */ -#define SCB_CFSR_STKERR ((uint32_t)0x00001000) /*!< Stacking error */ -#define SCB_CFSR_BFARVALID ((uint32_t)0x00008000) /*!< Bus Fault Address Register address valid flag */ -/*!< UFSR */ -#define SCB_CFSR_UNDEFINSTR ((uint32_t)0x00010000) /*!< The processor attempt to excecute an undefined instruction */ -#define SCB_CFSR_INVSTATE ((uint32_t)0x00020000) /*!< Invalid combination of EPSR and instruction */ -#define SCB_CFSR_INVPC ((uint32_t)0x00040000) /*!< Attempt to load EXC_RETURN into pc illegally */ -#define SCB_CFSR_NOCP ((uint32_t)0x00080000) /*!< Attempt to use a coprocessor instruction */ -#define SCB_CFSR_UNALIGNED ((uint32_t)0x01000000) /*!< Fault occurs when there is an attempt to make an unaligned memory access */ -#define SCB_CFSR_DIVBYZERO ((uint32_t)0x02000000) /*!< Fault occurs when SDIV or DIV instruction is used with a divisor of 0 */ - -/******************* Bit definition for SCB_HFSR register *******************/ -#define SCB_HFSR_VECTTBL ((uint32_t)0x00000002) /*!< Fault occures because of vector table read on exception processing */ -#define SCB_HFSR_FORCED ((uint32_t)0x40000000) /*!< Hard Fault activated when a configurable Fault was received and cannot activate */ -#define SCB_HFSR_DEBUGEVT ((uint32_t)0x80000000) /*!< Fault related to debug */ - -/******************* Bit definition for SCB_DFSR register *******************/ -#define SCB_DFSR_HALTED ((uint8_t)0x01) /*!< Halt request flag */ -#define SCB_DFSR_BKPT ((uint8_t)0x02) /*!< BKPT flag */ -#define SCB_DFSR_DWTTRAP ((uint8_t)0x04) /*!< Data Watchpoint and Trace (DWT) flag */ -#define SCB_DFSR_VCATCH ((uint8_t)0x08) /*!< Vector catch flag */ -#define SCB_DFSR_EXTERNAL ((uint8_t)0x10) /*!< External debug request flag */ - -/******************* Bit definition for SCB_MMFAR register ******************/ -#define SCB_MMFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Mem Manage fault address field */ - -/******************* Bit definition for SCB_BFAR register *******************/ -#define SCB_BFAR_ADDRESS ((uint32_t)0xFFFFFFFF) /*!< Bus fault address field */ - -/******************* Bit definition for SCB_afsr register *******************/ -#define SCB_AFSR_IMPDEF ((uint32_t)0xFFFFFFFF) /*!< Implementation defined */ - -/******************************************************************************/ -/* */ -/* External Interrupt/Event Controller */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for EXTI_IMR register *******************/ -#define EXTI_IMR_MR0 ((uint32_t)0x00000001) /*!< Interrupt Mask on line 0 */ -#define EXTI_IMR_MR1 ((uint32_t)0x00000002) /*!< Interrupt Mask on line 1 */ -#define EXTI_IMR_MR2 ((uint32_t)0x00000004) /*!< Interrupt Mask on line 2 */ -#define EXTI_IMR_MR3 ((uint32_t)0x00000008) /*!< Interrupt Mask on line 3 */ -#define EXTI_IMR_MR4 ((uint32_t)0x00000010) /*!< Interrupt Mask on line 4 */ -#define EXTI_IMR_MR5 ((uint32_t)0x00000020) /*!< Interrupt Mask on line 5 */ -#define EXTI_IMR_MR6 ((uint32_t)0x00000040) /*!< Interrupt Mask on line 6 */ -#define EXTI_IMR_MR7 ((uint32_t)0x00000080) /*!< Interrupt Mask on line 7 */ -#define EXTI_IMR_MR8 ((uint32_t)0x00000100) /*!< Interrupt Mask on line 8 */ -#define EXTI_IMR_MR9 ((uint32_t)0x00000200) /*!< Interrupt Mask on line 9 */ -#define EXTI_IMR_MR10 ((uint32_t)0x00000400) /*!< Interrupt Mask on line 10 */ -#define EXTI_IMR_MR11 ((uint32_t)0x00000800) /*!< Interrupt Mask on line 11 */ -#define EXTI_IMR_MR12 ((uint32_t)0x00001000) /*!< Interrupt Mask on line 12 */ -#define EXTI_IMR_MR13 ((uint32_t)0x00002000) /*!< Interrupt Mask on line 13 */ -#define EXTI_IMR_MR14 ((uint32_t)0x00004000) /*!< Interrupt Mask on line 14 */ -#define EXTI_IMR_MR15 ((uint32_t)0x00008000) /*!< Interrupt Mask on line 15 */ -#define EXTI_IMR_MR16 ((uint32_t)0x00010000) /*!< Interrupt Mask on line 16 */ -#define EXTI_IMR_MR17 ((uint32_t)0x00020000) /*!< Interrupt Mask on line 17 */ -#define EXTI_IMR_MR18 ((uint32_t)0x00040000) /*!< Interrupt Mask on line 18 */ -#define EXTI_IMR_MR19 ((uint32_t)0x00080000) /*!< Interrupt Mask on line 19 */ - -/******************* Bit definition for EXTI_EMR register *******************/ -#define EXTI_EMR_MR0 ((uint32_t)0x00000001) /*!< Event Mask on line 0 */ -#define EXTI_EMR_MR1 ((uint32_t)0x00000002) /*!< Event Mask on line 1 */ -#define EXTI_EMR_MR2 ((uint32_t)0x00000004) /*!< Event Mask on line 2 */ -#define EXTI_EMR_MR3 ((uint32_t)0x00000008) /*!< Event Mask on line 3 */ -#define EXTI_EMR_MR4 ((uint32_t)0x00000010) /*!< Event Mask on line 4 */ -#define EXTI_EMR_MR5 ((uint32_t)0x00000020) /*!< Event Mask on line 5 */ -#define EXTI_EMR_MR6 ((uint32_t)0x00000040) /*!< Event Mask on line 6 */ -#define EXTI_EMR_MR7 ((uint32_t)0x00000080) /*!< Event Mask on line 7 */ -#define EXTI_EMR_MR8 ((uint32_t)0x00000100) /*!< Event Mask on line 8 */ -#define EXTI_EMR_MR9 ((uint32_t)0x00000200) /*!< Event Mask on line 9 */ -#define EXTI_EMR_MR10 ((uint32_t)0x00000400) /*!< Event Mask on line 10 */ -#define EXTI_EMR_MR11 ((uint32_t)0x00000800) /*!< Event Mask on line 11 */ -#define EXTI_EMR_MR12 ((uint32_t)0x00001000) /*!< Event Mask on line 12 */ -#define EXTI_EMR_MR13 ((uint32_t)0x00002000) /*!< Event Mask on line 13 */ -#define EXTI_EMR_MR14 ((uint32_t)0x00004000) /*!< Event Mask on line 14 */ -#define EXTI_EMR_MR15 ((uint32_t)0x00008000) /*!< Event Mask on line 15 */ -#define EXTI_EMR_MR16 ((uint32_t)0x00010000) /*!< Event Mask on line 16 */ -#define EXTI_EMR_MR17 ((uint32_t)0x00020000) /*!< Event Mask on line 17 */ -#define EXTI_EMR_MR18 ((uint32_t)0x00040000) /*!< Event Mask on line 18 */ -#define EXTI_EMR_MR19 ((uint32_t)0x00080000) /*!< Event Mask on line 19 */ - -/****************** Bit definition for EXTI_RTSR register *******************/ -#define EXTI_RTSR_TR0 ((uint32_t)0x00000001) /*!< Rising trigger event configuration bit of line 0 */ -#define EXTI_RTSR_TR1 ((uint32_t)0x00000002) /*!< Rising trigger event configuration bit of line 1 */ -#define EXTI_RTSR_TR2 ((uint32_t)0x00000004) /*!< Rising trigger event configuration bit of line 2 */ -#define EXTI_RTSR_TR3 ((uint32_t)0x00000008) /*!< Rising trigger event configuration bit of line 3 */ -#define EXTI_RTSR_TR4 ((uint32_t)0x00000010) /*!< Rising trigger event configuration bit of line 4 */ -#define EXTI_RTSR_TR5 ((uint32_t)0x00000020) /*!< Rising trigger event configuration bit of line 5 */ -#define EXTI_RTSR_TR6 ((uint32_t)0x00000040) /*!< Rising trigger event configuration bit of line 6 */ -#define EXTI_RTSR_TR7 ((uint32_t)0x00000080) /*!< Rising trigger event configuration bit of line 7 */ -#define EXTI_RTSR_TR8 ((uint32_t)0x00000100) /*!< Rising trigger event configuration bit of line 8 */ -#define EXTI_RTSR_TR9 ((uint32_t)0x00000200) /*!< Rising trigger event configuration bit of line 9 */ -#define EXTI_RTSR_TR10 ((uint32_t)0x00000400) /*!< Rising trigger event configuration bit of line 10 */ -#define EXTI_RTSR_TR11 ((uint32_t)0x00000800) /*!< Rising trigger event configuration bit of line 11 */ -#define EXTI_RTSR_TR12 ((uint32_t)0x00001000) /*!< Rising trigger event configuration bit of line 12 */ -#define EXTI_RTSR_TR13 ((uint32_t)0x00002000) /*!< Rising trigger event configuration bit of line 13 */ -#define EXTI_RTSR_TR14 ((uint32_t)0x00004000) /*!< Rising trigger event configuration bit of line 14 */ -#define EXTI_RTSR_TR15 ((uint32_t)0x00008000) /*!< Rising trigger event configuration bit of line 15 */ -#define EXTI_RTSR_TR16 ((uint32_t)0x00010000) /*!< Rising trigger event configuration bit of line 16 */ -#define EXTI_RTSR_TR17 ((uint32_t)0x00020000) /*!< Rising trigger event configuration bit of line 17 */ -#define EXTI_RTSR_TR18 ((uint32_t)0x00040000) /*!< Rising trigger event configuration bit of line 18 */ -#define EXTI_RTSR_TR19 ((uint32_t)0x00080000) /*!< Rising trigger event configuration bit of line 19 */ - -/****************** Bit definition for EXTI_FTSR register *******************/ -#define EXTI_FTSR_TR0 ((uint32_t)0x00000001) /*!< Falling trigger event configuration bit of line 0 */ -#define EXTI_FTSR_TR1 ((uint32_t)0x00000002) /*!< Falling trigger event configuration bit of line 1 */ -#define EXTI_FTSR_TR2 ((uint32_t)0x00000004) /*!< Falling trigger event configuration bit of line 2 */ -#define EXTI_FTSR_TR3 ((uint32_t)0x00000008) /*!< Falling trigger event configuration bit of line 3 */ -#define EXTI_FTSR_TR4 ((uint32_t)0x00000010) /*!< Falling trigger event configuration bit of line 4 */ -#define EXTI_FTSR_TR5 ((uint32_t)0x00000020) /*!< Falling trigger event configuration bit of line 5 */ -#define EXTI_FTSR_TR6 ((uint32_t)0x00000040) /*!< Falling trigger event configuration bit of line 6 */ -#define EXTI_FTSR_TR7 ((uint32_t)0x00000080) /*!< Falling trigger event configuration bit of line 7 */ -#define EXTI_FTSR_TR8 ((uint32_t)0x00000100) /*!< Falling trigger event configuration bit of line 8 */ -#define EXTI_FTSR_TR9 ((uint32_t)0x00000200) /*!< Falling trigger event configuration bit of line 9 */ -#define EXTI_FTSR_TR10 ((uint32_t)0x00000400) /*!< Falling trigger event configuration bit of line 10 */ -#define EXTI_FTSR_TR11 ((uint32_t)0x00000800) /*!< Falling trigger event configuration bit of line 11 */ -#define EXTI_FTSR_TR12 ((uint32_t)0x00001000) /*!< Falling trigger event configuration bit of line 12 */ -#define EXTI_FTSR_TR13 ((uint32_t)0x00002000) /*!< Falling trigger event configuration bit of line 13 */ -#define EXTI_FTSR_TR14 ((uint32_t)0x00004000) /*!< Falling trigger event configuration bit of line 14 */ -#define EXTI_FTSR_TR15 ((uint32_t)0x00008000) /*!< Falling trigger event configuration bit of line 15 */ -#define EXTI_FTSR_TR16 ((uint32_t)0x00010000) /*!< Falling trigger event configuration bit of line 16 */ -#define EXTI_FTSR_TR17 ((uint32_t)0x00020000) /*!< Falling trigger event configuration bit of line 17 */ -#define EXTI_FTSR_TR18 ((uint32_t)0x00040000) /*!< Falling trigger event configuration bit of line 18 */ -#define EXTI_FTSR_TR19 ((uint32_t)0x00080000) /*!< Falling trigger event configuration bit of line 19 */ - -/****************** Bit definition for EXTI_SWIER register ******************/ -#define EXTI_SWIER_SWIER0 ((uint32_t)0x00000001) /*!< Software Interrupt on line 0 */ -#define EXTI_SWIER_SWIER1 ((uint32_t)0x00000002) /*!< Software Interrupt on line 1 */ -#define EXTI_SWIER_SWIER2 ((uint32_t)0x00000004) /*!< Software Interrupt on line 2 */ -#define EXTI_SWIER_SWIER3 ((uint32_t)0x00000008) /*!< Software Interrupt on line 3 */ -#define EXTI_SWIER_SWIER4 ((uint32_t)0x00000010) /*!< Software Interrupt on line 4 */ -#define EXTI_SWIER_SWIER5 ((uint32_t)0x00000020) /*!< Software Interrupt on line 5 */ -#define EXTI_SWIER_SWIER6 ((uint32_t)0x00000040) /*!< Software Interrupt on line 6 */ -#define EXTI_SWIER_SWIER7 ((uint32_t)0x00000080) /*!< Software Interrupt on line 7 */ -#define EXTI_SWIER_SWIER8 ((uint32_t)0x00000100) /*!< Software Interrupt on line 8 */ -#define EXTI_SWIER_SWIER9 ((uint32_t)0x00000200) /*!< Software Interrupt on line 9 */ -#define EXTI_SWIER_SWIER10 ((uint32_t)0x00000400) /*!< Software Interrupt on line 10 */ -#define EXTI_SWIER_SWIER11 ((uint32_t)0x00000800) /*!< Software Interrupt on line 11 */ -#define EXTI_SWIER_SWIER12 ((uint32_t)0x00001000) /*!< Software Interrupt on line 12 */ -#define EXTI_SWIER_SWIER13 ((uint32_t)0x00002000) /*!< Software Interrupt on line 13 */ -#define EXTI_SWIER_SWIER14 ((uint32_t)0x00004000) /*!< Software Interrupt on line 14 */ -#define EXTI_SWIER_SWIER15 ((uint32_t)0x00008000) /*!< Software Interrupt on line 15 */ -#define EXTI_SWIER_SWIER16 ((uint32_t)0x00010000) /*!< Software Interrupt on line 16 */ -#define EXTI_SWIER_SWIER17 ((uint32_t)0x00020000) /*!< Software Interrupt on line 17 */ -#define EXTI_SWIER_SWIER18 ((uint32_t)0x00040000) /*!< Software Interrupt on line 18 */ -#define EXTI_SWIER_SWIER19 ((uint32_t)0x00080000) /*!< Software Interrupt on line 19 */ - -/******************* Bit definition for EXTI_PR register ********************/ -#define EXTI_PR_PR0 ((uint32_t)0x00000001) /*!< Pending bit for line 0 */ -#define EXTI_PR_PR1 ((uint32_t)0x00000002) /*!< Pending bit for line 1 */ -#define EXTI_PR_PR2 ((uint32_t)0x00000004) /*!< Pending bit for line 2 */ -#define EXTI_PR_PR3 ((uint32_t)0x00000008) /*!< Pending bit for line 3 */ -#define EXTI_PR_PR4 ((uint32_t)0x00000010) /*!< Pending bit for line 4 */ -#define EXTI_PR_PR5 ((uint32_t)0x00000020) /*!< Pending bit for line 5 */ -#define EXTI_PR_PR6 ((uint32_t)0x00000040) /*!< Pending bit for line 6 */ -#define EXTI_PR_PR7 ((uint32_t)0x00000080) /*!< Pending bit for line 7 */ -#define EXTI_PR_PR8 ((uint32_t)0x00000100) /*!< Pending bit for line 8 */ -#define EXTI_PR_PR9 ((uint32_t)0x00000200) /*!< Pending bit for line 9 */ -#define EXTI_PR_PR10 ((uint32_t)0x00000400) /*!< Pending bit for line 10 */ -#define EXTI_PR_PR11 ((uint32_t)0x00000800) /*!< Pending bit for line 11 */ -#define EXTI_PR_PR12 ((uint32_t)0x00001000) /*!< Pending bit for line 12 */ -#define EXTI_PR_PR13 ((uint32_t)0x00002000) /*!< Pending bit for line 13 */ -#define EXTI_PR_PR14 ((uint32_t)0x00004000) /*!< Pending bit for line 14 */ -#define EXTI_PR_PR15 ((uint32_t)0x00008000) /*!< Pending bit for line 15 */ -#define EXTI_PR_PR16 ((uint32_t)0x00010000) /*!< Pending bit for line 16 */ -#define EXTI_PR_PR17 ((uint32_t)0x00020000) /*!< Pending bit for line 17 */ -#define EXTI_PR_PR18 ((uint32_t)0x00040000) /*!< Pending bit for line 18 */ -#define EXTI_PR_PR19 ((uint32_t)0x00080000) /*!< Pending bit for line 19 */ - -/******************************************************************************/ -/* */ -/* DMA Controller */ -/* */ -/******************************************************************************/ - -/******************* Bit definition for DMA_ISR register ********************/ -#define DMA_ISR_GIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt flag */ -#define DMA_ISR_TCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete flag */ -#define DMA_ISR_HTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer flag */ -#define DMA_ISR_TEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error flag */ -#define DMA_ISR_GIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt flag */ -#define DMA_ISR_TCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete flag */ -#define DMA_ISR_HTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer flag */ -#define DMA_ISR_TEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error flag */ -#define DMA_ISR_GIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt flag */ -#define DMA_ISR_TCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete flag */ -#define DMA_ISR_HTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer flag */ -#define DMA_ISR_TEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error flag */ -#define DMA_ISR_GIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt flag */ -#define DMA_ISR_TCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete flag */ -#define DMA_ISR_HTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer flag */ -#define DMA_ISR_TEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error flag */ -#define DMA_ISR_GIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt flag */ -#define DMA_ISR_TCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete flag */ -#define DMA_ISR_HTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer flag */ -#define DMA_ISR_TEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error flag */ -#define DMA_ISR_GIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt flag */ -#define DMA_ISR_TCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete flag */ -#define DMA_ISR_HTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer flag */ -#define DMA_ISR_TEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error flag */ -#define DMA_ISR_GIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt flag */ -#define DMA_ISR_TCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete flag */ -#define DMA_ISR_HTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer flag */ -#define DMA_ISR_TEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error flag */ - -/******************* Bit definition for DMA_IFCR register *******************/ -#define DMA_IFCR_CGIF1 ((uint32_t)0x00000001) /*!< Channel 1 Global interrupt clearr */ -#define DMA_IFCR_CTCIF1 ((uint32_t)0x00000002) /*!< Channel 1 Transfer Complete clear */ -#define DMA_IFCR_CHTIF1 ((uint32_t)0x00000004) /*!< Channel 1 Half Transfer clear */ -#define DMA_IFCR_CTEIF1 ((uint32_t)0x00000008) /*!< Channel 1 Transfer Error clear */ -#define DMA_IFCR_CGIF2 ((uint32_t)0x00000010) /*!< Channel 2 Global interrupt clear */ -#define DMA_IFCR_CTCIF2 ((uint32_t)0x00000020) /*!< Channel 2 Transfer Complete clear */ -#define DMA_IFCR_CHTIF2 ((uint32_t)0x00000040) /*!< Channel 2 Half Transfer clear */ -#define DMA_IFCR_CTEIF2 ((uint32_t)0x00000080) /*!< Channel 2 Transfer Error clear */ -#define DMA_IFCR_CGIF3 ((uint32_t)0x00000100) /*!< Channel 3 Global interrupt clear */ -#define DMA_IFCR_CTCIF3 ((uint32_t)0x00000200) /*!< Channel 3 Transfer Complete clear */ -#define DMA_IFCR_CHTIF3 ((uint32_t)0x00000400) /*!< Channel 3 Half Transfer clear */ -#define DMA_IFCR_CTEIF3 ((uint32_t)0x00000800) /*!< Channel 3 Transfer Error clear */ -#define DMA_IFCR_CGIF4 ((uint32_t)0x00001000) /*!< Channel 4 Global interrupt clear */ -#define DMA_IFCR_CTCIF4 ((uint32_t)0x00002000) /*!< Channel 4 Transfer Complete clear */ -#define DMA_IFCR_CHTIF4 ((uint32_t)0x00004000) /*!< Channel 4 Half Transfer clear */ -#define DMA_IFCR_CTEIF4 ((uint32_t)0x00008000) /*!< Channel 4 Transfer Error clear */ -#define DMA_IFCR_CGIF5 ((uint32_t)0x00010000) /*!< Channel 5 Global interrupt clear */ -#define DMA_IFCR_CTCIF5 ((uint32_t)0x00020000) /*!< Channel 5 Transfer Complete clear */ -#define DMA_IFCR_CHTIF5 ((uint32_t)0x00040000) /*!< Channel 5 Half Transfer clear */ -#define DMA_IFCR_CTEIF5 ((uint32_t)0x00080000) /*!< Channel 5 Transfer Error clear */ -#define DMA_IFCR_CGIF6 ((uint32_t)0x00100000) /*!< Channel 6 Global interrupt clear */ -#define DMA_IFCR_CTCIF6 ((uint32_t)0x00200000) /*!< Channel 6 Transfer Complete clear */ -#define DMA_IFCR_CHTIF6 ((uint32_t)0x00400000) /*!< Channel 6 Half Transfer clear */ -#define DMA_IFCR_CTEIF6 ((uint32_t)0x00800000) /*!< Channel 6 Transfer Error clear */ -#define DMA_IFCR_CGIF7 ((uint32_t)0x01000000) /*!< Channel 7 Global interrupt clear */ -#define DMA_IFCR_CTCIF7 ((uint32_t)0x02000000) /*!< Channel 7 Transfer Complete clear */ -#define DMA_IFCR_CHTIF7 ((uint32_t)0x04000000) /*!< Channel 7 Half Transfer clear */ -#define DMA_IFCR_CTEIF7 ((uint32_t)0x08000000) /*!< Channel 7 Transfer Error clear */ - -/******************* Bit definition for DMA_CCR1 register *******************/ -#define DMA_CCR1_EN ((uint16_t)0x0001) /*!< Channel enable*/ -#define DMA_CCR1_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR1_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR1_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR1_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR1_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR1_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR1_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR1_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR1_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR1_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR1_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR1_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR1_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR1_PL ((uint16_t)0x3000) /*!< PL[1:0] bits(Channel Priority level) */ -#define DMA_CCR1_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR1_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR1_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ - -/******************* Bit definition for DMA_CCR2 register *******************/ -#define DMA_CCR2_EN ((uint16_t)0x0001) /*!< Channel enable */ -#define DMA_CCR2_TCIE ((uint16_t)0x0002) /*!< ransfer complete interrupt enable */ -#define DMA_CCR2_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR2_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR2_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR2_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR2_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR2_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR2_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR2_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR2_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR2_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR2_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR2_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR2_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ -#define DMA_CCR2_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR2_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR2_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ - -/******************* Bit definition for DMA_CCR3 register *******************/ -#define DMA_CCR3_EN ((uint16_t)0x0001) /*!< Channel enable */ -#define DMA_CCR3_TCIE ((uint16_t)0x0002) /*!< Transfer complete interrupt enable */ -#define DMA_CCR3_HTIE ((uint16_t)0x0004) /*!< Half Transfer interrupt enable */ -#define DMA_CCR3_TEIE ((uint16_t)0x0008) /*!< Transfer error interrupt enable */ -#define DMA_CCR3_DIR ((uint16_t)0x0010) /*!< Data transfer direction */ -#define DMA_CCR3_CIRC ((uint16_t)0x0020) /*!< Circular mode */ -#define DMA_CCR3_PINC ((uint16_t)0x0040) /*!< Peripheral increment mode */ -#define DMA_CCR3_MINC ((uint16_t)0x0080) /*!< Memory increment mode */ - -#define DMA_CCR3_PSIZE ((uint16_t)0x0300) /*!< PSIZE[1:0] bits (Peripheral size) */ -#define DMA_CCR3_PSIZE_0 ((uint16_t)0x0100) /*!< Bit 0 */ -#define DMA_CCR3_PSIZE_1 ((uint16_t)0x0200) /*!< Bit 1 */ - -#define DMA_CCR3_MSIZE ((uint16_t)0x0C00) /*!< MSIZE[1:0] bits (Memory size) */ -#define DMA_CCR3_MSIZE_0 ((uint16_t)0x0400) /*!< Bit 0 */ -#define DMA_CCR3_MSIZE_1 ((uint16_t)0x0800) /*!< Bit 1 */ - -#define DMA_CCR3_PL ((uint16_t)0x3000) /*!< PL[1:0] bits (Channel Priority level) */ -#define DMA_CCR3_PL_0 ((uint16_t)0x1000) /*!< Bit 0 */ -#define DMA_CCR3_PL_1 ((uint16_t)0x2000) /*!< Bit 1 */ - -#define DMA_CCR3_MEM2MEM ((uint16_t)0x4000) /*!< Memory to memory mode */ - -/*!<****************** Bit definition for DMA_CCR4 register *******************/ -#define DMA_CCR4_EN ((uint16_t)0x0001) /*!
© COPYRIGHT 2010 STMicroelectronics
- ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f10x_system - * @{ - */ - -/** @addtogroup STM32F10x_System_Private_Includes - * @{ - */ - -#include "stm32f10x.h" - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_Defines - * @{ - */ - -/*!< Uncomment the line corresponding to the desired System clock (SYSCLK) - frequency (after reset the HSI is used as SYSCLK source) - - IMPORTANT NOTE: - ============== - 1. After each device reset the HSI is used as System clock source. - - 2. Please make sure that the selected System clock doesn't exceed your device's - maximum frequency. - - 3. If none of the define below is enabled, the HSI is used as System clock - source. - - 4. The System clock configuration functions provided within this file assume that: - - For Low and Medium density Value line devices an external 8MHz crystal - is used to drive the System clock. - - For Low, Medium and High density devices an external 8MHz crystal is - used to drive the System clock. - - For Connectivity line devices an external 25MHz crystal is used to drive - the System clock. - If you are using different crystal you have to adapt those functions accordingly. - */ - -#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) -/* #define SYSCLK_FREQ_HSE HSE_Value */ - #define SYSCLK_FREQ_24MHz 24000000 -#else -/* #define SYSCLK_FREQ_HSE HSE_Value */ -/* #define SYSCLK_FREQ_24MHz 24000000 */ -/* #define SYSCLK_FREQ_36MHz 36000000 */ -/* #define SYSCLK_FREQ_48MHz 48000000 */ -/* #define SYSCLK_FREQ_56MHz 56000000 */ -#define SYSCLK_FREQ_72MHz 72000000 -#endif - -/*!< Uncomment the following line if you need to use external SRAM mounted - on STM3210E-EVAL board (STM32 High density devices) as data memory */ -#ifdef STM32F10X_HD -/* #define DATA_IN_ExtSRAM */ -#endif /* STM32F10X_HD */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_Variables - * @{ - */ - -/******************************************************************************* -* Clock Definitions -*******************************************************************************/ -#ifdef SYSCLK_FREQ_HSE - uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_24MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_36MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_48MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_56MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */ -#elif defined SYSCLK_FREQ_72MHz - uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */ -#else /*!< HSI Selected as System Clock source */ - uint32_t SystemCoreClock = HSI_Value; /*!< System Clock Frequency (Core Clock) */ -#endif - -__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_FunctionPrototypes - * @{ - */ - -static void SetSysClock(void); - -#ifdef SYSCLK_FREQ_HSE - static void SetSysClockToHSE(void); -#elif defined SYSCLK_FREQ_24MHz - static void SetSysClockTo24(void); -#elif defined SYSCLK_FREQ_36MHz - static void SetSysClockTo36(void); -#elif defined SYSCLK_FREQ_48MHz - static void SetSysClockTo48(void); -#elif defined SYSCLK_FREQ_56MHz - static void SetSysClockTo56(void); -#elif defined SYSCLK_FREQ_72MHz - static void SetSysClockTo72(void); -#endif - -#ifdef DATA_IN_ExtSRAM - static void SystemInit_ExtMemCtl(void); -#endif /* DATA_IN_ExtSRAM */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemCoreClock variable. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -void SystemInit (void) -{ - /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ -#ifndef STM32F10X_CL - RCC->CFGR &= (uint32_t)0xF8FF0000; -#else - RCC->CFGR &= (uint32_t)0xF0FF0000; -#endif /* STM32F10X_CL */ - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ - RCC->CFGR &= (uint32_t)0xFF80FFFF; - -#ifdef STM32F10X_CL - /* Reset PLL2ON and PLL3ON bits */ - RCC->CR &= (uint32_t)0xEBFFFFFF; - - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x00FF0000; - - /* Reset CFGR2 register */ - RCC->CFGR2 = 0x00000000; -#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x009F0000; - - /* Reset CFGR2 register */ - RCC->CFGR2 = 0x00000000; -#else - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x009F0000; -#endif /* STM32F10X_CL */ - - /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */ - /* Configure the Flash Latency cycles and enable prefetch buffer */ - SetSysClock(); - -#ifdef STM32F10X_HD - #ifdef DATA_IN_ExtSRAM - SystemInit_ExtMemCtl(); - #endif /* DATA_IN_ExtSRAM */ -#endif /* STM32F10X_HD */ - -} - -/** - * @brief Update SystemCoreClock according to Clock Register Values - * @note None - * @param None - * @retval None - */ -void SystemCoreClockUpdate (void) -{ - uint32_t tmp = 0, pllmull = 0, pllsource = 0; - -#ifdef STM32F10X_CL - uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0; -#endif /* STM32F10X_CL */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - uint32_t prediv1factor = 0; -#endif /* STM32F10X_LD_VL or STM32F10X_MD_VL */ - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock */ - SystemCoreClock = HSI_Value; - break; - case 0x04: /* HSE used as system clock */ - SystemCoreClock = HSE_Value; - break; - case 0x08: /* PLL used as system clock */ - - /* Get PLL clock source and multiplication factor ----------------------*/ - pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; - pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; - -#ifndef STM32F10X_CL - pllmull = ( pllmull >> 18) + 2; - - if (pllsource == 0x00) - { - /* HSI oscillator clock divided by 2 selected as PLL clock entry */ - SystemCoreClock = (HSI_Value >> 1) * pllmull; - } - else - { - #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; - /* HSE oscillator clock selected as PREDIV1 clock entry */ - SystemCoreClock = (HSE_Value / prediv1factor) * pllmull; - #else - /* HSE selected as PLL clock entry */ - if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET) - {/* HSE oscillator clock divided by 2 */ - SystemCoreClock = (HSE_Value >> 1) * pllmull; - } - else - { - SystemCoreClock = HSE_Value * pllmull; - } - #endif - } -#else - pllmull = pllmull >> 18; - - if (pllmull != 0x0D) - { - pllmull += 2; - } - else - { /* PLL multiplication factor = PLL input clock * 6.5 */ - pllmull = 13 / 2; - } - - if (pllsource == 0x00) - { - /* HSI oscillator clock divided by 2 selected as PLL clock entry */ - SystemCoreClock = (HSI_Value >> 1) * pllmull; - } - else - {/* PREDIV1 selected as PLL clock entry */ - - /* Get PREDIV1 clock source and division factor */ - prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC; - prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1; - - if (prediv1source == 0) - { - /* HSE oscillator clock selected as PREDIV1 clock entry */ - SystemCoreClock = (HSE_Value / prediv1factor) * pllmull; - } - else - {/* PLL2 clock selected as PREDIV1 clock entry */ - - /* Get PREDIV2 division factor and PLL2 multiplication factor */ - prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4) + 1; - pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8 ) + 2; - SystemCoreClock = (((HSE_Value / prediv2factor) * pll2mull) / prediv1factor) * pllmull; - } - } -#endif /* STM32F10X_CL */ - break; - - default: - SystemCoreClock = HSI_Value; - break; - } - - /* Compute HCLK clock frequency ----------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers. - * @param None - * @retval None - */ -static void SetSysClock(void) -{ -#ifdef SYSCLK_FREQ_HSE - SetSysClockToHSE(); -#elif defined SYSCLK_FREQ_24MHz - SetSysClockTo24(); -#elif defined SYSCLK_FREQ_36MHz - SetSysClockTo36(); -#elif defined SYSCLK_FREQ_48MHz - SetSysClockTo48(); -#elif defined SYSCLK_FREQ_56MHz - SetSysClockTo56(); -#elif defined SYSCLK_FREQ_72MHz - SetSysClockTo72(); -#endif - - /* If none of the define above is enabled, the HSI is used as System clock - source (default after reset) */ -} - -/** - * @brief Setup the external memory controller. Called in startup_stm32f10x.s - * before jump to __main - * @param None - * @retval None - */ -#ifdef DATA_IN_ExtSRAM -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f10x_xx.s/.c before jump to main. - * This function configures the external SRAM mounted on STM3210E-EVAL - * board (STM32 High density devices). This SRAM will be used as program - * data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ -/*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is - required, then adjust the Register Addresses */ - - /* Enable FSMC clock */ - RCC->AHBENR = 0x00000114; - - /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ - RCC->APB2ENR = 0x000001E0; - -/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/ -/*---------------- SRAM Address lines configuration -------------------------*/ -/*---------------- NOE and NWE configuration --------------------------------*/ -/*---------------- NE3 configuration ----------------------------------------*/ -/*---------------- NBL0, NBL1 configuration ---------------------------------*/ - - GPIOD->CRL = 0x44BB44BB; - GPIOD->CRH = 0xBBBBBBBB; - - GPIOE->CRL = 0xB44444BB; - GPIOE->CRH = 0xBBBBBBBB; - - GPIOF->CRL = 0x44BBBBBB; - GPIOF->CRH = 0xBBBB4444; - - GPIOG->CRL = 0x44BBBBBB; - GPIOG->CRH = 0x44444B44; - -/*---------------- FSMC Configuration ---------------------------------------*/ -/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/ - - FSMC_Bank1->BTCR[4] = 0x00001011; - FSMC_Bank1->BTCR[5] = 0x00000200; -} -#endif /* DATA_IN_ExtSRAM */ - -#ifdef SYSCLK_FREQ_HSE -/** - * @brief Selects HSE as System clock source and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockToHSE(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - -#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 0 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - -#ifndef STM32F10X_CL - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; -#else - if (HSE_Value <= 24000000) - { - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; - } - else - { - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; - } -#endif /* STM32F10X_CL */ -#endif - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; - - /* Select HSE as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE; - - /* Wait till HSE is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} -#elif defined SYSCLK_FREQ_24MHz -/** - * @brief Sets System clock frequency to 24MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo24(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { -#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 0 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0; -#endif - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - /* PLL configuration: PLLCLK = PREDIV1 * 6 = 24 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL6); - - /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */ - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } -#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - /* PLL configuration: = (HSE / 2) * 6 = 24 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6); -#else - /* PLL configuration: = (HSE / 2) * 6 = 24 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL6); -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} -#elif defined SYSCLK_FREQ_36MHz -/** - * @brief Sets System clock frequency to 36MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo36(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 1 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - - /* PLL configuration: PLLCLK = PREDIV1 * 9 = 36 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL9); - - /*!< PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 10 = 4 MHz */ - - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV10); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } - -#else - /* PLL configuration: PLLCLK = (HSE / 2) * 9 = 36 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9); -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} -#elif defined SYSCLK_FREQ_48MHz -/** - * @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo48(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 1 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1; - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ - - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } - - - /* PLL configuration: PLLCLK = PREDIV1 * 6 = 48 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL6); -#else - /* PLL configuration: PLLCLK = HSE * 6 = 48 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} - -#elif defined SYSCLK_FREQ_56MHz -/** - * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo56(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 2 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ - - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } - - - /* PLL configuration: PLLCLK = PREDIV1 * 7 = 56 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL7); -#else - /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL7); - -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} - -#elif defined SYSCLK_FREQ_72MHz -/** - * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 - * and PCLK1 prescalers. - * @note This function should be used only after reset. - * @param None - * @retval None - */ -static void SetSysClockTo72(void) -{ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Enable Prefetch Buffer */ - FLASH->ACR |= FLASH_ACR_PRFTBE; - - /* Flash 2 wait state */ - FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); - FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; - - - /* HCLK = SYSCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; - - /* PCLK1 = HCLK */ - RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; - -#ifdef STM32F10X_CL - /* Configure PLLs ------------------------------------------------------*/ - /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ - /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ - - RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | - RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); - RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | - RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); - - /* Enable PLL2 */ - RCC->CR |= RCC_CR_PLL2ON; - /* Wait till PLL2 is ready */ - while((RCC->CR & RCC_CR_PLL2RDY) == 0) - { - } - - - /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ - RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | - RCC_CFGR_PLLMULL9); -#else - /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | - RCC_CFGR_PLLMULL)); - RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); -#endif /* STM32F10X_CL */ - - /* Enable PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Select PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; - - /* Wait till PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } -} -#endif - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h b/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h deleted file mode 100644 index 8bbd2cb1ff..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f10x.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Header File. - ****************************************************************************** - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f10x_system - * @{ - */ - -/** - * @brief Define to prevent recursive inclusion - */ -#ifndef __SYSTEM_STM32F10X_H -#define __SYSTEM_STM32F10X_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup STM32F10x_System_Includes - * @{ - */ - -/** - * @} - */ - - -/** @addtogroup STM32F10x_System_Exported_types - * @{ - */ - -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Exported_Constants - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F10x_System_Exported_Functions - * @{ - */ - -extern void SystemInit(void); -extern void SystemCoreClockUpdate(void); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__SYSTEM_STM32F10X_H */ - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/CMSIS/CMSIS debug support.htm b/bsp/stm32_radio/Libraries/CMSIS/CMSIS debug support.htm deleted file mode 100644 index efda685be6..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CMSIS debug support.htm +++ /dev/null @@ -1,243 +0,0 @@ - - - -CMSIS Debug Support - - - - - - - - -

CMSIS Debug Support

- -
- -

Cortex-M3 ITM Debug Access

-

- The Cortex-M3 incorporates the Instrumented Trace Macrocell (ITM) that provides together with - the Serial Viewer Output trace capabilities for the microcontroller system. The ITM has - 32 communication channels which are able to transmit 32 / 16 / 8 bit values; two ITM - communication channels are used by CMSIS to output the following information: -

-
    -
  • ITM Channel 0: used for printf-style output via the debug interface.
  • -
  • ITM Channel 31: is reserved for RTOS kernel awareness debugging.
  • -
- -

Debug IN / OUT functions

-

CMSIS provides following debug functions:

-
    -
  • ITM_SendChar (uses ITM channel 0)
  • -
  • ITM_ReceiveChar (uses global variable)
  • -
  • ITM_CheckChar (uses global variable)
  • -
- -

ITM_SendChar

-

- ITM_SendChar is used to transmit a character over ITM channel 0 from - the microcontroller system to the debug system.
- Only a 8 bit value is transmitted. -

-
-static __INLINE uint32_t ITM_SendChar (uint32_t ch)
-{
-  /* check if debugger connected and ITM channel enabled for tracing */
-  if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA)  &&
-      (ITM->TCR & ITM_TCR_ITMENA)                  &&
-      (ITM->TER & (1UL << 0))  ) 
-  {
-    while (ITM->PORT[0].u32 == 0);
-    ITM->PORT[0].u8 = (uint8_t)ch;
-  }  
-  return (ch);
-}
- -

ITM_ReceiveChar

-

- ITM communication channel is only capable for OUT direction. For IN direction - a globel variable is used. A simple mechansim detects if a character is received. - The project to test need to be build with debug information. -

- -

- The globale variable ITM_RxBuffer is used to transmit a 8 bit value from debug system - to microcontroller system. ITM_RxBuffer is 32 bit wide to enshure a proper handshake. -

-
-extern volatile int ITM_RxBuffer;                    /* variable to receive characters                             */
-
-

- A dedicated bit pattern is used to determin if ITM_RxBuffer is empty - or contains a valid value. -

-
-#define             ITM_RXBUFFER_EMPTY    0x5AA55AA5 /* value identifying ITM_RxBuffer is ready for next character */
-
-

- ITM_ReceiveChar is used to receive a 8 bit value from the debug system. The function is nonblocking. - It returns the received character or '-1' if no character was available. -

-
-static __INLINE int ITM_ReceiveChar (void) {
-  int ch = -1;                               /* no character available */
-
-  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) {
-    ch = ITM_RxBuffer;
-    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */
-  }
-  
-  return (ch); 
-}
-
- -

ITM_CheckChar

-

- ITM_CheckChar is used to check if a character is received. -

-
-static __INLINE int ITM_CheckChar (void) {
-
-  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) {
-    return (0);                                 /* no character available */
-  } else {
-    return (1);                                 /*    character available */
-  }
-}
- - -

ITM Debug Support in uVision

-

- uVision uses in a debug session the Debug (printf) Viewer window to - display the debug data. -

-

Direction microcontroller system -> uVision:

-
    -
  • - Characters received via ITM communication channel 0 are written in a printf style - to Debug (printf) Viewer window. -
  • -
- -

Direction uVision -> microcontroller system:

-
    -
  • Check if ITM_RxBuffer variable is available (only performed once).
  • -
  • Read character from Debug (printf) Viewer window.
  • -
  • If ITM_RxBuffer empty write character to ITM_RxBuffer.
  • -
- -

Note

-
    -
  • Current solution does not use a buffer machanism for trasmitting the characters.

    -
  • -
- -

RTX Kernel awareness in uVision

-

- uVision / RTX are using a simple and efficient solution for RTX Kernel awareness. - No format overhead is necessary.
- uVsion debugger decodes the RTX events via the 32 / 16 / 8 bit ITM write access - to ITM communication channel 31. -

- -

Following RTX events are traced:

-
    -
  • Task Create / Delete event -
      -
    1. 32 bit access. Task start address is transmitted
    2. -
    3. 16 bit access. Task ID and Create/Delete flag are transmitted
      - High byte holds Create/Delete flag, Low byte holds TASK ID. -
    4. -
    -
  • -
  • Task switch event -
      -
    1. 8 bit access. Task ID of current task is transmitted
    2. -
    -
  • -
- -

Note

-
    -
  • Other RTOS information could be retrieved via memory read access in a polling mode manner.

    -
  • -
- - -

 

- -
- -

Copyright © KEIL - An ARM Company.
-All rights reserved.
-Visit our web site at www.keil.com. -

- - - - \ No newline at end of file diff --git a/bsp/stm32_radio/Libraries/CMSIS/CMSIS_changes.htm b/bsp/stm32_radio/Libraries/CMSIS/CMSIS_changes.htm deleted file mode 100644 index 162ffcc9dc..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/CMSIS_changes.htm +++ /dev/null @@ -1,320 +0,0 @@ - - - -CMSIS Changes - - - - - - - - -

Changes to CMSIS version V1.20

- -
- -

1. Removed CMSIS Middelware packages

-

- CMSIS Middleware is on hold from ARM side until a agreement between all CMSIS partners is found. -

- -

2. SystemFrequency renamed to SystemCoreClock

-

- The variable name SystemCoreClock is more precise than SystemFrequency - because the variable holds the clock value at which the core is running. -

- -

3. Changed startup concept

-

- The old startup concept (calling SystemInit_ExtMemCtl from startup file and calling SystemInit - from main) has the weakness that it does not work for controllers which need a already - configuerd clock system to configure the external memory controller. -

- -

Changed startup concept

-
    -
  • - SystemInit() is called from startup file before premain. -
  • -
  • - SystemInit() configures the clock system and also configures - an existing external memory controller. -
  • -
  • - SystemInit() must not use global variables. -
  • -
  • - SystemCoreClock is initialized with a correct predefined value. -
  • -
  • - Additional function void SystemCoreClockUpdate (void) is provided.
    - SystemCoreClockUpdate() updates the variable SystemCoreClock - and must be called whenever the core clock is changed.
    - SystemCoreClockUpdate() evaluates the clock register settings and calculates - the current core clock. -
  • -
- - -

4. Advanced Debug Functions

-

- ITM communication channel is only capable for OUT direction. To allow also communication for - IN direction a simple concept is provided. -

-
    -
  • - Global variable volatile int ITM_RxBuffer used for IN data. -
  • -
  • - Function int ITM_CheckChar (void) checks if a new character is available. -
  • -
  • - Function int ITM_ReceiveChar (void) retrieves the new character. -
  • -
- -

- For detailed explanation see file CMSIS debug support.htm. -

- - -

5. Core Register Bit Definitions

-

- Files core_cm3.h and core_cm0.h contain now bit definitions for Core Registers. The name for the - defines correspond with the Cortex-M Technical Reference Manual. -

-

- e.g. SysTick structure with bit definitions -

-
-/** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTick
-  memory mapped structure for SysTick
-  @{
- */
-typedef struct
-{
-  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */
-  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
-  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */
-  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */
-} SysTick_Type;
-
-/* SysTick Control / Status Register Definitions */
-#define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */
-#define SysTick_CTRL_COUNTFLAG_Msk         (1ul << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */
-
-#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */
-#define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */
-
-#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */
-#define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */
-
-#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */
-#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */
-
-/* SysTick Reload Register Definitions */
-#define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */
-#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */
-
-/* SysTick Current Register Definitions */
-#define SysTick_VAL_CURRENT_Pos             0                                             /*!< SysTick VAL: CURRENT Position */
-#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFul << SysTick_VAL_CURRENT_Pos)        /*!< SysTick VAL: CURRENT Mask */
-
-/* SysTick Calibration Register Definitions */
-#define SysTick_CALIB_NOREF_Pos            31                                             /*!< SysTick CALIB: NOREF Position */
-#define SysTick_CALIB_NOREF_Msk            (1ul << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */
-
-#define SysTick_CALIB_SKEW_Pos             30                                             /*!< SysTick CALIB: SKEW Position */
-#define SysTick_CALIB_SKEW_Msk             (1ul << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */
-
-#define SysTick_CALIB_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */
-#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFul << SysTick_VAL_CURRENT_Pos)        /*!< SysTick CALIB: TENMS Mask */
-/*@}*/ /* end of group CMSIS_CM3_SysTick */
- -

7. DoxyGen Tags

-

- DoxyGen tags in files core_cm3.[c,h] and core_cm0.[c,h] are reworked to create proper documentation - using DoxyGen. -

- -

8. Folder Structure

-

- The folder structure is changed to differentiate the single support packages. -

- -
    -
  • CM0
  • -
  • CM3 -
      -
    • CoreSupport
    • -
    • DeviceSupport
    • -
        -
      • Vendor -
          -
        • Device -
            -
          • Startup -
              -
            • Toolchain
            • -
            • Toolchain
            • -
            • ...
            • -
            -
          • -
          -
        • -
        • Device
        • -
        • ...
        • -
        -
      • -
      • Vendor
      • -
      • ...
      • -
      - -
    • Example -
        -
      • Toolchain -
          -
        • Device
        • -
        • Device
        • -
        • ...
        • -
        -
      • -
      • Toolchain
      • -
      • ...
      • -
      -
    • -
    -
  • - -
  • Documentation
  • -
- -

9. Open Points

-

- Following points need to be clarified and solved: -

-
    -
  • -

    - Equivalent C and Assembler startup files. -

    -

    - Is there a need for having C startup files although assembler startup files are - very efficient and do not need to be changed? -

    -

  • -
  • -

    - Placing of HEAP in external RAM. -

    -

    - It must be possible to place HEAP in external RAM if the device supports an - external memory controller. -

    -
  • -
  • -

    - Placing of STACK /HEAP. -

    -

    - STACK should always be placed at the end of internal RAM. -

    -

    - If HEAP is placed in internal RAM than it should be placed after RW ZI section. -

    -
  • -
  • -

    - Removing core_cm3.c and core_cm0.c. -

    -

    - On a long term the functions in core_cm3.c and core_cm0.c must be replaced with - appropriate compiler intrinsics. -

    -
  • -
- - -

10. Limitations

-

- The following limitations are not covered with the current CMSIS version: -

-
    -
  • - No C startup files for ARM toolchain are provided. -
  • -
  • - No C startup files for GNU toolchain are provided. -
  • -
  • - No C startup files for IAR toolchain are provided. -
  • -
  • - No Tasking projects are provided yet. -
  • -
diff --git a/bsp/stm32_radio/Libraries/CMSIS/Documentation/CMSIS_Core.htm b/bsp/stm32_radio/Libraries/CMSIS/Documentation/CMSIS_Core.htm deleted file mode 100644 index 6fd131e125..0000000000 --- a/bsp/stm32_radio/Libraries/CMSIS/Documentation/CMSIS_Core.htm +++ /dev/null @@ -1,1337 +0,0 @@ - - - - CMSIS: Cortex Microcontroller Software Interface Standard - - - -

Cortex Microcontroller Software Interface Standard

- -

This file describes the Cortex Microcontroller Software Interface Standard (CMSIS).

-

Version: 1.30 - 30. October 2009

- -

Information in this file, the accompany manuals, and software is
- Copyright © ARM Ltd.
All rights reserved. -

- -
- -

Revision History

-
    -
  • Version 1.00: initial release.
  • -
  • Version 1.01: added __LDREXx, __STREXx, and __CLREX.
  • -
  • Version 1.02: added Cortex-M0.
  • -
  • Version 1.10: second review.
  • -
  • Version 1.20: third review.
  • -
  • Version 1.30 PRE-RELEASE: reworked Startup Concept, additional Debug Functionality.
  • -
  • Version 1.30 2nd PRE-RELEASE: changed folder structure, added doxyGen comments, added Bit definitions.
  • -
  • Version 1.30: updated Device Support Packages.
  • -
- -
- -

Contents

- -
    -
  1. About
  2. -
  3. Coding Rules and Conventions
  4. -
  5. CMSIS Files
  6. -
  7. Core Peripheral Access Layer
  8. -
  9. CMSIS Example
  10. -
- -

About

- -

- The Cortex Microcontroller Software Interface Standard (CMSIS) answers the challenges - that are faced when software components are deployed to physical microcontroller devices based on a - Cortex-M0 or Cortex-M3 processor. The CMSIS will be also expanded to future Cortex-M - processor cores (the term Cortex-M is used to indicate that). The CMSIS is defined in close co-operation - with various silicon and software vendors and provides a common approach to interface to peripherals, - real-time operating systems, and middleware components. -

- -

ARM provides as part of the CMSIS the following software layers that are -available for various compiler implementations:

-
    -
  • Core Peripheral Access Layer: contains name definitions, - address definitions and helper functions to - access core registers and peripherals. It defines also a device - independent interface for RTOS Kernels that includes debug channel - definitions.
  • -
- -

These software layers are expanded by Silicon partners with:

-
    -
  • Device Peripheral Access Layer: provides definitions - for all device peripherals
  • -
  • Access Functions for Peripherals (optional): provides - additional helper functions for peripherals
  • -
- -

CMSIS defines for a Cortex-M Microcontroller System:

-
    -
  • A common way to access peripheral registers - and a common way to define exception vectors.
  • -
  • The register names of the Core - Peripherals and the names of the Core - Exception Vectors.
  • -
  • An device independent interface for RTOS Kernels including a debug - channel.
  • -
- -

- By using CMSIS compliant software components, the user can easier re-use template code. - CMSIS is intended to enable the combination of software components from multiple middleware vendors. -

- -

Coding Rules and Conventions

- -

- The following section describes the coding rules and conventions used in the CMSIS - implementation. It contains also information about data types and version number information. -

- -

Essentials

-
    -
  • The CMSIS C code conforms to MISRA 2004 rules. In case of MISRA violations, - there are disable and enable sequences for PC-LINT inserted.
  • -
  • ANSI standard data types defined in the ANSI C header file - <stdint.h> are used.
  • -
  • #define constants that include expressions must be enclosed by - parenthesis.
  • -
  • Variables and parameters have a complete data type.
  • -
  • All functions in the Core Peripheral Access Layer are - re-entrant.
  • -
  • The Core Peripheral Access Layer has no blocking code - (which means that wait/query loops are done at other software layers).
  • -
  • For each exception/interrupt there is definition for: -
      -
    • an exception/interrupt handler with the postfix _Handler - (for exceptions) or _IRQHandler (for interrupts).
    • -
    • a default exception/interrupt handler (weak definition) that contains an endless loop.
    • -
    • a #define of the interrupt number with the postfix _IRQn.
    • -
  • -
- -

Recommendations

- -

The CMSIS recommends the following conventions for identifiers.

-
    -
  • CAPITAL names to identify Core Registers, Peripheral Registers, and CPU Instructions.
  • -
  • CamelCase names to identify peripherals access functions and interrupts.
  • -
  • PERIPHERAL_ prefix to identify functions that belong to specify peripherals.
  • -
  • Doxygen comments for all functions are included as described under Function Comments below.
  • -
- -Comments - -
    -
  • Comments use the ANSI C90 style (/* comment */) or C++ style - (// comment). It is assumed that the programming tools support today - consistently the C++ comment style.
  • -
  • Function Comments provide for each function the following information: -
      -
    • one-line brief function overview.
    • -
    • detailed parameter explanation.
    • -
    • detailed information about return values.
    • -
    • detailed description of the actual function.
    • -
    -

    Doxygen Example:

    -
    -/** 
    - * @brief  Enable Interrupt in NVIC Interrupt Controller
    - * @param  IRQn  interrupt number that specifies the interrupt
    - * @return none.
    - * Enable the specified interrupt in the NVIC Interrupt Controller.
    - * Other settings of the interrupt such as priority are not affected.
    - */
    -
  • -
- -

Data Types and IO Type Qualifiers

- -

- The Cortex-M HAL uses the standard types from the standard ANSI C header file - <stdint.h>. IO Type Qualifiers are used to specify the access - to peripheral variables. IO Type Qualifiers are indented to be used for automatic generation of - debug information of peripheral registers. -

- - - - - - - - - - - - - - - - - - - - - - - - -
IO Type Qualifier#defineDescription
__Ivolatile constRead access only
__OvolatileWrite access only
__IOvolatileRead and write access
- -

CMSIS Version Number

-

- File core_cm3.h contains the version number of the CMSIS with the following define: -

- -
-#define __CM3_CMSIS_VERSION_MAIN  (0x01)      /* [31:16] main version       */
-#define __CM3_CMSIS_VERSION_SUB   (0x30)      /* [15:0]  sub version        */
-#define __CM3_CMSIS_VERSION       ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB)
- -

- File core_cm0.h contains the version number of the CMSIS with the following define: -

- -
-#define __CM0_CMSIS_VERSION_MAIN  (0x01)      /* [31:16] main version       */
-#define __CM0_CMSIS_VERSION_SUB   (0x30)      /* [15:0]  sub version        */
-#define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16) | __CM0_CMSIS_VERSION_SUB)
- - -

CMSIS Cortex Core

-

- File core_cm3.h contains the type of the CMSIS Cortex-M with the following define: -

- -
-#define __CORTEX_M                (0x03)
- -

- File core_cm0.h contains the type of the CMSIS Cortex-M with the following define: -

- -
-#define __CORTEX_M                (0x00)
- - -

CMSIS Files

-

- This section describes the Files provided in context with the CMSIS to access the Cortex-M - hardware and peripherals. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileProviderDescription
device.hDevice specific (provided by silicon partner)Defines the peripherals for the actual device. The file may use - several other include files to define the peripherals of the actual device.
core_cm0.hARM (for RealView ARMCC, IAR, and GNU GCC)Defines the core peripherals for the Cortex-M0 CPU and core peripherals.
core_cm3.hARM (for RealView ARMCC, IAR, and GNU GCC)Defines the core peripherals for the Cortex-M3 CPU and core peripherals.
core_cm0.cARM (for RealView ARMCC, IAR, and GNU GCC)Provides helper functions that access core registers.
core_cm3.cARM (for RealView ARMCC, IAR, and GNU GCC)Provides helper functions that access core registers.
startup_deviceARM (adapted by compiler partner / silicon partner)Provides the Cortex-M startup code and the complete (device specific) Interrupt Vector Table
system_deviceARM (adapted by silicon partner)Provides a device specific configuration file for the device. It configures the device initializes - typically the oscillator (PLL) that is part of the microcontroller device
- -

device.h

- -

- The file device.h is provided by the silicon vendor and is the - central include file that the application programmer is using in - the C source code. This file contains: -

-
    -
  • -

    Interrupt Number Definition: provides interrupt numbers - (IRQn) for all core and device specific exceptions and interrupts.

    -
  • -
  • -

    Configuration for core_cm0.h / core_cm3.h: reflects the - actual configuration of the Cortex-M processor that is part of the actual - device. As such the file core_cm0.h / core_cm3.h is included that - implements access to processor registers and core peripherals.

    -
  • -
  • -

    Device Peripheral Access Layer: provides definitions - for all device peripherals. It contains all data structures and the address - mapping for the device specific peripherals.

    -
  • -
  • Access Functions for Peripherals (optional): provides - additional helper functions for peripherals that are useful for programming - of these peripherals. Access Functions may be provided as inline functions - or can be extern references to a device specific library provided by the - silicon vendor.
  • -
- - -

Interrupt Number Definition

- -

To access the device specific interrupts the device.h file defines IRQn -numbers for the complete device using a enum typedef as shown below:

-
-typedef enum IRQn
-{
-/******  Cortex-M3 Processor Exceptions/Interrupt Numbers ************************************************/
-  NonMaskableInt_IRQn             = -14,      /*!< 2 Non Maskable Interrupt                              */
-  HardFault_IRQn                  = -13,      /*!< 3 Cortex-M3 Hard Fault Interrupt                      */
-  MemoryManagement_IRQn           = -12,      /*!< 4 Cortex-M3 Memory Management Interrupt               */
-  BusFault_IRQn                   = -11,      /*!< 5 Cortex-M3 Bus Fault Interrupt                       */
-  UsageFault_IRQn                 = -10,      /*!< 6 Cortex-M3 Usage Fault Interrupt                     */
-  SVCall_IRQn                     = -5,       /*!< 11 Cortex-M3 SV Call Interrupt                        */
-  DebugMonitor_IRQn               = -4,       /*!< 12 Cortex-M3 Debug Monitor Interrupt                  */
-  PendSV_IRQn                     = -2,       /*!< 14 Cortex-M3 Pend SV Interrupt                        */
-  SysTick_IRQn                    = -1,       /*!< 15 Cortex-M3 System Tick Interrupt                    */
-/******  STM32 specific Interrupt Numbers ****************************************************************/
-  WWDG_STM_IRQn                   = 0,        /*!< Window WatchDog Interrupt                             */
-  PVD_STM_IRQn                    = 1,        /*!< PVD through EXTI Line detection Interrupt             */
-  :
-  :
-  } IRQn_Type;
- - -

Configuration for core_cm0.h / core_cm3.h

-

- The Cortex-M core configuration options which are defined for each device implementation. Some - configuration options are reflected in the CMSIS layer using the #define settings described below. -

-

- To access core peripherals file device.h includes file core_cm0.h / core_cm3.h. - Several features in core_cm0.h / core_cm3.h are configured by the following defines that must be - defined before #include <core_cm0.h> / #include <core_cm3.h> - preprocessor command. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#defineFileValueDescription
__NVIC_PRIO_BITScore_cm0.h(2)Number of priority bits implemented in the NVIC (device specific)
__NVIC_PRIO_BITScore_cm3.h(2 ... 8)Number of priority bits implemented in the NVIC (device specific)
__MPU_PRESENTcore_cm0.h, core_cm3.h(0, 1)Defines if an MPU is present or not
__Vendor_SysTickConfigcore_cm0.h, core_cm3.h(1)When this define is setup to 1, the SysTickConfig function - in core_cm3.h is excluded. In this case the device.h - file must contain a vendor specific implementation of this function.
- - -

Device Peripheral Access Layer

-

- Each peripheral uses a prefix which consists of <device abbreviation>_ - and <peripheral name>_ to identify peripheral registers that access this - specific peripheral. The intention of this is to avoid name collisions caused - due to short names. If more than one peripheral of the same type exists, - identifiers have a postfix (digit or letter). For example: -

-
    -
  • <device abbreviation>_UART_Type: defines the generic register layout for all UART channels in a device. -
    -typedef struct
    -{
    -  union {
    -  __I  uint8_t  RBR;                     /*!< Offset: 0x000   Receiver Buffer Register    */
    -  __O  uint8_t  THR;                     /*!< Offset: 0x000   Transmit Holding Register   */
    -  __IO uint8_t  DLL;                     /*!< Offset: 0x000   Divisor Latch LSB           */
    -       uint32_t RESERVED0;
    -  };
    -  union {
    -  __IO uint8_t  DLM;                     /*!< Offset: 0x004   Divisor Latch MSB           */
    -  __IO uint32_t IER;                     /*!< Offset: 0x004   Interrupt Enable Register   */
    -  };
    -  union {
    -  __I  uint32_t IIR;                     /*!< Offset: 0x008   Interrupt ID Register       */
    -  __O  uint8_t  FCR;                     /*!< Offset: 0x008   FIFO Control Register       */
    -  };
    -  __IO uint8_t  LCR;                     /*!< Offset: 0x00C   Line Control Register       */
    -       uint8_t  RESERVED1[7];
    -  __I  uint8_t  LSR;                     /*!< Offset: 0x014   Line Status Register        */
    -       uint8_t  RESERVED2[7];
    -  __IO uint8_t  SCR;                     /*!< Offset: 0x01C   Scratch Pad Register        */
    -       uint8_t  RESERVED3[3];
    -  __IO uint32_t ACR;                     /*!< Offset: 0x020   Autobaud Control Register   */
    -  __IO uint8_t  ICR;                     /*!< Offset: 0x024   IrDA Control Register       */
    -       uint8_t  RESERVED4[3];
    -  __IO uint8_t  FDR;                     /*!< Offset: 0x028   Fractional Divider Register */
    -       uint8_t  RESERVED5[7];
    -  __IO uint8_t  TER;                     /*!< Offset: 0x030   Transmit Enable Register    */
    -       uint8_t  RESERVED6[39];
    -  __I  uint8_t  FIFOLVL;                 /*!< Offset: 0x058   FIFO Level Register         */
    -} LPC_UART_TypeDef;
    -
  • -
  • <device abbreviation>_UART1: is a pointer to a register structure that refers to a specific UART. - For example UART1->DR is the data register of UART1. -
    -#define LPC_UART2             ((LPC_UART_TypeDef      *) LPC_UART2_BASE    )
    -#define LPC_UART3             ((LPC_UART_TypeDef      *) LPC_UART3_BASE    )
    -
  • -
- -
Minimal Requiements
-

- To access the peripheral registers and related function in a device the files device.h - and core_cm0.h / core_cm3.h defines as a minimum: -

-
    -
  • The Register Layout Typedef for each peripheral that defines all register names. - Names that start with RESERVE are used to introduce space into the structure to adjust the addresses of - the peripheral registers. For example: -
    -typedef struct {
    -  __IO uint32_t CTRL;      /* SysTick Control and Status Register */
    -  __IO uint32_t LOAD;      /* SysTick Reload Value Register       */
    -  __IO uint32_t VAL;       /* SysTick Current Value Register      */
    -  __I  uint32_t CALIB;     /* SysTick Calibration Register        */
    -  } SysTick_Type;
    -
  • - -
  • - Base Address for each peripheral (in case of multiple peripherals - that use the same register layout typedef multiple base addresses are defined). For example: -
    -#define SysTick_BASE (SCS_BASE + 0x0010)            /* SysTick Base Address */
    -
  • - -
  • - Access Definition for each peripheral (in case of multiple peripherals that use - the same register layout typedef multiple access definitions exist, i.e. LPC_UART0, - LPC_UART2). For Example: -
    -#define SysTick ((SysTick_Type *) SysTick_BASE)     /* SysTick access definition */
    -
  • -
- -

- These definitions allow to access the peripheral registers from user code with simple assignments like: -

-
SysTick->CTRL = 0;
- -
Optional Features
-

In addition the device.h file may define:

-
    -
  • - #define constants that simplify access to the peripheral registers. - These constant define bit-positions or other specific patterns are that required for the - programming of the peripheral registers. The identifiers used start with - <device abbreviation>_ and <peripheral name>_. - It is recommended to use CAPITAL letters for such #define constants. -
  • -
  • - Functions that perform more complex functions with the peripheral (i.e. status query before - a sending register is accessed). Again these function start with - <device abbreviation>_ and <peripheral name>_. -
  • -
- -

core_cm0.h and core_cm0.c

-

- File core_cm0.h describes the data structures for the Cortex-M0 core peripherals and does - the address mapping of this structures. It also provides basic access to the Cortex-M0 core registers - and core peripherals with efficient functions (defined as static inline). -

-

- File core_cm0.c defines several helper functions that access processor registers. -

-

Together these files implement the Core Peripheral Access Layer for a Cortex-M0.

- -

core_cm3.h and core_cm3.c

-

- File core_cm3.h describes the data structures for the Cortex-M3 core peripherals and does - the address mapping of this structures. It also provides basic access to the Cortex-M3 core registers - and core peripherals with efficient functions (defined as static inline). -

-

- File core_cm3.c defines several helper functions that access processor registers. -

-

Together these files implement the Core Peripheral Access Layer for a Cortex-M3.

- -

startup_device

-

- A template file for startup_device is provided by ARM for each supported - compiler. It is adapted by the silicon vendor to include interrupt vectors for all device specific - interrupt handlers. Each interrupt handler is defined as weak function - to an dummy handler. Therefore the interrupt handler can be directly used in application software - without any requirements to adapt the startup_device file. -

-

- The following exception names are fixed and define the start of the vector table for a Cortex-M0: -

-
-__Vectors       DCD     __initial_sp              ; Top of Stack
-                DCD     Reset_Handler             ; Reset Handler
-                DCD     NMI_Handler               ; NMI Handler
-                DCD     HardFault_Handler         ; Hard Fault Handler
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     SVC_Handler               ; SVCall Handler
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     PendSV_Handler            ; PendSV Handler
-                DCD     SysTick_Handler           ; SysTick Handler
- -

- The following exception names are fixed and define the start of the vector table for a Cortex-M3: -

-
-__Vectors       DCD     __initial_sp              ; Top of Stack
-                DCD     Reset_Handler             ; Reset Handler
-                DCD     NMI_Handler               ; NMI Handler
-                DCD     HardFault_Handler         ; Hard Fault Handler
-                DCD     MemManage_Handler         ; MPU Fault Handler
-                DCD     BusFault_Handler          ; Bus Fault Handler
-                DCD     UsageFault_Handler        ; Usage Fault Handler
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     0                         ; Reserved
-                DCD     SVC_Handler               ; SVCall Handler
-                DCD     DebugMon_Handler          ; Debug Monitor Handler
-                DCD     0                         ; Reserved
-                DCD     PendSV_Handler            ; PendSV Handler
-                DCD     SysTick_Handler           ; SysTick Handler
- -

- In the following examples for device specific interrupts are shown: -

-
-; External Interrupts
-                DCD     WWDG_IRQHandler           ; Window Watchdog
-                DCD     PVD_IRQHandler            ; PVD through EXTI Line detect
-                DCD     TAMPER_IRQHandler         ; Tamper
- -

- Device specific interrupts must have a dummy function that can be overwritten in user code. - Below is an example for this dummy function. -

-
-Default_Handler PROC
-                EXPORT WWDG_IRQHandler   [WEAK]
-                EXPORT PVD_IRQHandler    [WEAK]
-                EXPORT TAMPER_IRQHandler [WEAK]
-                :
-                :
-                WWDG_IRQHandler
-                PVD_IRQHandler
-                TAMPER_IRQHandler
-                :
-                :
-                B .
-                ENDP
- -

- The user application may simply define an interrupt handler function by using the handler name - as shown below. -

-
-void WWDG_IRQHandler(void)
-{
-  :
-  :
-}
- - -

system_device.c

-

- A template file for system_device.c is provided by ARM but adapted by - the silicon vendor to match their actual device. As a minimum requirement - this file must provide a device specific system configuration function and a global variable - that contains the system frequency. It configures the device and initializes typically the - oscillator (PLL) that is part of the microcontroller device. -

-

- The file system_device.c must provide - as a minimum requirement the SystemInit function as shown below. -

- - - - - - - - - - - - - - - - -
Function DefinitionDescription
void SystemInit (void)Setup the microcontroller system. Typically this function configures the - oscillator (PLL) that is part of the microcontroller device. For systems - with variable clock speed it also updates the variable SystemCoreClock.
- SystemInit is called from startup_device file.
void SystemCoreClockUpdate (void)Updates the variable SystemCoreClock and must be called whenever the - core clock is changed during program execution. SystemCoreClockUpdate() - evaluates the clock register settings and calculates the current core clock. -
- -

- Also part of the file system_device.c - is the variable SystemCoreClock which contains the current CPU clock speed shown below. -

- - - - - - - - - - - - -
Variable DefinitionDescription
uint32_t SystemCoreClockContains the system core clock (which is the system clock frequency supplied - to the SysTick timer and the processor core clock). This variable can be - used by the user application to setup the SysTick timer or configure other - parameters. It may also be used by debugger to query the frequency of the - debug timer or configure the trace clock speed.
- SystemCoreClock is initialized with a correct predefined value.

- The compiler must be configured to avoid the removal of this variable in - case that the application program is not using it. It is important for - debug systems that the variable is physically present in memory so that - it can be examined to configure the debugger.
- -

Note

-
    -
  • The above definitions are the minimum requirements for the file - system_device.c. This - file may export more functions or variables that provide a more flexible - configuration of the microcontroller system.

    -
  • -
- - -

Core Peripheral Access Layer

- -

Cortex-M Core Register Access

-

- The following functions are defined in core_cm0.h / core_cm3.h - and provide access to Cortex-M core registers. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Function DefinitionCoreCore RegisterDescription
void __enable_irq (void)M0, M3PRIMASK = 0Global Interrupt enable (using the instruction CPSIE - i)
void __disable_irq (void)M0, M3PRIMASK = 1Global Interrupt disable (using the instruction - CPSID i)
void __set_PRIMASK (uint32_t value)M0, M3PRIMASK = valueAssign value to Priority Mask Register (using the instruction - MSR)
uint32_t __get_PRIMASK (void)M0, M3return PRIMASKReturn Priority Mask Register (using the instruction - MRS)
void __enable_fault_irq (void)M3FAULTMASK = 0Global Fault exception and Interrupt enable (using the - instruction CPSIE - f)
void __disable_fault_irq (void)M3FAULTMASK = 1Global Fault exception and Interrupt disable (using the - instruction CPSID f)
void __set_FAULTMASK (uint32_t value)M3FAULTMASK = valueAssign value to Fault Mask Register (using the instruction - MSR)
uint32_t __get_FAULTMASK (void)M3return FAULTMASKReturn Fault Mask Register (using the instruction MRS)
void __set_BASEPRI (uint32_t value)M3BASEPRI = valueSet Base Priority (using the instruction MSR)
uiuint32_t __get_BASEPRI (void)M3return BASEPRIReturn Base Priority (using the instruction MRS)
void __set_CONTROL (uint32_t value)M0, M3CONTROL = valueSet CONTROL register value (using the instruction MSR)
uint32_t __get_CONTROL (void)M0, M3return CONTROLReturn Control Register Value (using the instruction - MRS)
void __set_PSP (uint32_t TopOfProcStack)M0, M3PSP = TopOfProcStackSet Process Stack Pointer value (using the instruction - MSR)
uint32_t __get_PSP (void)M0, M3return PSPReturn Process Stack Pointer (using the instruction MRS)
void __set_MSP (uint32_t TopOfMainStack)M0, M3MSP = TopOfMainStackSet Main Stack Pointer (using the instruction MSR)
uint32_t __get_MSP (void)M0, M3return MSPReturn Main Stack Pointer (using the instruction MRS)
- -

Cortex-M Instruction Access

-

- The following functions are defined in core_cm0.h / core_cm3.hand - generate specific Cortex-M instructions. The functions are implemented in the file - core_cm0.c / core_cm3.c. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameCoreGenerated CPU InstructionDescription
void __NOP (void)M0, M3NOPNo Operation
void __WFI (void)M0, M3WFIWait for Interrupt
void __WFE (void)M0, M3WFEWait for Event
void __SEV (void)M0, M3SEVSet Event
void __ISB (void)M0, M3ISBInstruction Synchronization Barrier
void __DSB (void)M0, M3DSBData Synchronization Barrier
void __DMB (void)M0, M3DMBData Memory Barrier
uint32_t __REV (uint32_t value)M0, M3REVReverse byte order in integer value.
uint32_t __REV16 (uint16_t value)M0, M3REV16Reverse byte order in unsigned short value.
sint32_t __REVSH (sint16_t value)M0, M3REVSHReverse byte order in signed short value with sign extension to integer.
uint32_t __RBIT (uint32_t value)M3RBITReverse bit order of value
uint8_t __LDREXB (uint8_t *addr)M3LDREXBLoad exclusive byte
uint16_t __LDREXH (uint16_t *addr)M3LDREXHLoad exclusive half-word
uint32_t __LDREXW (uint32_t *addr)M3LDREXWLoad exclusive word
uint32_t __STREXB (uint8_t value, uint8_t *addr)M3STREXBStore exclusive byte
uint32_t __STREXB (uint16_t value, uint16_t *addr)M3STREXHStore exclusive half-word
uint32_t __STREXB (uint32_t value, uint32_t *addr)M3STREXWStore exclusive word
void __CLREX (void)M3CLREXRemove the exclusive lock created by __LDREXB, __LDREXH, or __LDREXW
- - -

NVIC Access Functions

-

- The CMSIS provides access to the NVIC via the register interface structure and several helper - functions that simplify the setup of the NVIC. The CMSIS HAL uses IRQ numbers (IRQn) to - identify the interrupts. The first device interrupt has the IRQn value 0. Therefore negative - IRQn values are used for processor core exceptions. -

-

- For the IRQn values of core exceptions the file device.h provides - the following enum names. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Core Exception enum ValueCoreIRQnDescription
NonMaskableInt_IRQnM0, M3-14Cortex-M Non Maskable Interrupt
HardFault_IRQnM0, M3-13Cortex-M Hard Fault Interrupt
MemoryManagement_IRQnM3-12Cortex-M Memory Management Interrupt
BusFault_IRQnM3-11Cortex-M Bus Fault Interrupt
UsageFault_IRQnM3-10Cortex-M Usage Fault Interrupt
SVCall_IRQnM0, M3-5Cortex-M SV Call Interrupt
DebugMonitor_IRQnM3-4Cortex-M Debug Monitor Interrupt
PendSV_IRQnM0, M3-2Cortex-M Pend SV Interrupt
SysTick_IRQnM0, M3-1Cortex-M System Tick Interrupt
- -

The following functions simplify the setup of the NVIC. -The functions are defined as static inline.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameCoreParameterDescription
void NVIC_SetPriorityGrouping (uint32_t PriorityGroup)M3Priority Grouping ValueSet the Priority Grouping (Groups . Subgroups)
uint32_t NVIC_GetPriorityGrouping (void)M3(void)Get the Priority Grouping (Groups . Subgroups)
void NVIC_EnableIRQ (IRQn_Type IRQn)M0, M3IRQ NumberEnable IRQn
void NVIC_DisableIRQ (IRQn_Type IRQn)M0, M3IRQ NumberDisable IRQn
uint32_t NVIC_GetPendingIRQ (IRQn_Type IRQn)M0, M3IRQ NumberReturn 1 if IRQn is pending else 0
void NVIC_SetPendingIRQ (IRQn_Type IRQn)M0, M3IRQ NumberSet IRQn Pending
void NVIC_ClearPendingIRQ (IRQn_Type IRQn)M0, M3IRQ NumberClear IRQn Pending Status
uint32_t NVIC_GetActive (IRQn_Type IRQn)M3IRQ NumberReturn 1 if IRQn is active else 0
void NVIC_SetPriority (IRQn_Type IRQn, uint32_t priority)M0, M3IRQ Number, PrioritySet Priority for IRQn
- (not threadsafe for Cortex-M0)
uint32_t NVIC_GetPriority (IRQn_Type IRQn)M0, M3IRQ NumberGet Priority for IRQn
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)M3IRQ Number, Priority Group, Preemptive Priority, Sub PriorityEncode priority for given group, preemptive and sub priority
NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority)M3IRQ Number, Priority, pointer to Priority Group, pointer to Preemptive Priority, pointer to Sub PriorityDeccode given priority to group, preemptive and sub priority
void NVIC_SystemReset (void)M0, M3(void)Resets the System
-

Note

-
    -
  • The processor exceptions have negative enum values. Device specific interrupts - have positive enum values and start with 0. The values are defined in - device.h file. -

    -
  • -
  • The values for PreemptPriority and SubPriority - used in functions NVIC_EncodePriority and NVIC_DecodePriority - depend on the available __NVIC_PRIO_BITS implemented in the NVIC. -

    -
  • -
- - -

SysTick Configuration Function

- -

The following function is used to configure the SysTick timer and start the -SysTick interrupt.

- - - - - - - - - - - - - - -
NameParameterDescription
uint32_t SysTickConfig - (uint32_t ticks)ticks is SysTick counter reload valueSetup the SysTick timer and enable the SysTick interrupt. After this - call the SysTick timer creates interrupts with the specified time - interval.
-
- Return: 0 when successful, 1 on failure.
-
- - -

Cortex-M3 ITM Debug Access

- -

The Cortex-M3 incorporates the Instrumented Trace Macrocell (ITM) that -provides together with the Serial Viewer Output trace capabilities for the -microcontroller system. The ITM has 32 communication channels; two ITM -communication channels are used by CMSIS to output the following information:

-
    -
  • ITM Channel 0: implements the ITM_SendChar function - which can be used for printf-style output via the debug interface.
  • -
  • ITM Channel 31: is reserved for the RTOS kernel and can be used for - kernel awareness debugging.
  • -
-

Note

-
    -
  • The ITM channel 31 is selected for the RTOS kernel since some kernels - may use the Privileged level for program execution. ITM - channels have 4 groups with 8 channels each, whereby each group can be - configured for access rights in the Unprivileged level. The ITM channel 0 - may be therefore enabled for the user task whereas ITM channel 31 may be - accessible only in Privileged level from the RTOS kernel itself.

    -
  • -
- -

The prototype of the ITM_SendChar routine is shown in the -table below.

- - - - - - - - - - - - - - -
NameParameterDescription
void uint32_t ITM_SendChar(uint32_t chr)character to outputThe function outputs a character via the ITM channel 0. The - function returns when no debugger is connected that has booked the - output. It is blocking when a debugger is connected, but the - previous character send is not transmitted.

- Return: the input character 'chr'.
- -

- Example for the usage of the ITM Channel 31 for RTOS Kernels: -

-
-  // check if debugger connected and ITM channel enabled for tracing
-  if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA) &&
-  (ITM->TCR & ITM_TCR_ITMENA) &&
-  (ITM->TER & (1UL << 31))) {
-    // transmit trace data
-    while (ITM->PORT31_U32 == 0);
-    ITM->PORT[31].u8 = task_id;      // id of next task
-    while (ITM->PORT[31].u32 == 0);
-    ITM->PORT[31].u32 = task_status; // status information
-  }
- - -

Cortex-M3 additional Debug Access

- -

CMSIS provides additional debug functions to enlarge the Cortex-M3 Debug Access. -Data can be transmitted via a certain global buffer variable towards the target system.

- -

The buffer variable and the prototypes of the additional functions are shown in the -table below.

- - - - - - - - - - - - - - - - - - - - - - - - -
NameParameterDescription
extern volatile int ITM_RxBuffer Buffer to transmit data towards debug system.

- Value 0x5AA55AA5 indicates that buffer is empty.
int ITM_ReceiveChar (void)noneThe nonblocking functions returns the character stored in - ITM_RxBuffer.

- Return: -1 indicates that no character was received.
int ITM_CheckChar (void)noneThe function checks if a character is available in ITM_RxBuffer.

- Return: 1 indicates that a character is available, 0 indicates that - no character is available.
- - -

CMSIS Example

-

- The following section shows a typical example for using the CMSIS layer in user applications. - The example is based on a STM32F10x Device. -

-
-#include "stm32f10x.h"
-
-volatile uint32_t msTicks;                       /* timeTicks counter */
-
-void SysTick_Handler(void) {
-  msTicks++;                                     /* increment timeTicks counter */
-}
-
-__INLINE static void Delay (uint32_t dlyTicks) {
-  uint32_t curTicks = msTicks;
-
-  while ((msTicks - curTicks) < dlyTicks);
-}
-
-__INLINE static void LED_Config(void) {
-  ;                                              /* Configure the LEDs */
-}
-
-__INLINE static void LED_On (uint32_t led) {
-  ;                                              /* Turn On  LED */
-}
-
-__INLINE static void LED_Off (uint32_t led) {
-  ;                                              /* Turn Off LED */
-}
-
-int main (void) {
-  if (SysTick_Config (SystemCoreClock / 1000)) { /* Setup SysTick for 1 msec interrupts */
-    ;                                            /* Handle Error */
-    while (1);
-  }
-  
-  LED_Config();                                  /* configure the LEDs */                            
- 
-  while(1) {
-    LED_On (0x100);                              /* Turn  on the LED   */
-    Delay (100);                                 /* delay  100 Msec    */
-    LED_Off (0x100);                             /* Turn off the LED   */
-    Delay (100);                                 /* delay  100 Msec    */
-  }
-}
- - - \ No newline at end of file diff --git a/bsp/stm32_radio/Libraries/CMSIS/License.doc b/bsp/stm32_radio/Libraries/CMSIS/License.doc deleted file mode 100644 index b6b8acecc137bca709444106cba045d3d01daedd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39936 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 diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/fsmc_nand.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/fsmc_nand.h deleted file mode 100644 index dc6ebb9fdb..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/fsmc_nand.h +++ /dev/null @@ -1,99 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : fsmc_nand.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Header for fsmc_nand.c file. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FSMC_NAND_H -#define __FSMC_NAND_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/* Exported types ------------------------------------------------------------*/ -typedef struct -{ - uint8_t Maker_ID; - uint8_t Device_ID; - uint8_t Third_ID; - uint8_t Fourth_ID; -}NAND_IDTypeDef; - -typedef struct -{ - uint16_t Zone; - uint16_t Block; - uint16_t Page; -} NAND_ADDRESS; - -/* Exported constants --------------------------------------------------------*/ -/* NAND Area definition for STM3210E-EVAL Board RevD */ -#define CMD_AREA (uint32_t)(1<<16) /* A16 = CLE high */ -#define ADDR_AREA (uint32_t)(1<<17) /* A17 = ALE high */ - -#define DATA_AREA ((uint32_t)0x00000000) - -/* FSMC NAND memory command */ -#define NAND_CMD_AREA_A ((uint8_t)0x00) -#define NAND_CMD_AREA_B ((uint8_t)0x01) -#define NAND_CMD_AREA_C ((uint8_t)0x50) -#define NAND_CMD_AREA_TRUE1 ((uint8_t)0x30) - -#define NAND_CMD_WRITE0 ((uint8_t)0x80) -#define NAND_CMD_WRITE_TRUE1 ((uint8_t)0x10) - -#define NAND_CMD_ERASE0 ((uint8_t)0x60) -#define NAND_CMD_ERASE1 ((uint8_t)0xD0) - -#define NAND_CMD_READID ((uint8_t)0x90) -#define NAND_CMD_STATUS ((uint8_t)0x70) -#define NAND_CMD_LOCK_STATUS ((uint8_t)0x7A) -#define NAND_CMD_RESET ((uint8_t)0xFF) - -/* NAND memory status */ -#define NAND_VALID_ADDRESS ((uint32_t)0x00000100) -#define NAND_INVALID_ADDRESS ((uint32_t)0x00000200) -#define NAND_TIMEOUT_ERROR ((uint32_t)0x00000400) -#define NAND_BUSY ((uint32_t)0x00000000) -#define NAND_ERROR ((uint32_t)0x00000001) -#define NAND_READY ((uint32_t)0x00000040) - -/* FSMC NAND memory parameters */ -#define NAND_PAGE_SIZE ((uint16_t)0x0200) /* 512 bytes per page w/o Spare Area */ -#define NAND_BLOCK_SIZE ((uint16_t)0x0020) /* 32x512 bytes pages per block */ -#define NAND_ZONE_SIZE ((uint16_t)0x0400) /* 1024 Block per zone */ -#define NAND_SPARE_AREA_SIZE ((uint16_t)0x0010) /* last 16 bytes as spare area */ -#define NAND_MAX_ZONE ((uint16_t)0x0004) /* 4 zones of 1024 block */ - -/* FSMC NAND memory address computation */ -#define ADDR_1st_CYCLE(ADDR) (uint8_t)((ADDR)& 0xFF) /* 1st addressing cycle */ -#define ADDR_2nd_CYCLE(ADDR) (uint8_t)(((ADDR)& 0xFF00) >> 8) /* 2nd addressing cycle */ -#define ADDR_3rd_CYCLE(ADDR) (uint8_t)(((ADDR)& 0xFF0000) >> 16) /* 3rd addressing cycle */ -#define ADDR_4th_CYCLE(ADDR) (uint8_t)(((ADDR)& 0xFF000000) >> 24) /* 4th addressing cycle */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void FSMC_NAND_Init(void); -void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID); -uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToWrite); -uint32_t FSMC_NAND_ReadSmallPage (uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToRead); -uint32_t FSMC_NAND_WriteSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaTowrite); -uint32_t FSMC_NAND_ReadSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaToRead); -uint32_t FSMC_NAND_EraseBlock(NAND_ADDRESS Address); -uint32_t FSMC_NAND_Reset(void); -uint32_t FSMC_NAND_GetStatus(void); -uint32_t FSMC_NAND_ReadStatus(void); -uint32_t FSMC_NAND_AddressIncrement(NAND_ADDRESS* Address); - -#endif /* __FSMC_NAND_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/hw_config.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/hw_config.h deleted file mode 100644 index fc63a69773..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/hw_config.h +++ /dev/null @@ -1,49 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : hw_config.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Hardware Configuration & Setup -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __HW_CONFIG_H -#define __HW_CONFIG_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -#include "platform_config.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported define -----------------------------------------------------------*/ -#define BULK_MAX_PACKET_SIZE 0x00000040 - -/* Exported functions ------------------------------------------------------- */ -void Set_System(void); -void Set_USBClock(void); -void Enter_LowPowerMode(void); -void Leave_LowPowerMode(void); -void USB_Interrupts_Config(void); -void Led_Config(void); -void Led_RW_ON(void); -void Led_RW_OFF(void); -void USB_Configured_LED(void); -void USB_NotConfigured_LED(void); -void USB_Cable_Config (FunctionalState NewState); -void Get_SerialNum(void); -void MAL_Config(void); -void USB_Disconnect_Config(void); -/* External variables --------------------------------------------------------*/ - -#endif /*__HW_CONFIG_H*/ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/mass_mal.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/mass_mal.h deleted file mode 100644 index 0de1d63107..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/mass_mal.h +++ /dev/null @@ -1,35 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : mass_mal.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Header for mass_mal.c file. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MASS_MAL_H -#define __MASS_MAL_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -#define MAL_OK 0 -#define MAL_FAIL 1 - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -uint16_t MAL_Init (uint8_t lun); -uint16_t MAL_GetStatus (uint8_t lun); -uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length); -uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length); -#endif /* __MASS_MAL_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/memory.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/memory.h deleted file mode 100644 index 508faa2467..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/memory.h +++ /dev/null @@ -1,33 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : memory.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Memory management layer -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __memory_H -#define __memory_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -#define TXFR_IDLE 0 -#define TXFR_ONGOING 1 - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length); -void Read_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length); -#endif /* __memory_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/nand_if.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/nand_if.h deleted file mode 100644 index d07eb51c16..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/nand_if.h +++ /dev/null @@ -1,67 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : nand_if.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : All functions related to the NAND process -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __NAND_IF_H -#define __NAND_IF_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -#define NAND_OK 0 -#define NAND_FAIL 1 - -#define FREE_BLOCK (1 << 12 ) -#define BAD_BLOCK (1 << 13 ) -#define VALID_BLOCK (1 << 14 ) -#define USED_BLOCK (1 << 15 ) - -#define MAX_PHY_BLOCKS_PER_ZONE 1024 -#define MAX_LOG_BLOCKS_PER_ZONE 1000 -/* Private Structures---------------------------------------------------------*/ -typedef struct __SPARE_AREA { - uint16_t LogicalIndex; - uint16_t DataStatus; - uint16_t BlockStatus; -} SPARE_AREA; - -typedef enum { - WRITE_IDLE = 0, - POST_WRITE, - PRE_WRITE, - WRITE_CLEANUP, - WRITE_ONGOING -}WRITE_STATE; - -typedef enum { - OLD_BLOCK = 0, - UNUSED_BLOCK -}BLOCK_STATE; - -/* Private macro --------------------------------------------------------------*/ -//#define WEAR_LEVELLING_SUPPORT -#define WEAR_DEPTH 10 -#define PAGE_TO_WRITE (Transfer_Length/512) -/* Private variables ----------------------------------------------------------*/ -/* Private function prototypes ------------------------------------------------*/ -/* exported functions ---------------------------------------------------------*/ -uint16_t NAND_Init (void); -uint16_t NAND_Write (uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length); -uint16_t NAND_Read (uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length); -uint16_t NAND_Format (void); -SPARE_AREA ReadSpareArea (uint32_t address); -#endif -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/platform_config.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/platform_config.h deleted file mode 100644 index 909289b91c..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/platform_config.h +++ /dev/null @@ -1,37 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : platform_config.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Evaluation board specific configuration file. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __PLATFORM_CONFIG_H -#define __PLATFORM_CONFIG_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -#define USB_DISCONNECT GPIOG -#define USB_DISCONNECT_PIN GPIO_Pin_7 -#define RCC_APB2Periph_GPIO_DISCONNECT RCC_APB2Periph_GPIOG - -/* use auto remove: 0-NO 1-YES */ -#define USB_USE_AUTO_REMOVE 1 - -/* use led: 0-NO 1-YES */ -#define USB_USE_LED 1 -#define USB_LED_PORT GPIOE -#define USB_LED_PIN GPIO_Pin_2 - -#endif /* __PLATFORM_CONFIG_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/stm32f10x_conf.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/stm32f10x_conf.h deleted file mode 100644 index fa2676c5a6..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/stm32f10x_conf.h +++ /dev/null @@ -1,72 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : stm32f10x_conf.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Library configuration file. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_CONF_H -#define __STM32F10x_CONF_H - -/* Includes ------------------------------------------------------------------*/ -/* Uncomment the line below to enable peripheral header file inclusion */ -/* #include "stm32f10x_adc.h" */ -/* #include "stm32f10x_bkp.h" */ -/* #include "stm32f10x_can.h" */ -/* #include "stm32f10x_crc.h" */ -/* #include "stm32f10x_dac.h" */ -/* #include "stm32f10x_dbgmcu.h" */ -#include "stm32f10x_dma.h" -#include "stm32f10x_exti.h" -#include "stm32f10x_flash.h" -#include "stm32f10x_fsmc.h" -#include "stm32f10x_gpio.h" -/* #include "stm32f10x_i2c.h" */ -/* #include "stm32f10x_iwdg.h" */ -/* #include "stm32f10x_pwr.h" */ -#include "stm32f10x_rcc.h" -/* #include "stm32f10x_rtc.h" */ -#include "stm32f10x_sdio.h" -#include "stm32f10x_spi.h" -/* #include "stm32f10x_tim.h" */ -#include "stm32f10x_usart.h" -/* #include "stm32f10x_wwdg.h" */ -#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Uncomment the line below to expanse the "assert_param" macro in the - Standard Peripheral Library drivers code */ -/* #define USE_FULL_ASSERT 1 */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT - -/******************************************************************************* -* Macro Name : assert_param -* Description : The assert_param macro is used for function's parameters check. -* Input : - expr: If expr is false, it calls assert_failed function -* which reports the name of the source file and the source -* line number of the call that failed. -* If expr is true, it returns no value. -* Return : None -*******************************************************************************/ - #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0) -#endif /* USE_FULL_ASSERT */ - -#endif /* __STM32F10x_CONF_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_bot.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_bot.h deleted file mode 100644 index 9c4affe0b3..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_bot.h +++ /dev/null @@ -1,87 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_bot.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : BOT State Machine management -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_BOT_H -#define __USB_BOT_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Bulk-only Command Block Wrapper */ - -typedef struct _Bulk_Only_CBW -{ - uint32_t dSignature; - uint32_t dTag; - uint32_t dDataLength; - uint8_t bmFlags; - uint8_t bLUN; - uint8_t bCBLength; - uint8_t CB[16]; -} -Bulk_Only_CBW; - -/* Bulk-only Command Status Wrapper */ -typedef struct _Bulk_Only_CSW -{ - uint32_t dSignature; - uint32_t dTag; - uint32_t dDataResidue; - uint8_t bStatus; -} -Bulk_Only_CSW; -/* Exported constants --------------------------------------------------------*/ - -/*****************************************************************************/ -/*********************** Bulk-Only Transfer State machine ********************/ -/*****************************************************************************/ -#define BOT_IDLE 0 /* Idle state */ -#define BOT_DATA_OUT 1 /* Data Out state */ -#define BOT_DATA_IN 2 /* Data In state */ -#define BOT_DATA_IN_LAST 3 /* Last Data In Last */ -#define BOT_CSW_Send 4 /* Command Status Wrapper */ -#define BOT_ERROR 5 /* error state */ - -#define BOT_CBW_SIGNATURE 0x43425355 -#define BOT_CSW_SIGNATURE 0x53425355 -#define BOT_CBW_PACKET_LENGTH 31 - -#define CSW_DATA_LENGTH 0x000D - -/* CSW Status Definitions */ -#define CSW_CMD_PASSED 0x00 -#define CSW_CMD_FAILED 0x01 -#define CSW_PHASE_ERROR 0x02 - -#define SEND_CSW_DISABLE 0 -#define SEND_CSW_ENABLE 1 - -#define DIR_IN 0 -#define DIR_OUT 1 -#define BOTH_DIR 2 - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void Mass_Storage_In (void); -void Mass_Storage_Out (void); -void CBW_Decode(void); -void Transfer_Data_Request(uint8_t* Data_Pointer, uint16_t Data_Len); -void Set_CSW (uint8_t CSW_Status, uint8_t Send_Permission); -void Bot_Abort(uint8_t Direction); - -#endif /* __USB_BOT_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_conf.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_conf.h deleted file mode 100644 index 97f63e300f..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_conf.h +++ /dev/null @@ -1,132 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_conf.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Mass Storage Demo configuration header -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CONF_H -#define __USB_CONF_H - -/*-------------------------------------------------------------*/ -/* EP_NUM */ -/* defines how many endpoints are used by the device */ -/*-------------------------------------------------------------*/ -#define EP_NUM (3) - -#ifndef STM32F10X_CL -/*-------------------------------------------------------------*/ -/* -------------- Buffer Description Table -----------------*/ -/*-------------------------------------------------------------*/ -/* buffer table base address */ - -#define BTABLE_ADDRESS (0x00) - -/* EP0 */ -/* rx/tx buffer base address */ -#define ENDP0_RXADDR (0x18) -#define ENDP0_TXADDR (0x58) - -/* EP1 */ -/* tx buffer base address */ -#define ENDP1_TXADDR (0x98) - -/* EP2 */ -/* Rx buffer base address */ -#define ENDP2_RXADDR (0xD8) - - -/* ISTR events */ -/* IMR_MSK */ -/* mask defining which events has to be handled */ -/* by the device application software */ -#define IMR_MSK (CNTR_CTRM | CNTR_RESETM) -#endif /* STM32F10X_CL */ - -/* CTR service routines */ -/* associated to defined endpoints */ -//#define EP1_IN_Callback NOP_Process -#define EP2_IN_Callback NOP_Process -#define EP3_IN_Callback NOP_Process -#define EP4_IN_Callback NOP_Process -#define EP5_IN_Callback NOP_Process -#define EP6_IN_Callback NOP_Process -#define EP7_IN_Callback NOP_Process - - -#define EP1_OUT_Callback NOP_Process -//#define EP2_OUT_Callback NOP_Process -#define EP3_OUT_Callback NOP_Process -#define EP4_OUT_Callback NOP_Process -#define EP5_OUT_Callback NOP_Process -#define EP6_OUT_Callback NOP_Process -#define EP7_OUT_Callback NOP_Process - -#ifdef STM32F10X_CL - -/* OTGD-FS-DEVICE IP interrupts Enable definitions */ -/* Uncomment the define to enable the selected interrupt */ -//#define INTR_MODEMISMATCH -#define INTR_SOFINTR -#define INTR_RXSTSQLVL /* Mandatory */ -//#define INTR_NPTXFEMPTY -//#define INTR_GINNAKEFF -//#define INTR_GOUTNAKEFF -//#define INTR_ERLYSUSPEND -#define INTR_USBSUSPEND /* Mandatory */ -#define INTR_USBRESET /* Mandatory */ -#define INTR_ENUMDONE /* Mandatory */ -//#define INTR_ISOOUTDROP -#define INTR_EOPFRAME -//#define INTR_EPMISMATCH -#define INTR_INEPINTR /* Mandatory */ -#define INTR_OUTEPINTR /* Mandatory */ -//#define INTR_INCOMPLISOIN -//#define INTR_INCOMPLISOOUT -#define INTR_WKUPINTR /* Mandatory */ - -/* OTGD-FS-DEVICE IP interrupts subroutines */ -/* Comment the define to enable the selected interrupt subroutine and replace it - by user code */ -#define INTR_MODEMISMATCH_Callback NOP_Process -#define INTR_SOFINTR_Callback NOP_Process -#define INTR_RXSTSQLVL_Callback NOP_Process -#define INTR_NPTXFEMPTY_Callback NOP_Process -#define INTR_NPTXFEMPTY_Callback NOP_Process -#define INTR_GINNAKEFF_Callback NOP_Process -#define INTR_GOUTNAKEFF_Callback NOP_Process -#define INTR_ERLYSUSPEND_Callback NOP_Process -#define INTR_USBSUSPEND_Callback NOP_Process -#define INTR_USBRESET_Callback NOP_Process -#define INTR_ENUMDONE_Callback NOP_Process -#define INTR_ISOOUTDROP_Callback NOP_Process -#define INTR_EOPFRAME_Callback NOP_Process -#define INTR_EPMISMATCH_Callback NOP_Process -#define INTR_INEPINTR_Callback NOP_Process -#define INTR_OUTEPINTR_Callback NOP_Process -#define INTR_INCOMPLISOIN_Callback NOP_Process -#define INTR_INCOMPLISOOUT_Callback NOP_Process -#define INTR_WKUPINTR_Callback NOP_Process - -/* Isochronous data update */ -#define INTR_RXSTSQLVL_ISODU_Callback NOP_Process - -/* Isochronous transfer parameters */ -/* Size of a single Isochronous buffer (size of a single transfer) */ -#define ISOC_BUFFER_SZE 1 -/* Number of sub-buffers (number of single buffers/transfers), should be even */ -#define NUM_SUB_BUFFERS 2 - -#endif /* STM32F10X_CL */ - -#endif /* __USB_CONF_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_desc.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_desc.h deleted file mode 100644 index bf331e8219..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_desc.h +++ /dev/null @@ -1,49 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_desc.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Descriptor Header for Mass Storage Device -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DESC_H -#define __USB_DESC_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported define -----------------------------------------------------------*/ -#define MASS_SIZ_DEVICE_DESC 18 -#define MASS_SIZ_CONFIG_DESC 32 - -#define MASS_SIZ_STRING_LANGID 4 -#define MASS_SIZ_STRING_VENDOR 38 -#define MASS_SIZ_STRING_PRODUCT 38 -#define MASS_SIZ_STRING_SERIAL 26 -#define MASS_SIZ_STRING_INTERFACE 16 - -/* Exported functions ------------------------------------------------------- */ -extern const uint8_t MASS_DeviceDescriptor[MASS_SIZ_DEVICE_DESC]; -extern const uint8_t MASS_ConfigDescriptor[MASS_SIZ_CONFIG_DESC]; - -extern const uint8_t MASS_StringLangID[MASS_SIZ_STRING_LANGID]; -extern const uint8_t MASS_StringVendor[MASS_SIZ_STRING_VENDOR]; -extern const uint8_t MASS_StringProduct[MASS_SIZ_STRING_PRODUCT]; -extern uint8_t MASS_StringSerial[MASS_SIZ_STRING_SERIAL]; -extern const uint8_t MASS_StringInterface[MASS_SIZ_STRING_INTERFACE]; - -#endif /* __USB_DESC_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - - diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_istr.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_istr.h deleted file mode 100644 index ef7db31383..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_istr.h +++ /dev/null @@ -1,121 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_istr.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : This file includes the peripherals header files in the -* user application. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_ISTR_H -#define __USB_ISTR_H - -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#ifndef STM32F10X_CL - void USB_Istr(void); -#else /* STM32F10X_CL */ - u32 STM32_PCD_OTG_ISR_Handler(void); -#endif /* STM32F10X_CL */ - -/* function prototypes Automatically built defining related macros */ - -void EP1_IN_Callback(void); -void EP2_IN_Callback(void); -void EP3_IN_Callback(void); -void EP4_IN_Callback(void); -void EP5_IN_Callback(void); -void EP6_IN_Callback(void); -void EP7_IN_Callback(void); - -void EP1_OUT_Callback(void); -void EP2_OUT_Callback(void); -void EP3_OUT_Callback(void); -void EP4_OUT_Callback(void); -void EP5_OUT_Callback(void); -void EP6_OUT_Callback(void); -void EP7_OUT_Callback(void); - -#ifndef STM32F10X_CL - -#ifdef CTR_CALLBACK -void CTR_Callback(void); -#endif - -#ifdef DOVR_CALLBACK -void DOVR_Callback(void); -#endif - -#ifdef ERR_CALLBACK -void ERR_Callback(void); -#endif - -#ifdef WKUP_CALLBACK -void WKUP_Callback(void); -#endif - -#ifdef SUSP_CALLBACK -void SUSP_Callback(void); -#endif - -#ifdef RESET_CALLBACK -void RESET_Callback(void); -#endif - -#ifdef SOF_CALLBACK -void SOF_Callback(void); -#endif - -#ifdef ESOF_CALLBACK -void ESOF_Callback(void); -#endif - -#else /* STM32F10X_CL */ - -/* Interrupt subroutines user callbacks prototypes. - These callbacks are called into the respective interrupt sunroutine functinos - and can be tailored for various user application purposes. - Note: Make sure that the correspondant interrupt is enabled through the - definition in usb_conf.h file */ -void INTR_MODEMISMATCH_Callback(void); -void INTR_SOFINTR_Callback(void); -void INTR_RXSTSQLVL_Callback(void); -void INTR_NPTXFEMPTY_Callback(void); -void INTR_GINNAKEFF_Callback(void); -void INTR_GOUTNAKEFF_Callback(void); -void INTR_ERLYSUSPEND_Callback(void); -void INTR_USBSUSPEND_Callback(void); -void INTR_USBRESET_Callback(void); -void INTR_ENUMDONE_Callback(void); -void INTR_ISOOUTDROP_Callback(void); -void INTR_EOPFRAME_Callback(void); -void INTR_EPMISMATCH_Callback(void); -void INTR_INEPINTR_Callback(void); -void INTR_OUTEPINTR_Callback(void); -void INTR_INCOMPLISOIN_Callback(void); -void INTR_INCOMPLISOOUT_Callback(void); -void INTR_WKUPINTR_Callback(void); - -/* Isochronous data update */ -void INTR_RXSTSQLVL_ISODU_Callback(void); - -#endif /* STM32F10X_CL */ - - -#endif /*__USB_ISTR_H*/ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_prop.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_prop.h deleted file mode 100644 index dad9f391ed..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_prop.h +++ /dev/null @@ -1,58 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_prop.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : All processing related to Mass Storage Demo (Endpoint 0) -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __usb_prop_H -#define __usb_prop_H -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ - -/* Exported constants --------------------------------------------------------*/ -#define Mass_Storage_GetConfiguration NOP_Process -/* #define Mass_Storage_SetConfiguration NOP_Process*/ -#define Mass_Storage_GetInterface NOP_Process -#define Mass_Storage_SetInterface NOP_Process -#define Mass_Storage_GetStatus NOP_Process -/* #define Mass_Storage_ClearFeature NOP_Process*/ -#define Mass_Storage_SetEndPointFeature NOP_Process -#define Mass_Storage_SetDeviceFeature NOP_Process -/*#define Mass_Storage_SetDeviceAddress NOP_Process*/ - -/* MASS Storage Requests*/ -#define GET_MAX_LUN 0xFE -#define MASS_STORAGE_RESET 0xFF -#define LUN_DATA_LENGTH 1 - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void MASS_init(void); -void MASS_Reset(void); -void Mass_Storage_SetConfiguration(void); -void Mass_Storage_ClearFeature(void); -void Mass_Storage_SetDeviceAddress (void); -void MASS_Status_In (void); -void MASS_Status_Out (void); -RESULT MASS_Data_Setup(uint8_t); -RESULT MASS_NoData_Setup(uint8_t); -RESULT MASS_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting); -uint8_t *MASS_GetDeviceDescriptor(uint16_t ); -uint8_t *MASS_GetConfigDescriptor(uint16_t); -uint8_t *MASS_GetStringDescriptor(uint16_t); -uint8_t *Get_Max_Lun(uint16_t Length); - -#endif /* __usb_prop_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_pwr.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_pwr.h deleted file mode 100644 index 3bef34b921..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_pwr.h +++ /dev/null @@ -1,58 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_pwr.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Connection/disconnection & power management header -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_PWR_H -#define __USB_PWR_H -/* Includes ------------------------------------------------------------------*/ -#include "usb_core.h" -/* Exported types ------------------------------------------------------------*/ -typedef enum _RESUME_STATE -{ - RESUME_EXTERNAL, - RESUME_INTERNAL, - RESUME_LATER, - RESUME_WAIT, - RESUME_START, - RESUME_ON, - RESUME_OFF, - RESUME_ESOF -} RESUME_STATE; - -typedef enum _DEVICE_STATE -{ - UNCONNECTED, - ATTACHED, - POWERED, - SUSPENDED, - ADDRESSED, - CONFIGURED -} DEVICE_STATE; - -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void Suspend(void); -void Resume_Init(void); -void Resume(RESUME_STATE eResumeSetVal); -RESULT PowerOn(void); -RESULT PowerOff(void); - -/* External variables --------------------------------------------------------*/ -extern __IO uint32_t bDeviceState; /* USB device status */ -extern __IO bool fSuspendEnabled; /* true when suspend is possible */ - -#endif /*__USB_PWR_H*/ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_scsi.h b/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_scsi.h deleted file mode 100644 index e7a11198d8..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/inc/usb_scsi.h +++ /dev/null @@ -1,140 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_scsi.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : All processing related to the SCSI commands -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_SCSI_H -#define __USB_SCSI_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* SCSI Commands */ -#define SCSI_FORMAT_UNIT 0x04 -#define SCSI_INQUIRY 0x12 -#define SCSI_MODE_SELECT6 0x15 -#define SCSI_MODE_SELECT10 0x55 -#define SCSI_MODE_SENSE6 0x1A -#define SCSI_MODE_SENSE10 0x5A -#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1E -#define SCSI_READ6 0x08 -#define SCSI_READ10 0x28 -#define SCSI_READ12 0xA8 -#define SCSI_READ16 0x88 - -#define SCSI_READ_CAPACITY10 0x25 -#define SCSI_READ_CAPACITY16 0x9E - -#define SCSI_REQUEST_SENSE 0x03 -#define SCSI_START_STOP_UNIT 0x1B -#define SCSI_TEST_UNIT_READY 0x00 -#define SCSI_WRITE6 0x0A -#define SCSI_WRITE10 0x2A -#define SCSI_WRITE12 0xAA -#define SCSI_WRITE16 0x8A - -#define SCSI_VERIFY10 0x2F -#define SCSI_VERIFY12 0xAF -#define SCSI_VERIFY16 0x8F - -#define SCSI_SEND_DIAGNOSTIC 0x1D -#define SCSI_READ_FORMAT_CAPACITIES 0x23 - -#define NO_SENSE 0 -#define RECOVERED_ERROR 1 -#define NOT_READY 2 -#define MEDIUM_ERROR 3 -#define HARDWARE_ERROR 4 -#define ILLEGAL_REQUEST 5 -#define UNIT_ATTENTION 6 -#define DATA_PROTECT 7 -#define BLANK_CHECK 8 -#define VENDOR_SPECIFIC 9 -#define COPY_ABORTED 10 -#define ABORTED_COMMAND 11 -#define VOLUME_OVERFLOW 13 -#define MISCOMPARE 14 - - -#define INVALID_COMMAND 0x20 -#define INVALID_FIELED_IN_COMMAND 0x24 -#define PARAMETER_LIST_LENGTH_ERROR 0x1A -#define INVALID_FIELD_IN_PARAMETER_LIST 0x26 -#define ADDRESS_OUT_OF_RANGE 0x21 -#define MEDIUM_NOT_PRESENT 0x3A -#define MEDIUM_HAVE_CHANGED 0x28 - -#define READ_FORMAT_CAPACITY_DATA_LEN 0x0C -#define READ_CAPACITY10_DATA_LEN 0x08 -#define MODE_SENSE10_DATA_LEN 0x08 -#define MODE_SENSE6_DATA_LEN 0x04 -#define REQUEST_SENSE_DATA_LEN 0x12 -#define STANDARD_INQUIRY_DATA_LEN 0x24 -#define BLKVFY 0x04 - -extern uint8_t Page00_Inquiry_Data[]; -extern uint8_t Standard_Inquiry_Data1[]; -extern uint8_t Standard_Inquiry_Data2[]; -extern uint8_t Standard_Inquiry_Data3[]; -extern uint8_t Mode_Sense6_data[]; -extern uint8_t Mode_Sense10_data[]; -extern uint8_t Scsi_Sense_Data[]; -extern uint8_t ReadCapacity10_Data[]; -extern uint8_t ReadFormatCapacity_Data []; - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void SCSI_Inquiry_Cmd(uint8_t lun); -void SCSI_ReadFormatCapacity_Cmd(uint8_t lun); -void SCSI_ReadCapacity10_Cmd(uint8_t lun); -void SCSI_RequestSense_Cmd (uint8_t lun); -void SCSI_Start_Stop_Unit_Cmd(uint8_t lun); -void SCSI_ModeSense6_Cmd (uint8_t lun); -void SCSI_ModeSense10_Cmd (uint8_t lun); -void SCSI_Write10_Cmd(uint8_t lun , uint32_t LBA , uint32_t BlockNbr); -void SCSI_Read10_Cmd(uint8_t lun , uint32_t LBA , uint32_t BlockNbr); -void SCSI_Verify10_Cmd(uint8_t lun); - -void SCSI_Invalid_Cmd(uint8_t lun); -void SCSI_Valid_Cmd(uint8_t lun); -bool SCSI_Address_Management(uint8_t lun , uint8_t Cmd , uint32_t LBA , uint32_t BlockNbr); - -void Set_Scsi_Sense_Data(uint8_t lun , uint8_t Sens_Key, uint8_t Asc); -void SCSI_TestUnitReady_Cmd (uint8_t lun); -void SCSI_Format_Cmd (uint8_t lun); - -//#define SCSI_TestUnitReady_Cmd SCSI_Valid_Cmd -#define SCSI_Prevent_Removal_Cmd SCSI_Valid_Cmd - -/* Invalid (Unsupported) commands */ -#define SCSI_READ_CAPACITY16_Cmd SCSI_Invalid_Cmd -//#define SCSI_FormatUnit_Cmd SCSI_Invalid_Cmd -#define SCSI_Write6_Cmd SCSI_Invalid_Cmd -#define SCSI_Write16_Cmd SCSI_Invalid_Cmd -#define SCSI_Write12_Cmd SCSI_Invalid_Cmd -#define SCSI_Read6_Cmd SCSI_Invalid_Cmd -#define SCSI_Read12_Cmd SCSI_Invalid_Cmd -#define SCSI_Read16_Cmd SCSI_Invalid_Cmd -#define SCSI_Send_Diagnostic_Cmd SCSI_Invalid_Cmd -#define SCSI_Mode_Select6_Cmd SCSI_Invalid_Cmd -#define SCSI_Mode_Select10_Cmd SCSI_Invalid_Cmd -#define SCSI_Verify12_Cmd SCSI_Invalid_Cmd -#define SCSI_Verify16_Cmd SCSI_Invalid_Cmd - -#endif /* __USB_SCSI_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/fsmc_nand.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/fsmc_nand.c deleted file mode 100644 index 9bbe94dad7..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/fsmc_nand.c +++ /dev/null @@ -1,490 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : fsmc_nand.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : This file provides a set of functions needed to drive the -* NAND512W3A2 memory mounted on STM3210E-EVAL board. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -/* Includes ------------------------------------------------------------------*/ -#include "fsmc_nand.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -#define FSMC_Bank_NAND FSMC_Bank2_NAND -#define Bank_NAND_ADDR Bank2_NAND_ADDR -#define Bank2_NAND_ADDR ((uint32_t)0x70000000) - -/* Private macro -------------------------------------------------------------*/ -#define ROW_ADDRESS (Address.Page + (Address.Block + (Address.Zone * NAND_ZONE_SIZE)) * NAND_BLOCK_SIZE) - -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/******************************************************************************* -* Function Name : FSMC_NAND_Init -* Description : Configures the FSMC and GPIOs to interface with the NAND memory. -* This function must be called before any write/read operation -* on the NAND. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void FSMC_NAND_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - FSMC_NANDInitTypeDef FSMC_NANDInitStructure; - FSMC_NAND_PCCARDTimingInitTypeDef p; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | - RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE); - -/*-- GPIO Configuration ------------------------------------------------------*/ -/* CLE, ALE, D0->D3, NOE, NWE and NCE2 NAND pin configuration */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15 | - GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | - GPIO_Pin_7; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - - GPIO_Init(GPIOD, &GPIO_InitStructure); - -/* D4->D7 NAND pin configuration */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; - - GPIO_Init(GPIOE, &GPIO_InitStructure); - - -/* NWAIT NAND pin configuration */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; - - GPIO_Init(GPIOD, &GPIO_InitStructure); - -/* INT2 NAND pin configuration */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; - GPIO_Init(GPIOG, &GPIO_InitStructure); - - /*-- FSMC Configuration ------------------------------------------------------*/ - p.FSMC_SetupTime = 0x1; - p.FSMC_WaitSetupTime = 0x3; - p.FSMC_HoldSetupTime = 0x2; - p.FSMC_HiZSetupTime = 0x1; - - FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND; - FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable; - FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; - FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable; - FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_512Bytes; - FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00; - FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00; - FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p; - FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p; - - FSMC_NANDInit(&FSMC_NANDInitStructure); - - /* FSMC NAND Bank Cmd Test */ - FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_ReadID -* Description : Reads NAND memory's ID. -* Input : - NAND_ID: pointer to a NAND_IDTypeDef structure which will hold -* the Manufacturer and Device ID. -* Output : None -* Return : None -*******************************************************************************/ -void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID) -{ - uint32_t data = 0; - - /* Send Command to the command area */ - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = 0x90; - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00; - - /* Sequence to read ID from NAND flash */ - data = *(__IO uint32_t *)(Bank_NAND_ADDR | DATA_AREA); - - NAND_ID->Maker_ID = ADDR_1st_CYCLE (data); - NAND_ID->Device_ID = ADDR_2nd_CYCLE (data); - NAND_ID->Third_ID = ADDR_3rd_CYCLE (data); - NAND_ID->Fourth_ID = ADDR_4th_CYCLE (data); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_WriteSmallPage -* Description : This routine is for writing one or several 512 Bytes Page size. -* Input : - pBuffer: pointer on the Buffer containing data to be written -* - Address: First page address -* - NumPageToWrite: Number of page to write -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -* And the new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToWrite) -{ - uint32_t index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS; - uint32_t status = NAND_READY, size = 0x00; - - while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY)) - { - /* Page write command and address */ - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_A; - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0; - - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00; - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - - /* Calculate the size */ - size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten); - - /* Write data */ - for(; index < size; index++) - { - *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index]; - } - - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1; - - /* Check status for successful operation */ - status = FSMC_NAND_GetStatus(); - - if(status == NAND_READY) - { - numpagewritten++; - - NumPageToWrite--; - - /* Calculate Next small page Address */ - addressstatus = FSMC_NAND_AddressIncrement(&Address); - } - } - - return (status | addressstatus); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_ReadSmallPage -* Description : This routine is for sequential read from one or several -* 512 Bytes Page size. -* Input : - pBuffer: pointer on the Buffer to fill -* - Address: First page address -* - NumPageToRead: Number of page to read -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -* And the new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -uint32_t FSMC_NAND_ReadSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToRead) -{ - uint32_t index = 0x00, numpageread = 0x00, addressstatus = NAND_VALID_ADDRESS; - uint32_t status = NAND_READY, size = 0x00; - - while((NumPageToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS)) - { - /* Page Read command and page address */ - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_A; - - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00; - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_TRUE1; - - /* Calculate the size */ - size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpageread); - - /* Get Data into Buffer */ - for(; index < size; index++) - { - pBuffer[index]= *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA); - } - - numpageread++; - - NumPageToRead--; - - /* Calculate page address */ - addressstatus = FSMC_NAND_AddressIncrement(&Address); - } - - status = FSMC_NAND_GetStatus(); - - return (status | addressstatus); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_WriteSpareArea -* Description : This routine write the spare area information for the specified -* pages addresses. -* Input : - pBuffer: pointer on the Buffer containing data to be written -* - Address: First page address -* - NumSpareAreaTowrite: Number of Spare Area to write -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -* And the new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -uint32_t FSMC_NAND_WriteSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaTowrite) -{ - uint32_t index = 0x00, numsparesreawritten = 0x00, addressstatus = NAND_VALID_ADDRESS; - uint32_t status = NAND_READY, size = 0x00; - - while((NumSpareAreaTowrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY)) - { - /* Page write Spare area command and address */ - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_C; - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0; - - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00; - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - - /* Calculate the size */ - size = NAND_SPARE_AREA_SIZE + (NAND_SPARE_AREA_SIZE * numsparesreawritten); - - /* Write the data */ - for(; index < size; index++) - { - *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index]; - } - - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1; - - /* Check status for successful operation */ - status = FSMC_NAND_GetStatus(); - - if(status == NAND_READY) - { - numsparesreawritten++; - - NumSpareAreaTowrite--; - - /* Calculate Next page Address */ - addressstatus = FSMC_NAND_AddressIncrement(&Address); - } - } - - return (status | addressstatus); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_ReadSpareArea -* Description : This routine read the spare area information from the specified -* pages addresses. -* Input : - pBuffer: pointer on the Buffer to fill -* - Address: First page address -* - NumSpareAreaToRead: Number of Spare Area to read -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -* And the new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -uint32_t FSMC_NAND_ReadSpareArea(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumSpareAreaToRead) -{ - uint32_t numsparearearead = 0x00, index = 0x00, addressstatus = NAND_VALID_ADDRESS; - uint32_t status = NAND_READY, size = 0x00; - - while((NumSpareAreaToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS)) - { - /* Page Read command and page address */ - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_C; - - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00; - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_TRUE1; - - /* Data Read */ - size = NAND_SPARE_AREA_SIZE + (NAND_SPARE_AREA_SIZE * numsparearearead); - - /* Get Data into Buffer */ - for ( ;index < size; index++) - { - pBuffer[index] = *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA); - } - - numsparearearead++; - - NumSpareAreaToRead--; - - /* Calculate page address */ - addressstatus = FSMC_NAND_AddressIncrement(&Address); - } - - status = FSMC_NAND_GetStatus(); - - return (status | addressstatus); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_EraseBlock -* Description : This routine erase complete block from NAND FLASH -* Input : - Address: Any address into block to be erased -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -*******************************************************************************/ -uint32_t FSMC_NAND_EraseBlock(NAND_ADDRESS Address) -{ - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_ERASE0; - - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_ERASE1; - - return (FSMC_NAND_GetStatus()); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_Reset -* Description : This routine reset the NAND FLASH -* Input : None -* Output : None -* Return : NAND_READY -*******************************************************************************/ -uint32_t FSMC_NAND_Reset(void) -{ - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_RESET; - - return (NAND_READY); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_GetStatus -* Description : Get the NAND operation status -* Input : None -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -*******************************************************************************/ -uint32_t FSMC_NAND_GetStatus(void) -{ - uint32_t timeout = 0x1000000, status = NAND_READY; - - status = FSMC_NAND_ReadStatus(); - - /* Wait for a NAND operation to complete or a TIMEOUT to occur */ - while ((status != NAND_READY) &&( timeout != 0x00)) - { - status = FSMC_NAND_ReadStatus(); - timeout --; - } - - if(timeout == 0x00) - { - status = NAND_TIMEOUT_ERROR; - } - - /* Return the operation status */ - return (status); -} -/****************************************************************************** -* Function Name : FSMC_NAND_ReadStatus -* Description : Reads the NAND memory status using the Read status command -* Input : None -* Output : None -* Return : The status of the NAND memory. This parameter can be: -* - NAND_BUSY: when memory is busy -* - NAND_READY: when memory is ready for the next operation -* - NAND_ERROR: when the previous operation gererates error -*******************************************************************************/ -uint32_t FSMC_NAND_ReadStatus(void) -{ - uint32_t data = 0x00, status = NAND_BUSY; - - /* Read status operation ------------------------------------ */ - *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_STATUS; - data = *(__IO uint8_t *)(Bank_NAND_ADDR); - - if((data & NAND_ERROR) == NAND_ERROR) - { - status = NAND_ERROR; - } - else if((data & NAND_READY) == NAND_READY) - { - status = NAND_READY; - } - else - { - status = NAND_BUSY; - } - - return (status); -} - -/****************************************************************************** -* Function Name : NAND_AddressIncrement -* Description : Increment the NAND memory address -* Input : - Address: address to be incremented. -* Output : None -* Return : The new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -uint32_t FSMC_NAND_AddressIncrement(NAND_ADDRESS* Address) -{ - uint32_t status = NAND_VALID_ADDRESS; - - Address->Page++; - - if(Address->Page == NAND_BLOCK_SIZE) - { - Address->Page = 0; - Address->Block++; - - if(Address->Block == NAND_ZONE_SIZE) - { - Address->Block = 0; - Address->Zone++; - - if(Address->Zone == NAND_MAX_ZONE) - { - status = NAND_INVALID_ADDRESS; - } - } - } - - return (status); -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/hw_config.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/hw_config.c deleted file mode 100644 index b1fb978854..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/hw_config.c +++ /dev/null @@ -1,260 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : hw_config.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : Hardware Configuration & Setup -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "hw_config.h" -#include "platform_config.h" -#include "mass_mal.h" -#include "usb_desc.h" -#include "usb_pwr.h" - -void Set_System(void) -{ - /* Enable and GPIOD clock */ - USB_Disconnect_Config(); - - /* MAL configuration */ - MAL_Config(); -} - -/******************************************************************************* -* Function Name : Set_USBClock -* Description : Configures USB Clock input (48MHz) -* Input : None. -* Return : None. -*******************************************************************************/ -void Set_USBClock(void) -{ - /* USBCLK = PLLCLK */ - RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); - - /* Enable USB clock */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); -} - -/******************************************************************************* -* Function Name : Enter_LowPowerMode -* Description : Power-off system clocks and power while entering suspend mode -* Input : None. -* Return : None. -*******************************************************************************/ -void Enter_LowPowerMode(void) -{ - /* Set the device state to suspend */ - bDeviceState = SUSPENDED; -} - -/******************************************************************************* -* Function Name : Leave_LowPowerMode -* Description : Restores system clocks and power while exiting suspend mode -* Input : None. -* Return : None. -*******************************************************************************/ -void Leave_LowPowerMode(void) -{ - DEVICE_INFO *pInfo = &Device_Info; - - /* Set the device state to the correct state */ - if (pInfo->Current_Configuration != 0) - { - /* Device configured */ - bDeviceState = CONFIGURED; - } - else - { - bDeviceState = ATTACHED; - } - -} - -/******************************************************************************* -* Function Name : USB_Interrupts_Config -* Description : Configures the USB interrupts -* Input : None. -* Return : None. -*******************************************************************************/ -void USB_Interrupts_Config(void) -{ - NVIC_InitTypeDef NVIC_InitStructure; - - //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); - - NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - NVIC_InitStructure.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - -#if 0 - NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -#endif /* USE_STM3210E_EVAL */ - -} - -/******************************************************************************* -* Function Name : Led_Config -* Description : configure the Read/Write LEDs. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Led_Config(void) -{ -} - -/******************************************************************************* -* Function Name : Led_RW_ON -* Description : Turn ON the Read/Write LEDs. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Led_RW_ON(void) -{ -#if (USB_USE_LED == 1) - GPIO_SetBits(USB_LED_PORT, USB_LED_PIN); -#endif -} - -/******************************************************************************* -* Function Name : Led_RW_OFF -* Description : Turn off the Read/Write LEDs. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Led_RW_OFF(void) -{ -#if (USB_USE_LED == 1) - GPIO_ResetBits(USB_LED_PORT, USB_LED_PIN); -#endif -} -/******************************************************************************* -* Function Name : USB_Configured_LED -* Description : Turn ON the Read/Write LEDs. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void USB_Configured_LED(void) -{ - //GPIO_SetBits(USB_LED_PORT, GPIO_Pin_6); -} - -/******************************************************************************* -* Function Name : USB_NotConfigured_LED -* Description : Turn off the Read/Write LEDs. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void USB_NotConfigured_LED(void) -{ - //GPIO_ResetBits(USB_LED_PORT, GPIO_Pin_6); -} - -/******************************************************************************* -* Function Name : USB_Cable_Config -* Description : Software Connection/Disconnection of USB Cable. -* Input : None. -* Return : Status -*******************************************************************************/ -void USB_Cable_Config (FunctionalState NewState) -{ - if (NewState != DISABLE) - { - GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN); - } - else - { - GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN); - } -} - -/******************************************************************************* -* Function Name : Get_SerialNum. -* Description : Create the serial number string descriptor. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Get_SerialNum(void) -{ - uint32_t Device_Serial0, Device_Serial1, Device_Serial2; - - Device_Serial0 = *(__IO uint32_t*)(0x1FFFF7E8); - Device_Serial1 = *(__IO uint32_t*)(0x1FFFF7EC); - Device_Serial2 = *(__IO uint32_t*)(0x1FFFF7F0); - - if (Device_Serial0 != 0) - { - MASS_StringSerial[2] = (uint8_t)(Device_Serial0 & 0x000000FF); - MASS_StringSerial[4] = (uint8_t)((Device_Serial0 & 0x0000FF00) >> 8); - MASS_StringSerial[6] = (uint8_t)((Device_Serial0 & 0x00FF0000) >> 16); - MASS_StringSerial[8] = (uint8_t)((Device_Serial0 & 0xFF000000) >> 24); - - MASS_StringSerial[10] = (uint8_t)(Device_Serial1 & 0x000000FF); - MASS_StringSerial[12] = (uint8_t)((Device_Serial1 & 0x0000FF00) >> 8); - MASS_StringSerial[14] = (uint8_t)((Device_Serial1 & 0x00FF0000) >> 16); - MASS_StringSerial[16] = (uint8_t)((Device_Serial1 & 0xFF000000) >> 24); - - MASS_StringSerial[18] = (uint8_t)(Device_Serial2 & 0x000000FF); - MASS_StringSerial[20] = (uint8_t)((Device_Serial2 & 0x0000FF00) >> 8); - MASS_StringSerial[22] = (uint8_t)((Device_Serial2 & 0x00FF0000) >> 16); - MASS_StringSerial[24] = (uint8_t)((Device_Serial2 & 0xFF000000) >> 24); - } -} - -/******************************************************************************* -* Function Name : MAL_Config -* Description : MAL_layer configuration -* Input : None. -* Return : None. -*******************************************************************************/ -void MAL_Config(void) -{ - MAL_Init(0); -} - -/******************************************************************************* -* Function Name : USB_Disconnect_Config -* Description : Disconnect pin configuration -* Input : None. -* Return : None. -*******************************************************************************/ -void USB_Disconnect_Config(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE); - - /* config USB cable pin */ - GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure); -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/mass_mal.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/mass_mal.c deleted file mode 100644 index 37cef20559..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/mass_mal.c +++ /dev/null @@ -1,119 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : mass_mal.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : Medium Access Layer interface -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "platform_config.h" -#include "mass_mal.h" -#include "rtthread.h" - -uint32_t Mass_Memory_Size[3]; -uint32_t Mass_Block_Size[3]; -uint32_t Mass_Block_Count[3]; - -/* logic unit count; the first is 0 */ -uint32_t Max_Lun = 2; - -rt_device_t dev_sdio = RT_NULL; -rt_device_t dev_spi_flash = RT_NULL; -#if (USB_USE_AUTO_REMOVE == 1) -unsigned long test_unit_ready_last = 0; -#endif - -uint16_t MAL_Init(uint8_t lun) -{ - uint16_t status = MAL_OK; - - switch (lun) - { - case 0: - status = MAL_OK; - break; - case 1: - status = MAL_OK; - break; - case 2: - status = MAL_FAIL; - break; - default: - return MAL_FAIL; - } - return status; -} - -uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length) -{ -#if (USB_USE_AUTO_REMOVE == 1) - test_unit_ready_last = rt_tick_get(); -#endif - switch (lun) - { - case 0: - { - dev_sdio->write(dev_sdio,Memory_Offset,Writebuff,Transfer_Length); - } - break; - case 1: - { - dev_spi_flash->write(dev_spi_flash,Memory_Offset,Writebuff,Transfer_Length); - } - break; - default: - return MAL_FAIL; - } - return MAL_OK; -} - -uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length) -{ -#if (USB_USE_AUTO_REMOVE == 1) - test_unit_ready_last = rt_tick_get(); -#endif - switch (lun) - { - case 0: - { - dev_sdio->read(dev_sdio,Memory_Offset,Readbuff,Transfer_Length); - } - break; - case 1: - { - dev_spi_flash->read(dev_spi_flash,Memory_Offset,Readbuff,Transfer_Length); - } - break; - default: - return MAL_FAIL; - } - return MAL_OK; -} - -uint16_t MAL_GetStatus (uint8_t lun) -{ -#if (USB_USE_AUTO_REMOVE == 1) - test_unit_ready_last = rt_tick_get(); -#endif - switch(lun) - { - case 0: - return MAL_OK; - case 1: - return MAL_OK; - case 2: - return MAL_FAIL; - default: - return MAL_FAIL; - } -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/memory.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/memory.c deleted file mode 100644 index 5245d09c53..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/memory.c +++ /dev/null @@ -1,168 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : memory.c -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Memory management layer -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ - -#include "memory.h" -#include "usb_scsi.h" -#include "usb_bot.h" -#include "usb_regs.h" -#include "usb_mem.h" -#include "usb_conf.h" -#include "hw_config.h" -#include "mass_mal.h" -#include "usb_lib.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -__IO uint32_t Block_Read_count = 0; -__IO uint32_t Block_offset; -__IO uint32_t Counter = 0; -uint32_t Idx; -uint32_t Data_Buffer[BULK_MAX_PACKET_SIZE *2]; /* 512 bytes*/ -uint8_t TransferState = TXFR_IDLE; -/* Extern variables ----------------------------------------------------------*/ -extern uint8_t Bulk_Data_Buff[BULK_MAX_PACKET_SIZE]; /* data buffer*/ -extern uint16_t Data_Len; -extern uint8_t Bot_State; -extern Bulk_Only_CBW CBW; -extern Bulk_Only_CSW CSW; -extern uint32_t Mass_Memory_Size[2]; -extern uint32_t Mass_Block_Size[2]; - -/* Private function prototypes -----------------------------------------------*/ -/* Extern function prototypes ------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : Read_Memory -* Description : Handle the Read operation from the microSD card. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Read_Memory(uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length) -{ - static uint32_t Offset, Length; - - if (TransferState == TXFR_IDLE ) - { - Offset = Memory_Offset * Mass_Block_Size[lun]; - Length = Transfer_Length * Mass_Block_Size[lun]; - TransferState = TXFR_ONGOING; - } - - if (TransferState == TXFR_ONGOING ) - { - if (!Block_Read_count) - { - MAL_Read(lun , - Offset , - Data_Buffer, - Mass_Block_Size[lun]); - - USB_SIL_Write(EP1_IN, (uint8_t *)Data_Buffer, BULK_MAX_PACKET_SIZE); - - Block_Read_count = Mass_Block_Size[lun] - BULK_MAX_PACKET_SIZE; - Block_offset = BULK_MAX_PACKET_SIZE; - } - else - { - USB_SIL_Write(EP1_IN, (uint8_t *)Data_Buffer + Block_offset, BULK_MAX_PACKET_SIZE); - - Block_Read_count -= BULK_MAX_PACKET_SIZE; - Block_offset += BULK_MAX_PACKET_SIZE; - } - - SetEPTxCount(ENDP1, BULK_MAX_PACKET_SIZE); - SetEPTxStatus(ENDP1, EP_TX_VALID); - Offset += BULK_MAX_PACKET_SIZE; - Length -= BULK_MAX_PACKET_SIZE; - - CSW.dDataResidue -= BULK_MAX_PACKET_SIZE; - Led_RW_ON(); - } - if (Length == 0) - { - Block_Read_count = 0; - Block_offset = 0; - Offset = 0; - Bot_State = BOT_DATA_IN_LAST; - TransferState = TXFR_IDLE; - Led_RW_OFF(); - } -} - -/******************************************************************************* -* Function Name : Write_Memory -* Description : Handle the Write operation to the microSD card. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length) -{ - - static uint32_t W_Offset, W_Length; - - uint32_t temp = Counter + 64; - - if (TransferState == TXFR_IDLE ) - { - W_Offset = Memory_Offset * Mass_Block_Size[lun]; - W_Length = Transfer_Length * Mass_Block_Size[lun]; - TransferState = TXFR_ONGOING; - } - - if (TransferState == TXFR_ONGOING ) - { - - for (Idx = 0 ; Counter < temp; Counter++) - { - *((uint8_t *)Data_Buffer + Counter) = Bulk_Data_Buff[Idx++]; - } - - W_Offset += Data_Len; - W_Length -= Data_Len; - - if (!(W_Length % Mass_Block_Size[lun])) - { - Counter = 0; - MAL_Write(lun , - W_Offset - Mass_Block_Size[lun], - Data_Buffer, - Mass_Block_Size[lun]); - } - - CSW.dDataResidue -= Data_Len; - #ifndef STM32F10X_CL - SetEPRxStatus(ENDP2, EP_RX_VALID); /* enable the next transaction*/ - #endif /* STM32F10X_CL */ - - Led_RW_ON(); - } - - if ((W_Length == 0) || (Bot_State == BOT_CSW_Send)) - { - Counter = 0; - Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); - TransferState = TXFR_IDLE; - Led_RW_OFF(); - } -} -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/nand_if.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/nand_if.c deleted file mode 100644 index 5ba38716a9..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/nand_if.c +++ /dev/null @@ -1,544 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : nand_if.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : manage NAND operationx state machine -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -#include "platform_config.h" - -#ifdef USE_STM3210E_EVAL -/* Includes ------------------------------------------------------------------*/ -#include "nand_if.h" -#include "mass_mal.h" -#include "fsmc_nand.h" -#include "memory.h" -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* extern variables-----------------------------------------------------------*/ -extern uint32_t SCSI_LBA; -extern uint32_t SCSI_BlkLen; -/* Private variables ---------------------------------------------------------*/ -uint16_t LUT[1024]; //Look Up Table Buffer -WRITE_STATE Write_State; -BLOCK_STATE Block_State; -NAND_ADDRESS wAddress, fAddress; -uint16_t phBlock, LogAddress, Initial_Page, CurrentZone = 0; -uint16_t Written_Pages = 0; - -uint16_t LUT[1024]; //Look Up Table Buffer -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -static uint16_t NAND_CleanLUT(uint8_t ZoneNbr); -static NAND_ADDRESS NAND_GetAddress(uint32_t Address); -static uint16_t NAND_GetFreeBlock(void); -static uint16_t NAND_Write_Cleanup(void); -SPARE_AREA ReadSpareArea(uint32_t address); -static uint16_t NAND_Copy(NAND_ADDRESS Address_Src, NAND_ADDRESS Address_Dest, uint16_t PageToCopy); -static NAND_ADDRESS NAND_ConvertPhyAddress(uint32_t Address); -static uint16_t NAND_BuildLUT(uint8_t ZoneNbr); - -/******************************************************************************* -* Function Name : NAND_Init -* Description : Init NAND Interface -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -uint16_t NAND_Init(void) -{ - uint16_t Status = NAND_OK; - - FSMC_NAND_Init(); - Status = NAND_BuildLUT(0); - Write_State = WRITE_IDLE; - return Status; -} - -/******************************************************************************* -* Function Name : NAND_Write -* Description : write one sector by once -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -uint16_t NAND_Write(uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length) -{ - /* check block status and calculate start and end addreses */ - wAddress = NAND_GetAddress(Memory_Offset / 512); - - /*check Zone: if second zone is requested build second LUT*/ - if (wAddress.Zone != CurrentZone) - { - CurrentZone = wAddress.Zone; - NAND_BuildLUT(CurrentZone); - } - - phBlock = LUT[wAddress.Block]; /* Block Index + flags */ - LogAddress = wAddress.Block ; /* save logical block */ - - /* IDLE state */ - /****************/ - if ( Write_State == WRITE_IDLE) - {/* Idle state */ - - if (phBlock & USED_BLOCK) - { /* USED BLOCK */ - - Block_State = OLD_BLOCK; - /* Get a free Block for swap */ - fAddress.Block = NAND_GetFreeBlock(); - fAddress.Zone = wAddress.Zone; - Initial_Page = fAddress.Page = wAddress.Page; - - /* write the new page */ - FSMC_NAND_WriteSmallPage((uint8_t *)Writebuff, fAddress, PAGE_TO_WRITE); - Written_Pages++; - - /* get physical block */ - wAddress.Block = phBlock & 0x3FF; - - - if (Written_Pages == SCSI_BlkLen) - { - NAND_Write_Cleanup(); - Written_Pages = 0; - return NAND_OK; - } - else - { - if (wAddress.Page == (NAND_BLOCK_SIZE - 1)) - { - NAND_Write_Cleanup(); - return NAND_OK; - } - Write_State = WRITE_ONGOING; - return NAND_OK; - } - } - else - {/* UNUSED BLOCK */ - - Block_State = UNUSED_BLOCK; - /* write the new page */ - wAddress.Block = phBlock & 0x3FF; - FSMC_NAND_WriteSmallPage( (uint8_t *)Writebuff , wAddress, PAGE_TO_WRITE); - - Written_Pages++; - if (Written_Pages == SCSI_BlkLen) - { - Written_Pages = 0; - NAND_Write_Cleanup(); - return NAND_OK; - } - else - { - Write_State = WRITE_ONGOING; - return NAND_OK; - } - } - } - /* WRITE state */ - /***************/ - if ( Write_State == WRITE_ONGOING) - {/* Idle state */ - if (phBlock & USED_BLOCK) - { /* USED BLOCK */ - - wAddress.Block = phBlock & 0x3FF; - Block_State = OLD_BLOCK; - fAddress.Page = wAddress.Page; - - /* check if next pages are in next block */ - if (wAddress.Page == (NAND_BLOCK_SIZE - 1)) - { - /* write Last page */ - FSMC_NAND_WriteSmallPage( (uint8_t *)Writebuff , fAddress, PAGE_TO_WRITE); - Written_Pages++; - if (Written_Pages == SCSI_BlkLen) - { - Written_Pages = 0; - } - /* Clean up and Update the LUT */ - NAND_Write_Cleanup(); - Write_State = WRITE_IDLE; - return NAND_OK; - } - - /* write next page */ - FSMC_NAND_WriteSmallPage( (uint8_t *)Writebuff , fAddress, PAGE_TO_WRITE); - Written_Pages++; - if (Written_Pages == SCSI_BlkLen) - { - Write_State = WRITE_IDLE; - NAND_Write_Cleanup(); - Written_Pages = 0; - } - - } - else - {/* UNUSED BLOCK */ - wAddress.Block = phBlock & 0x3FF; - /* check if it is the last page in prev block */ - if (wAddress.Page == (NAND_BLOCK_SIZE - 1)) - { - /* write Last page */ - FSMC_NAND_WriteSmallPage( (uint8_t *)Writebuff , wAddress, PAGE_TO_WRITE); - Written_Pages++; - if (Written_Pages == SCSI_BlkLen) - { - Written_Pages = 0; - } - - /* Clean up and Update the LUT */ - NAND_Write_Cleanup(); - Write_State = WRITE_IDLE; - - - - return NAND_OK; - } - /* write next page in same block */ - FSMC_NAND_WriteSmallPage( (uint8_t *)Writebuff , wAddress, PAGE_TO_WRITE); - Written_Pages++; - if (Written_Pages == SCSI_BlkLen) - { - Write_State = WRITE_IDLE; - NAND_Write_Cleanup(); - Written_Pages = 0; - } - } - } - return NAND_OK; -} - -/******************************************************************************* -* Function Name : NAND_Read -* Description : Read sectors -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -uint16_t NAND_Read(uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length) -{ - NAND_ADDRESS phAddress; - - phAddress = NAND_GetAddress(Memory_Offset / 512); - - if (phAddress.Zone != CurrentZone) - { - CurrentZone = phAddress.Zone; - NAND_BuildLUT(CurrentZone); - } - - if (LUT [phAddress.Block] & BAD_BLOCK) - { - return NAND_FAIL; - } - else - { - phAddress.Block = LUT [phAddress.Block] & ~ (USED_BLOCK | VALID_BLOCK); - FSMC_NAND_ReadSmallPage ( (uint8_t *)Readbuff , phAddress, Transfer_Length / 512); - } - return NAND_OK; -} - -/******************************************************************************* -* Function Name : NAND_CleanLUT -* Description : Erase old blocks & rebuild the look up table -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -static uint16_t NAND_CleanLUT (uint8_t ZoneNbr) -{ -#ifdef WEAR_LEVELLING_SUPPORT - uint16_t BlockIdx, LUT_Item; -#endif - /* Rebuild the LUT for the current zone */ - NAND_BuildLUT (ZoneNbr); - -#ifdef WEAR_LEVELLING_SUPPORT - /* Wear Leveling : circular use of free blocks */ - LUT_Item = LUT [BlockIdx] - for (BlockIdx == MAX_LOG_BLOCKS_PER_ZONE ; BlockIdx < MAX_LOG_BLOCKS_PER_ZONE + WEAR_DEPTH ; BlockIdx++) - { - LUT [BlockIdx] = LUT [BlockIdx + 1]; - } - LUT [ MAX_LOG_BLOCKS_PER_ZONE + WEAR_DEPTH - 1] = LUT_Item ; -#endif - - return NAND_OK; -} - -/******************************************************************************* -* Function Name : NAND_GetAddress -* Description : Translate logical address into a phy one -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -static NAND_ADDRESS NAND_GetAddress (uint32_t Address) -{ - NAND_ADDRESS Address_t; - - Address_t.Page = Address & (NAND_BLOCK_SIZE - 1); - Address_t.Block = Address / NAND_BLOCK_SIZE; - Address_t.Zone = 0; - - while (Address_t.Block >= MAX_LOG_BLOCKS_PER_ZONE) - { - Address_t.Block -= MAX_LOG_BLOCKS_PER_ZONE; - Address_t.Zone++; - } - return Address_t; -} - -/******************************************************************************* -* Function Name : NAND_GetFreeBlock -* Description : Look for a free block for data exchange -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -static uint16_t NAND_GetFreeBlock (void) -{ - return LUT[MAX_LOG_BLOCKS_PER_ZONE]& ~(USED_BLOCK | VALID_BLOCK); -} - -/******************************************************************************* -* Function Name : ReadSpareArea -* Description : Check used block -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -SPARE_AREA ReadSpareArea (uint32_t address) -{ - SPARE_AREA t; - uint8_t Buffer[16]; - NAND_ADDRESS address_s; - address_s = NAND_ConvertPhyAddress(address); - FSMC_NAND_ReadSpareArea(Buffer , address_s, 1) ; - - t = *(SPARE_AREA *)Buffer; - - return t; -} - -/******************************************************************************* -* Function Name : NAND_Copy -* Description : Copy page -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -static uint16_t NAND_Copy (NAND_ADDRESS Address_Src, NAND_ADDRESS Address_Dest, uint16_t PageToCopy) -{ - uint8_t Copybuff[512]; - for ( ; PageToCopy > 0 ; PageToCopy-- ) - { - FSMC_NAND_ReadSmallPage ((uint8_t *)Copybuff, Address_Src , 1 ); - FSMC_NAND_WriteSmallPage ((uint8_t *)Copybuff, Address_Dest, 1); - FSMC_NAND_AddressIncrement(&Address_Src); - FSMC_NAND_AddressIncrement(&Address_Dest); - } - - return NAND_OK; -} - -/******************************************************************************* -* Function Name : NAND_Format -* Description : Format the entire NAND flash -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -uint16_t NAND_Format (void) -{ - NAND_ADDRESS phAddress; - SPARE_AREA SpareArea; - uint32_t BlockIndex; - - for (BlockIndex = 0 ; BlockIndex < NAND_ZONE_SIZE * NAND_MAX_ZONE; BlockIndex++) - { - phAddress = NAND_ConvertPhyAddress(BlockIndex * NAND_BLOCK_SIZE ); - SpareArea = ReadSpareArea(BlockIndex * NAND_BLOCK_SIZE); - - if((SpareArea.DataStatus != 0)||(SpareArea.BlockStatus != 0)){ - FSMC_NAND_EraseBlock (phAddress); - } - } - NAND_BuildLUT(0); - return NAND_OK; -} - -/******************************************************************************* -* Function Name : NAND_Write_Cleanup -* Description : None -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -static uint16_t NAND_Write_Cleanup (void) -{ - uint16_t tempSpareArea [8]; - uint16_t Page_Back; - - if ( Block_State == OLD_BLOCK ) - { - /* precopy old first pages */ - if (Initial_Page != 0) - { - Page_Back = wAddress.Page; - fAddress.Page = wAddress.Page = 0; - NAND_Copy (wAddress, fAddress, Initial_Page); - wAddress.Page = Page_Back ; - } - - /* postcopy remaining pages */ - if ((NAND_BLOCK_SIZE - (wAddress.Page + 1)) != 0) - { - FSMC_NAND_AddressIncrement(&wAddress); - fAddress.Page = wAddress.Page; - NAND_Copy (wAddress, fAddress, NAND_BLOCK_SIZE - wAddress.Page); - } - - /* assign logical address to new block */ - tempSpareArea [0] = LogAddress | USED_BLOCK ; - tempSpareArea [1] = 0xFFFF; - tempSpareArea [2] = 0xFFFF; - - fAddress.Page = 0x00; - FSMC_NAND_WriteSpareArea( (uint8_t *)tempSpareArea , fAddress , 1); - - /* erase old block */ - FSMC_NAND_EraseBlock(wAddress); - NAND_CleanLUT(wAddress.Zone); - } - else - {/* unused block case */ - /* assign logical address to the new used block */ - tempSpareArea [0] = LogAddress | USED_BLOCK ; - tempSpareArea [1] = 0xFFFF; - tempSpareArea [2] = 0xFFFF; - - wAddress.Page = 0x00; - FSMC_NAND_WriteSpareArea((uint8_t *)tempSpareArea , wAddress, 1); - NAND_CleanLUT(wAddress.Zone); - } - return NAND_OK; -} - -/******************************************************************************* -* Function Name : NAND_ConvertPhyAddress -* Description : None -* Input : physical Address -* Output : None -* Return : Status -*******************************************************************************/ -static NAND_ADDRESS NAND_ConvertPhyAddress (uint32_t Address) -{ - NAND_ADDRESS Address_t; - - Address_t.Page = Address & (NAND_BLOCK_SIZE - 1); - Address_t.Block = Address / NAND_BLOCK_SIZE; - Address_t.Zone = 0; - - while (Address_t.Block >= MAX_PHY_BLOCKS_PER_ZONE) - { - Address_t.Block -= MAX_PHY_BLOCKS_PER_ZONE; - Address_t.Zone++; - } - return Address_t; -} - -/******************************************************************************* -* Function Name : NAND_BuildLUT -* Description : Build the look up table -* Input : None -* Output : None -* Return : Status -* !!!! NOTE : THIS ALGORITHM IS A SUBJECT OF PATENT FOR STMICROELECTRONICS !!!!! -*******************************************************************************/ -static uint16_t NAND_BuildLUT (uint8_t ZoneNbr) -{ - - uint16_t pBadBlock, pCurrentBlock, pFreeBlock; - SPARE_AREA SpareArea; - /***************************************************************************** - 1st step : Init. - *****************************************************************************/ - /*Init the LUT (assume all blocks free) */ - for (pCurrentBlock = 0 ; pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE ; pCurrentBlock++) - { - LUT[pCurrentBlock] = FREE_BLOCK; /* 12th bit is set to 1 */ - } - - /* Init Pointers */ - pBadBlock = MAX_PHY_BLOCKS_PER_ZONE - 1; - pCurrentBlock = 0; - - /***************************************************************************** - 2nd step : locate used and bad blocks - *****************************************************************************/ - - while (pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE) - { - - SpareArea = ReadSpareArea(pCurrentBlock * NAND_BLOCK_SIZE + (ZoneNbr * NAND_BLOCK_SIZE * MAX_PHY_BLOCKS_PER_ZONE)); - - if ((SpareArea.DataStatus == 0) || (SpareArea.BlockStatus == 0)) - { - - LUT[pBadBlock--] |= pCurrentBlock | (uint16_t)BAD_BLOCK ; - LUT[pCurrentBlock] &= (uint16_t)~FREE_BLOCK; - if (pBadBlock == MAX_LOG_BLOCKS_PER_ZONE) - { - return NAND_FAIL; - } - } - else if (SpareArea.LogicalIndex != 0xFFFF) - { - - LUT[SpareArea.LogicalIndex & 0x3FF] |= pCurrentBlock | VALID_BLOCK | USED_BLOCK; - LUT[pCurrentBlock] &= (uint16_t)( ~FREE_BLOCK); - } - pCurrentBlock++ ; - } - - /***************************************************************************** - 3rd step : locate Free Blocks by scanning the LUT already built partially - *****************************************************************************/ - pFreeBlock = 0; - for (pCurrentBlock = 0 ; pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE ; pCurrentBlock++ ) - { - - if ( !(LUT[pCurrentBlock]& USED_BLOCK)) - { - do - { - if (LUT[pFreeBlock] & FREE_BLOCK) - { - - LUT [pCurrentBlock] |= pFreeBlock; - LUT [pFreeBlock] &= ~FREE_BLOCK; - break; - } - pFreeBlock++; - } - while ( pFreeBlock < MAX_PHY_BLOCKS_PER_ZONE ); - } - } - return NAND_OK; -} -#endif - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/scsi_data.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/scsi_data.c deleted file mode 100644 index 828ce19400..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/scsi_data.c +++ /dev/null @@ -1,164 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : scsi_data.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : Initialization of the SCSI data -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_scsi.h" -#include "memory.h" -uint8_t Page00_Inquiry_Data[] = -{ - 0x00, /* PERIPHERAL QUALIFIER & PERIPHERAL DEVICE TYPE*/ - 0x00, - 0x00, - 0x00, - 0x00 /* Supported Pages 00*/ -}; -uint8_t Standard_Inquiry_Data1[] = -{ - 0x00, /* Direct Access Device */ - 0x80, /* RMB = 1: Removable Medium */ - 0x02, /* Version: No conformance claim to standard */ - 0x02, - - 36 - 4, /* Additional Length */ - 0x00, /* SCCS = 1: Storage Controller Component */ - 0x00, - 0x00, - /* Vendor Identification */ - 'S', 'T', 'M', '3', '2', ' ', ' ', ' ', - /* Product Identification */ - 'n', 'e', 't', 'r', 'a', 'd', 'i', 'o', ' ', - 'D', 'I', 'S', 'K', '1', ' ', ' ', - /* Product Revision Level */ - '1', '.', '0', ' ' -}; -uint8_t Standard_Inquiry_Data2[] = -{ - 0x00, /* Direct Access Device */ - 0x80, /* RMB = 1: Removable Medium */ - - 0x02, /* Version: No conformance claim to standard */ - 0x02, /* Êý¾ÝÏìÓ¦¸ñʽ */ - - 36 - 4, /* ¸½¼ÓÊý¾Ý³¤¶È£¬Îª31×Ö½Ú */ - 0x00, /* SCCS = 1: Storage Controller Component */ - 0x00, - 0x00, - /* Vendor Identification */ - 'S', 'T', 'M', '3', '2', ' ', ' ', ' ', - /* Product Identification */ - 'n', 'e', 't', 'r', 'a', 'd', 'i', 'o', ' ', - 'D', 'I', 'S', 'K', '2', ' ', ' ', - /* Product Revision Level */ - '1', '.', '0', ' ' -}; -uint8_t Standard_Inquiry_Data3[] = -{ - 0x00, /* Direct Access Device */ - 0x80, /* RMB = 1: Removable Medium */ - - 0x02, /* Version: No conformance claim to standard */ - 0x02, /* Êý¾ÝÏìÓ¦¸ñʽ */ - - 36 - 4, /* ¸½¼ÓÊý¾Ý³¤¶È£¬Îª31×Ö½Ú */ - 0x00, /* SCCS = 1: Storage Controller Component */ - 0x00, - 0x00, - /* Vendor Identification */ - 'S', 'T', 'M', '3', '2', ' ', ' ', ' ', - /* Product Identification */ - 'n', 'e', 't', 'r', 'a', 'd', 'i', 'o', ' ', - 'D', 'I', 'S', 'K', '3', ' ', ' ', - /* Product Revision Level */ - '1', '.', '0', ' ' -}; -/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -uint8_t Mode_Sense6_data[] = -{ - 0x03, - 0x00, - 0x00, - 0x00, -}; - -/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ - -uint8_t Mode_Sense10_data[] = -{ - 0x00, - 0x06, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00 -}; -uint8_t Scsi_Sense_Data[] = -{ - 0x70, /*RespCode*/ - 0x00, /*SegmentNumber*/ - NO_SENSE, /* Sens_Key*/ - 0x00, - 0x00, - 0x00, - 0x00, /*Information*/ - 0x0A, /*AdditionalSenseLength*/ - 0x00, - 0x00, - 0x00, - 0x00, /*CmdInformation*/ - NO_SENSE, /*Asc*/ - 0x00, /*ASCQ*/ - 0x00, /*FRUC*/ - 0x00, /*TBD*/ - 0x00, - 0x00 /*SenseKeySpecific*/ -}; -uint8_t ReadCapacity10_Data[] = -{ - /* Last Logical Block */ - 0, - 0, - 0, - 0, - - /* Block Length */ - 0, - 0, - 0, - 0 -}; - -uint8_t ReadFormatCapacity_Data [] = -{ - 0x00, - 0x00, - 0x00, - 0x08, /* Capacity List Length */ - - /* Block Count */ - 0, - 0, - 0, - 0, - - /* Block Length */ - 0x02,/* Descriptor Code: Formatted Media */ - 0, - 0, - 0 -}; - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_bot.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_bot.c deleted file mode 100644 index 49ace5636f..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_bot.c +++ /dev/null @@ -1,335 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_bot.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : BOT State Machine management -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_scsi.h" -#include "hw_config.h" -#include "usb_regs.h" -#include "usb_mem.h" -#include "usb_conf.h" -#include "usb_bot.h" -#include "memory.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -uint8_t Bot_State; -uint8_t Bulk_Data_Buff[BULK_MAX_PACKET_SIZE]; /* data buffer*/ -uint16_t Data_Len; -Bulk_Only_CBW CBW; -Bulk_Only_CSW CSW; -uint32_t SCSI_LBA , SCSI_BlkLen; -extern uint32_t Max_Lun; -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Extern function prototypes ------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : Mass_Storage_In -* Description : Mass Storage IN transfer. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Mass_Storage_In (void) -{ - switch (Bot_State) - { - case BOT_CSW_Send: - case BOT_ERROR: - Bot_State = BOT_IDLE; - SetEPRxStatus(ENDP2, EP_RX_VALID);/* enable the Endpoint to recive the next cmd*/ - break; - case BOT_DATA_IN: - switch (CBW.CB[0]) - { - case SCSI_READ10: - SCSI_Read10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen); - break; - } - break; - case BOT_DATA_IN_LAST: - Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); - SetEPRxStatus(ENDP2, EP_RX_VALID); - break; - - default: - break; - } -} - -/******************************************************************************* -* Function Name : Mass_Storage_Out -* Description : Mass Storage OUT transfer. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Mass_Storage_Out (void) -{ - uint8_t CMD; - CMD = CBW.CB[0]; - Data_Len = GetEPRxCount(ENDP2); - - - /* read data to Bulk_Data_Buff */ - PMAToUserBufferCopy(Bulk_Data_Buff, ENDP2_RXADDR, Data_Len); - - switch (Bot_State) - { - case BOT_IDLE: - CBW_Decode(); - break; - case BOT_DATA_OUT: - if (CMD == SCSI_WRITE10) - { - SCSI_Write10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen); - break; - } - Bot_Abort(DIR_OUT); - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); - Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); - break; - default: - Bot_Abort(BOTH_DIR); - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); - Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); - break; - } -} - -/******************************************************************************* -* Function Name : CBW_Decode -* Description : Decode the received CBW and call the related SCSI command -* routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void CBW_Decode(void) -{ - uint32_t Counter; - - /* read data from Bulk_Data_Buff to CBW */ - for (Counter = 0; Counter < Data_Len; Counter++) - { - *((uint8_t *)&CBW + Counter) = Bulk_Data_Buff[Counter]; - } - /* copy return TAG */ - CSW.dTag = CBW.dTag; - CSW.dDataResidue = CBW.dDataLength; - - if (Data_Len != BOT_CBW_PACKET_LENGTH) - { - Bot_Abort(BOTH_DIR); - /* reset the CBW.dSignature to desible the clear feature until receiving a Mass storage reset*/ - CBW.dSignature = 0; - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, PARAMETER_LIST_LENGTH_ERROR); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); - return; - } - - if ((CBW.CB[0] == SCSI_READ10 ) || (CBW.CB[0] == SCSI_WRITE10 )) - { - /* Calculate Logical Block Address */ - SCSI_LBA = (CBW.CB[2] << 24) | (CBW.CB[3] << 16) | (CBW.CB[4] << 8) | CBW.CB[5]; - /* Calculate the Number of Blocks to transfer */ - SCSI_BlkLen = (CBW.CB[7] << 8) | CBW.CB[8]; - } - - /* USBC */ - if (CBW.dSignature == BOT_CBW_SIGNATURE) - { - /* Valid CBW */ - if ((CBW.bLUN > Max_Lun) || (CBW.bCBLength < 1) || (CBW.bCBLength > 16)) - { - Bot_Abort(BOTH_DIR); - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); - } - else - { - switch (CBW.CB[0]) - { - case SCSI_REQUEST_SENSE: - SCSI_RequestSense_Cmd (CBW.bLUN); - break; - case SCSI_INQUIRY: - SCSI_Inquiry_Cmd(CBW.bLUN); - break; - case SCSI_START_STOP_UNIT: - SCSI_Start_Stop_Unit_Cmd(CBW.bLUN); - break; - case SCSI_ALLOW_MEDIUM_REMOVAL: - SCSI_Start_Stop_Unit_Cmd(CBW.bLUN); - break; - case SCSI_MODE_SENSE6: - SCSI_ModeSense6_Cmd (CBW.bLUN); - break; - case SCSI_MODE_SENSE10: - SCSI_ModeSense10_Cmd (CBW.bLUN); - break; - case SCSI_READ_FORMAT_CAPACITIES: - SCSI_ReadFormatCapacity_Cmd(CBW.bLUN); - break; - case SCSI_READ_CAPACITY10: - SCSI_ReadCapacity10_Cmd(CBW.bLUN); - break; - case SCSI_TEST_UNIT_READY: - SCSI_TestUnitReady_Cmd(CBW.bLUN); - break; - case SCSI_READ10: - SCSI_Read10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen); - break; - case SCSI_WRITE10: - SCSI_Write10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen); - break; - case SCSI_VERIFY10: - SCSI_Verify10_Cmd(CBW.bLUN); - break; - case SCSI_FORMAT_UNIT: - SCSI_Format_Cmd(CBW.bLUN); - break; - /*Unsupported command*/ - - case SCSI_MODE_SELECT10: - SCSI_Mode_Select10_Cmd(CBW.bLUN); - break; - case SCSI_MODE_SELECT6: - SCSI_Mode_Select6_Cmd(CBW.bLUN); - break; - - case SCSI_SEND_DIAGNOSTIC: - SCSI_Send_Diagnostic_Cmd(CBW.bLUN); - break; - case SCSI_READ6: - SCSI_Read6_Cmd(CBW.bLUN); - break; - case SCSI_READ12: - SCSI_Read12_Cmd(CBW.bLUN); - break; - case SCSI_READ16: - SCSI_Read16_Cmd(CBW.bLUN); - break; - case SCSI_READ_CAPACITY16: - SCSI_READ_CAPACITY16_Cmd(CBW.bLUN); - break; - case SCSI_WRITE6: - SCSI_Write6_Cmd(CBW.bLUN); - break; - case SCSI_WRITE12: - SCSI_Write12_Cmd(CBW.bLUN); - break; - case SCSI_WRITE16: - SCSI_Write16_Cmd(CBW.bLUN); - break; - case SCSI_VERIFY12: - SCSI_Verify12_Cmd(CBW.bLUN); - break; - case SCSI_VERIFY16: - SCSI_Verify16_Cmd(CBW.bLUN); - break; - - default: - { - Bot_Abort(BOTH_DIR); - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); - } - } - } - } - else - { - /* Invalid CBW */ - Bot_Abort(BOTH_DIR); - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); - } -} - -/******************************************************************************* -* Function Name : Transfer_Data_Request -* Description : Send the request response to the PC HOST. -* Input : uint8_t* Data_Address : point to the data to transfer. -* uint16_t Data_Length : the nember of Bytes to transfer. -* Output : None. -* Return : None. -*******************************************************************************/ -void Transfer_Data_Request(uint8_t* Data_Pointer, uint16_t Data_Len) -{ - UserToPMABufferCopy(Data_Pointer, ENDP1_TXADDR, Data_Len); - - SetEPTxCount(ENDP1, Data_Len); - SetEPTxStatus(ENDP1, EP_TX_VALID); - Bot_State = BOT_DATA_IN_LAST; - CSW.dDataResidue -= Data_Len; - CSW.bStatus = CSW_CMD_PASSED; -} - -/******************************************************************************* -* Function Name : Set_CSW -* Description : Set the SCW with the needed fields. -* Input : uint8_t CSW_Status this filed can be CSW_CMD_PASSED,CSW_CMD_FAILED, -* or CSW_PHASE_ERROR. -* Output : None. -* Return : None. -*******************************************************************************/ -void Set_CSW (uint8_t CSW_Status, uint8_t Send_Permission) -{ - CSW.dSignature = BOT_CSW_SIGNATURE; - CSW.bStatus = CSW_Status; - - UserToPMABufferCopy(((uint8_t *)& CSW), ENDP1_TXADDR, CSW_DATA_LENGTH); - - SetEPTxCount(ENDP1, CSW_DATA_LENGTH); - Bot_State = BOT_ERROR; - if (Send_Permission) - { - Bot_State = BOT_CSW_Send; - SetEPTxStatus(ENDP1, EP_TX_VALID); - } - -} - -/******************************************************************************* -* Function Name : Bot_Abort -* Description : Stall the needed Endpoint according to the selected direction. -* Input : Endpoint direction IN, OUT or both directions -* Output : None. -* Return : None. -*******************************************************************************/ -void Bot_Abort(uint8_t Direction) -{ - switch (Direction) - { - case DIR_IN : - SetEPTxStatus(ENDP1, EP_TX_STALL); - break; - case DIR_OUT : - SetEPRxStatus(ENDP2, EP_RX_STALL); - break; - case BOTH_DIR : - SetEPTxStatus(ENDP1, EP_TX_STALL); - SetEPRxStatus(ENDP2, EP_RX_STALL); - break; - default: - break; - } -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_desc.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_desc.c deleted file mode 100644 index 0e2543c567..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_desc.c +++ /dev/null @@ -1,161 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_desc.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : Descriptors for Mass Storage Device -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_desc.h" - -const uint8_t MASS_DeviceDescriptor[MASS_SIZ_DEVICE_DESC] = -{ - 0x12, /* bLength */ - 0x01, /* bDescriptorType */ - 0x00, /* bcdUSB, version 2.00 */ - 0x02, - 0x00, /* bDeviceClass : each interface define the device class */ - 0x00, /* bDeviceSubClass */ - 0x00, /* bDeviceProtocol */ - 0x40, /* bMaxPacketSize0 0x40 = 64 */ - 0x83, /* idVendor (0483) */ - 0x04, - 0x20, /* idProduct */ - 0x57, - 0x00, /* bcdDevice 2.00*/ - 0x02, - 1, /* index of string Manufacturer */ - /**/ - 2, /* index of string descriptor of product*/ - /* */ - 3, /* */ - /* */ - /* */ - 0x01 /*bNumConfigurations */ -}; - -const uint8_t MASS_ConfigDescriptor[MASS_SIZ_CONFIG_DESC] = -{ - - 0x09, /* bLength: Configuation Descriptor size */ - 0x02, /* bDescriptorType: Configuration */ - MASS_SIZ_CONFIG_DESC, - - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: */ - /* Configuration value */ - 0x00, /* iConfiguration: */ - /* Index of string descriptor */ - /* describing the configuration */ - 0xC0, /* bmAttributes: */ - /* bus powered */ - 100, /* MaxPower 100 mA */ - - /*****************½Ó¿ÚÃèÊö·û*******************/ -//bLength×ֶΡ£½Ó¿ÚÃèÊö·ûµÄ³¤¶ÈΪ9×Ö½Ú¡£ - 0x09, - -//bDescriptorType×ֶΡ£½Ó¿ÚÃèÊö·ûµÄ±àºÅΪ0x04¡£ - 0x04, - -//bInterfaceNumber×ֶΡ£¸Ã½Ó¿ÚµÄ±àºÅ£¬µÚÒ»¸ö½Ó¿Ú£¬±àºÅΪ0¡£ - 0x00, - -//bAlternateSetting×ֶΡ£¸Ã½Ó¿ÚµÄ±¸ÓñàºÅ£¬Îª0¡£ - 0x00, - -//bNumEndpoints×ֶΡ£·Ç0¶ËµãµÄÊýÄ¿¡£¸Ã½Ó¿ÚÓÐ2¸öÅúÁ¿¶Ëµã - 0x02, - -//bInterfaceClass×ֶΡ£¸Ã½Ó¿ÚËùʹÓõÄÀà¡£´óÈÝÁ¿´æ´¢É豸½Ó¿ÚÀàµÄ´úÂëΪ0x08¡£ - 0x08, - -//bInterfaceSubClass×ֶΡ£¸Ã½Ó¿ÚËùʹÓõÄ×ÓÀà¡£SCSI͸Ã÷ÃüÁµÄ×ÓÀà´úÂëΪ0x06¡£ - 0x06, - -//bInterfaceProtocol×ֶΡ£Ð­ÒéΪ½öÅúÁ¿´«Ê䣬´úÂëΪ0x50¡£ - 0x50, - -//iConfiguration×ֶΡ£¸Ã½Ó¿ÚµÄ×Ö·û´®Ë÷ÒýÖµ¡£ - 4, /* iInterface: */ - - /*************±ê×¼ÅúÁ¿Êý¾ÝÊäÈë¶ËµãÃèÊö·û****************/ - /* 18 */ - 0x07, /*Endpoint descriptor length = 7*/ - 0x05, /*Endpoint descriptor type *///bDescriptorType×ֶΡ£¶ËµãÃèÊö·û±àºÅΪ0x05¡£ - -//bEndpointAddress×ֶΡ£¶ËµãµÄµØÖ·¡£ÎÒÃÇʹÓÃD12µÄÊäÈë¶Ëµã2¡£ -//D7λ±íʾÊý¾Ý·½Ïò£¬ÊäÈë¶ËµãD7Ϊ1¡£ËùÒÔÊäÈë¶Ëµã2µÄµØÖ·Îª0x82¡£ - 0x81, /*Endpoint address (IN, address 1) */ - - //bmAttributes×ֶΡ£D1~D0Ϊ¶Ëµã´«ÊäÀàÐÍÑ¡Ôñ¡£ -//¸Ã¶ËµãΪÅú¶Ëµã¡£ÅúÁ¿¶ËµãµÄ±àºÅΪ2¡£ÆäËüλ±£ÁôΪ0¡£ - 0x02, /*Bulk endpoint type */ - - 0x40, /*Maximum packet size (64 bytes) */ - 0x00, - 0x00, /*Polling interval in milliseconds */ - - /*************±ê×¼ÅúÁ¿Êý¾ÝÊä³ö¶ËµãÃèÊö·û****************/ - /* 25 */ - 0x07, /*Endpoint descriptor length = 7 */ - 0x05, /*Endpoint descriptor type */ - 0x02, /*Endpoint address (OUT, address 2) */ - 0x02, /*Bulk endpoint type */ - 0x40, /*Maximum packet size (64 bytes) */ - 0x00, - 0x00 /*Polling interval in milliseconds*/ - /*32*/ -}; -const uint8_t MASS_StringLangID[MASS_SIZ_STRING_LANGID] = -{ - MASS_SIZ_STRING_LANGID, - 0x03, - 0x09, - 0x04 -} -; /* LangID = 0x0409: U.S. English */ -const uint8_t MASS_StringVendor[MASS_SIZ_STRING_VENDOR] = -{ - MASS_SIZ_STRING_VENDOR, /* Size of manufaturer string */ - 0x03, /* bDescriptorType = String descriptor */ - /* Manufacturer: "STMicroelectronics" */ - '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 -}; -const uint8_t MASS_StringProduct[MASS_SIZ_STRING_PRODUCT] = -{ - MASS_SIZ_STRING_PRODUCT, - 0x03, - /* Product name: "STM32F10x:USB Mass Storage" */ - 'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 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 - -}; - -uint8_t MASS_StringSerial[MASS_SIZ_STRING_SERIAL] = -{ - MASS_SIZ_STRING_SERIAL, - 0x03, - /* STM3210 */ - 'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, '1', 0, '0', 0 -}; -const uint8_t MASS_StringInterface[MASS_SIZ_STRING_INTERFACE] = -{ - MASS_SIZ_STRING_INTERFACE, - 0x03, - /* Interface 0: "ST Mass" */ - 'S', 0, 'T', 0, ' ', 0, 'M', 0, 'a', 0, 's', 0, 's', 0 -}; - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_endp.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_endp.c deleted file mode 100644 index 11326d2722..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_endp.c +++ /dev/null @@ -1,55 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_endp.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : Endpoint routines -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_lib.h" -#include "usb_bot.h" -#include "usb_istr.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : EP1_IN_Callback -* Description : EP1 IN Callback Routine -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void EP1_IN_Callback(void) -{ - // IN - Mass_Storage_In(); -} - -/******************************************************************************* -* Function Name : EP2_OUT_Callback. -* Description : EP2 OUT Callback Routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void EP2_OUT_Callback(void) -{ - // OUT ÊÕµ½Ö÷»ú·¢À´µÄÊý¾Ý»òÃüÁî - Mass_Storage_Out(); -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_istr.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_istr.c deleted file mode 100644 index f54db810a3..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_istr.c +++ /dev/null @@ -1,174 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_istr.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : ISTR events interrupt service routines -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -#include "usb_type.h" -#include "usb_regs.h" -#include "usb_pwr.h" -#include "usb_istr.h" -#include "usb_init.h" -#include "usb_int.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -__IO uint16_t wIstr; /* ISTR register last read value */ -__IO uint8_t bIntPackSOF = 0; /* SOFs received between 2 consecutive packets */ - -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* function pointers to non-control endpoints service routines */ -void (*pEpInt_IN[7])(void) = - { - EP1_IN_Callback, - EP2_IN_Callback, - EP3_IN_Callback, - EP4_IN_Callback, - EP5_IN_Callback, - EP6_IN_Callback, - EP7_IN_Callback, - }; - -void (*pEpInt_OUT[7])(void) = - { - EP1_OUT_Callback, - EP2_OUT_Callback, - EP3_OUT_Callback, - EP4_OUT_Callback, - EP5_OUT_Callback, - EP6_OUT_Callback, - EP7_OUT_Callback, - }; - - -/******************************************************************************* -* Function Name : USB_Istr -* Description : ISTR events interrupt service routine -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void USB_Istr(void) -{ - - wIstr = _GetISTR(); - -#if (IMR_MSK & ISTR_RESET) - if (wIstr & ISTR_RESET & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_RESET); - Device_Property.Reset(); -#ifdef RESET_CALLBACK - RESET_Callback(); -#endif - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_DOVR) - if (wIstr & ISTR_DOVR & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_DOVR); -#ifdef DOVR_CALLBACK - DOVR_Callback(); -#endif - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_ERR) - if (wIstr & ISTR_ERR & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_ERR); -#ifdef ERR_CALLBACK - ERR_Callback(); -#endif - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_WKUP) - if (wIstr & ISTR_WKUP & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_WKUP); - Resume(RESUME_EXTERNAL); -#ifdef WKUP_CALLBACK - WKUP_Callback(); -#endif - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_SUSP) - if (wIstr & ISTR_SUSP & wInterrupt_Mask) - { - - /* check if SUSPEND is possible */ - if (fSuspendEnabled) - { - Suspend(); - } - else - { - /* if not possible then resume after xx ms */ - Resume(RESUME_LATER); - } - /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ - _SetISTR((uint16_t)CLR_SUSP); -#ifdef SUSP_CALLBACK - SUSP_Callback(); -#endif - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_SOF) - if (wIstr & ISTR_SOF & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_SOF); - bIntPackSOF++; - -#ifdef SOF_CALLBACK - SOF_Callback(); -#endif - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_ESOF) - if (wIstr & ISTR_ESOF & wInterrupt_Mask) - { - _SetISTR((uint16_t)CLR_ESOF); - /* resume handling timing is made with ESOFs */ - Resume(RESUME_ESOF); /* request without change of the machine state */ - -#ifdef ESOF_CALLBACK - ESOF_Callback(); -#endif - } -#endif - /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ -#if (IMR_MSK & ISTR_CTR) - if (wIstr & ISTR_CTR & wInterrupt_Mask) - { - /* servicing of the endpoint correct transfer interrupt */ - /* clear of the CTR flag into the sub */ - CTR_LP(); -#ifdef CTR_CALLBACK - CTR_Callback(); -#endif - } -#endif -} /* USB_Istr */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_main.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_main.c deleted file mode 100644 index ca975458b0..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_main.c +++ /dev/null @@ -1,116 +0,0 @@ -#include "stm32f10x.h" -#include "usb_lib.h" -#include "usb_istr.h" -#include "hw_config.h" -#include "usb_pwr.h" - -#include "rtthread.h" - -extern uint32_t Mass_Memory_Size[3]; -extern uint32_t Mass_Block_Size[3]; -extern uint32_t Mass_Block_Count[3]; -extern rt_device_t dev_sdio; -extern rt_device_t dev_spi_flash; - -#if (USB_USE_AUTO_REMOVE == 1) -extern unsigned long test_unit_ready_last; -void msc_thread_entry(void *parameter) -{ - extern void player_ui_freeze(void); - unsigned long test_unit_ready_start = rt_tick_get(); - test_unit_ready_last = test_unit_ready_start; - - /* wait connection */ - while( test_unit_ready_last == test_unit_ready_start ) - { - rt_thread_delay( RT_TICK_PER_SECOND ); - } - - - /* freeze player UI */ - player_ui_freeze(); - - /* wait remove */ - while(1) - { - rt_thread_delay( RT_TICK_PER_SECOND/2 ); - if( rt_tick_get() - test_unit_ready_last > RT_TICK_PER_SECOND*2 ) - { - rt_kprintf("\r\nCable removed!\r\nSystemReset\r\n\r\n"); - NVIC_SystemReset(); - } - } -} -#endif - -#include -#include "sdcard.h" -void USB_cable(void) -{ - rt_device_t dev = RT_NULL; - SD_CardInfo * sdio_info = RT_NULL; - dev = rt_device_find("sd0"); - - { - SPI_InitTypeDef SPI_InitStructure; - /*------------------------ SPI1 configuration ------------------------*/ - SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI_Direction_1Line_Tx; - SPI_InitStructure.SPI_Mode = SPI_Mode_Master; - SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; - SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; - SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;/* 72M/64=1.125M */ - SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; - SPI_InitStructure.SPI_CRCPolynomial = 7; - - SPI_I2S_DeInit(SPI1); - SPI_Init(SPI1, &SPI_InitStructure); - - /* Enable SPI_MASTER */ - SPI_Cmd(SPI1, ENABLE); - SPI_CalculateCRC(SPI1, DISABLE); - } - - - /* SPI_FLASH */ - dev_spi_flash = rt_device_find("spi0"); - Mass_Block_Size[1] = 512; - Mass_Block_Count[1] = 4096; - Mass_Memory_Size[1] = 4096*512; - - if(dev != RT_NULL) - { - dev_sdio = dev; - sdio_info = (SD_CardInfo *)dev->private; - Mass_Memory_Size[0] = sdio_info->CardCapacity; - Mass_Block_Size[0] = sdio_info->CardBlockSize; - Mass_Block_Count[0] = Mass_Memory_Size[0] / Mass_Block_Size[0]; - } - else - { - rt_kprintf("\r\nNo find the device sd0 !!!!"); - } - - /* 3:NAND */ - - /* usb msc up*/ - Set_System(); - Set_USBClock(); - USB_Interrupts_Config(); - USB_Init(); - -#if (USB_USE_AUTO_REMOVE == 1) - /* delete the other thread */ - - /* create msc_thread */ - { - rt_thread_t msc_thread; - msc_thread = rt_thread_create("msc_thread", - msc_thread_entry, RT_NULL, - 1024, RT_THREAD_PRIORITY_MAX-1,1); - if (msc_thread != RT_NULL) rt_thread_startup(msc_thread); - } -#endif -} -FINSH_FUNCTION_EXPORT(USB_cable, cable_the_usb); diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_prop.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_prop.c deleted file mode 100644 index b36658b175..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_prop.c +++ /dev/null @@ -1,392 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_prop.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : All processing related to Mass Storage Demo -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_lib.h" -#include "usb_desc.h" -#include "usb_pwr.h" -#include "usb_bot.h" -#include "hw_config.h" -#include "memory.h" -#include "mass_mal.h" -#include "usb_prop.h" - -extern uint32_t Max_Lun; - -DEVICE Device_Table = -{ - EP_NUM, - 1 -}; - -DEVICE_PROP Device_Property = -{ - MASS_init, - MASS_Reset, - MASS_Status_In, - MASS_Status_Out, - MASS_Data_Setup, - MASS_NoData_Setup, - MASS_Get_Interface_Setting, - MASS_GetDeviceDescriptor, - MASS_GetConfigDescriptor, - MASS_GetStringDescriptor, - 0, - 0x40 /*MAX PACKET SIZE*/ -}; - -USER_STANDARD_REQUESTS User_Standard_Requests = -{ - Mass_Storage_GetConfiguration, - Mass_Storage_SetConfiguration, - Mass_Storage_GetInterface, - Mass_Storage_SetInterface, - Mass_Storage_GetStatus, - Mass_Storage_ClearFeature, - Mass_Storage_SetEndPointFeature, - Mass_Storage_SetDeviceFeature, - Mass_Storage_SetDeviceAddress -}; - -ONE_DESCRIPTOR Device_Descriptor = -{ - (uint8_t*)MASS_DeviceDescriptor, - MASS_SIZ_DEVICE_DESC -}; - -ONE_DESCRIPTOR Config_Descriptor = -{ - (uint8_t*)MASS_ConfigDescriptor, - MASS_SIZ_CONFIG_DESC -}; - -ONE_DESCRIPTOR String_Descriptor[5] = -{ - {(uint8_t*)MASS_StringLangID, MASS_SIZ_STRING_LANGID}, - {(uint8_t*)MASS_StringVendor, MASS_SIZ_STRING_VENDOR}, - {(uint8_t*)MASS_StringProduct, MASS_SIZ_STRING_PRODUCT}, - {(uint8_t*)MASS_StringSerial, MASS_SIZ_STRING_SERIAL}, - {(uint8_t*)MASS_StringInterface, MASS_SIZ_STRING_INTERFACE}, -}; - -/* Extern variables ----------------------------------------------------------*/ -extern unsigned char Bot_State; -extern Bulk_Only_CBW CBW; - -/* Private function prototypes -----------------------------------------------*/ -/* Extern function prototypes ------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/******************************************************************************* -* Function Name : MASS_init -* Description : Mass Storage init routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void MASS_init() -{ - /* Update the serial number string descriptor with the data from the unique - ID*/ - Get_SerialNum(); - - pInformation->Current_Configuration = 0; - - /* Connect the device */ - PowerOn(); - - /* USB interrupts initialization */ - /* clear pending interrupts */ - _SetISTR(0); - wInterrupt_Mask = IMR_MSK; - /* set interrupts mask */ - _SetCNTR(wInterrupt_Mask); - - bDeviceState = UNCONNECTED; -} - -/******************************************************************************* -* Function Name : MASS_Reset -* Description : Mass Storage reset routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void MASS_Reset() -{ - /* Set the device as not configured */ - Device_Info.Current_Configuration = 0; - - /* Current Feature initialization */ - pInformation->Current_Feature = MASS_ConfigDescriptor[7]; - - SetBTABLE(BTABLE_ADDRESS); - - /* Initialize Endpoint 0 */ - SetEPType(ENDP0, EP_CONTROL); - SetEPTxStatus(ENDP0, EP_TX_NAK); - SetEPRxAddr(ENDP0, ENDP0_RXADDR); - SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); - SetEPTxAddr(ENDP0, ENDP0_TXADDR); - Clear_Status_Out(ENDP0); - SetEPRxValid(ENDP0); - - /* Initialize Endpoint 1 */ - SetEPType(ENDP1, EP_BULK); - SetEPTxAddr(ENDP1, ENDP1_TXADDR); - SetEPTxStatus(ENDP1, EP_TX_NAK); - SetEPRxStatus(ENDP1, EP_RX_DIS); - - /* Initialize Endpoint 2 */ - SetEPType(ENDP2, EP_BULK); - SetEPRxAddr(ENDP2, ENDP2_RXADDR); - SetEPRxCount(ENDP2, Device_Property.MaxPacketSize); - SetEPRxStatus(ENDP2, EP_RX_VALID); - SetEPTxStatus(ENDP2, EP_TX_DIS); - - - SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); - SetEPRxValid(ENDP0); - - /* Set the device to response on default address */ - SetDeviceAddress(0); - - bDeviceState = ATTACHED; - - CBW.dSignature = BOT_CBW_SIGNATURE; - Bot_State = BOT_IDLE; - //USB_NotConfigured_LED(); -} - -/******************************************************************************* -* Function Name : Mass_Storage_SetConfiguration -* Description : Handle the SetConfiguration request. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Mass_Storage_SetConfiguration(void) -{ - if (pInformation->Current_Configuration != 0) - { - /* Device configured */ - bDeviceState = CONFIGURED; - - ClearDTOG_TX(ENDP1); - ClearDTOG_RX(ENDP2); - Bot_State = BOT_IDLE; /* set the Bot state machine to the IDLE state */ - } -} - -/******************************************************************************* -* Function Name : Mass_Storage_ClearFeature -* Description : Handle the ClearFeature request. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Mass_Storage_ClearFeature(void) -{ - /* when the host send a CBW with invalid signature or invalid length the two - Endpoints (IN & OUT) shall stall until receiving a Mass Storage Reset */ - if (CBW.dSignature != BOT_CBW_SIGNATURE) - Bot_Abort(BOTH_DIR); -} - -/******************************************************************************* -* Function Name : Mass_Storage_SetConfiguration. -* Description : Udpade the device state to addressed. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Mass_Storage_SetDeviceAddress (void) -{ - bDeviceState = ADDRESSED; -} -/******************************************************************************* -* Function Name : MASS_Status_In -* Description : Mass Storage Status IN routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void MASS_Status_In(void) -{ - return; -} - -/******************************************************************************* -* Function Name : MASS_Status_Out -* Description : Mass Storage Status OUT routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void MASS_Status_Out(void) -{ - return; -} - -/******************************************************************************* -* Function Name : MASS_Data_Setup. -* Description : Handle the data class specific requests.. -* Input : RequestNo. -* Output : None. -* Return : RESULT. -*******************************************************************************/ -RESULT MASS_Data_Setup(uint8_t RequestNo) -{ - uint8_t *(*CopyRoutine)(uint16_t); - - CopyRoutine = NULL; - if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) - && (RequestNo == GET_MAX_LUN) && (pInformation->USBwValue == 0) - && (pInformation->USBwIndex == 0) && (pInformation->USBwLength == 0x01)) - { - CopyRoutine = Get_Max_Lun; - } - else - { - return USB_UNSUPPORT; - } - - if (CopyRoutine == NULL) - { - return USB_UNSUPPORT; - } - - pInformation->Ctrl_Info.CopyData = CopyRoutine; - pInformation->Ctrl_Info.Usb_wOffset = 0; - (*CopyRoutine)(0); - - return USB_SUCCESS; - -} - -/******************************************************************************* -* Function Name : MASS_NoData_Setup. -* Description : Handle the no data class specific requests. -* Input : RequestNo. -* Output : None. -* Return : RESULT. -*******************************************************************************/ -RESULT MASS_NoData_Setup(uint8_t RequestNo) -{ - if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) - && (RequestNo == MASS_STORAGE_RESET) && (pInformation->USBwValue == 0) - && (pInformation->USBwIndex == 0) && (pInformation->USBwLength == 0x00)) - { - /* Initialize Endpoint 1 */ - ClearDTOG_TX(ENDP1); - - /* Initialize Endpoint 2 */ - ClearDTOG_RX(ENDP2); - - /*intialise the CBW signature to enable the clear feature*/ - CBW.dSignature = BOT_CBW_SIGNATURE; - Bot_State = BOT_IDLE; - - return USB_SUCCESS; - } - return USB_UNSUPPORT; -} - -/******************************************************************************* -* Function Name : MASS_Get_Interface_Setting -* Description : Test the interface and the alternate setting according to the -* supported one. -* Input : uint8_t Interface, uint8_t AlternateSetting. -* Output : None. -* Return : RESULT. -*******************************************************************************/ -RESULT MASS_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) -{ - if (AlternateSetting > 0) - { - return USB_UNSUPPORT;/* in this application we don't have AlternateSetting*/ - } - else if (Interface > 0) - { - return USB_UNSUPPORT;/*in this application we have only 1 interfaces*/ - } - return USB_SUCCESS; -} - -/******************************************************************************* -* Function Name : MASS_GetDeviceDescriptor -* Description : Get the device descriptor. -* Input : uint16_t Length. -* Output : None. -* Return : None. -*******************************************************************************/ -uint8_t *MASS_GetDeviceDescriptor(uint16_t Length) -{ - return Standard_GetDescriptorData(Length, &Device_Descriptor ); -} - -/******************************************************************************* -* Function Name : MASS_GetConfigDescriptor -* Description : Get the configuration descriptor. -* Input : uint16_t Length. -* Output : None. -* Return : None. -*******************************************************************************/ -uint8_t *MASS_GetConfigDescriptor(uint16_t Length) -{ - return Standard_GetDescriptorData(Length, &Config_Descriptor ); -} - -/******************************************************************************* -* Function Name : MASS_GetStringDescriptor -* Description : Get the string descriptors according to the needed index. -* Input : uint16_t Length. -* Output : None. -* Return : None. -*******************************************************************************/ -uint8_t *MASS_GetStringDescriptor(uint16_t Length) -{ - uint8_t wValue0 = pInformation->USBwValue0; - - if (wValue0 > 5) - { - return NULL; - } - else - { - return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]); - } -} - -/******************************************************************************* -* Function Name : Get_Max_Lun -* Description : Handle the Get Max Lun request. -* Input : uint16_t Length. -* Output : None. -* Return : None. -*******************************************************************************/ -uint8_t *Get_Max_Lun(uint16_t Length) -{ - if (Length == 0) - { - pInformation->Ctrl_Info.Usb_wLength = LUN_DATA_LENGTH; - return 0; - } - else - { - return((uint8_t*)(&Max_Lun)); - } -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_pwr.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_pwr.c deleted file mode 100644 index b3096a8e64..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_pwr.c +++ /dev/null @@ -1,224 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_pwr.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : Connection/disconnection & power management -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -#include "usb_lib.h" -#include "usb_conf.h" -#include "usb_pwr.h" -#include "hw_config.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -__IO uint32_t bDeviceState = UNCONNECTED; /* USB device status */ -__IO bool fSuspendEnabled = TRUE; /* true when suspend is possible */ - -struct -{ - __IO RESUME_STATE eState; - __IO uint8_t bESOFcnt; -} -ResumeS; - -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Extern function prototypes ------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : PowerOn -* Description : -* Input : None. -* Output : None. -* Return : USB_SUCCESS. -*******************************************************************************/ -RESULT PowerOn(void) -{ - uint16_t wRegVal; - - /*** cable plugged-in ? ***/ - /*while(!CablePluggedIn());*/ - USB_Cable_Config(ENABLE); - - /*** CNTR_PWDN = 0 ***/ - wRegVal = CNTR_FRES; - _SetCNTR(wRegVal); - - /*** CNTR_FRES = 0 ***/ - wInterrupt_Mask = 0; - _SetCNTR(wInterrupt_Mask); - /*** Clear pending interrupts ***/ - _SetISTR(0); - /*** Set interrupt mask ***/ - wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM; - _SetCNTR(wInterrupt_Mask); - - return USB_SUCCESS; -} - -/******************************************************************************* -* Function Name : PowerOff -* Description : handles switch-off conditions -* Input : None. -* Output : None. -* Return : USB_SUCCESS. -*******************************************************************************/ -RESULT PowerOff() -{ - /* disable all ints and force USB reset */ - _SetCNTR(CNTR_FRES); - /* clear interrupt status register */ - _SetISTR(0); - /* Disable the Pull-Up*/ - USB_Cable_Config(DISABLE); - /* switch-off device */ - _SetCNTR(CNTR_FRES + CNTR_PDWN); - /* sw variables reset */ - /* ... */ - - return USB_SUCCESS; -} - -/******************************************************************************* -* Function Name : Suspend -* Description : sets suspend mode operating conditions -* Input : None. -* Output : None. -* Return : USB_SUCCESS. -*******************************************************************************/ -void Suspend(void) -{ - uint16_t wCNTR; - /* suspend preparation */ - /* ... */ - - /* macrocell enters suspend mode */ - wCNTR = _GetCNTR(); - wCNTR |= CNTR_FSUSP; - _SetCNTR(wCNTR); - - /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */ - /* power reduction */ - /* ... on connected devices */ - - - /* force low-power mode in the macrocell */ - wCNTR = _GetCNTR(); - wCNTR |= CNTR_LPMODE; - _SetCNTR(wCNTR); - - /* switch-off the clocks */ - /* ... */ - Enter_LowPowerMode(); - -} - -/******************************************************************************* -* Function Name : Resume_Init -* Description : Handles wake-up restoring normal operations -* Input : None. -* Output : None. -* Return : USB_SUCCESS. -*******************************************************************************/ -void Resume_Init(void) -{ - uint16_t wCNTR; - /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */ - /* restart the clocks */ - /* ... */ - - /* CNTR_LPMODE = 0 */ - wCNTR = _GetCNTR(); - wCNTR &= (~CNTR_LPMODE); - _SetCNTR(wCNTR); - - /* restore full power */ - /* ... on connected devices */ - Leave_LowPowerMode(); - - /* reset FSUSP bit */ - _SetCNTR(IMR_MSK); - - /* reverse suspend preparation */ - /* ... */ - -} - -/******************************************************************************* -* Function Name : Resume -* Description : This is the state machine handling resume operations and -* timing sequence. The control is based on the Resume structure -* variables and on the ESOF interrupt calling this subroutine -* without changing machine state. -* Input : a state machine value (RESUME_STATE) -* RESUME_ESOF doesn't change ResumeS.eState allowing -* decrementing of the ESOF counter in different states. -* Output : None. -* Return : None. -*******************************************************************************/ -void Resume(RESUME_STATE eResumeSetVal) -{ - uint16_t wCNTR; - - if (eResumeSetVal != RESUME_ESOF) - ResumeS.eState = eResumeSetVal; - - switch (ResumeS.eState) - { - case RESUME_EXTERNAL: - Resume_Init(); - ResumeS.eState = RESUME_OFF; - break; - case RESUME_INTERNAL: - Resume_Init(); - ResumeS.eState = RESUME_START; - break; - case RESUME_LATER: - ResumeS.bESOFcnt = 2; - ResumeS.eState = RESUME_WAIT; - break; - case RESUME_WAIT: - ResumeS.bESOFcnt--; - if (ResumeS.bESOFcnt == 0) - ResumeS.eState = RESUME_START; - break; - case RESUME_START: - wCNTR = _GetCNTR(); - wCNTR |= CNTR_RESUME; - _SetCNTR(wCNTR); - ResumeS.eState = RESUME_ON; - ResumeS.bESOFcnt = 10; - break; - case RESUME_ON: - ResumeS.bESOFcnt--; - if (ResumeS.bESOFcnt == 0) - { - wCNTR = _GetCNTR(); - wCNTR &= (~CNTR_RESUME); - _SetCNTR(wCNTR); - ResumeS.eState = RESUME_OFF; - } - break; - case RESUME_OFF: - case RESUME_ESOF: - default: - ResumeS.eState = RESUME_OFF; - break; - } -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_scsi.c b/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_scsi.c deleted file mode 100644 index 64869a0a24..0000000000 --- a/bsp/stm32_radio/Libraries/Mass_Storage/src/usb_scsi.c +++ /dev/null @@ -1,438 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_scsi.c -* Author : MCD Application Team -* Version : V3.0.1 -* Date : 04/27/2009 -* Description : All processing related to the SCSI commands -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "hw_config.h" -#include "usb_scsi.h" -#include "mass_mal.h" -#include "usb_bot.h" -#include "usb_regs.h" -#include "memory.h" -#include "nand_if.h" -#include "platform_config.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* External variables --------------------------------------------------------*/ -extern uint8_t Bulk_Data_Buff[BULK_MAX_PACKET_SIZE]; /* data buffer*/ -extern uint8_t Bot_State; -extern Bulk_Only_CBW CBW; -extern Bulk_Only_CSW CSW; - -/* lun=3 1:SPI_FLASH 2:SD card 3:NAND-FLASH */ -extern uint32_t Mass_Memory_Size[3]; -extern uint32_t Mass_Block_Size[3]; -extern uint32_t Mass_Block_Count[3]; - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : SCSI_Inquiry_Cmd -* Description : SCSI Inquiry Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_Inquiry_Cmd(uint8_t lun) -{ - uint8_t* Inquiry_Data; - uint16_t Inquiry_Data_Length; - - if (CBW.CB[1] & 0x01)/*Evpd is set*/ - { - Inquiry_Data = Page00_Inquiry_Data; - Inquiry_Data_Length = 5; - } - else - { - switch(lun) - { - case 0: - Inquiry_Data = Standard_Inquiry_Data1; - break; - case 1: - Inquiry_Data = Standard_Inquiry_Data2; - break; - case 2: - Inquiry_Data = Standard_Inquiry_Data3; - break; - } - - if (CBW.CB[4] <= STANDARD_INQUIRY_DATA_LEN) - Inquiry_Data_Length = CBW.CB[4]; - else - Inquiry_Data_Length = STANDARD_INQUIRY_DATA_LEN; - - } - Transfer_Data_Request(Inquiry_Data, Inquiry_Data_Length); -} - -/******************************************************************************* -* Function Name : SCSI_ReadFormatCapacity_Cmd -* Description : SCSI ReadFormatCapacity Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_ReadFormatCapacity_Cmd(uint8_t lun) -{ - - if (MAL_GetStatus(lun) != 0 ) - { - Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); - Bot_Abort(DIR_IN); - return; - } - ReadFormatCapacity_Data[4] = (uint8_t)(Mass_Block_Count[lun] >> 24); - ReadFormatCapacity_Data[5] = (uint8_t)(Mass_Block_Count[lun] >> 16); - ReadFormatCapacity_Data[6] = (uint8_t)(Mass_Block_Count[lun] >> 8); - ReadFormatCapacity_Data[7] = (uint8_t)(Mass_Block_Count[lun]); - - ReadFormatCapacity_Data[9] = (uint8_t)(Mass_Block_Size[lun] >> 16); - ReadFormatCapacity_Data[10] = (uint8_t)(Mass_Block_Size[lun] >> 8); - ReadFormatCapacity_Data[11] = (uint8_t)(Mass_Block_Size[lun]); - Transfer_Data_Request(ReadFormatCapacity_Data, READ_FORMAT_CAPACITY_DATA_LEN); -} - -/******************************************************************************* -* Function Name : SCSI_ReadCapacity10_Cmd -* Description : SCSI ReadCapacity10 Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_ReadCapacity10_Cmd(uint8_t lun) -{ - - if (MAL_GetStatus(lun)) - { - Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); - Bot_Abort(DIR_IN); - return; - } - - ReadCapacity10_Data[0] = (uint8_t)(Mass_Block_Count[lun] - 1 >> 24); - ReadCapacity10_Data[1] = (uint8_t)(Mass_Block_Count[lun] - 1 >> 16); - ReadCapacity10_Data[2] = (uint8_t)(Mass_Block_Count[lun] - 1 >> 8); - ReadCapacity10_Data[3] = (uint8_t)(Mass_Block_Count[lun] - 1); - - ReadCapacity10_Data[4] = (uint8_t)(Mass_Block_Size[lun] >> 24); - ReadCapacity10_Data[5] = (uint8_t)(Mass_Block_Size[lun] >> 16); - ReadCapacity10_Data[6] = (uint8_t)(Mass_Block_Size[lun] >> 8); - ReadCapacity10_Data[7] = (uint8_t)(Mass_Block_Size[lun]); - Transfer_Data_Request(ReadCapacity10_Data, READ_CAPACITY10_DATA_LEN); -} - -/******************************************************************************* -* Function Name : SCSI_ModeSense6_Cmd -* Description : SCSI ModeSense6 Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_ModeSense6_Cmd (uint8_t lun) -{ - Transfer_Data_Request(Mode_Sense6_data, MODE_SENSE6_DATA_LEN); -} - -/******************************************************************************* -* Function Name : SCSI_ModeSense10_Cmd -* Description : SCSI ModeSense10 Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_ModeSense10_Cmd (uint8_t lun) -{ - Transfer_Data_Request(Mode_Sense10_data, MODE_SENSE10_DATA_LEN); -} - -/******************************************************************************* -* Function Name : SCSI_RequestSense_Cmd -* Description : SCSI RequestSense Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_RequestSense_Cmd (uint8_t lun) -{ - uint8_t Request_Sense_data_Length; - - if (CBW.CB[4] <= REQUEST_SENSE_DATA_LEN) - { - Request_Sense_data_Length = CBW.CB[4]; - } - else - { - Request_Sense_data_Length = REQUEST_SENSE_DATA_LEN; - } - Transfer_Data_Request(Scsi_Sense_Data, Request_Sense_data_Length); -} - -/******************************************************************************* -* Function Name : Set_Scsi_Sense_Data -* Description : Set Scsi Sense Data routine. -* Input : uint8_t Sens_Key - uint8_t Asc. -* Output : None. -* Return : None. -*******************************************************************************/ -void Set_Scsi_Sense_Data(uint8_t lun, uint8_t Sens_Key, uint8_t Asc) -{ - Scsi_Sense_Data[2] = Sens_Key; - Scsi_Sense_Data[12] = Asc; -} - -/******************************************************************************* -* Function Name : SCSI_Start_Stop_Unit_Cmd -* Description : SCSI Start_Stop_Unit Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_Start_Stop_Unit_Cmd(uint8_t lun) -{ - Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); -} - -/******************************************************************************* -* Function Name : SCSI_Read10_Cmd -* Description : SCSI Read10 Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_Read10_Cmd(uint8_t lun , uint32_t LBA , uint32_t BlockNbr) -{ - - if (Bot_State == BOT_IDLE) - { - /*address out of range*/ - if (!(SCSI_Address_Management(CBW.bLUN, SCSI_READ10, LBA, BlockNbr))) - { - return; - } - - if ((CBW.bmFlags & 0x80) != 0) - { - Bot_State = BOT_DATA_IN; - Read_Memory(lun, LBA , BlockNbr); - } - else - { - Bot_Abort(BOTH_DIR); - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); - } - return; - } - else if (Bot_State == BOT_DATA_IN) - { - Read_Memory(lun , LBA , BlockNbr); - } -} - -/******************************************************************************* -* Function Name : SCSI_Write10_Cmd -* Description : SCSI Write10 Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_Write10_Cmd(uint8_t lun , uint32_t LBA , uint32_t BlockNbr) -{ - - if (Bot_State == BOT_IDLE) - { - if (!(SCSI_Address_Management(CBW.bLUN, SCSI_WRITE10 , LBA, BlockNbr)))/*address out of range*/ - { - return; - } - - if ((CBW.bmFlags & 0x80) == 0) - { - Bot_State = BOT_DATA_OUT; - SetEPRxStatus(ENDP2, EP_RX_VALID); - } - else - { - Bot_Abort(DIR_IN); - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); - } - return; - } - else if (Bot_State == BOT_DATA_OUT) - { - Write_Memory(lun , LBA , BlockNbr); - } -} - -/******************************************************************************* -* Function Name : SCSI_Verify10_Cmd -* Description : SCSI Verify10 Command routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_Verify10_Cmd(uint8_t lun) -{ - if ((CBW.dDataLength == 0) && !(CBW.CB[1] & BLKVFY))/* BLKVFY not set*/ - { - Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); - } - else - { - Bot_Abort(BOTH_DIR); - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); - } -} -/******************************************************************************* -* Function Name : SCSI_Valid_Cmd -* Description : Valid Commands routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_Valid_Cmd(uint8_t lun) -{ - if (CBW.dDataLength != 0) - { - Bot_Abort(BOTH_DIR); - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); - } - else - Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); -} -/******************************************************************************* -* Function Name : SCSI_Valid_Cmd -* Description : Valid Commands routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_TestUnitReady_Cmd(uint8_t lun) -{ - if (MAL_GetStatus(lun)) - { - Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); - Bot_Abort(DIR_IN); - return; - } - else - { - Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); - } -} -/******************************************************************************* -* Function Name : SCSI_Format_Cmd -* Description : Format Commands routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_Format_Cmd(uint8_t lun) -{ - if (MAL_GetStatus(lun)) - { - Set_Scsi_Sense_Data(CBW.bLUN, NOT_READY, MEDIUM_NOT_PRESENT); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_ENABLE); - Bot_Abort(DIR_IN); - return; - } -#ifdef USE_STM3210E_EVAL - else - { - //NAND_Format(); - Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); - } -#endif -} -/******************************************************************************* -* Function Name : SCSI_Invalid_Cmd -* Description : Invalid Commands routine -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void SCSI_Invalid_Cmd(uint8_t lun) -{ - if (CBW.dDataLength == 0) - { - Bot_Abort(DIR_IN); - } - else - { - if ((CBW.bmFlags & 0x80) != 0) - { - Bot_Abort(DIR_IN); - } - else - { - Bot_Abort(BOTH_DIR); - } - } - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); -} - -/******************************************************************************* -* Function Name : SCSI_Address_Management -* Description : Test the received address. -* Input : uint8_t Cmd : the command can be SCSI_READ10 or SCSI_WRITE10. -* Output : None. -* Return : Read\Write status (bool). -*******************************************************************************/ -bool SCSI_Address_Management(uint8_t lun , uint8_t Cmd , uint32_t LBA , uint32_t BlockNbr) -{ - - if ((LBA + BlockNbr) > Mass_Block_Count[lun] ) - { - if (Cmd == SCSI_WRITE10) - { - Bot_Abort(BOTH_DIR); - } - Bot_Abort(DIR_IN); - Set_Scsi_Sense_Data(lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); - return (FALSE); - } - - - if (CBW.dDataLength != BlockNbr * Mass_Block_Size[lun]) - { - if (Cmd == SCSI_WRITE10) - { - Bot_Abort(BOTH_DIR); - } - else - { - Bot_Abort(DIR_IN); - } - Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); - Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE); - return (FALSE); - } - return (TRUE); -} -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/Release_Notes_for_STM32F10x_StdPeriph_Driver.html b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/Release_Notes_for_STM32F10x_StdPeriph_Driver.html deleted file mode 100644 index 56cc3cbfe5..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/Release_Notes_for_STM32F10x_StdPeriph_Driver.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - -Release Notes for STM32F10x Standard Peripherals Library Drivers - - - - -
-


-

-
- - - - - - -
- - - - - - - - - -
Back to Release page
-

Release -Notes for STM32F10x Standard Peripherals Library Drivers -(StdPeriph_Driver)

-

Copyright 2010 STMicroelectronics

-

-
-

 

- - - - - - -
-

Contents

-
    -
  1. STM32F10x Standard Peripherals Library -Drivers update History
  2. -
  3. License
  4. -
- - -

STM32F10x Standard -Peripherals Library Drivers  update History

-

3.2.0 -- 03/01/2010

-
    -
  1. General
  2. -
-
    - -
  • Add support -for STM32 Low-density Value line (STM32F100x4/6) and -Medium-density Value line (STM32F100x8/B) devices.
  • -
  • Almost -peripherals drivers were updated to support Value -line devices features
  • -
  • Drivers limitations fix and enhancements.
  • - -
-
    -
  1. STM32F10x_StdPeriph_Driver
  2. -
-
    -
  • Add new -firmware driver for CEC peripheral: stm32f10x_cec.h and stm32f10x_cec.c
  • -
  • Timers drivers stm32f10x_tim.h/.c: add support for new General Purpose Timers: TIM15, TIM16 and TIM17.
  • -
  • RCC driver: add support for new Value peripherals: HDMI-CEC, TIM15, TIM16 and TIM17.
  • -
  • GPIO driver: add new remap parameters for TIM1, TIM15, TIM16, TIM17 and HDMI-CEC: GPIO_Remap_TIM1_DMA, GPIO_Remap_TIM15, GPIO_Remap_TIM16, GPIO_Remap_TIM17, GPIO_Remap_CEC.
  • -
  • USART -driver: add support for Oversampling by 8 mode and onebit method. 2 -functions has been added: USART_OverSampling8Cmd() and -USART_OneBitMethodCmd().
    -
  • -
  • DAC -driver: add new functions handling the DAC under run feature: -DAC_ITConfig(), DAC_GetFlagStatus(), DAC_ClearFlag(), DAC_GetITStatus() -and DAC_ClearITPendingBit().
  • -
  • DBGMCU driver: add new parameters for TIM15, TIM16 and TIM17: DBGMCU_TIM15_STOP, DBGMCU_TIM16_STOP, DBGMCU_TIM17_STOP.
    -
  • -
  • FLASH -driver: the FLASH_EraseOptionBytes() function updated. This is now just -erasing the option bytes without modifying the RDP status either -enabled or disabled.
  • -
  • PWR -driver: the PWR_EnterSTOPMode() function updated. When woken up from -STOP mode, this function resets again the SLEEPDEEP bit in the -Cortex-M3 System Control register to allow Sleep mode entering.
  • - - -
-

License

-

The -enclosed firmware and all the related documentation are not covered by -a License Agreement, if you need such License you can contact your -local STMicroelectronics office.

-

THE -PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO -SAVE TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR -ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY -CLAIMS ARISING FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY -CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH -THEIR PRODUCTS.

-

 

-
-
-

For -complete documentation on STM32(CORTEX M3) 32-Bit Microcontrollers -visit www.st.com/STM32

-
-

-
-
-

 

-
- \ No newline at end of file diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h deleted file mode 100644 index 7e96ab8829..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/misc.h +++ /dev/null @@ -1,219 +0,0 @@ -/** - ****************************************************************************** - * @file misc.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the miscellaneous - * firmware library functions (add-on to CMSIS functions). - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MISC_H -#define __MISC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup MISC - * @{ - */ - -/** @defgroup MISC_Exported_Types - * @{ - */ - -/** - * @brief NVIC Init Structure definition - */ - -typedef struct -{ - uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled. - This parameter can be a value of @ref IRQn_Type - (For the complete STM32 Devices IRQ Channels list, please - refer to stm32f10x.h file) */ - - uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the IRQ channel - specified in NVIC_IRQChannel. This parameter can be a value - between 0 and 15 as described in the table @ref NVIC_Priority_Table */ - - uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel specified - in NVIC_IRQChannel. This parameter can be a value - between 0 and 15 as described in the table @ref NVIC_Priority_Table */ - - FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel - will be enabled or disabled. - This parameter can be set either to ENABLE or DISABLE */ -} NVIC_InitTypeDef; - -/** - * @} - */ - -/** @defgroup NVIC_Priority_Table - * @{ - */ - -/** -@code - The table below gives the allowed values of the pre-emption priority and subpriority according - to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function - ============================================================================================================================ - NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description - ============================================================================================================================ - NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority - | | | 4 bits for subpriority - ---------------------------------------------------------------------------------------------------------------------------- - NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority - | | | 3 bits for subpriority - ---------------------------------------------------------------------------------------------------------------------------- - NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority - | | | 2 bits for subpriority - ---------------------------------------------------------------------------------------------------------------------------- - NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority - | | | 1 bits for subpriority - ---------------------------------------------------------------------------------------------------------------------------- - NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority - | | | 0 bits for subpriority - ============================================================================================================================ -@endcode -*/ - -/** - * @} - */ - -/** @defgroup MISC_Exported_Constants - * @{ - */ - -/** @defgroup Vector_Table_Base - * @{ - */ - -#define NVIC_VectTab_RAM ((uint32_t)0x20000000) -#define NVIC_VectTab_FLASH ((uint32_t)0x08000000) -#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \ - ((VECTTAB) == NVIC_VectTab_FLASH)) -/** - * @} - */ - -/** @defgroup System_Low_Power - * @{ - */ - -#define NVIC_LP_SEVONPEND ((uint8_t)0x10) -#define NVIC_LP_SLEEPDEEP ((uint8_t)0x04) -#define NVIC_LP_SLEEPONEXIT ((uint8_t)0x02) -#define IS_NVIC_LP(LP) (((LP) == NVIC_LP_SEVONPEND) || \ - ((LP) == NVIC_LP_SLEEPDEEP) || \ - ((LP) == NVIC_LP_SLEEPONEXIT)) -/** - * @} - */ - -/** @defgroup Preemption_Priority_Group - * @{ - */ - -#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority - 4 bits for subpriority */ -#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority - 3 bits for subpriority */ -#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority - 2 bits for subpriority */ -#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority - 1 bits for subpriority */ -#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority - 0 bits for subpriority */ - -#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \ - ((GROUP) == NVIC_PriorityGroup_1) || \ - ((GROUP) == NVIC_PriorityGroup_2) || \ - ((GROUP) == NVIC_PriorityGroup_3) || \ - ((GROUP) == NVIC_PriorityGroup_4)) - -#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) - -#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) - -#define IS_NVIC_OFFSET(OFFSET) ((OFFSET) < 0x0007FFFF) - -/** - * @} - */ - -/** @defgroup SysTick_clock_source - * @{ - */ - -#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) -#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) -#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \ - ((SOURCE) == SysTick_CLKSource_HCLK_Div8)) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup MISC_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup MISC_Exported_Functions - * @{ - */ - -void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); -void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); -void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); -void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); -void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource); - -#ifdef __cplusplus -} -#endif - -#endif /* __MISC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h deleted file mode 100644 index 41942cfc9b..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h +++ /dev/null @@ -1,479 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_adc.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the ADC firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_ADC_H -#define __STM32F10x_ADC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup ADC - * @{ - */ - -/** @defgroup ADC_Exported_Types - * @{ - */ - -/** - * @brief ADC Init structure definition - */ - -typedef struct -{ - uint32_t ADC_Mode; /*!< Configures the ADC to operate in independent or - dual mode. - This parameter can be a value of @ref ADC_mode */ - - FunctionalState ADC_ScanConvMode; /*!< Specifies whether the conversion is performed in - Scan (multichannels) or Single (one channel) mode. - This parameter can be set to ENABLE or DISABLE */ - - FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed in - Continuous or Single mode. - This parameter can be set to ENABLE or DISABLE. */ - - uint32_t ADC_ExternalTrigConv; /*!< Defines the external trigger used to start the analog - to digital conversion of regular channels. This parameter - can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */ - - uint32_t ADC_DataAlign; /*!< Specifies whether the ADC data alignment is left or right. - This parameter can be a value of @ref ADC_data_align */ - - uint8_t ADC_NbrOfChannel; /*!< Specifies the number of ADC channels that will be converted - using the sequencer for regular channel group. - This parameter must range from 1 to 16. */ -}ADC_InitTypeDef; -/** - * @} - */ - -/** @defgroup ADC_Exported_Constants - * @{ - */ - -#define IS_ADC_ALL_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ - ((PERIPH) == ADC2) || \ - ((PERIPH) == ADC3)) - -#define IS_ADC_DMA_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ - ((PERIPH) == ADC3)) - -/** @defgroup ADC_mode - * @{ - */ - -#define ADC_Mode_Independent ((uint32_t)0x00000000) -#define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) -#define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) -#define ADC_Mode_InjecSimult_FastInterl ((uint32_t)0x00030000) -#define ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000) -#define ADC_Mode_InjecSimult ((uint32_t)0x00050000) -#define ADC_Mode_RegSimult ((uint32_t)0x00060000) -#define ADC_Mode_FastInterl ((uint32_t)0x00070000) -#define ADC_Mode_SlowInterl ((uint32_t)0x00080000) -#define ADC_Mode_AlterTrig ((uint32_t)0x00090000) - -#define IS_ADC_MODE(MODE) (((MODE) == ADC_Mode_Independent) || \ - ((MODE) == ADC_Mode_RegInjecSimult) || \ - ((MODE) == ADC_Mode_RegSimult_AlterTrig) || \ - ((MODE) == ADC_Mode_InjecSimult_FastInterl) || \ - ((MODE) == ADC_Mode_InjecSimult_SlowInterl) || \ - ((MODE) == ADC_Mode_InjecSimult) || \ - ((MODE) == ADC_Mode_RegSimult) || \ - ((MODE) == ADC_Mode_FastInterl) || \ - ((MODE) == ADC_Mode_SlowInterl) || \ - ((MODE) == ADC_Mode_AlterTrig)) -/** - * @} - */ - -/** @defgroup ADC_external_trigger_sources_for_regular_channels_conversion - * @{ - */ - -#define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000) /*!< For ADC1 and ADC2 */ -#define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x00020000) /*!< For ADC1 and ADC2 */ -#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x00060000) /*!< For ADC1 and ADC2 */ -#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x00080000) /*!< For ADC1 and ADC2 */ -#define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x000A0000) /*!< For ADC1 and ADC2 */ -#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO ((uint32_t)0x000C0000) /*!< For ADC1 and ADC2 */ - -#define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000) /*!< For ADC1, ADC2 and ADC3 */ -#define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000) /*!< For ADC1, ADC2 and ADC3 */ - -#define ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x00000000) /*!< For ADC3 only */ -#define ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x00020000) /*!< For ADC3 only */ -#define ADC_ExternalTrigConv_T8_CC1 ((uint32_t)0x00060000) /*!< For ADC3 only */ -#define ADC_ExternalTrigConv_T8_TRGO ((uint32_t)0x00080000) /*!< For ADC3 only */ -#define ADC_ExternalTrigConv_T5_CC1 ((uint32_t)0x000A0000) /*!< For ADC3 only */ -#define ADC_ExternalTrigConv_T5_CC3 ((uint32_t)0x000C0000) /*!< For ADC3 only */ - -#define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T1_CC1) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T1_CC2) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T1_CC3) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \ - ((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO) || \ - ((REGTRIG) == ADC_ExternalTrigConv_None) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T8_CC1) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T8_TRGO) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T5_CC1) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T5_CC3)) -/** - * @} - */ - -/** @defgroup ADC_data_align - * @{ - */ - -#define ADC_DataAlign_Right ((uint32_t)0x00000000) -#define ADC_DataAlign_Left ((uint32_t)0x00000800) -#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \ - ((ALIGN) == ADC_DataAlign_Left)) -/** - * @} - */ - -/** @defgroup ADC_channels - * @{ - */ - -#define ADC_Channel_0 ((uint8_t)0x00) -#define ADC_Channel_1 ((uint8_t)0x01) -#define ADC_Channel_2 ((uint8_t)0x02) -#define ADC_Channel_3 ((uint8_t)0x03) -#define ADC_Channel_4 ((uint8_t)0x04) -#define ADC_Channel_5 ((uint8_t)0x05) -#define ADC_Channel_6 ((uint8_t)0x06) -#define ADC_Channel_7 ((uint8_t)0x07) -#define ADC_Channel_8 ((uint8_t)0x08) -#define ADC_Channel_9 ((uint8_t)0x09) -#define ADC_Channel_10 ((uint8_t)0x0A) -#define ADC_Channel_11 ((uint8_t)0x0B) -#define ADC_Channel_12 ((uint8_t)0x0C) -#define ADC_Channel_13 ((uint8_t)0x0D) -#define ADC_Channel_14 ((uint8_t)0x0E) -#define ADC_Channel_15 ((uint8_t)0x0F) -#define ADC_Channel_16 ((uint8_t)0x10) -#define ADC_Channel_17 ((uint8_t)0x11) - -#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_Channel_0) || ((CHANNEL) == ADC_Channel_1) || \ - ((CHANNEL) == ADC_Channel_2) || ((CHANNEL) == ADC_Channel_3) || \ - ((CHANNEL) == ADC_Channel_4) || ((CHANNEL) == ADC_Channel_5) || \ - ((CHANNEL) == ADC_Channel_6) || ((CHANNEL) == ADC_Channel_7) || \ - ((CHANNEL) == ADC_Channel_8) || ((CHANNEL) == ADC_Channel_9) || \ - ((CHANNEL) == ADC_Channel_10) || ((CHANNEL) == ADC_Channel_11) || \ - ((CHANNEL) == ADC_Channel_12) || ((CHANNEL) == ADC_Channel_13) || \ - ((CHANNEL) == ADC_Channel_14) || ((CHANNEL) == ADC_Channel_15) || \ - ((CHANNEL) == ADC_Channel_16) || ((CHANNEL) == ADC_Channel_17)) -/** - * @} - */ - -/** @defgroup ADC_sampling_time - * @{ - */ - -#define ADC_SampleTime_1Cycles5 ((uint8_t)0x00) -#define ADC_SampleTime_7Cycles5 ((uint8_t)0x01) -#define ADC_SampleTime_13Cycles5 ((uint8_t)0x02) -#define ADC_SampleTime_28Cycles5 ((uint8_t)0x03) -#define ADC_SampleTime_41Cycles5 ((uint8_t)0x04) -#define ADC_SampleTime_55Cycles5 ((uint8_t)0x05) -#define ADC_SampleTime_71Cycles5 ((uint8_t)0x06) -#define ADC_SampleTime_239Cycles5 ((uint8_t)0x07) -#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_1Cycles5) || \ - ((TIME) == ADC_SampleTime_7Cycles5) || \ - ((TIME) == ADC_SampleTime_13Cycles5) || \ - ((TIME) == ADC_SampleTime_28Cycles5) || \ - ((TIME) == ADC_SampleTime_41Cycles5) || \ - ((TIME) == ADC_SampleTime_55Cycles5) || \ - ((TIME) == ADC_SampleTime_71Cycles5) || \ - ((TIME) == ADC_SampleTime_239Cycles5)) -/** - * @} - */ - -/** @defgroup ADC_external_trigger_sources_for_injected_channels_conversion - * @{ - */ - -#define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00002000) /*!< For ADC1 and ADC2 */ -#define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00003000) /*!< For ADC1 and ADC2 */ -#define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00004000) /*!< For ADC1 and ADC2 */ -#define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00005000) /*!< For ADC1 and ADC2 */ -#define ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 ((uint32_t)0x00006000) /*!< For ADC1 and ADC2 */ - -#define ADC_ExternalTrigInjecConv_T1_TRGO ((uint32_t)0x00000000) /*!< For ADC1, ADC2 and ADC3 */ -#define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00001000) /*!< For ADC1, ADC2 and ADC3 */ -#define ADC_ExternalTrigInjecConv_None ((uint32_t)0x00007000) /*!< For ADC1, ADC2 and ADC3 */ - -#define ADC_ExternalTrigInjecConv_T4_CC3 ((uint32_t)0x00002000) /*!< For ADC3 only */ -#define ADC_ExternalTrigInjecConv_T8_CC2 ((uint32_t)0x00003000) /*!< For ADC3 only */ -#define ADC_ExternalTrigInjecConv_T8_CC4 ((uint32_t)0x00004000) /*!< For ADC3 only */ -#define ADC_ExternalTrigInjecConv_T5_TRGO ((uint32_t)0x00005000) /*!< For ADC3 only */ -#define ADC_ExternalTrigInjecConv_T5_CC4 ((uint32_t)0x00006000) /*!< For ADC3 only */ - -#define IS_ADC_EXT_INJEC_TRIG(INJTRIG) (((INJTRIG) == ADC_ExternalTrigInjecConv_T1_TRGO) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T1_CC4) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_TRGO) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_CC1) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T3_CC4) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_TRGO) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_None) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC3) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC2) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC4) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_TRGO) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_CC4)) -/** - * @} - */ - -/** @defgroup ADC_injected_channel_selection - * @{ - */ - -#define ADC_InjectedChannel_1 ((uint8_t)0x14) -#define ADC_InjectedChannel_2 ((uint8_t)0x18) -#define ADC_InjectedChannel_3 ((uint8_t)0x1C) -#define ADC_InjectedChannel_4 ((uint8_t)0x20) -#define IS_ADC_INJECTED_CHANNEL(CHANNEL) (((CHANNEL) == ADC_InjectedChannel_1) || \ - ((CHANNEL) == ADC_InjectedChannel_2) || \ - ((CHANNEL) == ADC_InjectedChannel_3) || \ - ((CHANNEL) == ADC_InjectedChannel_4)) -/** - * @} - */ - -/** @defgroup ADC_analog_watchdog_selection - * @{ - */ - -#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200) -#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200) -#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200) -#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000) -#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000) -#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000) -#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000) - -#define IS_ADC_ANALOG_WATCHDOG(WATCHDOG) (((WATCHDOG) == ADC_AnalogWatchdog_SingleRegEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_SingleInjecEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_SingleRegOrInjecEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_AllRegEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_AllInjecEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_AllRegAllInjecEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_None)) -/** - * @} - */ - -/** @defgroup ADC_interrupts_definition - * @{ - */ - -#define ADC_IT_EOC ((uint16_t)0x0220) -#define ADC_IT_AWD ((uint16_t)0x0140) -#define ADC_IT_JEOC ((uint16_t)0x0480) - -#define IS_ADC_IT(IT) ((((IT) & (uint16_t)0xF81F) == 0x00) && ((IT) != 0x00)) - -#define IS_ADC_GET_IT(IT) (((IT) == ADC_IT_EOC) || ((IT) == ADC_IT_AWD) || \ - ((IT) == ADC_IT_JEOC)) -/** - * @} - */ - -/** @defgroup ADC_flags_definition - * @{ - */ - -#define ADC_FLAG_AWD ((uint8_t)0x01) -#define ADC_FLAG_EOC ((uint8_t)0x02) -#define ADC_FLAG_JEOC ((uint8_t)0x04) -#define ADC_FLAG_JSTRT ((uint8_t)0x08) -#define ADC_FLAG_STRT ((uint8_t)0x10) -#define IS_ADC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint8_t)0xE0) == 0x00) && ((FLAG) != 0x00)) -#define IS_ADC_GET_FLAG(FLAG) (((FLAG) == ADC_FLAG_AWD) || ((FLAG) == ADC_FLAG_EOC) || \ - ((FLAG) == ADC_FLAG_JEOC) || ((FLAG)== ADC_FLAG_JSTRT) || \ - ((FLAG) == ADC_FLAG_STRT)) -/** - * @} - */ - -/** @defgroup ADC_thresholds - * @{ - */ - -#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF) - -/** - * @} - */ - -/** @defgroup ADC_injected_offset - * @{ - */ - -#define IS_ADC_OFFSET(OFFSET) ((OFFSET) <= 0xFFF) - -/** - * @} - */ - -/** @defgroup ADC_injected_length - * @{ - */ - -#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x4)) - -/** - * @} - */ - -/** @defgroup ADC_injected_rank - * @{ - */ - -#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x4)) - -/** - * @} - */ - - -/** @defgroup ADC_regular_length - * @{ - */ - -#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x10)) -/** - * @} - */ - -/** @defgroup ADC_regular_rank - * @{ - */ - -#define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x10)) - -/** - * @} - */ - -/** @defgroup ADC_regular_discontinuous_mode_number - * @{ - */ - -#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= 0x1) && ((NUMBER) <= 0x8)) - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup ADC_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup ADC_Exported_Functions - * @{ - */ - -void ADC_DeInit(ADC_TypeDef* ADCx); -void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); -void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); -void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); -void ADC_ResetCalibration(ADC_TypeDef* ADCx); -FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx); -void ADC_StartCalibration(ADC_TypeDef* ADCx); -FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); -void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); -void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); -void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); -void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); -uint32_t ADC_GetDualModeConversionValue(void); -void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv); -void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx); -void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); -void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); -void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); -uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); -void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); -void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold); -void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); -void ADC_TempSensorVrefintCmd(FunctionalState NewState); -FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); -void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); -ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); -void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F10x_ADC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h deleted file mode 100644 index 8eba3b1736..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_bkp.h +++ /dev/null @@ -1,194 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_bkp.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the BKP firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_BKP_H -#define __STM32F10x_BKP_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup BKP - * @{ - */ - -/** @defgroup BKP_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup BKP_Exported_Constants - * @{ - */ - -/** @defgroup Tamper_Pin_active_level - * @{ - */ - -#define BKP_TamperPinLevel_High ((uint16_t)0x0000) -#define BKP_TamperPinLevel_Low ((uint16_t)0x0001) -#define IS_BKP_TAMPER_PIN_LEVEL(LEVEL) (((LEVEL) == BKP_TamperPinLevel_High) || \ - ((LEVEL) == BKP_TamperPinLevel_Low)) -/** - * @} - */ - -/** @defgroup RTC_output_source_to_output_on_the_Tamper_pin - * @{ - */ - -#define BKP_RTCOutputSource_None ((uint16_t)0x0000) -#define BKP_RTCOutputSource_CalibClock ((uint16_t)0x0080) -#define BKP_RTCOutputSource_Alarm ((uint16_t)0x0100) -#define BKP_RTCOutputSource_Second ((uint16_t)0x0300) -#define IS_BKP_RTC_OUTPUT_SOURCE(SOURCE) (((SOURCE) == BKP_RTCOutputSource_None) || \ - ((SOURCE) == BKP_RTCOutputSource_CalibClock) || \ - ((SOURCE) == BKP_RTCOutputSource_Alarm) || \ - ((SOURCE) == BKP_RTCOutputSource_Second)) -/** - * @} - */ - -/** @defgroup Data_Backup_Register - * @{ - */ - -#define BKP_DR1 ((uint16_t)0x0004) -#define BKP_DR2 ((uint16_t)0x0008) -#define BKP_DR3 ((uint16_t)0x000C) -#define BKP_DR4 ((uint16_t)0x0010) -#define BKP_DR5 ((uint16_t)0x0014) -#define BKP_DR6 ((uint16_t)0x0018) -#define BKP_DR7 ((uint16_t)0x001C) -#define BKP_DR8 ((uint16_t)0x0020) -#define BKP_DR9 ((uint16_t)0x0024) -#define BKP_DR10 ((uint16_t)0x0028) -#define BKP_DR11 ((uint16_t)0x0040) -#define BKP_DR12 ((uint16_t)0x0044) -#define BKP_DR13 ((uint16_t)0x0048) -#define BKP_DR14 ((uint16_t)0x004C) -#define BKP_DR15 ((uint16_t)0x0050) -#define BKP_DR16 ((uint16_t)0x0054) -#define BKP_DR17 ((uint16_t)0x0058) -#define BKP_DR18 ((uint16_t)0x005C) -#define BKP_DR19 ((uint16_t)0x0060) -#define BKP_DR20 ((uint16_t)0x0064) -#define BKP_DR21 ((uint16_t)0x0068) -#define BKP_DR22 ((uint16_t)0x006C) -#define BKP_DR23 ((uint16_t)0x0070) -#define BKP_DR24 ((uint16_t)0x0074) -#define BKP_DR25 ((uint16_t)0x0078) -#define BKP_DR26 ((uint16_t)0x007C) -#define BKP_DR27 ((uint16_t)0x0080) -#define BKP_DR28 ((uint16_t)0x0084) -#define BKP_DR29 ((uint16_t)0x0088) -#define BKP_DR30 ((uint16_t)0x008C) -#define BKP_DR31 ((uint16_t)0x0090) -#define BKP_DR32 ((uint16_t)0x0094) -#define BKP_DR33 ((uint16_t)0x0098) -#define BKP_DR34 ((uint16_t)0x009C) -#define BKP_DR35 ((uint16_t)0x00A0) -#define BKP_DR36 ((uint16_t)0x00A4) -#define BKP_DR37 ((uint16_t)0x00A8) -#define BKP_DR38 ((uint16_t)0x00AC) -#define BKP_DR39 ((uint16_t)0x00B0) -#define BKP_DR40 ((uint16_t)0x00B4) -#define BKP_DR41 ((uint16_t)0x00B8) -#define BKP_DR42 ((uint16_t)0x00BC) - -#define IS_BKP_DR(DR) (((DR) == BKP_DR1) || ((DR) == BKP_DR2) || ((DR) == BKP_DR3) || \ - ((DR) == BKP_DR4) || ((DR) == BKP_DR5) || ((DR) == BKP_DR6) || \ - ((DR) == BKP_DR7) || ((DR) == BKP_DR8) || ((DR) == BKP_DR9) || \ - ((DR) == BKP_DR10) || ((DR) == BKP_DR11) || ((DR) == BKP_DR12) || \ - ((DR) == BKP_DR13) || ((DR) == BKP_DR14) || ((DR) == BKP_DR15) || \ - ((DR) == BKP_DR16) || ((DR) == BKP_DR17) || ((DR) == BKP_DR18) || \ - ((DR) == BKP_DR19) || ((DR) == BKP_DR20) || ((DR) == BKP_DR21) || \ - ((DR) == BKP_DR22) || ((DR) == BKP_DR23) || ((DR) == BKP_DR24) || \ - ((DR) == BKP_DR25) || ((DR) == BKP_DR26) || ((DR) == BKP_DR27) || \ - ((DR) == BKP_DR28) || ((DR) == BKP_DR29) || ((DR) == BKP_DR30) || \ - ((DR) == BKP_DR31) || ((DR) == BKP_DR32) || ((DR) == BKP_DR33) || \ - ((DR) == BKP_DR34) || ((DR) == BKP_DR35) || ((DR) == BKP_DR36) || \ - ((DR) == BKP_DR37) || ((DR) == BKP_DR38) || ((DR) == BKP_DR39) || \ - ((DR) == BKP_DR40) || ((DR) == BKP_DR41) || ((DR) == BKP_DR42)) - -#define IS_BKP_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x7F) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup BKP_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup BKP_Exported_Functions - * @{ - */ - -void BKP_DeInit(void); -void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel); -void BKP_TamperPinCmd(FunctionalState NewState); -void BKP_ITConfig(FunctionalState NewState); -void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource); -void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue); -void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data); -uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR); -FlagStatus BKP_GetFlagStatus(void); -void BKP_ClearFlag(void); -ITStatus BKP_GetITStatus(void); -void BKP_ClearITPendingBit(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_BKP_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h deleted file mode 100644 index 900eb5e5fa..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_can.h +++ /dev/null @@ -1,535 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_can.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the CAN firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_CAN_H -#define __STM32F10x_CAN_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CAN - * @{ - */ - -/** @defgroup CAN_Exported_Types - * @{ - */ - -#define IS_CAN_ALL_PERIPH(PERIPH) (((PERIPH) == CAN1) || \ - ((PERIPH) == CAN2)) - -/** - * @brief CAN init structure definition - */ - -typedef struct -{ - uint16_t CAN_Prescaler; /*!< Specifies the length of a time quantum. It ranges from 1 to 1024. */ - - uint8_t CAN_Mode; /*!< Specifies the CAN operating mode. - This parameter can be a value of @ref CAN_operating_mode */ - - uint8_t CAN_SJW; /*!< Specifies the maximum number of time quanta the CAN hardware - is allowed to lengthen or shorten a bit to perform resynchronization. - This parameter can be a value of @ref CAN_synchronisation_jump_width */ - - uint8_t CAN_BS1; /*!< Specifies the number of time quanta in Bit Segment 1. - This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 */ - - uint8_t CAN_BS2; /*!< Specifies the number of time quanta in Bit Segment 2. - This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */ - - FunctionalState CAN_TTCM; /*!< Enable or disable the time triggered communication mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_ABOM; /*!< Enable or disable the automatic bus-off management. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_AWUM; /*!< Enable or disable the automatic wake-up mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_NART; /*!< Enable or disable the no-automatic retransmission mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_RFLM; /*!< Enable or disable the Receive FIFO Locked mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_TXFP; /*!< Enable or disable the transmit FIFO priority. - This parameter can be set either to ENABLE or DISABLE. */ -} CAN_InitTypeDef; - -/** - * @brief CAN filter init structure definition - */ - -typedef struct -{ - uint16_t CAN_FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bit - configuration, first one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bit - configuration, second one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number, - according to the mode (MSBs for a 32-bit configuration, - first one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterMaskIdLow; /*!< Specifies the filter mask number or identification number, - according to the mode (LSBs for a 32-bit configuration, - second one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter. - This parameter can be a value of @ref CAN_filter_FIFO */ - - uint8_t CAN_FilterNumber; /*!< Specifies the filter which will be initialized. It ranges from 0 to 13. */ - - uint8_t CAN_FilterMode; /*!< Specifies the filter mode to be initialized. - This parameter can be a value of @ref CAN_filter_mode */ - - uint8_t CAN_FilterScale; /*!< Specifies the filter scale. - This parameter can be a value of @ref CAN_filter_scale */ - - FunctionalState CAN_FilterActivation; /*!< Enable or disable the filter. - This parameter can be set either to ENABLE or DISABLE. */ -} CAN_FilterInitTypeDef; - -/** - * @brief CAN Tx message structure definition - */ - -typedef struct -{ - uint32_t StdId; /*!< Specifies the standard identifier. - This parameter can be a value between 0 to 0x7FF. */ - - uint32_t ExtId; /*!< Specifies the extended identifier. - This parameter can be a value between 0 to 0x1FFFFFFF. */ - - uint8_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted. - This parameter can be a value of @ref CAN_identifier_type */ - - uint8_t RTR; /*!< Specifies the type of frame for the message that will be transmitted. - This parameter can be a value of @ref CAN_remote_transmission_request */ - - uint8_t DLC; /*!< Specifies the length of the frame that will be transmitted. - This parameter can be a value between 0 to 8 */ - - uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 to 0xFF. */ -} CanTxMsg; - -/** - * @brief CAN Rx message structure definition - */ - -typedef struct -{ - uint32_t StdId; /*!< Specifies the standard identifier. - This parameter can be a value between 0 to 0x7FF. */ - - uint32_t ExtId; /*!< Specifies the extended identifier. - This parameter can be a value between 0 to 0x1FFFFFFF. */ - - uint8_t IDE; /*!< Specifies the type of identifier for the message that will be received. - This parameter can be a value of @ref CAN_identifier_type */ - - uint8_t RTR; /*!< Specifies the type of frame for the received message. - This parameter can be a value of @ref CAN_remote_transmission_request */ - - uint8_t DLC; /*!< Specifies the length of the frame that will be received. - This parameter can be a value between 0 to 8 */ - - uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to 0xFF. */ - - uint8_t FMI; /*!< Specifies the index of the filter the message stored in the mailbox passes through. - This parameter can be a value between 0 to 0xFF */ -} CanRxMsg; - -/** - * @} - */ - -/** @defgroup CAN_Exported_Constants - * @{ - */ - -/** @defgroup CAN_sleep_constants - * @{ - */ - -#define CANINITFAILED ((uint8_t)0x00) /*!< CAN initialization failed */ -#define CANINITOK ((uint8_t)0x01) /*!< CAN initialization failed */ - -/** - * @} - */ - -/** @defgroup CAN_operating_mode - * @{ - */ - -#define CAN_Mode_Normal ((uint8_t)0x00) /*!< normal mode */ -#define CAN_Mode_LoopBack ((uint8_t)0x01) /*!< loopback mode */ -#define CAN_Mode_Silent ((uint8_t)0x02) /*!< silent mode */ -#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /*!< loopback combined with silent mode */ - -#define IS_CAN_MODE(MODE) (((MODE) == CAN_Mode_Normal) || ((MODE) == CAN_Mode_LoopBack)|| \ - ((MODE) == CAN_Mode_Silent) || ((MODE) == CAN_Mode_Silent_LoopBack)) -/** - * @} - */ - -/** @defgroup CAN_synchronisation_jump_width - * @{ - */ - -#define CAN_SJW_1tq ((uint8_t)0x00) /*!< 1 time quantum */ -#define CAN_SJW_2tq ((uint8_t)0x01) /*!< 2 time quantum */ -#define CAN_SJW_3tq ((uint8_t)0x02) /*!< 3 time quantum */ -#define CAN_SJW_4tq ((uint8_t)0x03) /*!< 4 time quantum */ - -#define IS_CAN_SJW(SJW) (((SJW) == CAN_SJW_1tq) || ((SJW) == CAN_SJW_2tq)|| \ - ((SJW) == CAN_SJW_3tq) || ((SJW) == CAN_SJW_4tq)) -/** - * @} - */ - -/** @defgroup CAN_time_quantum_in_bit_segment_1 - * @{ - */ - -#define CAN_BS1_1tq ((uint8_t)0x00) /*!< 1 time quantum */ -#define CAN_BS1_2tq ((uint8_t)0x01) /*!< 2 time quantum */ -#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ -#define CAN_BS1_4tq ((uint8_t)0x03) /*!< 4 time quantum */ -#define CAN_BS1_5tq ((uint8_t)0x04) /*!< 5 time quantum */ -#define CAN_BS1_6tq ((uint8_t)0x05) /*!< 6 time quantum */ -#define CAN_BS1_7tq ((uint8_t)0x06) /*!< 7 time quantum */ -#define CAN_BS1_8tq ((uint8_t)0x07) /*!< 8 time quantum */ -#define CAN_BS1_9tq ((uint8_t)0x08) /*!< 9 time quantum */ -#define CAN_BS1_10tq ((uint8_t)0x09) /*!< 10 time quantum */ -#define CAN_BS1_11tq ((uint8_t)0x0A) /*!< 11 time quantum */ -#define CAN_BS1_12tq ((uint8_t)0x0B) /*!< 12 time quantum */ -#define CAN_BS1_13tq ((uint8_t)0x0C) /*!< 13 time quantum */ -#define CAN_BS1_14tq ((uint8_t)0x0D) /*!< 14 time quantum */ -#define CAN_BS1_15tq ((uint8_t)0x0E) /*!< 15 time quantum */ -#define CAN_BS1_16tq ((uint8_t)0x0F) /*!< 16 time quantum */ - -#define IS_CAN_BS1(BS1) ((BS1) <= CAN_BS1_16tq) -/** - * @} - */ - -/** @defgroup CAN_time_quantum_in_bit_segment_2 - * @{ - */ - -#define CAN_BS2_1tq ((uint8_t)0x00) /*!< 1 time quantum */ -#define CAN_BS2_2tq ((uint8_t)0x01) /*!< 2 time quantum */ -#define CAN_BS2_3tq ((uint8_t)0x02) /*!< 3 time quantum */ -#define CAN_BS2_4tq ((uint8_t)0x03) /*!< 4 time quantum */ -#define CAN_BS2_5tq ((uint8_t)0x04) /*!< 5 time quantum */ -#define CAN_BS2_6tq ((uint8_t)0x05) /*!< 6 time quantum */ -#define CAN_BS2_7tq ((uint8_t)0x06) /*!< 7 time quantum */ -#define CAN_BS2_8tq ((uint8_t)0x07) /*!< 8 time quantum */ - -#define IS_CAN_BS2(BS2) ((BS2) <= CAN_BS2_8tq) - -/** - * @} - */ - -/** @defgroup CAN_clock_prescaler - * @{ - */ - -#define IS_CAN_PRESCALER(PRESCALER) (((PRESCALER) >= 1) && ((PRESCALER) <= 1024)) - -/** - * @} - */ - -/** @defgroup CAN_filter_number - * @{ - */ -#ifndef STM32F10X_CL - #define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 13) -#else - #define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 27) -#endif /* STM32F10X_CL */ -/** - * @} - */ - -/** @defgroup CAN_filter_mode - * @{ - */ - -#define CAN_FilterMode_IdMask ((uint8_t)0x00) /*!< id/mask mode */ -#define CAN_FilterMode_IdList ((uint8_t)0x01) /*!< identifier list mode */ - -#define IS_CAN_FILTER_MODE(MODE) (((MODE) == CAN_FilterMode_IdMask) || \ - ((MODE) == CAN_FilterMode_IdList)) -/** - * @} - */ - -/** @defgroup CAN_filter_scale - * @{ - */ - -#define CAN_FilterScale_16bit ((uint8_t)0x00) /*!< Two 16-bit filters */ -#define CAN_FilterScale_32bit ((uint8_t)0x01) /*!< One 32-bit filter */ - -#define IS_CAN_FILTER_SCALE(SCALE) (((SCALE) == CAN_FilterScale_16bit) || \ - ((SCALE) == CAN_FilterScale_32bit)) - -/** - * @} - */ - -/** @defgroup CAN_filter_FIFO - * @{ - */ - -#define CAN_FilterFIFO0 ((uint8_t)0x00) /*!< Filter FIFO 0 assignment for filter x */ -#define CAN_FilterFIFO1 ((uint8_t)0x01) /*!< Filter FIFO 1 assignment for filter x */ -#define IS_CAN_FILTER_FIFO(FIFO) (((FIFO) == CAN_FilterFIFO0) || \ - ((FIFO) == CAN_FilterFIFO1)) - -/** - * @} - */ - -/** @defgroup Start_bank_filter_for_slave_CAN - * @{ - */ -#define IS_CAN_BANKNUMBER(BANKNUMBER) (((BANKNUMBER) >= 1) && ((BANKNUMBER) <= 27)) -/** - * @} - */ - -/** @defgroup CAN_Tx - * @{ - */ - -#define IS_CAN_TRANSMITMAILBOX(TRANSMITMAILBOX) ((TRANSMITMAILBOX) <= ((uint8_t)0x02)) -#define IS_CAN_STDID(STDID) ((STDID) <= ((uint32_t)0x7FF)) -#define IS_CAN_EXTID(EXTID) ((EXTID) <= ((uint32_t)0x1FFFFFFF)) -#define IS_CAN_DLC(DLC) ((DLC) <= ((uint8_t)0x08)) - -/** - * @} - */ - -/** @defgroup CAN_identifier_type - * @{ - */ - -#define CAN_ID_STD ((uint32_t)0x00000000) /*!< Standard Id */ -#define CAN_ID_EXT ((uint32_t)0x00000004) /*!< Extended Id */ -#define IS_CAN_IDTYPE(IDTYPE) (((IDTYPE) == CAN_ID_STD) || ((IDTYPE) == CAN_ID_EXT)) - -/** - * @} - */ - -/** @defgroup CAN_remote_transmission_request - * @{ - */ - -#define CAN_RTR_DATA ((uint32_t)0x00000000) /*!< Data frame */ -#define CAN_RTR_REMOTE ((uint32_t)0x00000002) /*!< Remote frame */ -#define IS_CAN_RTR(RTR) (((RTR) == CAN_RTR_DATA) || ((RTR) == CAN_RTR_REMOTE)) - -/** - * @} - */ - -/** @defgroup CAN_transmit_constants - * @{ - */ - -#define CANTXFAILED ((uint8_t)0x00) /*!< CAN transmission failed */ -#define CANTXOK ((uint8_t)0x01) /*!< CAN transmission succeeded */ -#define CANTXPENDING ((uint8_t)0x02) /*!< CAN transmission pending */ -#define CAN_NO_MB ((uint8_t)0x04) /*!< CAN cell did not provide an empty mailbox */ - -/** - * @} - */ - -/** @defgroup CAN_receive_FIFO_number_constants - * @{ - */ - -#define CAN_FIFO0 ((uint8_t)0x00) /*!< CAN FIFO0 used to receive */ -#define CAN_FIFO1 ((uint8_t)0x01) /*!< CAN FIFO1 used to receive */ - -#define IS_CAN_FIFO(FIFO) (((FIFO) == CAN_FIFO0) || ((FIFO) == CAN_FIFO1)) - -/** - * @} - */ - -/** @defgroup CAN_sleep_constants - * @{ - */ - -#define CANSLEEPFAILED ((uint8_t)0x00) /*!< CAN did not enter the sleep mode */ -#define CANSLEEPOK ((uint8_t)0x01) /*!< CAN entered the sleep mode */ - -/** - * @} - */ - -/** @defgroup CAN_wake_up_constants - * @{ - */ - -#define CANWAKEUPFAILED ((uint8_t)0x00) /*!< CAN did not leave the sleep mode */ -#define CANWAKEUPOK ((uint8_t)0x01) /*!< CAN leaved the sleep mode */ - -/** - * @} - */ - -/** @defgroup CAN_flags - * @{ - */ - -#define CAN_FLAG_EWG ((uint32_t)0x00000001) /*!< Error Warning Flag */ -#define CAN_FLAG_EPV ((uint32_t)0x00000002) /*!< Error Passive Flag */ -#define CAN_FLAG_BOF ((uint32_t)0x00000004) /*!< Bus-Off Flag */ - -#define IS_CAN_FLAG(FLAG) (((FLAG) == CAN_FLAG_EWG) || ((FLAG) == CAN_FLAG_EPV) ||\ - ((FLAG) == CAN_FLAG_BOF)) - -/** - * @} - */ - -/** @defgroup CAN_interrupts - * @{ - */ - -#define CAN_IT_RQCP0 ((uint32_t)0x00000005) /*!< Request completed mailbox 0 */ -#define CAN_IT_RQCP1 ((uint32_t)0x00000006) /*!< Request completed mailbox 1 */ -#define CAN_IT_RQCP2 ((uint32_t)0x00000007) /*!< Request completed mailbox 2 */ -#define CAN_IT_TME ((uint32_t)0x00000001) /*!< Transmit mailbox empty */ -#define CAN_IT_FMP0 ((uint32_t)0x00000002) /*!< FIFO 0 message pending */ -#define CAN_IT_FF0 ((uint32_t)0x00000004) /*!< FIFO 0 full */ -#define CAN_IT_FOV0 ((uint32_t)0x00000008) /*!< FIFO 0 overrun */ -#define CAN_IT_FMP1 ((uint32_t)0x00000010) /*!< FIFO 1 message pending */ -#define CAN_IT_FF1 ((uint32_t)0x00000020) /*!< FIFO 1 full */ -#define CAN_IT_FOV1 ((uint32_t)0x00000040) /*!< FIFO 1 overrun */ -#define CAN_IT_EWG ((uint32_t)0x00000100) /*!< Error warning */ -#define CAN_IT_EPV ((uint32_t)0x00000200) /*!< Error passive */ -#define CAN_IT_BOF ((uint32_t)0x00000400) /*!< Bus-off */ -#define CAN_IT_LEC ((uint32_t)0x00000800) /*!< Last error code */ -#define CAN_IT_ERR ((uint32_t)0x00008000) /*!< Error */ -#define CAN_IT_WKU ((uint32_t)0x00010000) /*!< Wake-up */ -#define CAN_IT_SLK ((uint32_t)0x00020000) /*!< Sleep */ - -#define IS_CAN_ITConfig(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FMP0) ||\ - ((IT) == CAN_IT_FF0) || ((IT) == CAN_IT_FOV0) ||\ - ((IT) == CAN_IT_FMP1) || ((IT) == CAN_IT_FF1) ||\ - ((IT) == CAN_IT_FOV1) || ((IT) == CAN_IT_EWG) ||\ - ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ - ((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||\ - ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) - -#define IS_CAN_ITStatus(IT) (((IT) == CAN_IT_RQCP0) || ((IT) == CAN_IT_RQCP1) ||\ - ((IT) == CAN_IT_RQCP2) || ((IT) == CAN_IT_FF0) ||\ - ((IT) == CAN_IT_FOV0) || ((IT) == CAN_IT_FF1) ||\ - ((IT) == CAN_IT_FOV1) || ((IT) == CAN_IT_EWG) ||\ - ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ - ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup CAN_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup CAN_Exported_Functions - * @{ - */ - -void CAN_DeInit(CAN_TypeDef* CANx); -uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct); -void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct); -void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct); -void CAN_SlaveStartBank(uint8_t CAN_BankNumber); -void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState); -uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage); -uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox); -void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox); -void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber); -uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber); -void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage); -void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState); -uint8_t CAN_Sleep(CAN_TypeDef* CANx); -uint8_t CAN_WakeUp(CAN_TypeDef* CANx); -FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG); -void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG); -ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT); -void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_CAN_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h deleted file mode 100644 index 8210ce55ac..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h +++ /dev/null @@ -1,209 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_cec.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the CEC firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_CEC_H -#define __STM32F10x_CEC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CEC - * @{ - */ - - -/** @defgroup CEC_Exported_Types - * @{ - */ - -/** - * @brief CEC Init structure definition - */ -typedef struct -{ - uint16_t CEC_BitTimingMode; /*!< Configures the CEC Bit Timing Error Mode. - This parameter can be a value of @ref CEC_BitTiming_Mode */ - uint16_t CEC_BitPeriodMode; /*!< Configures the CEC Bit Period Error Mode. - This parameter can be a value of @ref CEC_BitPeriod_Mode */ -}CEC_InitTypeDef; - -/** - * @} - */ - -/** @defgroup CEC_Exported_Constants - * @{ - */ - -/** @defgroup CEC_BitTiming_Mode - * @{ - */ -#define CEC_BitTimingStdMode ((uint16_t)0x00) /*!< Bit timing error Standard Mode */ -#define CEC_BitTimingErrFreeMode CEC_CFGR_BTEM /*!< Bit timing error Free Mode */ - -#define IS_CEC_BIT_TIMING_ERROR_MODE(MODE) (((MODE) == CEC_BitTimingStdMode) || \ - ((MODE) == CEC_BitTimingErrFreeMode)) -/** - * @} - */ - -/** @defgroup CEC_BitPeriod_Mode - * @{ - */ -#define CEC_BitPeriodStdMode ((uint16_t)0x00) /*!< Bit period error Standard Mode */ -#define CEC_BitPeriodFlexibleMode CEC_CFGR_BPEM /*!< Bit period error Flexible Mode */ - -#define IS_CEC_BIT_PERIOD_ERROR_MODE(MODE) (((MODE) == CEC_BitPeriodStdMode) || \ - ((MODE) == CEC_BitPeriodFlexibleMode)) -/** - * @} - */ - - -/** @defgroup CEC_interrupts_definition - * @{ - */ -#define CEC_IT_TERR CEC_CSR_TERR -#define CEC_IT_TBTRF CEC_CSR_TBTRF -#define CEC_IT_RERR CEC_CSR_RERR -#define CEC_IT_RBTF CEC_CSR_RBTF -#define IS_CEC_GET_IT(IT) (((IT) == CEC_IT_TERR) || ((IT) == CEC_IT_TBTRF) || \ - ((IT) == CEC_IT_RERR) || ((IT) == CEC_IT_RBTF)) -/** - * @} - */ - - -/** @defgroup CEC_Own_Addres - * @{ - */ -#define IS_CEC_ADDRESS(ADDRESS) ((ADDRESS) < 0x10) -/** - * @} - */ - -/** @defgroup CEC_Prescaler - * @{ - */ -#define IS_CEC_PRESCALER(PRESCALER) ((PRESCALER) <= 0x3FFF) - -/** - * @} - */ - -/** @defgroup CEC_flags_definition - * @{ - */ - -/** - * @brief ESR register flags - */ -#define CEC_FLAG_BTE ((uint32_t)0x10010000) -#define CEC_FLAG_BPE ((uint32_t)0x10020000) -#define CEC_FLAG_RBTFE ((uint32_t)0x10040000) -#define CEC_FLAG_SBE ((uint32_t)0x10080000) -#define CEC_FLAG_ACKE ((uint32_t)0x10100000) -#define CEC_FLAG_LINE ((uint32_t)0x10200000) -#define CEC_FLAG_TBTFE ((uint32_t)0x10400000) - -/** - * @brief CSR register flags - */ -#define CEC_FLAG_TEOM ((uint32_t)0x00000002) -#define CEC_FLAG_TERR ((uint32_t)0x00000004) -#define CEC_FLAG_TBTRF ((uint32_t)0x00000008) -#define CEC_FLAG_RSOM ((uint32_t)0x00000010) -#define CEC_FLAG_REOM ((uint32_t)0x00000020) -#define CEC_FLAG_RERR ((uint32_t)0x00000040) -#define CEC_FLAG_RBTF ((uint32_t)0x00000080) - -#define IS_CEC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFF03) == 0x00) && ((FLAG) != 0x00)) - -#define IS_CEC_GET_FLAG(FLAG) (((FLAG) == CEC_FLAG_BTE) || ((FLAG) == CEC_FLAG_BPE) || \ - ((FLAG) == CEC_FLAG_RBTFE) || ((FLAG)== CEC_FLAG_SBE) || \ - ((FLAG) == CEC_FLAG_ACKE) || ((FLAG) == CEC_FLAG_LINE) || \ - ((FLAG) == CEC_FLAG_TBTFE) || ((FLAG) == CEC_FLAG_TEOM) || \ - ((FLAG) == CEC_FLAG_TERR) || ((FLAG) == CEC_FLAG_TBTRF) || \ - ((FLAG) == CEC_FLAG_RSOM) || ((FLAG) == CEC_FLAG_REOM) || \ - ((FLAG) == CEC_FLAG_RERR) || ((FLAG) == CEC_FLAG_RBTF)) - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup CEC_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup CEC_Exported_Functions - * @{ - */ -void CEC_DeInit(void); -void CEC_Init(CEC_InitTypeDef* CEC_InitStruct); -void CEC_Cmd(FunctionalState NewState); -void CEC_ITConfig(FunctionalState NewState); -void CEC_OwnAddressConfig(uint8_t CEC_OwnAddress); -void CEC_SetPrescaler(uint16_t CEC_Prescaler); -void CEC_SendDataByte(uint8_t Data); -uint8_t CEC_ReceiveDataByte(void); -void CEC_StartOfMessage(void); -void CEC_EndOfMessageCmd(FunctionalState NewState); -FlagStatus CEC_GetFlagStatus(uint32_t CEC_FLAG); -void CEC_ClearFlag(uint32_t CEC_FLAG); -ITStatus CEC_GetITStatus(uint8_t CEC_IT); -void CEC_ClearITPendingBit(uint16_t CEC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_CEC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h deleted file mode 100644 index b65170ceaf..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_crc.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_crc.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the CRC firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_CRC_H -#define __STM32F10x_CRC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CRC - * @{ - */ - -/** @defgroup CRC_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup CRC_Exported_Constants - * @{ - */ - -/** - * @} - */ - -/** @defgroup CRC_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup CRC_Exported_Functions - * @{ - */ - -void CRC_ResetDR(void); -uint32_t CRC_CalcCRC(uint32_t Data); -uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); -uint32_t CRC_GetCRC(void); -void CRC_SetIDRegister(uint8_t IDValue); -uint8_t CRC_GetIDRegister(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_CRC_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h deleted file mode 100644 index fb6b543f4b..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dac.h +++ /dev/null @@ -1,316 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_dac.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the DAC firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_DAC_H -#define __STM32F10x_DAC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DAC - * @{ - */ - -/** @defgroup DAC_Exported_Types - * @{ - */ - -/** - * @brief DAC Init structure definition - */ - -typedef struct -{ - uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel. - This parameter can be a value of @ref DAC_trigger_selection */ - - uint32_t DAC_WaveGeneration; /*!< Specifies whether DAC channel noise waves or triangle waves - are generated, or whether no wave is generated. - This parameter can be a value of @ref DAC_wave_generation */ - - uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< Specifies the LFSR mask for noise wave generation or - the maximum amplitude triangle generation for the DAC channel. - This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */ - - uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled. - This parameter can be a value of @ref DAC_output_buffer */ -}DAC_InitTypeDef; - -/** - * @} - */ - -/** @defgroup DAC_Exported_Constants - * @{ - */ - -/** @defgroup DAC_trigger_selection - * @{ - */ - -#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register - has been loaded, and not by external trigger */ -#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_T8_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel - only in High-density devices*/ -#define DAC_Trigger_T3_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel - only in Connectivity line, Medium-density and Low-density Value Line devices */ -#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_T5_TRGO ((uint32_t)0x0000001C) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_T15_TRGO ((uint32_t)0x0000001C) /*!< TIM15 TRGO selected as external conversion trigger for DAC channel - only in Medium-density and Low-density Value Line devices*/ -#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */ - -#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_Trigger_None) || \ - ((TRIGGER) == DAC_Trigger_T6_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T8_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T7_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T5_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T2_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T4_TRGO) || \ - ((TRIGGER) == DAC_Trigger_Ext_IT9) || \ - ((TRIGGER) == DAC_Trigger_Software)) - -/** - * @} - */ - -/** @defgroup DAC_wave_generation - * @{ - */ - -#define DAC_WaveGeneration_None ((uint32_t)0x00000000) -#define DAC_WaveGeneration_Noise ((uint32_t)0x00000040) -#define DAC_WaveGeneration_Triangle ((uint32_t)0x00000080) -#define IS_DAC_GENERATE_WAVE(WAVE) (((WAVE) == DAC_WaveGeneration_None) || \ - ((WAVE) == DAC_WaveGeneration_Noise) || \ - ((WAVE) == DAC_WaveGeneration_Triangle)) -/** - * @} - */ - -/** @defgroup DAC_lfsrunmask_triangleamplitude - * @{ - */ - -#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ -#define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000100) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000200) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000300) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000400) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000500) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000600) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000700) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000800) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000900) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x00000A00) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x00000B00) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ -#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000) /*!< Select max triangle amplitude of 1 */ -#define DAC_TriangleAmplitude_3 ((uint32_t)0x00000100) /*!< Select max triangle amplitude of 3 */ -#define DAC_TriangleAmplitude_7 ((uint32_t)0x00000200) /*!< Select max triangle amplitude of 7 */ -#define DAC_TriangleAmplitude_15 ((uint32_t)0x00000300) /*!< Select max triangle amplitude of 15 */ -#define DAC_TriangleAmplitude_31 ((uint32_t)0x00000400) /*!< Select max triangle amplitude of 31 */ -#define DAC_TriangleAmplitude_63 ((uint32_t)0x00000500) /*!< Select max triangle amplitude of 63 */ -#define DAC_TriangleAmplitude_127 ((uint32_t)0x00000600) /*!< Select max triangle amplitude of 127 */ -#define DAC_TriangleAmplitude_255 ((uint32_t)0x00000700) /*!< Select max triangle amplitude of 255 */ -#define DAC_TriangleAmplitude_511 ((uint32_t)0x00000800) /*!< Select max triangle amplitude of 511 */ -#define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000900) /*!< Select max triangle amplitude of 1023 */ -#define DAC_TriangleAmplitude_2047 ((uint32_t)0x00000A00) /*!< Select max triangle amplitude of 2047 */ -#define DAC_TriangleAmplitude_4095 ((uint32_t)0x00000B00) /*!< Select max triangle amplitude of 4095 */ - -#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUnmask_Bit0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits1_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits2_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits3_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits4_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits5_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits6_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits7_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits8_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits9_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits10_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits11_0) || \ - ((VALUE) == DAC_TriangleAmplitude_1) || \ - ((VALUE) == DAC_TriangleAmplitude_3) || \ - ((VALUE) == DAC_TriangleAmplitude_7) || \ - ((VALUE) == DAC_TriangleAmplitude_15) || \ - ((VALUE) == DAC_TriangleAmplitude_31) || \ - ((VALUE) == DAC_TriangleAmplitude_63) || \ - ((VALUE) == DAC_TriangleAmplitude_127) || \ - ((VALUE) == DAC_TriangleAmplitude_255) || \ - ((VALUE) == DAC_TriangleAmplitude_511) || \ - ((VALUE) == DAC_TriangleAmplitude_1023) || \ - ((VALUE) == DAC_TriangleAmplitude_2047) || \ - ((VALUE) == DAC_TriangleAmplitude_4095)) -/** - * @} - */ - -/** @defgroup DAC_output_buffer - * @{ - */ - -#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) -#define DAC_OutputBuffer_Disable ((uint32_t)0x00000002) -#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OutputBuffer_Enable) || \ - ((STATE) == DAC_OutputBuffer_Disable)) -/** - * @} - */ - -/** @defgroup DAC_Channel_selection - * @{ - */ - -#define DAC_Channel_1 ((uint32_t)0x00000000) -#define DAC_Channel_2 ((uint32_t)0x00000010) -#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_Channel_1) || \ - ((CHANNEL) == DAC_Channel_2)) -/** - * @} - */ - -/** @defgroup DAC_data_alignement - * @{ - */ - -#define DAC_Align_12b_R ((uint32_t)0x00000000) -#define DAC_Align_12b_L ((uint32_t)0x00000004) -#define DAC_Align_8b_R ((uint32_t)0x00000008) -#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_Align_12b_R) || \ - ((ALIGN) == DAC_Align_12b_L) || \ - ((ALIGN) == DAC_Align_8b_R)) -/** - * @} - */ - -/** @defgroup DAC_wave_generation - * @{ - */ - -#define DAC_Wave_Noise ((uint32_t)0x00000040) -#define DAC_Wave_Triangle ((uint32_t)0x00000080) -#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_Wave_Noise) || \ - ((WAVE) == DAC_Wave_Triangle)) -/** - * @} - */ - -/** @defgroup DAC_data - * @{ - */ - -#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0) -/** - * @} - */ -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -/** @defgroup DAC_interrupts_definition - * @{ - */ - -#define DAC_IT_DMAUDR ((uint32_t)0x00002000) -#define IS_DAC_IT(IT) (((IT) == DAC_IT_DMAUDR)) - -/** - * @} - */ - -/** @defgroup DAC_flags_definition - * @{ - */ - -#define DAC_FLAG_DMAUDR ((uint32_t)0x00002000) -#define IS_DAC_FLAG(FLAG) (((FLAG) == DAC_FLAG_DMAUDR)) - -/** - * @} - */ -#endif - -/** - * @} - */ - -/** @defgroup DAC_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup DAC_Exported_Functions - * @{ - */ - -void DAC_DeInit(void); -void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct); -void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct); -void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState); -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState); -#endif -void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState); -void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState); -void DAC_DualSoftwareTriggerCmd(FunctionalState NewState); -void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState); -void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); -void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data); -void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); -uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel); -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG); -void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG); -ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT); -void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F10x_DAC_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h deleted file mode 100644 index 917334b1d1..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dbgmcu.h +++ /dev/null @@ -1,112 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_dbgmcu.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the DBGMCU - * firmware library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_DBGMCU_H -#define __STM32F10x_DBGMCU_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DBGMCU - * @{ - */ - -/** @defgroup DBGMCU_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup DBGMCU_Exported_Constants - * @{ - */ - -#define DBGMCU_SLEEP ((uint32_t)0x00000001) -#define DBGMCU_STOP ((uint32_t)0x00000002) -#define DBGMCU_STANDBY ((uint32_t)0x00000004) -#define DBGMCU_IWDG_STOP ((uint32_t)0x00000100) -#define DBGMCU_WWDG_STOP ((uint32_t)0x00000200) -#define DBGMCU_TIM1_STOP ((uint32_t)0x00000400) -#define DBGMCU_TIM2_STOP ((uint32_t)0x00000800) -#define DBGMCU_TIM3_STOP ((uint32_t)0x00001000) -#define DBGMCU_TIM4_STOP ((uint32_t)0x00002000) -#define DBGMCU_CAN1_STOP ((uint32_t)0x00004000) -#define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00008000) -#define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00010000) -#define DBGMCU_TIM8_STOP ((uint32_t)0x00020000) -#define DBGMCU_TIM5_STOP ((uint32_t)0x00040000) -#define DBGMCU_TIM6_STOP ((uint32_t)0x00080000) -#define DBGMCU_TIM7_STOP ((uint32_t)0x00100000) -#define DBGMCU_CAN2_STOP ((uint32_t)0x00200000) -#define DBGMCU_TIM15_STOP ((uint32_t)0x00400000) -#define DBGMCU_TIM16_STOP ((uint32_t)0x00800000) -#define DBGMCU_TIM17_STOP ((uint32_t)0x01000000) - -#define IS_DBGMCU_PERIPH(PERIPH) ((((PERIPH) & 0xFE0000F8) == 0x00) && ((PERIPH) != 0x00)) -/** - * @} - */ - -/** @defgroup DBGMCU_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup DBGMCU_Exported_Functions - * @{ - */ - -uint32_t DBGMCU_GetREVID(void); -uint32_t DBGMCU_GetDEVID(void); -void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_DBGMCU_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h deleted file mode 100644 index 6240aa5b44..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_dma.h +++ /dev/null @@ -1,437 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_dma.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the DMA firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_DMA_H -#define __STM32F10x_DMA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DMA - * @{ - */ - -/** @defgroup DMA_Exported_Types - * @{ - */ - -/** - * @brief DMA Init structure definition - */ - -typedef struct -{ - uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */ - - uint32_t DMA_MemoryBaseAddr; /*!< Specifies the memory base address for DMAy Channelx. */ - - uint32_t DMA_DIR; /*!< Specifies if the peripheral is the source or destination. - This parameter can be a value of @ref DMA_data_transfer_direction */ - - uint32_t DMA_BufferSize; /*!< Specifies the buffer size, in data unit, of the specified Channel. - The data unit is equal to the configuration set in DMA_PeripheralDataSize - or DMA_MemoryDataSize members depending in the transfer direction. */ - - uint32_t DMA_PeripheralInc; /*!< Specifies whether the Peripheral address register is incremented or not. - This parameter can be a value of @ref DMA_peripheral_incremented_mode */ - - uint32_t DMA_MemoryInc; /*!< Specifies whether the memory address register is incremented or not. - This parameter can be a value of @ref DMA_memory_incremented_mode */ - - uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width. - This parameter can be a value of @ref DMA_peripheral_data_size */ - - uint32_t DMA_MemoryDataSize; /*!< Specifies the Memory data width. - This parameter can be a value of @ref DMA_memory_data_size */ - - uint32_t DMA_Mode; /*!< Specifies the operation mode of the DMAy Channelx. - This parameter can be a value of @ref DMA_circular_normal_mode. - @note: The circular buffer mode cannot be used if the memory-to-memory - data transfer is configured on the selected Channel */ - - uint32_t DMA_Priority; /*!< Specifies the software priority for the DMAy Channelx. - This parameter can be a value of @ref DMA_priority_level */ - - uint32_t DMA_M2M; /*!< Specifies if the DMAy Channelx will be used in memory-to-memory transfer. - This parameter can be a value of @ref DMA_memory_to_memory */ -}DMA_InitTypeDef; - -/** - * @} - */ - -/** @defgroup DMA_Exported_Constants - * @{ - */ - -#define IS_DMA_ALL_PERIPH(PERIPH) (((PERIPH) == DMA1_Channel1) || \ - ((PERIPH) == DMA1_Channel2) || \ - ((PERIPH) == DMA1_Channel3) || \ - ((PERIPH) == DMA1_Channel4) || \ - ((PERIPH) == DMA1_Channel5) || \ - ((PERIPH) == DMA1_Channel6) || \ - ((PERIPH) == DMA1_Channel7) || \ - ((PERIPH) == DMA2_Channel1) || \ - ((PERIPH) == DMA2_Channel2) || \ - ((PERIPH) == DMA2_Channel3) || \ - ((PERIPH) == DMA2_Channel4) || \ - ((PERIPH) == DMA2_Channel5)) - -/** @defgroup DMA_data_transfer_direction - * @{ - */ - -#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) -#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) -#define IS_DMA_DIR(DIR) (((DIR) == DMA_DIR_PeripheralDST) || \ - ((DIR) == DMA_DIR_PeripheralSRC)) -/** - * @} - */ - -/** @defgroup DMA_peripheral_incremented_mode - * @{ - */ - -#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040) -#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) -#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PeripheralInc_Enable) || \ - ((STATE) == DMA_PeripheralInc_Disable)) -/** - * @} - */ - -/** @defgroup DMA_memory_incremented_mode - * @{ - */ - -#define DMA_MemoryInc_Enable ((uint32_t)0x00000080) -#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) -#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MemoryInc_Enable) || \ - ((STATE) == DMA_MemoryInc_Disable)) -/** - * @} - */ - -/** @defgroup DMA_peripheral_data_size - * @{ - */ - -#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) -#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) -#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200) -#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PeripheralDataSize_Byte) || \ - ((SIZE) == DMA_PeripheralDataSize_HalfWord) || \ - ((SIZE) == DMA_PeripheralDataSize_Word)) -/** - * @} - */ - -/** @defgroup DMA_memory_data_size - * @{ - */ - -#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) -#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400) -#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800) -#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MemoryDataSize_Byte) || \ - ((SIZE) == DMA_MemoryDataSize_HalfWord) || \ - ((SIZE) == DMA_MemoryDataSize_Word)) -/** - * @} - */ - -/** @defgroup DMA_circular_normal_mode - * @{ - */ - -#define DMA_Mode_Circular ((uint32_t)0x00000020) -#define DMA_Mode_Normal ((uint32_t)0x00000000) -#define IS_DMA_MODE(MODE) (((MODE) == DMA_Mode_Circular) || ((MODE) == DMA_Mode_Normal)) -/** - * @} - */ - -/** @defgroup DMA_priority_level - * @{ - */ - -#define DMA_Priority_VeryHigh ((uint32_t)0x00003000) -#define DMA_Priority_High ((uint32_t)0x00002000) -#define DMA_Priority_Medium ((uint32_t)0x00001000) -#define DMA_Priority_Low ((uint32_t)0x00000000) -#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_Priority_VeryHigh) || \ - ((PRIORITY) == DMA_Priority_High) || \ - ((PRIORITY) == DMA_Priority_Medium) || \ - ((PRIORITY) == DMA_Priority_Low)) -/** - * @} - */ - -/** @defgroup DMA_memory_to_memory - * @{ - */ - -#define DMA_M2M_Enable ((uint32_t)0x00004000) -#define DMA_M2M_Disable ((uint32_t)0x00000000) -#define IS_DMA_M2M_STATE(STATE) (((STATE) == DMA_M2M_Enable) || ((STATE) == DMA_M2M_Disable)) - -/** - * @} - */ - -/** @defgroup DMA_interrupts_definition - * @{ - */ - -#define DMA_IT_TC ((uint32_t)0x00000002) -#define DMA_IT_HT ((uint32_t)0x00000004) -#define DMA_IT_TE ((uint32_t)0x00000008) -#define IS_DMA_CONFIG_IT(IT) ((((IT) & 0xFFFFFFF1) == 0x00) && ((IT) != 0x00)) - -#define DMA1_IT_GL1 ((uint32_t)0x00000001) -#define DMA1_IT_TC1 ((uint32_t)0x00000002) -#define DMA1_IT_HT1 ((uint32_t)0x00000004) -#define DMA1_IT_TE1 ((uint32_t)0x00000008) -#define DMA1_IT_GL2 ((uint32_t)0x00000010) -#define DMA1_IT_TC2 ((uint32_t)0x00000020) -#define DMA1_IT_HT2 ((uint32_t)0x00000040) -#define DMA1_IT_TE2 ((uint32_t)0x00000080) -#define DMA1_IT_GL3 ((uint32_t)0x00000100) -#define DMA1_IT_TC3 ((uint32_t)0x00000200) -#define DMA1_IT_HT3 ((uint32_t)0x00000400) -#define DMA1_IT_TE3 ((uint32_t)0x00000800) -#define DMA1_IT_GL4 ((uint32_t)0x00001000) -#define DMA1_IT_TC4 ((uint32_t)0x00002000) -#define DMA1_IT_HT4 ((uint32_t)0x00004000) -#define DMA1_IT_TE4 ((uint32_t)0x00008000) -#define DMA1_IT_GL5 ((uint32_t)0x00010000) -#define DMA1_IT_TC5 ((uint32_t)0x00020000) -#define DMA1_IT_HT5 ((uint32_t)0x00040000) -#define DMA1_IT_TE5 ((uint32_t)0x00080000) -#define DMA1_IT_GL6 ((uint32_t)0x00100000) -#define DMA1_IT_TC6 ((uint32_t)0x00200000) -#define DMA1_IT_HT6 ((uint32_t)0x00400000) -#define DMA1_IT_TE6 ((uint32_t)0x00800000) -#define DMA1_IT_GL7 ((uint32_t)0x01000000) -#define DMA1_IT_TC7 ((uint32_t)0x02000000) -#define DMA1_IT_HT7 ((uint32_t)0x04000000) -#define DMA1_IT_TE7 ((uint32_t)0x08000000) - -#define DMA2_IT_GL1 ((uint32_t)0x10000001) -#define DMA2_IT_TC1 ((uint32_t)0x10000002) -#define DMA2_IT_HT1 ((uint32_t)0x10000004) -#define DMA2_IT_TE1 ((uint32_t)0x10000008) -#define DMA2_IT_GL2 ((uint32_t)0x10000010) -#define DMA2_IT_TC2 ((uint32_t)0x10000020) -#define DMA2_IT_HT2 ((uint32_t)0x10000040) -#define DMA2_IT_TE2 ((uint32_t)0x10000080) -#define DMA2_IT_GL3 ((uint32_t)0x10000100) -#define DMA2_IT_TC3 ((uint32_t)0x10000200) -#define DMA2_IT_HT3 ((uint32_t)0x10000400) -#define DMA2_IT_TE3 ((uint32_t)0x10000800) -#define DMA2_IT_GL4 ((uint32_t)0x10001000) -#define DMA2_IT_TC4 ((uint32_t)0x10002000) -#define DMA2_IT_HT4 ((uint32_t)0x10004000) -#define DMA2_IT_TE4 ((uint32_t)0x10008000) -#define DMA2_IT_GL5 ((uint32_t)0x10010000) -#define DMA2_IT_TC5 ((uint32_t)0x10020000) -#define DMA2_IT_HT5 ((uint32_t)0x10040000) -#define DMA2_IT_TE5 ((uint32_t)0x10080000) - -#define IS_DMA_CLEAR_IT(IT) (((((IT) & 0xF0000000) == 0x00) || (((IT) & 0xEFF00000) == 0x00)) && ((IT) != 0x00)) - -#define IS_DMA_GET_IT(IT) (((IT) == DMA1_IT_GL1) || ((IT) == DMA1_IT_TC1) || \ - ((IT) == DMA1_IT_HT1) || ((IT) == DMA1_IT_TE1) || \ - ((IT) == DMA1_IT_GL2) || ((IT) == DMA1_IT_TC2) || \ - ((IT) == DMA1_IT_HT2) || ((IT) == DMA1_IT_TE2) || \ - ((IT) == DMA1_IT_GL3) || ((IT) == DMA1_IT_TC3) || \ - ((IT) == DMA1_IT_HT3) || ((IT) == DMA1_IT_TE3) || \ - ((IT) == DMA1_IT_GL4) || ((IT) == DMA1_IT_TC4) || \ - ((IT) == DMA1_IT_HT4) || ((IT) == DMA1_IT_TE4) || \ - ((IT) == DMA1_IT_GL5) || ((IT) == DMA1_IT_TC5) || \ - ((IT) == DMA1_IT_HT5) || ((IT) == DMA1_IT_TE5) || \ - ((IT) == DMA1_IT_GL6) || ((IT) == DMA1_IT_TC6) || \ - ((IT) == DMA1_IT_HT6) || ((IT) == DMA1_IT_TE6) || \ - ((IT) == DMA1_IT_GL7) || ((IT) == DMA1_IT_TC7) || \ - ((IT) == DMA1_IT_HT7) || ((IT) == DMA1_IT_TE7) || \ - ((IT) == DMA2_IT_GL1) || ((IT) == DMA2_IT_TC1) || \ - ((IT) == DMA2_IT_HT1) || ((IT) == DMA2_IT_TE1) || \ - ((IT) == DMA2_IT_GL2) || ((IT) == DMA2_IT_TC2) || \ - ((IT) == DMA2_IT_HT2) || ((IT) == DMA2_IT_TE2) || \ - ((IT) == DMA2_IT_GL3) || ((IT) == DMA2_IT_TC3) || \ - ((IT) == DMA2_IT_HT3) || ((IT) == DMA2_IT_TE3) || \ - ((IT) == DMA2_IT_GL4) || ((IT) == DMA2_IT_TC4) || \ - ((IT) == DMA2_IT_HT4) || ((IT) == DMA2_IT_TE4) || \ - ((IT) == DMA2_IT_GL5) || ((IT) == DMA2_IT_TC5) || \ - ((IT) == DMA2_IT_HT5) || ((IT) == DMA2_IT_TE5)) - -/** - * @} - */ - -/** @defgroup DMA_flags_definition - * @{ - */ -#define DMA1_FLAG_GL1 ((uint32_t)0x00000001) -#define DMA1_FLAG_TC1 ((uint32_t)0x00000002) -#define DMA1_FLAG_HT1 ((uint32_t)0x00000004) -#define DMA1_FLAG_TE1 ((uint32_t)0x00000008) -#define DMA1_FLAG_GL2 ((uint32_t)0x00000010) -#define DMA1_FLAG_TC2 ((uint32_t)0x00000020) -#define DMA1_FLAG_HT2 ((uint32_t)0x00000040) -#define DMA1_FLAG_TE2 ((uint32_t)0x00000080) -#define DMA1_FLAG_GL3 ((uint32_t)0x00000100) -#define DMA1_FLAG_TC3 ((uint32_t)0x00000200) -#define DMA1_FLAG_HT3 ((uint32_t)0x00000400) -#define DMA1_FLAG_TE3 ((uint32_t)0x00000800) -#define DMA1_FLAG_GL4 ((uint32_t)0x00001000) -#define DMA1_FLAG_TC4 ((uint32_t)0x00002000) -#define DMA1_FLAG_HT4 ((uint32_t)0x00004000) -#define DMA1_FLAG_TE4 ((uint32_t)0x00008000) -#define DMA1_FLAG_GL5 ((uint32_t)0x00010000) -#define DMA1_FLAG_TC5 ((uint32_t)0x00020000) -#define DMA1_FLAG_HT5 ((uint32_t)0x00040000) -#define DMA1_FLAG_TE5 ((uint32_t)0x00080000) -#define DMA1_FLAG_GL6 ((uint32_t)0x00100000) -#define DMA1_FLAG_TC6 ((uint32_t)0x00200000) -#define DMA1_FLAG_HT6 ((uint32_t)0x00400000) -#define DMA1_FLAG_TE6 ((uint32_t)0x00800000) -#define DMA1_FLAG_GL7 ((uint32_t)0x01000000) -#define DMA1_FLAG_TC7 ((uint32_t)0x02000000) -#define DMA1_FLAG_HT7 ((uint32_t)0x04000000) -#define DMA1_FLAG_TE7 ((uint32_t)0x08000000) - -#define DMA2_FLAG_GL1 ((uint32_t)0x10000001) -#define DMA2_FLAG_TC1 ((uint32_t)0x10000002) -#define DMA2_FLAG_HT1 ((uint32_t)0x10000004) -#define DMA2_FLAG_TE1 ((uint32_t)0x10000008) -#define DMA2_FLAG_GL2 ((uint32_t)0x10000010) -#define DMA2_FLAG_TC2 ((uint32_t)0x10000020) -#define DMA2_FLAG_HT2 ((uint32_t)0x10000040) -#define DMA2_FLAG_TE2 ((uint32_t)0x10000080) -#define DMA2_FLAG_GL3 ((uint32_t)0x10000100) -#define DMA2_FLAG_TC3 ((uint32_t)0x10000200) -#define DMA2_FLAG_HT3 ((uint32_t)0x10000400) -#define DMA2_FLAG_TE3 ((uint32_t)0x10000800) -#define DMA2_FLAG_GL4 ((uint32_t)0x10001000) -#define DMA2_FLAG_TC4 ((uint32_t)0x10002000) -#define DMA2_FLAG_HT4 ((uint32_t)0x10004000) -#define DMA2_FLAG_TE4 ((uint32_t)0x10008000) -#define DMA2_FLAG_GL5 ((uint32_t)0x10010000) -#define DMA2_FLAG_TC5 ((uint32_t)0x10020000) -#define DMA2_FLAG_HT5 ((uint32_t)0x10040000) -#define DMA2_FLAG_TE5 ((uint32_t)0x10080000) - -#define IS_DMA_CLEAR_FLAG(FLAG) (((((FLAG) & 0xF0000000) == 0x00) || (((FLAG) & 0xEFF00000) == 0x00)) && ((FLAG) != 0x00)) - -#define IS_DMA_GET_FLAG(FLAG) (((FLAG) == DMA1_FLAG_GL1) || ((FLAG) == DMA1_FLAG_TC1) || \ - ((FLAG) == DMA1_FLAG_HT1) || ((FLAG) == DMA1_FLAG_TE1) || \ - ((FLAG) == DMA1_FLAG_GL2) || ((FLAG) == DMA1_FLAG_TC2) || \ - ((FLAG) == DMA1_FLAG_HT2) || ((FLAG) == DMA1_FLAG_TE2) || \ - ((FLAG) == DMA1_FLAG_GL3) || ((FLAG) == DMA1_FLAG_TC3) || \ - ((FLAG) == DMA1_FLAG_HT3) || ((FLAG) == DMA1_FLAG_TE3) || \ - ((FLAG) == DMA1_FLAG_GL4) || ((FLAG) == DMA1_FLAG_TC4) || \ - ((FLAG) == DMA1_FLAG_HT4) || ((FLAG) == DMA1_FLAG_TE4) || \ - ((FLAG) == DMA1_FLAG_GL5) || ((FLAG) == DMA1_FLAG_TC5) || \ - ((FLAG) == DMA1_FLAG_HT5) || ((FLAG) == DMA1_FLAG_TE5) || \ - ((FLAG) == DMA1_FLAG_GL6) || ((FLAG) == DMA1_FLAG_TC6) || \ - ((FLAG) == DMA1_FLAG_HT6) || ((FLAG) == DMA1_FLAG_TE6) || \ - ((FLAG) == DMA1_FLAG_GL7) || ((FLAG) == DMA1_FLAG_TC7) || \ - ((FLAG) == DMA1_FLAG_HT7) || ((FLAG) == DMA1_FLAG_TE7) || \ - ((FLAG) == DMA2_FLAG_GL1) || ((FLAG) == DMA2_FLAG_TC1) || \ - ((FLAG) == DMA2_FLAG_HT1) || ((FLAG) == DMA2_FLAG_TE1) || \ - ((FLAG) == DMA2_FLAG_GL2) || ((FLAG) == DMA2_FLAG_TC2) || \ - ((FLAG) == DMA2_FLAG_HT2) || ((FLAG) == DMA2_FLAG_TE2) || \ - ((FLAG) == DMA2_FLAG_GL3) || ((FLAG) == DMA2_FLAG_TC3) || \ - ((FLAG) == DMA2_FLAG_HT3) || ((FLAG) == DMA2_FLAG_TE3) || \ - ((FLAG) == DMA2_FLAG_GL4) || ((FLAG) == DMA2_FLAG_TC4) || \ - ((FLAG) == DMA2_FLAG_HT4) || ((FLAG) == DMA2_FLAG_TE4) || \ - ((FLAG) == DMA2_FLAG_GL5) || ((FLAG) == DMA2_FLAG_TC5) || \ - ((FLAG) == DMA2_FLAG_HT5) || ((FLAG) == DMA2_FLAG_TE5)) -/** - * @} - */ - -/** @defgroup DMA_Buffer_Size - * @{ - */ - -#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x1) && ((SIZE) < 0x10000)) - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup DMA_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup DMA_Exported_Functions - * @{ - */ - -void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); -void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); -void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); -void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); -void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); -uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); -FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG); -void DMA_ClearFlag(uint32_t DMA_FLAG); -ITStatus DMA_GetITStatus(uint32_t DMA_IT); -void DMA_ClearITPendingBit(uint32_t DMA_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F10x_DMA_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h deleted file mode 100644 index df600833a1..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_exti.h +++ /dev/null @@ -1,183 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_exti.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the EXTI firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_EXTI_H -#define __STM32F10x_EXTI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup EXTI - * @{ - */ - -/** @defgroup EXTI_Exported_Types - * @{ - */ - -/** - * @brief EXTI mode enumeration - */ - -typedef enum -{ - EXTI_Mode_Interrupt = 0x00, - EXTI_Mode_Event = 0x04 -}EXTIMode_TypeDef; - -#define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event)) - -/** - * @brief EXTI Trigger enumeration - */ - -typedef enum -{ - EXTI_Trigger_Rising = 0x08, - EXTI_Trigger_Falling = 0x0C, - EXTI_Trigger_Rising_Falling = 0x10 -}EXTITrigger_TypeDef; - -#define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \ - ((TRIGGER) == EXTI_Trigger_Falling) || \ - ((TRIGGER) == EXTI_Trigger_Rising_Falling)) -/** - * @brief EXTI Init Structure definition - */ - -typedef struct -{ - uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. - This parameter can be any combination of @ref EXTI_Lines */ - - EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines. - This parameter can be a value of @ref EXTIMode_TypeDef */ - - EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. - This parameter can be a value of @ref EXTIMode_TypeDef */ - - FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. - This parameter can be set either to ENABLE or DISABLE */ -}EXTI_InitTypeDef; - -/** - * @} - */ - -/** @defgroup EXTI_Exported_Constants - * @{ - */ - -/** @defgroup EXTI_Lines - * @{ - */ - -#define EXTI_Line0 ((uint32_t)0x00001) /*!< External interrupt line 0 */ -#define EXTI_Line1 ((uint32_t)0x00002) /*!< External interrupt line 1 */ -#define EXTI_Line2 ((uint32_t)0x00004) /*!< External interrupt line 2 */ -#define EXTI_Line3 ((uint32_t)0x00008) /*!< External interrupt line 3 */ -#define EXTI_Line4 ((uint32_t)0x00010) /*!< External interrupt line 4 */ -#define EXTI_Line5 ((uint32_t)0x00020) /*!< External interrupt line 5 */ -#define EXTI_Line6 ((uint32_t)0x00040) /*!< External interrupt line 6 */ -#define EXTI_Line7 ((uint32_t)0x00080) /*!< External interrupt line 7 */ -#define EXTI_Line8 ((uint32_t)0x00100) /*!< External interrupt line 8 */ -#define EXTI_Line9 ((uint32_t)0x00200) /*!< External interrupt line 9 */ -#define EXTI_Line10 ((uint32_t)0x00400) /*!< External interrupt line 10 */ -#define EXTI_Line11 ((uint32_t)0x00800) /*!< External interrupt line 11 */ -#define EXTI_Line12 ((uint32_t)0x01000) /*!< External interrupt line 12 */ -#define EXTI_Line13 ((uint32_t)0x02000) /*!< External interrupt line 13 */ -#define EXTI_Line14 ((uint32_t)0x04000) /*!< External interrupt line 14 */ -#define EXTI_Line15 ((uint32_t)0x08000) /*!< External interrupt line 15 */ -#define EXTI_Line16 ((uint32_t)0x10000) /*!< External interrupt line 16 Connected to the PVD Output */ -#define EXTI_Line17 ((uint32_t)0x20000) /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#define EXTI_Line18 ((uint32_t)0x40000) /*!< External interrupt line 18 Connected to the USB Device/USB OTG FS - Wakeup from suspend event */ -#define EXTI_Line19 ((uint32_t)0x80000) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ - -#define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0xFFF00000) == 0x00) && ((LINE) != (uint16_t)0x00)) -#define IS_GET_EXTI_LINE(LINE) (((LINE) == EXTI_Line0) || ((LINE) == EXTI_Line1) || \ - ((LINE) == EXTI_Line2) || ((LINE) == EXTI_Line3) || \ - ((LINE) == EXTI_Line4) || ((LINE) == EXTI_Line5) || \ - ((LINE) == EXTI_Line6) || ((LINE) == EXTI_Line7) || \ - ((LINE) == EXTI_Line8) || ((LINE) == EXTI_Line9) || \ - ((LINE) == EXTI_Line10) || ((LINE) == EXTI_Line11) || \ - ((LINE) == EXTI_Line12) || ((LINE) == EXTI_Line13) || \ - ((LINE) == EXTI_Line14) || ((LINE) == EXTI_Line15) || \ - ((LINE) == EXTI_Line16) || ((LINE) == EXTI_Line17) || \ - ((LINE) == EXTI_Line18) || ((LINE) == EXTI_Line19)) - - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup EXTI_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup EXTI_Exported_Functions - * @{ - */ - -void EXTI_DeInit(void); -void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); -void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); -void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); -FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); -void EXTI_ClearFlag(uint32_t EXTI_Line); -ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); -void EXTI_ClearITPendingBit(uint32_t EXTI_Line); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_EXTI_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h deleted file mode 100644 index 54cf3c85a5..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_flash.h +++ /dev/null @@ -1,346 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_flash.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the FLASH - * firmware library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_FLASH_H -#define __STM32F10x_FLASH_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup FLASH - * @{ - */ - -/** @defgroup FLASH_Exported_Types - * @{ - */ - -/** - * @brief FLASH Status - */ - -typedef enum -{ - FLASH_BUSY = 1, - FLASH_ERROR_PG, - FLASH_ERROR_WRP, - FLASH_COMPLETE, - FLASH_TIMEOUT -}FLASH_Status; - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Constants - * @{ - */ - -/** @defgroup Flash_Latency - * @{ - */ - -#define FLASH_Latency_0 ((uint32_t)0x00000000) /*!< FLASH Zero Latency cycle */ -#define FLASH_Latency_1 ((uint32_t)0x00000001) /*!< FLASH One Latency cycle */ -#define FLASH_Latency_2 ((uint32_t)0x00000002) /*!< FLASH Two Latency cycles */ -#define IS_FLASH_LATENCY(LATENCY) (((LATENCY) == FLASH_Latency_0) || \ - ((LATENCY) == FLASH_Latency_1) || \ - ((LATENCY) == FLASH_Latency_2)) -/** - * @} - */ - -/** @defgroup Half_Cycle_Enable_Disable - * @{ - */ - -#define FLASH_HalfCycleAccess_Enable ((uint32_t)0x00000008) /*!< FLASH Half Cycle Enable */ -#define FLASH_HalfCycleAccess_Disable ((uint32_t)0x00000000) /*!< FLASH Half Cycle Disable */ -#define IS_FLASH_HALFCYCLEACCESS_STATE(STATE) (((STATE) == FLASH_HalfCycleAccess_Enable) || \ - ((STATE) == FLASH_HalfCycleAccess_Disable)) -/** - * @} - */ - -/** @defgroup Prefetch_Buffer_Enable_Disable - * @{ - */ - -#define FLASH_PrefetchBuffer_Enable ((uint32_t)0x00000010) /*!< FLASH Prefetch Buffer Enable */ -#define FLASH_PrefetchBuffer_Disable ((uint32_t)0x00000000) /*!< FLASH Prefetch Buffer Disable */ -#define IS_FLASH_PREFETCHBUFFER_STATE(STATE) (((STATE) == FLASH_PrefetchBuffer_Enable) || \ - ((STATE) == FLASH_PrefetchBuffer_Disable)) -/** - * @} - */ - -/** @defgroup Option_Bytes_Write_Protection - * @{ - */ - -/* Values to be used with STM32 Low and Medium density devices */ -#define FLASH_WRProt_Pages0to3 ((uint32_t)0x00000001) /*!< STM32 Low and Medium density devices: Write protection of page 0 to 3 */ -#define FLASH_WRProt_Pages4to7 ((uint32_t)0x00000002) /*!< STM32 Low and Medium density devices: Write protection of page 4 to 7 */ -#define FLASH_WRProt_Pages8to11 ((uint32_t)0x00000004) /*!< STM32 Low and Medium density devices: Write protection of page 8 to 11 */ -#define FLASH_WRProt_Pages12to15 ((uint32_t)0x00000008) /*!< STM32 Low and Medium density devices: Write protection of page 12 to 15 */ -#define FLASH_WRProt_Pages16to19 ((uint32_t)0x00000010) /*!< STM32 Low and Medium density devices: Write protection of page 16 to 19 */ -#define FLASH_WRProt_Pages20to23 ((uint32_t)0x00000020) /*!< STM32 Low and Medium density devices: Write protection of page 20 to 23 */ -#define FLASH_WRProt_Pages24to27 ((uint32_t)0x00000040) /*!< STM32 Low and Medium density devices: Write protection of page 24 to 27 */ -#define FLASH_WRProt_Pages28to31 ((uint32_t)0x00000080) /*!< STM32 Low and Medium density devices: Write protection of page 28 to 31 */ - -/* Values to be used with STM32 Medium-density devices */ -#define FLASH_WRProt_Pages32to35 ((uint32_t)0x00000100) /*!< STM32 Medium-density devices: Write protection of page 32 to 35 */ -#define FLASH_WRProt_Pages36to39 ((uint32_t)0x00000200) /*!< STM32 Medium-density devices: Write protection of page 36 to 39 */ -#define FLASH_WRProt_Pages40to43 ((uint32_t)0x00000400) /*!< STM32 Medium-density devices: Write protection of page 40 to 43 */ -#define FLASH_WRProt_Pages44to47 ((uint32_t)0x00000800) /*!< STM32 Medium-density devices: Write protection of page 44 to 47 */ -#define FLASH_WRProt_Pages48to51 ((uint32_t)0x00001000) /*!< STM32 Medium-density devices: Write protection of page 48 to 51 */ -#define FLASH_WRProt_Pages52to55 ((uint32_t)0x00002000) /*!< STM32 Medium-density devices: Write protection of page 52 to 55 */ -#define FLASH_WRProt_Pages56to59 ((uint32_t)0x00004000) /*!< STM32 Medium-density devices: Write protection of page 56 to 59 */ -#define FLASH_WRProt_Pages60to63 ((uint32_t)0x00008000) /*!< STM32 Medium-density devices: Write protection of page 60 to 63 */ -#define FLASH_WRProt_Pages64to67 ((uint32_t)0x00010000) /*!< STM32 Medium-density devices: Write protection of page 64 to 67 */ -#define FLASH_WRProt_Pages68to71 ((uint32_t)0x00020000) /*!< STM32 Medium-density devices: Write protection of page 68 to 71 */ -#define FLASH_WRProt_Pages72to75 ((uint32_t)0x00040000) /*!< STM32 Medium-density devices: Write protection of page 72 to 75 */ -#define FLASH_WRProt_Pages76to79 ((uint32_t)0x00080000) /*!< STM32 Medium-density devices: Write protection of page 76 to 79 */ -#define FLASH_WRProt_Pages80to83 ((uint32_t)0x00100000) /*!< STM32 Medium-density devices: Write protection of page 80 to 83 */ -#define FLASH_WRProt_Pages84to87 ((uint32_t)0x00200000) /*!< STM32 Medium-density devices: Write protection of page 84 to 87 */ -#define FLASH_WRProt_Pages88to91 ((uint32_t)0x00400000) /*!< STM32 Medium-density devices: Write protection of page 88 to 91 */ -#define FLASH_WRProt_Pages92to95 ((uint32_t)0x00800000) /*!< STM32 Medium-density devices: Write protection of page 92 to 95 */ -#define FLASH_WRProt_Pages96to99 ((uint32_t)0x01000000) /*!< STM32 Medium-density devices: Write protection of page 96 to 99 */ -#define FLASH_WRProt_Pages100to103 ((uint32_t)0x02000000) /*!< STM32 Medium-density devices: Write protection of page 100 to 103 */ -#define FLASH_WRProt_Pages104to107 ((uint32_t)0x04000000) /*!< STM32 Medium-density devices: Write protection of page 104 to 107 */ -#define FLASH_WRProt_Pages108to111 ((uint32_t)0x08000000) /*!< STM32 Medium-density devices: Write protection of page 108 to 111 */ -#define FLASH_WRProt_Pages112to115 ((uint32_t)0x10000000) /*!< STM32 Medium-density devices: Write protection of page 112 to 115 */ -#define FLASH_WRProt_Pages116to119 ((uint32_t)0x20000000) /*!< STM32 Medium-density devices: Write protection of page 115 to 119 */ -#define FLASH_WRProt_Pages120to123 ((uint32_t)0x40000000) /*!< STM32 Medium-density devices: Write protection of page 120 to 123 */ -#define FLASH_WRProt_Pages124to127 ((uint32_t)0x80000000) /*!< STM32 Medium-density devices: Write protection of page 124 to 127 */ - -/* Values to be used with STM32 High-density and STM32F10X Connectivity line devices */ -#define FLASH_WRProt_Pages0to1 ((uint32_t)0x00000001) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 0 to 1 */ -#define FLASH_WRProt_Pages2to3 ((uint32_t)0x00000002) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 2 to 3 */ -#define FLASH_WRProt_Pages4to5 ((uint32_t)0x00000004) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 4 to 5 */ -#define FLASH_WRProt_Pages6to7 ((uint32_t)0x00000008) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 6 to 7 */ -#define FLASH_WRProt_Pages8to9 ((uint32_t)0x00000010) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 8 to 9 */ -#define FLASH_WRProt_Pages10to11 ((uint32_t)0x00000020) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 10 to 11 */ -#define FLASH_WRProt_Pages12to13 ((uint32_t)0x00000040) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 12 to 13 */ -#define FLASH_WRProt_Pages14to15 ((uint32_t)0x00000080) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 14 to 15 */ -#define FLASH_WRProt_Pages16to17 ((uint32_t)0x00000100) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 16 to 17 */ -#define FLASH_WRProt_Pages18to19 ((uint32_t)0x00000200) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 18 to 19 */ -#define FLASH_WRProt_Pages20to21 ((uint32_t)0x00000400) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 20 to 21 */ -#define FLASH_WRProt_Pages22to23 ((uint32_t)0x00000800) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 22 to 23 */ -#define FLASH_WRProt_Pages24to25 ((uint32_t)0x00001000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 24 to 25 */ -#define FLASH_WRProt_Pages26to27 ((uint32_t)0x00002000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 26 to 27 */ -#define FLASH_WRProt_Pages28to29 ((uint32_t)0x00004000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 28 to 29 */ -#define FLASH_WRProt_Pages30to31 ((uint32_t)0x00008000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 30 to 31 */ -#define FLASH_WRProt_Pages32to33 ((uint32_t)0x00010000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 32 to 33 */ -#define FLASH_WRProt_Pages34to35 ((uint32_t)0x00020000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 34 to 35 */ -#define FLASH_WRProt_Pages36to37 ((uint32_t)0x00040000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 36 to 37 */ -#define FLASH_WRProt_Pages38to39 ((uint32_t)0x00080000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 38 to 39 */ -#define FLASH_WRProt_Pages40to41 ((uint32_t)0x00100000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 40 to 41 */ -#define FLASH_WRProt_Pages42to43 ((uint32_t)0x00200000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 42 to 43 */ -#define FLASH_WRProt_Pages44to45 ((uint32_t)0x00400000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 44 to 45 */ -#define FLASH_WRProt_Pages46to47 ((uint32_t)0x00800000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 46 to 47 */ -#define FLASH_WRProt_Pages48to49 ((uint32_t)0x01000000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 48 to 49 */ -#define FLASH_WRProt_Pages50to51 ((uint32_t)0x02000000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 50 to 51 */ -#define FLASH_WRProt_Pages52to53 ((uint32_t)0x04000000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 52 to 53 */ -#define FLASH_WRProt_Pages54to55 ((uint32_t)0x08000000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 54 to 55 */ -#define FLASH_WRProt_Pages56to57 ((uint32_t)0x10000000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 56 to 57 */ -#define FLASH_WRProt_Pages58to59 ((uint32_t)0x20000000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 58 to 59 */ -#define FLASH_WRProt_Pages60to61 ((uint32_t)0x40000000) /*!< STM32 Medium-density and Connectivity line devices: - Write protection of page 60 to 61 */ -#define FLASH_WRProt_Pages62to127 ((uint32_t)0x80000000) /*!< STM32 Connectivity line devices: Write protection of page 62 to 127 */ -#define FLASH_WRProt_Pages62to255 ((uint32_t)0x80000000) /*!< STM32 Medium-density devices: Write protection of page 62 to 255 */ - -#define FLASH_WRProt_AllPages ((uint32_t)0xFFFFFFFF) /*!< Write protection of all Pages */ - -#define IS_FLASH_WRPROT_PAGE(PAGE) (((PAGE) != 0x00000000)) - -#define IS_FLASH_ADDRESS(ADDRESS) (((ADDRESS) >= 0x08000000) && ((ADDRESS) < 0x0807FFFF)) - -#define IS_OB_DATA_ADDRESS(ADDRESS) (((ADDRESS) == 0x1FFFF804) || ((ADDRESS) == 0x1FFFF806)) - -/** - * @} - */ - -/** @defgroup Option_Bytes_IWatchdog - * @{ - */ - -#define OB_IWDG_SW ((uint16_t)0x0001) /*!< Software IWDG selected */ -#define OB_IWDG_HW ((uint16_t)0x0000) /*!< Hardware IWDG selected */ -#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW)) - -/** - * @} - */ - -/** @defgroup Option_Bytes_nRST_STOP - * @{ - */ - -#define OB_STOP_NoRST ((uint16_t)0x0002) /*!< No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint16_t)0x0000) /*!< Reset generated when entering in STOP */ -#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NoRST) || ((SOURCE) == OB_STOP_RST)) - -/** - * @} - */ - -/** @defgroup Option_Bytes_nRST_STDBY - * @{ - */ - -#define OB_STDBY_NoRST ((uint16_t)0x0004) /*!< No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint16_t)0x0000) /*!< Reset generated when entering in STANDBY */ -#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NoRST) || ((SOURCE) == OB_STDBY_RST)) - -/** - * @} - */ - -/** @defgroup FLASH_Interrupts - * @{ - */ - -#define FLASH_IT_ERROR ((uint32_t)0x00000400) /*!< FPEC error interrupt source */ -#define FLASH_IT_EOP ((uint32_t)0x00001000) /*!< End of FLASH Operation Interrupt source */ -#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0xFFFFEBFF) == 0x00000000) && (((IT) != 0x00000000))) - -/** - * @} - */ - -/** @defgroup FLASH_Flags - * @{ - */ - -#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /*!< FLASH Busy flag */ -#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /*!< FLASH End of Operation flag */ -#define FLASH_FLAG_PGERR ((uint32_t)0x00000004) /*!< FLASH Program error flag */ -#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /*!< FLASH Write protected error flag */ -#define FLASH_FLAG_OPTERR ((uint32_t)0x00000001) /*!< FLASH Option Byte error flag */ - -#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFCA) == 0x00000000) && ((FLAG) != 0x00000000)) -#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_BSY) || ((FLAG) == FLASH_FLAG_EOP) || \ - ((FLAG) == FLASH_FLAG_PGERR) || ((FLAG) == FLASH_FLAG_WRPRTERR) || \ - ((FLAG) == FLASH_FLAG_OPTERR)) - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup FLASH_Exported_Functions - * @{ - */ - -void FLASH_SetLatency(uint32_t FLASH_Latency); -void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess); -void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer); -void FLASH_Unlock(void); -void FLASH_Lock(void); -FLASH_Status FLASH_ErasePage(uint32_t Page_Address); -FLASH_Status FLASH_EraseAllPages(void); -FLASH_Status FLASH_EraseOptionBytes(void); -FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); -FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); -FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); -FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages); -FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState); -FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY); -uint32_t FLASH_GetUserOptionByte(void); -uint32_t FLASH_GetWriteProtectionOptionByte(void); -FlagStatus FLASH_GetReadOutProtectionStatus(void); -FlagStatus FLASH_GetPrefetchBufferStatus(void); -void FLASH_ITConfig(uint16_t FLASH_IT, FunctionalState NewState); -FlagStatus FLASH_GetFlagStatus(uint16_t FLASH_FLAG); -void FLASH_ClearFlag(uint16_t FLASH_FLAG); -FLASH_Status FLASH_GetStatus(void); -FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_FLASH_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h deleted file mode 100644 index a74a2926bb..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_fsmc.h +++ /dev/null @@ -1,716 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_fsmc.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the FSMC firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_FSMC_H -#define __STM32F10x_FSMC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup FSMC - * @{ - */ - -/** @defgroup FSMC_Exported_Types - * @{ - */ - -/** - * @brief Timing parameters For NOR/SRAM Banks - */ - -typedef struct -{ - uint32_t FSMC_AddressSetupTime; /*!< Defines the number of HCLK cycles to configure - the duration of the address setup time. - This parameter can be a value between 0 and 0xF. - @note: It is not used with synchronous NOR Flash memories. */ - - uint32_t FSMC_AddressHoldTime; /*!< Defines the number of HCLK cycles to configure - the duration of the address hold time. - This parameter can be a value between 0 and 0xF. - @note: It is not used with synchronous NOR Flash memories.*/ - - uint32_t FSMC_DataSetupTime; /*!< Defines the number of HCLK cycles to configure - the duration of the data setup time. - This parameter can be a value between 0 and 0xFF. - @note: It is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */ - - uint32_t FSMC_BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure - the duration of the bus turnaround. - This parameter can be a value between 0 and 0xF. - @note: It is only used for multiplexed NOR Flash memories. */ - - uint32_t FSMC_CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles. - This parameter can be a value between 1 and 0xF. - @note: This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */ - - uint32_t FSMC_DataLatency; /*!< Defines the number of memory clock cycles to issue - to the memory before getting the first data. - The value of this parameter depends on the memory type as shown below: - - It must be set to 0 in case of a CRAM - - It is don’t care in asynchronous NOR, SRAM or ROM accesses - - It may assume a value between 0 and 0xF in NOR Flash memories - with synchronous burst mode enable */ - - uint32_t FSMC_AccessMode; /*!< Specifies the asynchronous access mode. - This parameter can be a value of @ref FSMC_Access_Mode */ -}FSMC_NORSRAMTimingInitTypeDef; - -/** - * @brief FSMC NOR/SRAM Init structure definition - */ - -typedef struct -{ - uint32_t FSMC_Bank; /*!< Specifies the NOR/SRAM memory bank that will be used. - This parameter can be a value of @ref FSMC_NORSRAM_Bank */ - - uint32_t FSMC_DataAddressMux; /*!< Specifies whether the address and data values are - multiplexed on the databus or not. - This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */ - - uint32_t FSMC_MemoryType; /*!< Specifies the type of external memory attached to - the corresponding memory bank. - This parameter can be a value of @ref FSMC_Memory_Type */ - - uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. - This parameter can be a value of @ref FSMC_Data_Width */ - - uint32_t FSMC_BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory, - valid only with synchronous burst Flash memories. - This parameter can be a value of @ref FSMC_Burst_Access_Mode */ - - uint32_t FSMC_WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing - the Flash memory in burst mode. - This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */ - - uint32_t FSMC_WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash - memory, valid only when accessing Flash memories in burst mode. - This parameter can be a value of @ref FSMC_Wrap_Mode */ - - uint32_t FSMC_WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one - clock cycle before the wait state or during the wait state, - valid only when accessing memories in burst mode. - This parameter can be a value of @ref FSMC_Wait_Timing */ - - uint32_t FSMC_WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FSMC. - This parameter can be a value of @ref FSMC_Write_Operation */ - - uint32_t FSMC_WaitSignal; /*!< Enables or disables the wait-state insertion via wait - signal, valid for Flash memory access in burst mode. - This parameter can be a value of @ref FSMC_Wait_Signal */ - - uint32_t FSMC_ExtendedMode; /*!< Enables or disables the extended mode. - This parameter can be a value of @ref FSMC_Extended_Mode */ - - uint32_t FSMC_WriteBurst; /*!< Enables or disables the write burst operation. - This parameter can be a value of @ref FSMC_Write_Burst */ - - FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the ExtendedMode is not used*/ - - FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /*!< Timing Parameters for write access if the ExtendedMode is used*/ -}FSMC_NORSRAMInitTypeDef; - -/** - * @brief Timing parameters For FSMC NAND and PCCARD Banks - */ - -typedef struct -{ - uint32_t FSMC_SetupTime; /*!< Defines the number of HCLK cycles to setup address before - the command assertion for NAND-Flash read or write access - to common/Attribute or I/O memory space (depending on - the memory space timing to be configured). - This parameter can be a value between 0 and 0xFF.*/ - - uint32_t FSMC_WaitSetupTime; /*!< Defines the minimum number of HCLK cycles to assert the - command for NAND-Flash read or write access to - common/Attribute or I/O memory space (depending on the - memory space timing to be configured). - This parameter can be a number between 0x00 and 0xFF */ - - uint32_t FSMC_HoldSetupTime; /*!< Defines the number of HCLK clock cycles to hold address - (and data for write access) after the command deassertion - for NAND-Flash read or write access to common/Attribute - or I/O memory space (depending on the memory space timing - to be configured). - This parameter can be a number between 0x00 and 0xFF */ - - uint32_t FSMC_HiZSetupTime; /*!< Defines the number of HCLK clock cycles during which the - databus is kept in HiZ after the start of a NAND-Flash - write access to common/Attribute or I/O memory space (depending - on the memory space timing to be configured). - This parameter can be a number between 0x00 and 0xFF */ -}FSMC_NAND_PCCARDTimingInitTypeDef; - -/** - * @brief FSMC NAND Init structure definition - */ - -typedef struct -{ - uint32_t FSMC_Bank; /*!< Specifies the NAND memory bank that will be used. - This parameter can be a value of @ref FSMC_NAND_Bank */ - - uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the NAND Memory Bank. - This parameter can be any value of @ref FSMC_Wait_feature */ - - uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. - This parameter can be any value of @ref FSMC_Data_Width */ - - uint32_t FSMC_ECC; /*!< Enables or disables the ECC computation. - This parameter can be any value of @ref FSMC_ECC */ - - uint32_t FSMC_ECCPageSize; /*!< Defines the page size for the extended ECC. - This parameter can be any value of @ref FSMC_ECC_Page_Size */ - - uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between CLE low and RE low. - This parameter can be a value between 0 and 0xFF. */ - - uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between ALE low and RE low. - This parameter can be a number between 0x0 and 0xFF */ - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ -}FSMC_NANDInitTypeDef; - -/** - * @brief FSMC PCCARD Init structure definition - */ - -typedef struct -{ - uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the Memory Bank. - This parameter can be any value of @ref FSMC_Wait_feature */ - - uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between CLE low and RE low. - This parameter can be a value between 0 and 0xFF. */ - - uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between ALE low and RE low. - This parameter can be a number between 0x0 and 0xFF */ - - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_IOSpaceTimingStruct; /*!< FSMC IO Space Timing */ -}FSMC_PCCARDInitTypeDef; - -/** - * @} - */ - -/** @defgroup FSMC_Exported_Constants - * @{ - */ - -/** @defgroup FSMC_NORSRAM_Bank - * @{ - */ -#define FSMC_Bank1_NORSRAM1 ((uint32_t)0x00000000) -#define FSMC_Bank1_NORSRAM2 ((uint32_t)0x00000002) -#define FSMC_Bank1_NORSRAM3 ((uint32_t)0x00000004) -#define FSMC_Bank1_NORSRAM4 ((uint32_t)0x00000006) -/** - * @} - */ - -/** @defgroup FSMC_NAND_Bank - * @{ - */ -#define FSMC_Bank2_NAND ((uint32_t)0x00000010) -#define FSMC_Bank3_NAND ((uint32_t)0x00000100) -/** - * @} - */ - -/** @defgroup FSMC_PCCARD_Bank - * @{ - */ -#define FSMC_Bank4_PCCARD ((uint32_t)0x00001000) -/** - * @} - */ - -#define IS_FSMC_NORSRAM_BANK(BANK) (((BANK) == FSMC_Bank1_NORSRAM1) || \ - ((BANK) == FSMC_Bank1_NORSRAM2) || \ - ((BANK) == FSMC_Bank1_NORSRAM3) || \ - ((BANK) == FSMC_Bank1_NORSRAM4)) - -#define IS_FSMC_NAND_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ - ((BANK) == FSMC_Bank3_NAND)) - -#define IS_FSMC_GETFLAG_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ - ((BANK) == FSMC_Bank3_NAND) || \ - ((BANK) == FSMC_Bank4_PCCARD)) - -#define IS_FSMC_IT_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ - ((BANK) == FSMC_Bank3_NAND) || \ - ((BANK) == FSMC_Bank4_PCCARD)) - -/** @defgroup NOR_SRAM_Controller - * @{ - */ - -/** @defgroup FSMC_Data_Address_Bus_Multiplexing - * @{ - */ - -#define FSMC_DataAddressMux_Disable ((uint32_t)0x00000000) -#define FSMC_DataAddressMux_Enable ((uint32_t)0x00000002) -#define IS_FSMC_MUX(MUX) (((MUX) == FSMC_DataAddressMux_Disable) || \ - ((MUX) == FSMC_DataAddressMux_Enable)) - -/** - * @} - */ - -/** @defgroup FSMC_Memory_Type - * @{ - */ - -#define FSMC_MemoryType_SRAM ((uint32_t)0x00000000) -#define FSMC_MemoryType_PSRAM ((uint32_t)0x00000004) -#define FSMC_MemoryType_NOR ((uint32_t)0x00000008) -#define IS_FSMC_MEMORY(MEMORY) (((MEMORY) == FSMC_MemoryType_SRAM) || \ - ((MEMORY) == FSMC_MemoryType_PSRAM)|| \ - ((MEMORY) == FSMC_MemoryType_NOR)) - -/** - * @} - */ - -/** @defgroup FSMC_Data_Width - * @{ - */ - -#define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000) -#define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010) -#define IS_FSMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FSMC_MemoryDataWidth_8b) || \ - ((WIDTH) == FSMC_MemoryDataWidth_16b)) - -/** - * @} - */ - -/** @defgroup FSMC_Burst_Access_Mode - * @{ - */ - -#define FSMC_BurstAccessMode_Disable ((uint32_t)0x00000000) -#define FSMC_BurstAccessMode_Enable ((uint32_t)0x00000100) -#define IS_FSMC_BURSTMODE(STATE) (((STATE) == FSMC_BurstAccessMode_Disable) || \ - ((STATE) == FSMC_BurstAccessMode_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Wait_Signal_Polarity - * @{ - */ - -#define FSMC_WaitSignalPolarity_Low ((uint32_t)0x00000000) -#define FSMC_WaitSignalPolarity_High ((uint32_t)0x00000200) -#define IS_FSMC_WAIT_POLARITY(POLARITY) (((POLARITY) == FSMC_WaitSignalPolarity_Low) || \ - ((POLARITY) == FSMC_WaitSignalPolarity_High)) - -/** - * @} - */ - -/** @defgroup FSMC_Wrap_Mode - * @{ - */ - -#define FSMC_WrapMode_Disable ((uint32_t)0x00000000) -#define FSMC_WrapMode_Enable ((uint32_t)0x00000400) -#define IS_FSMC_WRAP_MODE(MODE) (((MODE) == FSMC_WrapMode_Disable) || \ - ((MODE) == FSMC_WrapMode_Enable)) - -/** - * @} - */ - -/** @defgroup FSMC_Wait_Timing - * @{ - */ - -#define FSMC_WaitSignalActive_BeforeWaitState ((uint32_t)0x00000000) -#define FSMC_WaitSignalActive_DuringWaitState ((uint32_t)0x00000800) -#define IS_FSMC_WAIT_SIGNAL_ACTIVE(ACTIVE) (((ACTIVE) == FSMC_WaitSignalActive_BeforeWaitState) || \ - ((ACTIVE) == FSMC_WaitSignalActive_DuringWaitState)) - -/** - * @} - */ - -/** @defgroup FSMC_Write_Operation - * @{ - */ - -#define FSMC_WriteOperation_Disable ((uint32_t)0x00000000) -#define FSMC_WriteOperation_Enable ((uint32_t)0x00001000) -#define IS_FSMC_WRITE_OPERATION(OPERATION) (((OPERATION) == FSMC_WriteOperation_Disable) || \ - ((OPERATION) == FSMC_WriteOperation_Enable)) - -/** - * @} - */ - -/** @defgroup FSMC_Wait_Signal - * @{ - */ - -#define FSMC_WaitSignal_Disable ((uint32_t)0x00000000) -#define FSMC_WaitSignal_Enable ((uint32_t)0x00002000) -#define IS_FSMC_WAITE_SIGNAL(SIGNAL) (((SIGNAL) == FSMC_WaitSignal_Disable) || \ - ((SIGNAL) == FSMC_WaitSignal_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Extended_Mode - * @{ - */ - -#define FSMC_ExtendedMode_Disable ((uint32_t)0x00000000) -#define FSMC_ExtendedMode_Enable ((uint32_t)0x00004000) - -#define IS_FSMC_EXTENDED_MODE(MODE) (((MODE) == FSMC_ExtendedMode_Disable) || \ - ((MODE) == FSMC_ExtendedMode_Enable)) - -/** - * @} - */ - -/** @defgroup FSMC_Write_Burst - * @{ - */ - -#define FSMC_WriteBurst_Disable ((uint32_t)0x00000000) -#define FSMC_WriteBurst_Enable ((uint32_t)0x00080000) -#define IS_FSMC_WRITE_BURST(BURST) (((BURST) == FSMC_WriteBurst_Disable) || \ - ((BURST) == FSMC_WriteBurst_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Address_Setup_Time - * @{ - */ - -#define IS_FSMC_ADDRESS_SETUP_TIME(TIME) ((TIME) <= 0xF) - -/** - * @} - */ - -/** @defgroup FSMC_Address_Hold_Time - * @{ - */ - -#define IS_FSMC_ADDRESS_HOLD_TIME(TIME) ((TIME) <= 0xF) - -/** - * @} - */ - -/** @defgroup FSMC_Data_Setup_Time - * @{ - */ - -#define IS_FSMC_DATASETUP_TIME(TIME) (((TIME) > 0) && ((TIME) <= 0xFF)) - -/** - * @} - */ - -/** @defgroup FSMC_Bus_Turn_around_Duration - * @{ - */ - -#define IS_FSMC_TURNAROUND_TIME(TIME) ((TIME) <= 0xF) - -/** - * @} - */ - -/** @defgroup FSMC_CLK_Division - * @{ - */ - -#define IS_FSMC_CLK_DIV(DIV) ((DIV) <= 0xF) - -/** - * @} - */ - -/** @defgroup FSMC_Data_Latency - * @{ - */ - -#define IS_FSMC_DATA_LATENCY(LATENCY) ((LATENCY) <= 0xF) - -/** - * @} - */ - -/** @defgroup FSMC_Access_Mode - * @{ - */ - -#define FSMC_AccessMode_A ((uint32_t)0x00000000) -#define FSMC_AccessMode_B ((uint32_t)0x10000000) -#define FSMC_AccessMode_C ((uint32_t)0x20000000) -#define FSMC_AccessMode_D ((uint32_t)0x30000000) -#define IS_FSMC_ACCESS_MODE(MODE) (((MODE) == FSMC_AccessMode_A) || \ - ((MODE) == FSMC_AccessMode_B) || \ - ((MODE) == FSMC_AccessMode_C) || \ - ((MODE) == FSMC_AccessMode_D)) - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup NAND_PCCARD_Controller - * @{ - */ - -/** @defgroup FSMC_Wait_feature - * @{ - */ - -#define FSMC_Waitfeature_Disable ((uint32_t)0x00000000) -#define FSMC_Waitfeature_Enable ((uint32_t)0x00000002) -#define IS_FSMC_WAIT_FEATURE(FEATURE) (((FEATURE) == FSMC_Waitfeature_Disable) || \ - ((FEATURE) == FSMC_Waitfeature_Enable)) - -/** - * @} - */ - - -/** @defgroup FSMC_ECC - * @{ - */ - -#define FSMC_ECC_Disable ((uint32_t)0x00000000) -#define FSMC_ECC_Enable ((uint32_t)0x00000040) -#define IS_FSMC_ECC_STATE(STATE) (((STATE) == FSMC_ECC_Disable) || \ - ((STATE) == FSMC_ECC_Enable)) - -/** - * @} - */ - -/** @defgroup FSMC_ECC_Page_Size - * @{ - */ - -#define FSMC_ECCPageSize_256Bytes ((uint32_t)0x00000000) -#define FSMC_ECCPageSize_512Bytes ((uint32_t)0x00020000) -#define FSMC_ECCPageSize_1024Bytes ((uint32_t)0x00040000) -#define FSMC_ECCPageSize_2048Bytes ((uint32_t)0x00060000) -#define FSMC_ECCPageSize_4096Bytes ((uint32_t)0x00080000) -#define FSMC_ECCPageSize_8192Bytes ((uint32_t)0x000A0000) -#define IS_FSMC_ECCPAGE_SIZE(SIZE) (((SIZE) == FSMC_ECCPageSize_256Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_512Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_1024Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_2048Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_4096Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_8192Bytes)) - -/** - * @} - */ - -/** @defgroup FSMC_TCLR_Setup_Time - * @{ - */ - -#define IS_FSMC_TCLR_TIME(TIME) ((TIME) <= 0xFF) - -/** - * @} - */ - -/** @defgroup FSMC_TAR_Setup_Time - * @{ - */ - -#define IS_FSMC_TAR_TIME(TIME) ((TIME) <= 0xFF) - -/** - * @} - */ - -/** @defgroup FSMC_Setup_Time - * @{ - */ - -#define IS_FSMC_SETUP_TIME(TIME) ((TIME) <= 0xFF) - -/** - * @} - */ - -/** @defgroup FSMC_Wait_Setup_Time - * @{ - */ - -#define IS_FSMC_WAIT_TIME(TIME) ((TIME) <= 0xFF) - -/** - * @} - */ - -/** @defgroup FSMC_Hold_Setup_Time - * @{ - */ - -#define IS_FSMC_HOLD_TIME(TIME) ((TIME) <= 0xFF) - -/** - * @} - */ - -/** @defgroup FSMC_HiZ_Setup_Time - * @{ - */ - -#define IS_FSMC_HIZ_TIME(TIME) ((TIME) <= 0xFF) - -/** - * @} - */ - -/** @defgroup FSMC_Interrupt_sources - * @{ - */ - -#define FSMC_IT_RisingEdge ((uint32_t)0x00000008) -#define FSMC_IT_Level ((uint32_t)0x00000010) -#define FSMC_IT_FallingEdge ((uint32_t)0x00000020) -#define IS_FSMC_IT(IT) ((((IT) & (uint32_t)0xFFFFFFC7) == 0x00000000) && ((IT) != 0x00000000)) -#define IS_FSMC_GET_IT(IT) (((IT) == FSMC_IT_RisingEdge) || \ - ((IT) == FSMC_IT_Level) || \ - ((IT) == FSMC_IT_FallingEdge)) -/** - * @} - */ - -/** @defgroup FSMC_Flags - * @{ - */ - -#define FSMC_FLAG_RisingEdge ((uint32_t)0x00000001) -#define FSMC_FLAG_Level ((uint32_t)0x00000002) -#define FSMC_FLAG_FallingEdge ((uint32_t)0x00000004) -#define FSMC_FLAG_FEMPT ((uint32_t)0x00000040) -#define IS_FSMC_GET_FLAG(FLAG) (((FLAG) == FSMC_FLAG_RisingEdge) || \ - ((FLAG) == FSMC_FLAG_Level) || \ - ((FLAG) == FSMC_FLAG_FallingEdge) || \ - ((FLAG) == FSMC_FLAG_FEMPT)) - -#define IS_FSMC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFF8) == 0x00000000) && ((FLAG) != 0x00000000)) - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup FSMC_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup FSMC_Exported_Functions - * @{ - */ - -void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank); -void FSMC_NANDDeInit(uint32_t FSMC_Bank); -void FSMC_PCCARDDeInit(void); -void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); -void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); -void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); -void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); -void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); -void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); -void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState); -void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState); -void FSMC_PCCARDCmd(FunctionalState NewState); -void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState); -uint32_t FSMC_GetECC(uint32_t FSMC_Bank); -void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState); -FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); -void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); -ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT); -void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F10x_FSMC_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h deleted file mode 100644 index e1bbe2e375..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_gpio.h +++ /dev/null @@ -1,369 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_gpio.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the GPIO - * firmware library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_GPIO_H -#define __STM32F10x_GPIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup GPIO - * @{ - */ - -/** @defgroup GPIO_Exported_Types - * @{ - */ - -#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ - ((PERIPH) == GPIOB) || \ - ((PERIPH) == GPIOC) || \ - ((PERIPH) == GPIOD) || \ - ((PERIPH) == GPIOE) || \ - ((PERIPH) == GPIOF) || \ - ((PERIPH) == GPIOG)) - -/** - * @brief Output Maximum frequency selection - */ - -typedef enum -{ - GPIO_Speed_10MHz = 1, - GPIO_Speed_2MHz, - GPIO_Speed_50MHz -}GPIOSpeed_TypeDef; -#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \ - ((SPEED) == GPIO_Speed_50MHz)) - -/** - * @brief Configuration Mode enumeration - */ - -typedef enum -{ GPIO_Mode_AIN = 0x0, - GPIO_Mode_IN_FLOATING = 0x04, - GPIO_Mode_IPD = 0x28, - GPIO_Mode_IPU = 0x48, - GPIO_Mode_Out_OD = 0x14, - GPIO_Mode_Out_PP = 0x10, - GPIO_Mode_AF_OD = 0x1C, - GPIO_Mode_AF_PP = 0x18 -}GPIOMode_TypeDef; - -#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \ - ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \ - ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \ - ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP)) - -/** - * @brief GPIO Init structure definition - */ - -typedef struct -{ - uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_pins_define */ - - GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIOSpeed_TypeDef */ - - GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIOMode_TypeDef */ -}GPIO_InitTypeDef; - - -/** - * @brief Bit_SET and Bit_RESET enumeration - */ - -typedef enum -{ Bit_RESET = 0, - Bit_SET -}BitAction; - -#define IS_GPIO_BIT_ACTION(ACTION) (((ACTION) == Bit_RESET) || ((ACTION) == Bit_SET)) - -/** - * @} - */ - -/** @defgroup GPIO_Exported_Constants - * @{ - */ - -/** @defgroup GPIO_pins_define - * @{ - */ - -#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ -#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ -#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ -#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ -#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ -#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ -#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ -#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ -#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ -#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ -#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ -#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ -#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ -#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ -#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ -#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */ -#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */ - -#define IS_GPIO_PIN(PIN) ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) != (uint16_t)0x00)) - -#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \ - ((PIN) == GPIO_Pin_1) || \ - ((PIN) == GPIO_Pin_2) || \ - ((PIN) == GPIO_Pin_3) || \ - ((PIN) == GPIO_Pin_4) || \ - ((PIN) == GPIO_Pin_5) || \ - ((PIN) == GPIO_Pin_6) || \ - ((PIN) == GPIO_Pin_7) || \ - ((PIN) == GPIO_Pin_8) || \ - ((PIN) == GPIO_Pin_9) || \ - ((PIN) == GPIO_Pin_10) || \ - ((PIN) == GPIO_Pin_11) || \ - ((PIN) == GPIO_Pin_12) || \ - ((PIN) == GPIO_Pin_13) || \ - ((PIN) == GPIO_Pin_14) || \ - ((PIN) == GPIO_Pin_15)) - -/** - * @} - */ - -/** @defgroup GPIO_Remap_define - * @{ - */ - -#define GPIO_Remap_SPI1 ((uint32_t)0x00000001) /*!< SPI1 Alternate Function mapping */ -#define GPIO_Remap_I2C1 ((uint32_t)0x00000002) /*!< I2C1 Alternate Function mapping */ -#define GPIO_Remap_USART1 ((uint32_t)0x00000004) /*!< USART1 Alternate Function mapping */ -#define GPIO_Remap_USART2 ((uint32_t)0x00000008) /*!< USART2 Alternate Function mapping */ -#define GPIO_PartialRemap_USART3 ((uint32_t)0x00140010) /*!< USART3 Partial Alternate Function mapping */ -#define GPIO_FullRemap_USART3 ((uint32_t)0x00140030) /*!< USART3 Full Alternate Function mapping */ -#define GPIO_PartialRemap_TIM1 ((uint32_t)0x00160040) /*!< TIM1 Partial Alternate Function mapping */ -#define GPIO_FullRemap_TIM1 ((uint32_t)0x001600C0) /*!< TIM1 Full Alternate Function mapping */ -#define GPIO_PartialRemap1_TIM2 ((uint32_t)0x00180100) /*!< TIM2 Partial1 Alternate Function mapping */ -#define GPIO_PartialRemap2_TIM2 ((uint32_t)0x00180200) /*!< TIM2 Partial2 Alternate Function mapping */ -#define GPIO_FullRemap_TIM2 ((uint32_t)0x00180300) /*!< TIM2 Full Alternate Function mapping */ -#define GPIO_PartialRemap_TIM3 ((uint32_t)0x001A0800) /*!< TIM3 Partial Alternate Function mapping */ -#define GPIO_FullRemap_TIM3 ((uint32_t)0x001A0C00) /*!< TIM3 Full Alternate Function mapping */ -#define GPIO_Remap_TIM4 ((uint32_t)0x00001000) /*!< TIM4 Alternate Function mapping */ -#define GPIO_Remap1_CAN1 ((uint32_t)0x001D4000) /*!< CAN1 Alternate Function mapping */ -#define GPIO_Remap2_CAN1 ((uint32_t)0x001D6000) /*!< CAN1 Alternate Function mapping */ -#define GPIO_Remap_PD01 ((uint32_t)0x00008000) /*!< PD01 Alternate Function mapping */ -#define GPIO_Remap_TIM5CH4_LSI ((uint32_t)0x00200001) /*!< LSI connected to TIM5 Channel4 input capture for calibration */ -#define GPIO_Remap_ADC1_ETRGINJ ((uint32_t)0x00200002) /*!< ADC1 External Trigger Injected Conversion remapping */ -#define GPIO_Remap_ADC1_ETRGREG ((uint32_t)0x00200004) /*!< ADC1 External Trigger Regular Conversion remapping */ -#define GPIO_Remap_ADC2_ETRGINJ ((uint32_t)0x00200008) /*!< ADC2 External Trigger Injected Conversion remapping */ -#define GPIO_Remap_ADC2_ETRGREG ((uint32_t)0x00200010) /*!< ADC2 External Trigger Regular Conversion remapping */ -#define GPIO_Remap_ETH ((uint32_t)0x00200020) /*!< Ethernet remapping (only for Connectivity line devices) */ -#define GPIO_Remap_CAN2 ((uint32_t)0x00200040) /*!< CAN2 remapping (only for Connectivity line devices) */ -#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100) /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */ -#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*!< JTAG-DP Disabled and SW-DP Enabled */ -#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /*!< Full SWJ Disabled (JTAG-DP + SW-DP) */ -#define GPIO_Remap_SPI3 ((uint32_t)0x00201000) /*!< SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices) */ -#define GPIO_Remap_TIM2ITR1_PTP_SOF ((uint32_t)0x00202000) /*!< Ethernet PTP output or USB OTG SOF (Start of Frame) connected - to TIM2 Internal Trigger 1 for calibration - (only for Connectivity line devices) */ -#define GPIO_Remap_PTP_PPS ((uint32_t)0x00204000) /*!< Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) */ - -#define GPIO_Remap_TIM15 ((uint32_t)0x80000001) /*!< TIM15 Alternate Function mapping (only for Value line devices) */ -#define GPIO_Remap_TIM16 ((uint32_t)0x80000002) /*!< TIM16 Alternate Function mapping (only for Value line devices) */ -#define GPIO_Remap_TIM17 ((uint32_t)0x80000004) /*!< TIM17 Alternate Function mapping (only for Value line devices) */ -#define GPIO_Remap_CEC ((uint32_t)0x80000008) /*!< CEC Alternate Function mapping (only for Value line devices) */ -#define GPIO_Remap_TIM1_DMA ((uint32_t)0x80000010) /*!< TIM1 DMA requests mapping (only for Value line devices) */ - - -#define IS_GPIO_REMAP(REMAP) (((REMAP) == GPIO_Remap_SPI1) || ((REMAP) == GPIO_Remap_I2C1) || \ - ((REMAP) == GPIO_Remap_USART1) || ((REMAP) == GPIO_Remap_USART2) || \ - ((REMAP) == GPIO_PartialRemap_USART3) || ((REMAP) == GPIO_FullRemap_USART3) || \ - ((REMAP) == GPIO_PartialRemap_TIM1) || ((REMAP) == GPIO_FullRemap_TIM1) || \ - ((REMAP) == GPIO_PartialRemap1_TIM2) || ((REMAP) == GPIO_PartialRemap2_TIM2) || \ - ((REMAP) == GPIO_FullRemap_TIM2) || ((REMAP) == GPIO_PartialRemap_TIM3) || \ - ((REMAP) == GPIO_FullRemap_TIM3) || ((REMAP) == GPIO_Remap_TIM4) || \ - ((REMAP) == GPIO_Remap1_CAN1) || ((REMAP) == GPIO_Remap2_CAN1) || \ - ((REMAP) == GPIO_Remap_PD01) || ((REMAP) == GPIO_Remap_TIM5CH4_LSI) || \ - ((REMAP) == GPIO_Remap_ADC1_ETRGINJ) ||((REMAP) == GPIO_Remap_ADC1_ETRGREG) || \ - ((REMAP) == GPIO_Remap_ADC2_ETRGINJ) ||((REMAP) == GPIO_Remap_ADC2_ETRGREG) || \ - ((REMAP) == GPIO_Remap_ETH) ||((REMAP) == GPIO_Remap_CAN2) || \ - ((REMAP) == GPIO_Remap_SWJ_NoJTRST) || ((REMAP) == GPIO_Remap_SWJ_JTAGDisable) || \ - ((REMAP) == GPIO_Remap_SWJ_Disable)|| ((REMAP) == GPIO_Remap_SPI3) || \ - ((REMAP) == GPIO_Remap_TIM2ITR1_PTP_SOF) || ((REMAP) == GPIO_Remap_PTP_PPS) || \ - ((REMAP) == GPIO_Remap_TIM15) || ((REMAP) == GPIO_Remap_TIM16) || \ - ((REMAP) == GPIO_Remap_TIM17) || ((REMAP) == GPIO_Remap_CEC) || \ - ((REMAP) == GPIO_Remap_TIM1_DMA)) - -/** - * @} - */ - -/** @defgroup GPIO_Port_Sources - * @{ - */ - -#define GPIO_PortSourceGPIOA ((uint8_t)0x00) -#define GPIO_PortSourceGPIOB ((uint8_t)0x01) -#define GPIO_PortSourceGPIOC ((uint8_t)0x02) -#define GPIO_PortSourceGPIOD ((uint8_t)0x03) -#define GPIO_PortSourceGPIOE ((uint8_t)0x04) -#define GPIO_PortSourceGPIOF ((uint8_t)0x05) -#define GPIO_PortSourceGPIOG ((uint8_t)0x06) -#define IS_GPIO_EVENTOUT_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == GPIO_PortSourceGPIOA) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOB) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOC) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOD) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOE)) - -#define IS_GPIO_EXTI_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == GPIO_PortSourceGPIOA) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOB) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOC) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOD) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOE) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOF) || \ - ((PORTSOURCE) == GPIO_PortSourceGPIOG)) - -/** - * @} - */ - -/** @defgroup GPIO_Pin_sources - * @{ - */ - -#define GPIO_PinSource0 ((uint8_t)0x00) -#define GPIO_PinSource1 ((uint8_t)0x01) -#define GPIO_PinSource2 ((uint8_t)0x02) -#define GPIO_PinSource3 ((uint8_t)0x03) -#define GPIO_PinSource4 ((uint8_t)0x04) -#define GPIO_PinSource5 ((uint8_t)0x05) -#define GPIO_PinSource6 ((uint8_t)0x06) -#define GPIO_PinSource7 ((uint8_t)0x07) -#define GPIO_PinSource8 ((uint8_t)0x08) -#define GPIO_PinSource9 ((uint8_t)0x09) -#define GPIO_PinSource10 ((uint8_t)0x0A) -#define GPIO_PinSource11 ((uint8_t)0x0B) -#define GPIO_PinSource12 ((uint8_t)0x0C) -#define GPIO_PinSource13 ((uint8_t)0x0D) -#define GPIO_PinSource14 ((uint8_t)0x0E) -#define GPIO_PinSource15 ((uint8_t)0x0F) - -#define IS_GPIO_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == GPIO_PinSource0) || \ - ((PINSOURCE) == GPIO_PinSource1) || \ - ((PINSOURCE) == GPIO_PinSource2) || \ - ((PINSOURCE) == GPIO_PinSource3) || \ - ((PINSOURCE) == GPIO_PinSource4) || \ - ((PINSOURCE) == GPIO_PinSource5) || \ - ((PINSOURCE) == GPIO_PinSource6) || \ - ((PINSOURCE) == GPIO_PinSource7) || \ - ((PINSOURCE) == GPIO_PinSource8) || \ - ((PINSOURCE) == GPIO_PinSource9) || \ - ((PINSOURCE) == GPIO_PinSource10) || \ - ((PINSOURCE) == GPIO_PinSource11) || \ - ((PINSOURCE) == GPIO_PinSource12) || \ - ((PINSOURCE) == GPIO_PinSource13) || \ - ((PINSOURCE) == GPIO_PinSource14) || \ - ((PINSOURCE) == GPIO_PinSource15)) - -/** - * @} - */ - -/** @defgroup Ethernet_Media_Interface - * @{ - */ -#define GPIO_ETH_MediaInterface_MII ((u32)0x00000000) -#define GPIO_ETH_MediaInterface_RMII ((u32)0x00000001) - -#define IS_GPIO_ETH_MEDIA_INTERFACE(INTERFACE) (((INTERFACE) == GPIO_ETH_MediaInterface_MII) || \ - ((INTERFACE) == GPIO_ETH_MediaInterface_RMII)) - -/** - * @} - */ -/** - * @} - */ - -/** @defgroup GPIO_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup GPIO_Exported_Functions - * @{ - */ - -void GPIO_DeInit(GPIO_TypeDef* GPIOx); -void GPIO_AFIODeInit(void); -void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); -void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); -uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); -uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); -void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); -void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); -void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); -void GPIO_EventOutputCmd(FunctionalState NewState); -void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState); -void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); -void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_GPIO_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h deleted file mode 100644 index f58754cc5e..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h +++ /dev/null @@ -1,472 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_i2c.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the I2C firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_I2C_H -#define __STM32F10x_I2C_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup I2C - * @{ - */ - -/** @defgroup I2C_Exported_Types - * @{ - */ - -/** - * @brief I2C Init structure definition - */ - -typedef struct -{ - uint32_t I2C_ClockSpeed; /*!< Specifies the clock frequency. - This parameter must be set to a value lower than 400kHz */ - - uint16_t I2C_Mode; /*!< Specifies the I2C mode. - This parameter can be a value of @ref I2C_mode */ - - uint16_t I2C_DutyCycle; /*!< Specifies the I2C fast mode duty cycle. - This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ - - uint16_t I2C_OwnAddress1; /*!< Specifies the first device own address. - This parameter can be a 7-bit or 10-bit address. */ - - uint16_t I2C_Ack; /*!< Enables or disables the acknowledgement. - This parameter can be a value of @ref I2C_acknowledgement */ - - uint16_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged. - This parameter can be a value of @ref I2C_acknowledged_address */ -}I2C_InitTypeDef; - -/** - * @} - */ - - -/** @defgroup I2C_Exported_Constants - * @{ - */ - -#define IS_I2C_ALL_PERIPH(PERIPH) (((PERIPH) == I2C1) || \ - ((PERIPH) == I2C2)) -/** @defgroup I2C_mode - * @{ - */ - -#define I2C_Mode_I2C ((uint16_t)0x0000) -#define I2C_Mode_SMBusDevice ((uint16_t)0x0002) -#define I2C_Mode_SMBusHost ((uint16_t)0x000A) -#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \ - ((MODE) == I2C_Mode_SMBusDevice) || \ - ((MODE) == I2C_Mode_SMBusHost)) -/** - * @} - */ - -/** @defgroup I2C_duty_cycle_in_fast_mode - * @{ - */ - -#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /*!< I2C fast mode Tlow/Thigh = 16/9 */ -#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /*!< I2C fast mode Tlow/Thigh = 2 */ -#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \ - ((CYCLE) == I2C_DutyCycle_2)) -/** - * @} - */ - -/** @defgroup I2C_acknowledgement - * @{ - */ - -#define I2C_Ack_Enable ((uint16_t)0x0400) -#define I2C_Ack_Disable ((uint16_t)0x0000) -#define IS_I2C_ACK_STATE(STATE) (((STATE) == I2C_Ack_Enable) || \ - ((STATE) == I2C_Ack_Disable)) -/** - * @} - */ - -/** @defgroup I2C_transfer_direction - * @{ - */ - -#define I2C_Direction_Transmitter ((uint8_t)0x00) -#define I2C_Direction_Receiver ((uint8_t)0x01) -#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \ - ((DIRECTION) == I2C_Direction_Receiver)) -/** - * @} - */ - -/** @defgroup I2C_acknowledged_address - * @{ - */ - -#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000) -#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000) -#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \ - ((ADDRESS) == I2C_AcknowledgedAddress_10bit)) -/** - * @} - */ - -/** @defgroup I2C_registers - * @{ - */ - -#define I2C_Register_CR1 ((uint8_t)0x00) -#define I2C_Register_CR2 ((uint8_t)0x04) -#define I2C_Register_OAR1 ((uint8_t)0x08) -#define I2C_Register_OAR2 ((uint8_t)0x0C) -#define I2C_Register_DR ((uint8_t)0x10) -#define I2C_Register_SR1 ((uint8_t)0x14) -#define I2C_Register_SR2 ((uint8_t)0x18) -#define I2C_Register_CCR ((uint8_t)0x1C) -#define I2C_Register_TRISE ((uint8_t)0x20) -#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \ - ((REGISTER) == I2C_Register_CR2) || \ - ((REGISTER) == I2C_Register_OAR1) || \ - ((REGISTER) == I2C_Register_OAR2) || \ - ((REGISTER) == I2C_Register_DR) || \ - ((REGISTER) == I2C_Register_SR1) || \ - ((REGISTER) == I2C_Register_SR2) || \ - ((REGISTER) == I2C_Register_CCR) || \ - ((REGISTER) == I2C_Register_TRISE)) -/** - * @} - */ - -/** @defgroup I2C_SMBus_alert_pin_level - * @{ - */ - -#define I2C_SMBusAlert_Low ((uint16_t)0x2000) -#define I2C_SMBusAlert_High ((uint16_t)0xDFFF) -#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \ - ((ALERT) == I2C_SMBusAlert_High)) -/** - * @} - */ - -/** @defgroup I2C_PEC_position - * @{ - */ - -#define I2C_PECPosition_Next ((uint16_t)0x0800) -#define I2C_PECPosition_Current ((uint16_t)0xF7FF) -#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \ - ((POSITION) == I2C_PECPosition_Current)) -/** - * @} - */ - -/** @defgroup I2C_interrupts_definition - * @{ - */ - -#define I2C_IT_BUF ((uint16_t)0x0400) -#define I2C_IT_EVT ((uint16_t)0x0200) -#define I2C_IT_ERR ((uint16_t)0x0100) -#define IS_I2C_CONFIG_IT(IT) ((((IT) & (uint16_t)0xF8FF) == 0x00) && ((IT) != 0x00)) -/** - * @} - */ - -/** @defgroup I2C_interrupts_definition - * @{ - */ - -#define I2C_IT_SMBALERT ((uint32_t)0x01008000) -#define I2C_IT_TIMEOUT ((uint32_t)0x01004000) -#define I2C_IT_PECERR ((uint32_t)0x01001000) -#define I2C_IT_OVR ((uint32_t)0x01000800) -#define I2C_IT_AF ((uint32_t)0x01000400) -#define I2C_IT_ARLO ((uint32_t)0x01000200) -#define I2C_IT_BERR ((uint32_t)0x01000100) -#define I2C_IT_TXE ((uint32_t)0x06000080) -#define I2C_IT_RXNE ((uint32_t)0x06000040) -#define I2C_IT_STOPF ((uint32_t)0x02000010) -#define I2C_IT_ADD10 ((uint32_t)0x02000008) -#define I2C_IT_BTF ((uint32_t)0x02000004) -#define I2C_IT_ADDR ((uint32_t)0x02000002) -#define I2C_IT_SB ((uint32_t)0x02000001) - -#define IS_I2C_CLEAR_IT(IT) ((((IT) & (uint16_t)0x20FF) == 0x00) && ((IT) != (uint16_t)0x00)) - -#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \ - ((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \ - ((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \ - ((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \ - ((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \ - ((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \ - ((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB)) -/** - * @} - */ - -/** @defgroup I2C_flags_definition - * @{ - */ - -/** - * @brief SR2 register flags - */ - -#define I2C_FLAG_DUALF ((uint32_t)0x00800000) -#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000) -#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000) -#define I2C_FLAG_GENCALL ((uint32_t)0x00100000) -#define I2C_FLAG_TRA ((uint32_t)0x00040000) -#define I2C_FLAG_BUSY ((uint32_t)0x00020000) -#define I2C_FLAG_MSL ((uint32_t)0x00010000) - -/** - * @brief SR1 register flags - */ - -#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000) -#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000) -#define I2C_FLAG_PECERR ((uint32_t)0x10001000) -#define I2C_FLAG_OVR ((uint32_t)0x10000800) -#define I2C_FLAG_AF ((uint32_t)0x10000400) -#define I2C_FLAG_ARLO ((uint32_t)0x10000200) -#define I2C_FLAG_BERR ((uint32_t)0x10000100) -#define I2C_FLAG_TXE ((uint32_t)0x10000080) -#define I2C_FLAG_RXNE ((uint32_t)0x10000040) -#define I2C_FLAG_STOPF ((uint32_t)0x10000010) -#define I2C_FLAG_ADD10 ((uint32_t)0x10000008) -#define I2C_FLAG_BTF ((uint32_t)0x10000004) -#define I2C_FLAG_ADDR ((uint32_t)0x10000002) -#define I2C_FLAG_SB ((uint32_t)0x10000001) - -#define IS_I2C_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0x20FF) == 0x00) && ((FLAG) != (uint16_t)0x00)) - -#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \ - ((FLAG) == I2C_FLAG_SMBDEFAULT) || ((FLAG) == I2C_FLAG_GENCALL) || \ - ((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \ - ((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \ - ((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \ - ((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \ - ((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \ - ((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \ - ((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \ - ((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \ - ((FLAG) == I2C_FLAG_SB)) -/** - * @} - */ - -/** @defgroup I2C_Events - * @{ - */ - -/** - * @brief EV1 - */ - -#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */ -#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */ -#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */ -#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */ -#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */ - -/** - * @brief EV2 - */ - -#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */ - -/** - * @brief EV3 - */ - -#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */ - -/** - * @brief EV4 - */ - -#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */ - -/** - * @brief EV5 - */ - -#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ - -/** - * @brief EV6 - */ - -#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */ -#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ - -/** - * @brief EV7 - */ - -#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */ - -/** - * @brief EV8 - */ - -#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */ - -/** - * @brief EV8_2 - */ - -#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */ - -/** - * @brief EV9 - */ - -#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */ - -/** - * @brief EV3_2 - */ - -#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */ - -#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \ - ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \ - ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \ - ((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \ - ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \ - ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \ - ((EVENT) == I2C_EVENT_SLAVE_STOP_DETECTED) || \ - ((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \ - ((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \ - ((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \ - ((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \ - ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \ - ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTING) || \ - ((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \ - ((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE)) -/** - * @} - */ - -/** @defgroup I2C_own_address1 - * @{ - */ - -#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF) -/** - * @} - */ - -/** @defgroup I2C_clock_speed - * @{ - */ - -#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000)) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup I2C_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup I2C_Exported_Functions - * @{ - */ - -void I2C_DeInit(I2C_TypeDef* I2Cx); -void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); -void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct); -void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); -void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState); -void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); -uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx); -void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); -uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register); -void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert); -void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition); -void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState); -uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx); -void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle); -uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx); -ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT); -FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); -void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); -ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT); -void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F10x_I2C_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h deleted file mode 100644 index af652df66f..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_iwdg.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the IWDG - * firmware library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_IWDG_H -#define __STM32F10x_IWDG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup IWDG - * @{ - */ - -/** @defgroup IWDG_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup IWDG_Exported_Constants - * @{ - */ - -/** @defgroup IWDG_WriteAccess - * @{ - */ - -#define IWDG_WriteAccess_Enable ((uint16_t)0x5555) -#define IWDG_WriteAccess_Disable ((uint16_t)0x0000) -#define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) || \ - ((ACCESS) == IWDG_WriteAccess_Disable)) -/** - * @} - */ - -/** @defgroup IWDG_prescaler - * @{ - */ - -#define IWDG_Prescaler_4 ((uint8_t)0x00) -#define IWDG_Prescaler_8 ((uint8_t)0x01) -#define IWDG_Prescaler_16 ((uint8_t)0x02) -#define IWDG_Prescaler_32 ((uint8_t)0x03) -#define IWDG_Prescaler_64 ((uint8_t)0x04) -#define IWDG_Prescaler_128 ((uint8_t)0x05) -#define IWDG_Prescaler_256 ((uint8_t)0x06) -#define IS_IWDG_PRESCALER(PRESCALER) (((PRESCALER) == IWDG_Prescaler_4) || \ - ((PRESCALER) == IWDG_Prescaler_8) || \ - ((PRESCALER) == IWDG_Prescaler_16) || \ - ((PRESCALER) == IWDG_Prescaler_32) || \ - ((PRESCALER) == IWDG_Prescaler_64) || \ - ((PRESCALER) == IWDG_Prescaler_128)|| \ - ((PRESCALER) == IWDG_Prescaler_256)) -/** - * @} - */ - -/** @defgroup IWDG_Flag - * @{ - */ - -#define IWDG_FLAG_PVU ((uint16_t)0x0001) -#define IWDG_FLAG_RVU ((uint16_t)0x0002) -#define IS_IWDG_FLAG(FLAG) (((FLAG) == IWDG_FLAG_PVU) || ((FLAG) == IWDG_FLAG_RVU)) -#define IS_IWDG_RELOAD(RELOAD) ((RELOAD) <= 0xFFF) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup IWDG_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup IWDG_Exported_Functions - * @{ - */ - -void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); -void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); -void IWDG_SetReload(uint16_t Reload); -void IWDG_ReloadCounter(void); -void IWDG_Enable(void); -FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_IWDG_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h deleted file mode 100644 index b223b16a57..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_pwr.h +++ /dev/null @@ -1,155 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_pwr.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the PWR firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_PWR_H -#define __STM32F10x_PWR_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup PWR - * @{ - */ - -/** @defgroup PWR_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup PWR_Exported_Constants - * @{ - */ - -/** @defgroup PVD_detection_level - * @{ - */ - -#define PWR_PVDLevel_2V2 ((uint32_t)0x00000000) -#define PWR_PVDLevel_2V3 ((uint32_t)0x00000020) -#define PWR_PVDLevel_2V4 ((uint32_t)0x00000040) -#define PWR_PVDLevel_2V5 ((uint32_t)0x00000060) -#define PWR_PVDLevel_2V6 ((uint32_t)0x00000080) -#define PWR_PVDLevel_2V7 ((uint32_t)0x000000A0) -#define PWR_PVDLevel_2V8 ((uint32_t)0x000000C0) -#define PWR_PVDLevel_2V9 ((uint32_t)0x000000E0) -#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLevel_2V2) || ((LEVEL) == PWR_PVDLevel_2V3)|| \ - ((LEVEL) == PWR_PVDLevel_2V4) || ((LEVEL) == PWR_PVDLevel_2V5)|| \ - ((LEVEL) == PWR_PVDLevel_2V6) || ((LEVEL) == PWR_PVDLevel_2V7)|| \ - ((LEVEL) == PWR_PVDLevel_2V8) || ((LEVEL) == PWR_PVDLevel_2V9)) -/** - * @} - */ - -/** @defgroup Regulator_state_is_STOP_mode - * @{ - */ - -#define PWR_Regulator_ON ((uint32_t)0x00000000) -#define PWR_Regulator_LowPower ((uint32_t)0x00000001) -#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_Regulator_ON) || \ - ((REGULATOR) == PWR_Regulator_LowPower)) -/** - * @} - */ - -/** @defgroup STOP_mode_entry - * @{ - */ - -#define PWR_STOPEntry_WFI ((uint8_t)0x01) -#define PWR_STOPEntry_WFE ((uint8_t)0x02) -#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPEntry_WFI) || ((ENTRY) == PWR_STOPEntry_WFE)) - -/** - * @} - */ - -/** @defgroup PWR_Flag - * @{ - */ - -#define PWR_FLAG_WU ((uint32_t)0x00000001) -#define PWR_FLAG_SB ((uint32_t)0x00000002) -#define PWR_FLAG_PVDO ((uint32_t)0x00000004) -#define IS_PWR_GET_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB) || \ - ((FLAG) == PWR_FLAG_PVDO)) - -#define IS_PWR_CLEAR_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB)) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup PWR_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup PWR_Exported_Functions - * @{ - */ - -void PWR_DeInit(void); -void PWR_BackupAccessCmd(FunctionalState NewState); -void PWR_PVDCmd(FunctionalState NewState); -void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); -void PWR_WakeUpPinCmd(FunctionalState NewState); -void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); -void PWR_EnterSTANDBYMode(void); -FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); -void PWR_ClearFlag(uint32_t PWR_FLAG); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_PWR_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h deleted file mode 100644 index 496cbd9778..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rcc.h +++ /dev/null @@ -1,720 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_rcc.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the RCC firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_RCC_H -#define __STM32F10x_RCC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup RCC - * @{ - */ - -/** @defgroup RCC_Exported_Types - * @{ - */ - -typedef struct -{ - uint32_t SYSCLK_Frequency; /*!< returns SYSCLK clock frequency expressed in Hz */ - uint32_t HCLK_Frequency; /*!< returns HCLK clock frequency expressed in Hz */ - uint32_t PCLK1_Frequency; /*!< returns PCLK1 clock frequency expressed in Hz */ - uint32_t PCLK2_Frequency; /*!< returns PCLK2 clock frequency expressed in Hz */ - uint32_t ADCCLK_Frequency; /*!< returns ADCCLK clock frequency expressed in Hz */ -}RCC_ClocksTypeDef; - -/** - * @} - */ - -/** @defgroup RCC_Exported_Constants - * @{ - */ - -/** @defgroup HSE_configuration - * @{ - */ - -#define RCC_HSE_OFF ((uint32_t)0x00000000) -#define RCC_HSE_ON ((uint32_t)0x00010000) -#define RCC_HSE_Bypass ((uint32_t)0x00040000) -#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ - ((HSE) == RCC_HSE_Bypass)) - -/** - * @} - */ - -/** @defgroup PLL_entry_clock_source - * @{ - */ - -#define RCC_PLLSource_HSI_Div2 ((uint32_t)0x00000000) - -#if !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_CL) - #define RCC_PLLSource_HSE_Div1 ((uint32_t)0x00010000) - #define RCC_PLLSource_HSE_Div2 ((uint32_t)0x00030000) - #define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \ - ((SOURCE) == RCC_PLLSource_HSE_Div1) || \ - ((SOURCE) == RCC_PLLSource_HSE_Div2)) -#else - #define RCC_PLLSource_PREDIV1 ((uint32_t)0x00010000) - #define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \ - ((SOURCE) == RCC_PLLSource_PREDIV1)) -#endif /* STM32F10X_CL */ - -/** - * @} - */ - -/** @defgroup PLL_multiplication_factor - * @{ - */ -#ifndef STM32F10X_CL - #define RCC_PLLMul_2 ((uint32_t)0x00000000) - #define RCC_PLLMul_3 ((uint32_t)0x00040000) - #define RCC_PLLMul_4 ((uint32_t)0x00080000) - #define RCC_PLLMul_5 ((uint32_t)0x000C0000) - #define RCC_PLLMul_6 ((uint32_t)0x00100000) - #define RCC_PLLMul_7 ((uint32_t)0x00140000) - #define RCC_PLLMul_8 ((uint32_t)0x00180000) - #define RCC_PLLMul_9 ((uint32_t)0x001C0000) - #define RCC_PLLMul_10 ((uint32_t)0x00200000) - #define RCC_PLLMul_11 ((uint32_t)0x00240000) - #define RCC_PLLMul_12 ((uint32_t)0x00280000) - #define RCC_PLLMul_13 ((uint32_t)0x002C0000) - #define RCC_PLLMul_14 ((uint32_t)0x00300000) - #define RCC_PLLMul_15 ((uint32_t)0x00340000) - #define RCC_PLLMul_16 ((uint32_t)0x00380000) - #define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_2) || ((MUL) == RCC_PLLMul_3) || \ - ((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5) || \ - ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7) || \ - ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9) || \ - ((MUL) == RCC_PLLMul_10) || ((MUL) == RCC_PLLMul_11) || \ - ((MUL) == RCC_PLLMul_12) || ((MUL) == RCC_PLLMul_13) || \ - ((MUL) == RCC_PLLMul_14) || ((MUL) == RCC_PLLMul_15) || \ - ((MUL) == RCC_PLLMul_16)) - -#else - #define RCC_PLLMul_4 ((uint32_t)0x00080000) - #define RCC_PLLMul_5 ((uint32_t)0x000C0000) - #define RCC_PLLMul_6 ((uint32_t)0x00100000) - #define RCC_PLLMul_7 ((uint32_t)0x00140000) - #define RCC_PLLMul_8 ((uint32_t)0x00180000) - #define RCC_PLLMul_9 ((uint32_t)0x001C0000) - #define RCC_PLLMul_6_5 ((uint32_t)0x00340000) - - #define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5) || \ - ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7) || \ - ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9) || \ - ((MUL) == RCC_PLLMul_6_5)) -#endif /* STM32F10X_CL */ -/** - * @} - */ - -/** @defgroup PREDIV1_division_factor - * @{ - */ -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_CL) - #define RCC_PREDIV1_Div1 ((uint32_t)0x00000000) - #define RCC_PREDIV1_Div2 ((uint32_t)0x00000001) - #define RCC_PREDIV1_Div3 ((uint32_t)0x00000002) - #define RCC_PREDIV1_Div4 ((uint32_t)0x00000003) - #define RCC_PREDIV1_Div5 ((uint32_t)0x00000004) - #define RCC_PREDIV1_Div6 ((uint32_t)0x00000005) - #define RCC_PREDIV1_Div7 ((uint32_t)0x00000006) - #define RCC_PREDIV1_Div8 ((uint32_t)0x00000007) - #define RCC_PREDIV1_Div9 ((uint32_t)0x00000008) - #define RCC_PREDIV1_Div10 ((uint32_t)0x00000009) - #define RCC_PREDIV1_Div11 ((uint32_t)0x0000000A) - #define RCC_PREDIV1_Div12 ((uint32_t)0x0000000B) - #define RCC_PREDIV1_Div13 ((uint32_t)0x0000000C) - #define RCC_PREDIV1_Div14 ((uint32_t)0x0000000D) - #define RCC_PREDIV1_Div15 ((uint32_t)0x0000000E) - #define RCC_PREDIV1_Div16 ((uint32_t)0x0000000F) - - #define IS_RCC_PREDIV1(PREDIV1) (((PREDIV1) == RCC_PREDIV1_Div1) || ((PREDIV1) == RCC_PREDIV1_Div2) || \ - ((PREDIV1) == RCC_PREDIV1_Div3) || ((PREDIV1) == RCC_PREDIV1_Div4) || \ - ((PREDIV1) == RCC_PREDIV1_Div5) || ((PREDIV1) == RCC_PREDIV1_Div6) || \ - ((PREDIV1) == RCC_PREDIV1_Div7) || ((PREDIV1) == RCC_PREDIV1_Div8) || \ - ((PREDIV1) == RCC_PREDIV1_Div9) || ((PREDIV1) == RCC_PREDIV1_Div10) || \ - ((PREDIV1) == RCC_PREDIV1_Div11) || ((PREDIV1) == RCC_PREDIV1_Div12) || \ - ((PREDIV1) == RCC_PREDIV1_Div13) || ((PREDIV1) == RCC_PREDIV1_Div14) || \ - ((PREDIV1) == RCC_PREDIV1_Div15) || ((PREDIV1) == RCC_PREDIV1_Div16)) -#endif -/** - * @} - */ - - -/** @defgroup PREDIV1_clock_source - * @{ - */ -#ifdef STM32F10X_CL -/* PREDIV1 clock source (for STM32 connectivity line devices) */ - #define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) - #define RCC_PREDIV1_Source_PLL2 ((uint32_t)0x00010000) - - #define IS_RCC_PREDIV1_SOURCE(SOURCE) (((SOURCE) == RCC_PREDIV1_Source_HSE) || \ - ((SOURCE) == RCC_PREDIV1_Source_PLL2)) -#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -/* PREDIV1 clock source (for STM32 Value line devices) */ - #define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) - - #define IS_RCC_PREDIV1_SOURCE(SOURCE) (((SOURCE) == RCC_PREDIV1_Source_HSE)) -#endif -/** - * @} - */ - -#ifdef STM32F10X_CL -/** @defgroup PREDIV2_division_factor - * @{ - */ - - #define RCC_PREDIV2_Div1 ((uint32_t)0x00000000) - #define RCC_PREDIV2_Div2 ((uint32_t)0x00000010) - #define RCC_PREDIV2_Div3 ((uint32_t)0x00000020) - #define RCC_PREDIV2_Div4 ((uint32_t)0x00000030) - #define RCC_PREDIV2_Div5 ((uint32_t)0x00000040) - #define RCC_PREDIV2_Div6 ((uint32_t)0x00000050) - #define RCC_PREDIV2_Div7 ((uint32_t)0x00000060) - #define RCC_PREDIV2_Div8 ((uint32_t)0x00000070) - #define RCC_PREDIV2_Div9 ((uint32_t)0x00000080) - #define RCC_PREDIV2_Div10 ((uint32_t)0x00000090) - #define RCC_PREDIV2_Div11 ((uint32_t)0x000000A0) - #define RCC_PREDIV2_Div12 ((uint32_t)0x000000B0) - #define RCC_PREDIV2_Div13 ((uint32_t)0x000000C0) - #define RCC_PREDIV2_Div14 ((uint32_t)0x000000D0) - #define RCC_PREDIV2_Div15 ((uint32_t)0x000000E0) - #define RCC_PREDIV2_Div16 ((uint32_t)0x000000F0) - - #define IS_RCC_PREDIV2(PREDIV2) (((PREDIV2) == RCC_PREDIV2_Div1) || ((PREDIV2) == RCC_PREDIV2_Div2) || \ - ((PREDIV2) == RCC_PREDIV2_Div3) || ((PREDIV2) == RCC_PREDIV2_Div4) || \ - ((PREDIV2) == RCC_PREDIV2_Div5) || ((PREDIV2) == RCC_PREDIV2_Div6) || \ - ((PREDIV2) == RCC_PREDIV2_Div7) || ((PREDIV2) == RCC_PREDIV2_Div8) || \ - ((PREDIV2) == RCC_PREDIV2_Div9) || ((PREDIV2) == RCC_PREDIV2_Div10) || \ - ((PREDIV2) == RCC_PREDIV2_Div11) || ((PREDIV2) == RCC_PREDIV2_Div12) || \ - ((PREDIV2) == RCC_PREDIV2_Div13) || ((PREDIV2) == RCC_PREDIV2_Div14) || \ - ((PREDIV2) == RCC_PREDIV2_Div15) || ((PREDIV2) == RCC_PREDIV2_Div16)) -/** - * @} - */ - - -/** @defgroup PLL2_multiplication_factor - * @{ - */ - - #define RCC_PLL2Mul_8 ((uint32_t)0x00000600) - #define RCC_PLL2Mul_9 ((uint32_t)0x00000700) - #define RCC_PLL2Mul_10 ((uint32_t)0x00000800) - #define RCC_PLL2Mul_11 ((uint32_t)0x00000900) - #define RCC_PLL2Mul_12 ((uint32_t)0x00000A00) - #define RCC_PLL2Mul_13 ((uint32_t)0x00000B00) - #define RCC_PLL2Mul_14 ((uint32_t)0x00000C00) - #define RCC_PLL2Mul_16 ((uint32_t)0x00000E00) - #define RCC_PLL2Mul_20 ((uint32_t)0x00000F00) - - #define IS_RCC_PLL2_MUL(MUL) (((MUL) == RCC_PLL2Mul_8) || ((MUL) == RCC_PLL2Mul_9) || \ - ((MUL) == RCC_PLL2Mul_10) || ((MUL) == RCC_PLL2Mul_11) || \ - ((MUL) == RCC_PLL2Mul_12) || ((MUL) == RCC_PLL2Mul_13) || \ - ((MUL) == RCC_PLL2Mul_14) || ((MUL) == RCC_PLL2Mul_16) || \ - ((MUL) == RCC_PLL2Mul_20)) -/** - * @} - */ - - -/** @defgroup PLL3_multiplication_factor - * @{ - */ - - #define RCC_PLL3Mul_8 ((uint32_t)0x00006000) - #define RCC_PLL3Mul_9 ((uint32_t)0x00007000) - #define RCC_PLL3Mul_10 ((uint32_t)0x00008000) - #define RCC_PLL3Mul_11 ((uint32_t)0x00009000) - #define RCC_PLL3Mul_12 ((uint32_t)0x0000A000) - #define RCC_PLL3Mul_13 ((uint32_t)0x0000B000) - #define RCC_PLL3Mul_14 ((uint32_t)0x0000C000) - #define RCC_PLL3Mul_16 ((uint32_t)0x0000E000) - #define RCC_PLL3Mul_20 ((uint32_t)0x0000F000) - - #define IS_RCC_PLL3_MUL(MUL) (((MUL) == RCC_PLL3Mul_8) || ((MUL) == RCC_PLL3Mul_9) || \ - ((MUL) == RCC_PLL3Mul_10) || ((MUL) == RCC_PLL3Mul_11) || \ - ((MUL) == RCC_PLL3Mul_12) || ((MUL) == RCC_PLL3Mul_13) || \ - ((MUL) == RCC_PLL3Mul_14) || ((MUL) == RCC_PLL3Mul_16) || \ - ((MUL) == RCC_PLL3Mul_20)) -/** - * @} - */ - -#endif /* STM32F10X_CL */ - - -/** @defgroup System_clock_source - * @{ - */ - -#define RCC_SYSCLKSource_HSI ((uint32_t)0x00000000) -#define RCC_SYSCLKSource_HSE ((uint32_t)0x00000001) -#define RCC_SYSCLKSource_PLLCLK ((uint32_t)0x00000002) -#define IS_RCC_SYSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSource_HSI) || \ - ((SOURCE) == RCC_SYSCLKSource_HSE) || \ - ((SOURCE) == RCC_SYSCLKSource_PLLCLK)) -/** - * @} - */ - -/** @defgroup AHB_clock_source - * @{ - */ - -#define RCC_SYSCLK_Div1 ((uint32_t)0x00000000) -#define RCC_SYSCLK_Div2 ((uint32_t)0x00000080) -#define RCC_SYSCLK_Div4 ((uint32_t)0x00000090) -#define RCC_SYSCLK_Div8 ((uint32_t)0x000000A0) -#define RCC_SYSCLK_Div16 ((uint32_t)0x000000B0) -#define RCC_SYSCLK_Div64 ((uint32_t)0x000000C0) -#define RCC_SYSCLK_Div128 ((uint32_t)0x000000D0) -#define RCC_SYSCLK_Div256 ((uint32_t)0x000000E0) -#define RCC_SYSCLK_Div512 ((uint32_t)0x000000F0) -#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_Div1) || ((HCLK) == RCC_SYSCLK_Div2) || \ - ((HCLK) == RCC_SYSCLK_Div4) || ((HCLK) == RCC_SYSCLK_Div8) || \ - ((HCLK) == RCC_SYSCLK_Div16) || ((HCLK) == RCC_SYSCLK_Div64) || \ - ((HCLK) == RCC_SYSCLK_Div128) || ((HCLK) == RCC_SYSCLK_Div256) || \ - ((HCLK) == RCC_SYSCLK_Div512)) -/** - * @} - */ - -/** @defgroup APB1_APB2_clock_source - * @{ - */ - -#define RCC_HCLK_Div1 ((uint32_t)0x00000000) -#define RCC_HCLK_Div2 ((uint32_t)0x00000400) -#define RCC_HCLK_Div4 ((uint32_t)0x00000500) -#define RCC_HCLK_Div8 ((uint32_t)0x00000600) -#define RCC_HCLK_Div16 ((uint32_t)0x00000700) -#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_Div1) || ((PCLK) == RCC_HCLK_Div2) || \ - ((PCLK) == RCC_HCLK_Div4) || ((PCLK) == RCC_HCLK_Div8) || \ - ((PCLK) == RCC_HCLK_Div16)) -/** - * @} - */ - -/** @defgroup RCC_Interrupt_source - * @{ - */ - -#define RCC_IT_LSIRDY ((uint8_t)0x01) -#define RCC_IT_LSERDY ((uint8_t)0x02) -#define RCC_IT_HSIRDY ((uint8_t)0x04) -#define RCC_IT_HSERDY ((uint8_t)0x08) -#define RCC_IT_PLLRDY ((uint8_t)0x10) -#define RCC_IT_CSS ((uint8_t)0x80) - -#ifndef STM32F10X_CL - #define IS_RCC_IT(IT) ((((IT) & (uint8_t)0xE0) == 0x00) && ((IT) != 0x00)) - #define IS_RCC_GET_IT(IT) (((IT) == RCC_IT_LSIRDY) || ((IT) == RCC_IT_LSERDY) || \ - ((IT) == RCC_IT_HSIRDY) || ((IT) == RCC_IT_HSERDY) || \ - ((IT) == RCC_IT_PLLRDY) || ((IT) == RCC_IT_CSS)) - #define IS_RCC_CLEAR_IT(IT) ((((IT) & (uint8_t)0x60) == 0x00) && ((IT) != 0x00)) -#else - #define RCC_IT_PLL2RDY ((uint8_t)0x20) - #define RCC_IT_PLL3RDY ((uint8_t)0x40) - #define IS_RCC_IT(IT) ((((IT) & (uint8_t)0x80) == 0x00) && ((IT) != 0x00)) - #define IS_RCC_GET_IT(IT) (((IT) == RCC_IT_LSIRDY) || ((IT) == RCC_IT_LSERDY) || \ - ((IT) == RCC_IT_HSIRDY) || ((IT) == RCC_IT_HSERDY) || \ - ((IT) == RCC_IT_PLLRDY) || ((IT) == RCC_IT_CSS) || \ - ((IT) == RCC_IT_PLL2RDY) || ((IT) == RCC_IT_PLL3RDY)) - #define IS_RCC_CLEAR_IT(IT) ((IT) != 0x00) -#endif /* STM32F10X_CL */ - - -/** - * @} - */ - -#ifndef STM32F10X_CL -/** @defgroup USB_Device_clock_source - * @{ - */ - - #define RCC_USBCLKSource_PLLCLK_1Div5 ((uint8_t)0x00) - #define RCC_USBCLKSource_PLLCLK_Div1 ((uint8_t)0x01) - - #define IS_RCC_USBCLK_SOURCE(SOURCE) (((SOURCE) == RCC_USBCLKSource_PLLCLK_1Div5) || \ - ((SOURCE) == RCC_USBCLKSource_PLLCLK_Div1)) -/** - * @} - */ -#else -/** @defgroup USB_OTG_FS_clock_source - * @{ - */ - #define RCC_OTGFSCLKSource_PLLVCO_Div3 ((uint8_t)0x00) - #define RCC_OTGFSCLKSource_PLLVCO_Div2 ((uint8_t)0x01) - - #define IS_RCC_OTGFSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_OTGFSCLKSource_PLLVCO_Div3) || \ - ((SOURCE) == RCC_OTGFSCLKSource_PLLVCO_Div2)) -/** - * @} - */ -#endif /* STM32F10X_CL */ - - -#ifdef STM32F10X_CL -/** @defgroup I2S2_clock_source - * @{ - */ - #define RCC_I2S2CLKSource_SYSCLK ((uint8_t)0x00) - #define RCC_I2S2CLKSource_PLL3_VCO ((uint8_t)0x01) - - #define IS_RCC_I2S2CLK_SOURCE(SOURCE) (((SOURCE) == RCC_I2S2CLKSource_SYSCLK) || \ - ((SOURCE) == RCC_I2S2CLKSource_PLL3_VCO)) -/** - * @} - */ - -/** @defgroup I2S3_clock_source - * @{ - */ - #define RCC_I2S3CLKSource_SYSCLK ((uint8_t)0x00) - #define RCC_I2S3CLKSource_PLL3_VCO ((uint8_t)0x01) - - #define IS_RCC_I2S3CLK_SOURCE(SOURCE) (((SOURCE) == RCC_I2S3CLKSource_SYSCLK) || \ - ((SOURCE) == RCC_I2S3CLKSource_PLL3_VCO)) -/** - * @} - */ -#endif /* STM32F10X_CL */ - - -/** @defgroup ADC_clock_source - * @{ - */ - -#define RCC_PCLK2_Div2 ((uint32_t)0x00000000) -#define RCC_PCLK2_Div4 ((uint32_t)0x00004000) -#define RCC_PCLK2_Div6 ((uint32_t)0x00008000) -#define RCC_PCLK2_Div8 ((uint32_t)0x0000C000) -#define IS_RCC_ADCCLK(ADCCLK) (((ADCCLK) == RCC_PCLK2_Div2) || ((ADCCLK) == RCC_PCLK2_Div4) || \ - ((ADCCLK) == RCC_PCLK2_Div6) || ((ADCCLK) == RCC_PCLK2_Div8)) -/** - * @} - */ - -/** @defgroup LSE_configuration - * @{ - */ - -#define RCC_LSE_OFF ((uint8_t)0x00) -#define RCC_LSE_ON ((uint8_t)0x01) -#define RCC_LSE_Bypass ((uint8_t)0x04) -#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ - ((LSE) == RCC_LSE_Bypass)) -/** - * @} - */ - -/** @defgroup RTC_clock_source - * @{ - */ - -#define RCC_RTCCLKSource_LSE ((uint32_t)0x00000100) -#define RCC_RTCCLKSource_LSI ((uint32_t)0x00000200) -#define RCC_RTCCLKSource_HSE_Div128 ((uint32_t)0x00000300) -#define IS_RCC_RTCCLK_SOURCE(SOURCE) (((SOURCE) == RCC_RTCCLKSource_LSE) || \ - ((SOURCE) == RCC_RTCCLKSource_LSI) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div128)) -/** - * @} - */ - -/** @defgroup AHB_peripheral - * @{ - */ - -#define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) -#define RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) -#define RCC_AHBPeriph_SRAM ((uint32_t)0x00000004) -#define RCC_AHBPeriph_FLITF ((uint32_t)0x00000010) -#define RCC_AHBPeriph_CRC ((uint32_t)0x00000040) - -#ifndef STM32F10X_CL - #define RCC_AHBPeriph_FSMC ((uint32_t)0x00000100) - #define RCC_AHBPeriph_SDIO ((uint32_t)0x00000400) - #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFAA8) == 0x00) && ((PERIPH) != 0x00)) -#else - #define RCC_AHBPeriph_OTG_FS ((uint32_t)0x00001000) - #define RCC_AHBPeriph_ETH_MAC ((uint32_t)0x00004000) - #define RCC_AHBPeriph_ETH_MAC_Tx ((uint32_t)0x00008000) - #define RCC_AHBPeriph_ETH_MAC_Rx ((uint32_t)0x00010000) - - #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFE2FA8) == 0x00) && ((PERIPH) != 0x00)) - #define IS_RCC_AHB_PERIPH_RESET(PERIPH) ((((PERIPH) & 0xFFFFAFFF) == 0x00) && ((PERIPH) != 0x00)) -#endif /* STM32F10X_CL */ -/** - * @} - */ - -/** @defgroup APB2_peripheral - * @{ - */ - -#define RCC_APB2Periph_AFIO ((uint32_t)0x00000001) -#define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) -#define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008) -#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) -#define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) -#define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040) -#define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080) -#define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100) -#define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200) -#define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400) -#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800) -#define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) -#define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000) -#define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) -#define RCC_APB2Periph_ADC3 ((uint32_t)0x00008000) -#define RCC_APB2Periph_TIM15 ((uint32_t)0x00010000) -#define RCC_APB2Periph_TIM16 ((uint32_t)0x00020000) -#define RCC_APB2Periph_TIM17 ((uint32_t)0x00040000) - -#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFF80002) == 0x00) && ((PERIPH) != 0x00)) -/** - * @} - */ - -/** @defgroup APB1_peripheral - * @{ - */ - -#define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) -#define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) -#define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) -#define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) -#define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) -#define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) -#define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) -#define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000) -#define RCC_APB1Periph_SPI3 ((uint32_t)0x00008000) -#define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) -#define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) -#define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) -#define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) -#define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) -#define RCC_APB1Periph_I2C2 ((uint32_t)0x00400000) -#define RCC_APB1Periph_USB ((uint32_t)0x00800000) -#define RCC_APB1Periph_CAN1 ((uint32_t)0x02000000) -#define RCC_APB1Periph_CAN2 ((uint32_t)0x04000000) -#define RCC_APB1Periph_BKP ((uint32_t)0x08000000) -#define RCC_APB1Periph_PWR ((uint32_t)0x10000000) -#define RCC_APB1Periph_DAC ((uint32_t)0x20000000) -#define RCC_APB1Periph_CEC ((uint32_t)0x40000000) - -#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x810137C0) == 0x00) && ((PERIPH) != 0x00)) - -/** - * @} - */ - -/** @defgroup Clock_source_to_output_on_MCO_pin - * @{ - */ - -#define RCC_MCO_NoClock ((uint8_t)0x00) -#define RCC_MCO_SYSCLK ((uint8_t)0x04) -#define RCC_MCO_HSI ((uint8_t)0x05) -#define RCC_MCO_HSE ((uint8_t)0x06) -#define RCC_MCO_PLLCLK_Div2 ((uint8_t)0x07) - -#ifndef STM32F10X_CL - #define IS_RCC_MCO(MCO) (((MCO) == RCC_MCO_NoClock) || ((MCO) == RCC_MCO_HSI) || \ - ((MCO) == RCC_MCO_SYSCLK) || ((MCO) == RCC_MCO_HSE) || \ - ((MCO) == RCC_MCO_PLLCLK_Div2)) -#else - #define RCC_MCO_PLL2CLK ((uint8_t)0x08) - #define RCC_MCO_PLL3CLK_Div2 ((uint8_t)0x09) - #define RCC_MCO_XT1 ((uint8_t)0x0A) - #define RCC_MCO_PLL3CLK ((uint8_t)0x0B) - - #define IS_RCC_MCO(MCO) (((MCO) == RCC_MCO_NoClock) || ((MCO) == RCC_MCO_HSI) || \ - ((MCO) == RCC_MCO_SYSCLK) || ((MCO) == RCC_MCO_HSE) || \ - ((MCO) == RCC_MCO_PLLCLK_Div2) || ((MCO) == RCC_MCO_PLL2CLK) || \ - ((MCO) == RCC_MCO_PLL3CLK_Div2) || ((MCO) == RCC_MCO_XT1) || \ - ((MCO) == RCC_MCO_PLL3CLK)) -#endif /* STM32F10X_CL */ - -/** - * @} - */ - -/** @defgroup RCC_Flag - * @{ - */ - -#define RCC_FLAG_HSIRDY ((uint8_t)0x21) -#define RCC_FLAG_HSERDY ((uint8_t)0x31) -#define RCC_FLAG_PLLRDY ((uint8_t)0x39) -#define RCC_FLAG_LSERDY ((uint8_t)0x41) -#define RCC_FLAG_LSIRDY ((uint8_t)0x61) -#define RCC_FLAG_PINRST ((uint8_t)0x7A) -#define RCC_FLAG_PORRST ((uint8_t)0x7B) -#define RCC_FLAG_SFTRST ((uint8_t)0x7C) -#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) -#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) -#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) - -#ifndef STM32F10X_CL - #define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ - ((FLAG) == RCC_FLAG_PLLRDY) || ((FLAG) == RCC_FLAG_LSERDY) || \ - ((FLAG) == RCC_FLAG_LSIRDY) || ((FLAG) == RCC_FLAG_PINRST) || \ - ((FLAG) == RCC_FLAG_PORRST) || ((FLAG) == RCC_FLAG_SFTRST) || \ - ((FLAG) == RCC_FLAG_IWDGRST)|| ((FLAG) == RCC_FLAG_WWDGRST)|| \ - ((FLAG) == RCC_FLAG_LPWRRST)) -#else - #define RCC_FLAG_PLL2RDY ((uint8_t)0x3B) - #define RCC_FLAG_PLL3RDY ((uint8_t)0x3D) - #define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ - ((FLAG) == RCC_FLAG_PLLRDY) || ((FLAG) == RCC_FLAG_LSERDY) || \ - ((FLAG) == RCC_FLAG_PLL2RDY) || ((FLAG) == RCC_FLAG_PLL3RDY) || \ - ((FLAG) == RCC_FLAG_LSIRDY) || ((FLAG) == RCC_FLAG_PINRST) || \ - ((FLAG) == RCC_FLAG_PORRST) || ((FLAG) == RCC_FLAG_SFTRST) || \ - ((FLAG) == RCC_FLAG_IWDGRST)|| ((FLAG) == RCC_FLAG_WWDGRST)|| \ - ((FLAG) == RCC_FLAG_LPWRRST)) -#endif /* STM32F10X_CL */ - -#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1F) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup RCC_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup RCC_Exported_Functions - * @{ - */ - -void RCC_DeInit(void); -void RCC_HSEConfig(uint32_t RCC_HSE); -ErrorStatus RCC_WaitForHSEStartUp(void); -void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); -void RCC_HSICmd(FunctionalState NewState); -void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul); -void RCC_PLLCmd(FunctionalState NewState); - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_CL) - void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div); -#endif - -#ifdef STM32F10X_CL - void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div); - void RCC_PLL2Config(uint32_t RCC_PLL2Mul); - void RCC_PLL2Cmd(FunctionalState NewState); - void RCC_PLL3Config(uint32_t RCC_PLL3Mul); - void RCC_PLL3Cmd(FunctionalState NewState); -#endif /* STM32F10X_CL */ - -void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); -uint8_t RCC_GetSYSCLKSource(void); -void RCC_HCLKConfig(uint32_t RCC_SYSCLK); -void RCC_PCLK1Config(uint32_t RCC_HCLK); -void RCC_PCLK2Config(uint32_t RCC_HCLK); -void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); - -#ifndef STM32F10X_CL - void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource); -#else - void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource); -#endif /* STM32F10X_CL */ - -void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); - -#ifdef STM32F10X_CL - void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource); - void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource); -#endif /* STM32F10X_CL */ - -void RCC_LSEConfig(uint8_t RCC_LSE); -void RCC_LSICmd(FunctionalState NewState); -void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); -void RCC_RTCCLKCmd(FunctionalState NewState); -void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks); -void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); -void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); -void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); - -#ifdef STM32F10X_CL -void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); -#endif /* STM32F10X_CL */ - -void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); -void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); -void RCC_BackupResetCmd(FunctionalState NewState); -void RCC_ClockSecuritySystemCmd(FunctionalState NewState); -void RCC_MCOConfig(uint8_t RCC_MCO); -FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); -void RCC_ClearFlag(void); -ITStatus RCC_GetITStatus(uint8_t RCC_IT); -void RCC_ClearITPendingBit(uint8_t RCC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_RCC_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h deleted file mode 100644 index d0b1e5495f..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_rtc.h +++ /dev/null @@ -1,134 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_rtc.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the RTC firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_RTC_H -#define __STM32F10x_RTC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup RTC - * @{ - */ - -/** @defgroup RTC_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup RTC_Exported_Constants - * @{ - */ - -/** @defgroup RTC_interrupts_define - * @{ - */ - -#define RTC_IT_OW ((uint16_t)0x0004) /*!< Overflow interrupt */ -#define RTC_IT_ALR ((uint16_t)0x0002) /*!< Alarm interrupt */ -#define RTC_IT_SEC ((uint16_t)0x0001) /*!< Second interrupt */ -#define IS_RTC_IT(IT) ((((IT) & (uint16_t)0xFFF8) == 0x00) && ((IT) != 0x00)) -#define IS_RTC_GET_IT(IT) (((IT) == RTC_IT_OW) || ((IT) == RTC_IT_ALR) || \ - ((IT) == RTC_IT_SEC)) -/** - * @} - */ - -/** @defgroup RTC_interrupts_flags - * @{ - */ - -#define RTC_FLAG_RTOFF ((uint16_t)0x0020) /*!< RTC Operation OFF flag */ -#define RTC_FLAG_RSF ((uint16_t)0x0008) /*!< Registers Synchronized flag */ -#define RTC_FLAG_OW ((uint16_t)0x0004) /*!< Overflow flag */ -#define RTC_FLAG_ALR ((uint16_t)0x0002) /*!< Alarm flag */ -#define RTC_FLAG_SEC ((uint16_t)0x0001) /*!< Second flag */ -#define IS_RTC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFFF0) == 0x00) && ((FLAG) != 0x00)) -#define IS_RTC_GET_FLAG(FLAG) (((FLAG) == RTC_FLAG_RTOFF) || ((FLAG) == RTC_FLAG_RSF) || \ - ((FLAG) == RTC_FLAG_OW) || ((FLAG) == RTC_FLAG_ALR) || \ - ((FLAG) == RTC_FLAG_SEC)) -#define IS_RTC_PRESCALER(PRESCALER) ((PRESCALER) <= 0xFFFFF) - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup RTC_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup RTC_Exported_Functions - * @{ - */ - -void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState); -void RTC_EnterConfigMode(void); -void RTC_ExitConfigMode(void); -uint32_t RTC_GetCounter(void); -void RTC_SetCounter(uint32_t CounterValue); -void RTC_SetPrescaler(uint32_t PrescalerValue); -void RTC_SetAlarm(uint32_t AlarmValue); -uint32_t RTC_GetDivider(void); -void RTC_WaitForLastTask(void); -void RTC_WaitForSynchro(void); -FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG); -void RTC_ClearFlag(uint16_t RTC_FLAG); -ITStatus RTC_GetITStatus(uint16_t RTC_IT); -void RTC_ClearITPendingBit(uint16_t RTC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_RTC_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h deleted file mode 100644 index 72bf65389e..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_sdio.h +++ /dev/null @@ -1,530 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_sdio.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the SDIO firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_SDIO_H -#define __STM32F10x_SDIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup SDIO - * @{ - */ - -/** @defgroup SDIO_Exported_Types - * @{ - */ - -typedef struct -{ - uint32_t SDIO_ClockEdge; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref SDIO_Clock_Edge */ - - uint32_t SDIO_ClockBypass; /*!< Specifies whether the SDIO Clock divider bypass is - enabled or disabled. - This parameter can be a value of @ref SDIO_Clock_Bypass */ - - uint32_t SDIO_ClockPowerSave; /*!< Specifies whether SDIO Clock output is enabled or - disabled when the bus is idle. - This parameter can be a value of @ref SDIO_Clock_Power_Save */ - - uint32_t SDIO_BusWide; /*!< Specifies the SDIO bus width. - This parameter can be a value of @ref SDIO_Bus_Wide */ - - uint32_t SDIO_HardwareFlowControl; /*!< Specifies whether the SDIO hardware flow control is enabled or disabled. - This parameter can be a value of @ref SDIO_Hardware_Flow_Control */ - - uint8_t SDIO_ClockDiv; /*!< Specifies the clock frequency of the SDIO controller. - This parameter can be a value between 0x00 and 0xFF. */ - -} SDIO_InitTypeDef; - -typedef struct -{ - uint32_t SDIO_Argument; /*!< Specifies the SDIO command argument which is sent - to a card as part of a command message. If a command - contains an argument, it must be loaded into this register - before writing the command to the command register */ - - uint32_t SDIO_CmdIndex; /*!< Specifies the SDIO command index. It must be lower than 0x40. */ - - uint32_t SDIO_Response; /*!< Specifies the SDIO response type. - This parameter can be a value of @ref SDIO_Response_Type */ - - uint32_t SDIO_Wait; /*!< Specifies whether SDIO wait-for-interrupt request is enabled or disabled. - This parameter can be a value of @ref SDIO_Wait_Interrupt_State */ - - uint32_t SDIO_CPSM; /*!< Specifies whether SDIO Command path state machine (CPSM) - is enabled or disabled. - This parameter can be a value of @ref SDIO_CPSM_State */ -} SDIO_CmdInitTypeDef; - -typedef struct -{ - uint32_t SDIO_DataTimeOut; /*!< Specifies the data timeout period in card bus clock periods. */ - - uint32_t SDIO_DataLength; /*!< Specifies the number of data bytes to be transferred. */ - - uint32_t SDIO_DataBlockSize; /*!< Specifies the data block size for block transfer. - This parameter can be a value of @ref SDIO_Data_Block_Size */ - - uint32_t SDIO_TransferDir; /*!< Specifies the data transfer direction, whether the transfer - is a read or write. - This parameter can be a value of @ref SDIO_Transfer_Direction */ - - uint32_t SDIO_TransferMode; /*!< Specifies whether data transfer is in stream or block mode. - This parameter can be a value of @ref SDIO_Transfer_Type */ - - uint32_t SDIO_DPSM; /*!< Specifies whether SDIO Data path state machine (DPSM) - is enabled or disabled. - This parameter can be a value of @ref SDIO_DPSM_State */ -} SDIO_DataInitTypeDef; - -/** - * @} - */ - -/** @defgroup SDIO_Exported_Constants - * @{ - */ - -/** @defgroup SDIO_Clock_Edge - * @{ - */ - -#define SDIO_ClockEdge_Rising ((uint32_t)0x00000000) -#define SDIO_ClockEdge_Falling ((uint32_t)0x00002000) -#define IS_SDIO_CLOCK_EDGE(EDGE) (((EDGE) == SDIO_ClockEdge_Rising) || \ - ((EDGE) == SDIO_ClockEdge_Falling)) -/** - * @} - */ - -/** @defgroup SDIO_Clock_Bypass - * @{ - */ - -#define SDIO_ClockBypass_Disable ((uint32_t)0x00000000) -#define SDIO_ClockBypass_Enable ((uint32_t)0x00000400) -#define IS_SDIO_CLOCK_BYPASS(BYPASS) (((BYPASS) == SDIO_ClockBypass_Disable) || \ - ((BYPASS) == SDIO_ClockBypass_Enable)) -/** - * @} - */ - -/** @defgroup SDIO_Clock_Power_Save - * @{ - */ - -#define SDIO_ClockPowerSave_Disable ((uint32_t)0x00000000) -#define SDIO_ClockPowerSave_Enable ((uint32_t)0x00000200) -#define IS_SDIO_CLOCK_POWER_SAVE(SAVE) (((SAVE) == SDIO_ClockPowerSave_Disable) || \ - ((SAVE) == SDIO_ClockPowerSave_Enable)) -/** - * @} - */ - -/** @defgroup SDIO_Bus_Wide - * @{ - */ - -#define SDIO_BusWide_1b ((uint32_t)0x00000000) -#define SDIO_BusWide_4b ((uint32_t)0x00000800) -#define SDIO_BusWide_8b ((uint32_t)0x00001000) -#define IS_SDIO_BUS_WIDE(WIDE) (((WIDE) == SDIO_BusWide_1b) || ((WIDE) == SDIO_BusWide_4b) || \ - ((WIDE) == SDIO_BusWide_8b)) - -/** - * @} - */ - -/** @defgroup SDIO_Hardware_Flow_Control - * @{ - */ - -#define SDIO_HardwareFlowControl_Disable ((uint32_t)0x00000000) -#define SDIO_HardwareFlowControl_Enable ((uint32_t)0x00004000) -#define IS_SDIO_HARDWARE_FLOW_CONTROL(CONTROL) (((CONTROL) == SDIO_HardwareFlowControl_Disable) || \ - ((CONTROL) == SDIO_HardwareFlowControl_Enable)) -/** - * @} - */ - -/** @defgroup SDIO_Power_State - * @{ - */ - -#define SDIO_PowerState_OFF ((uint32_t)0x00000000) -#define SDIO_PowerState_ON ((uint32_t)0x00000003) -#define IS_SDIO_POWER_STATE(STATE) (((STATE) == SDIO_PowerState_OFF) || ((STATE) == SDIO_PowerState_ON)) -/** - * @} - */ - - -/** @defgroup SDIO_Interrupt_soucres - * @{ - */ - -#define SDIO_IT_CCRCFAIL ((uint32_t)0x00000001) -#define SDIO_IT_DCRCFAIL ((uint32_t)0x00000002) -#define SDIO_IT_CTIMEOUT ((uint32_t)0x00000004) -#define SDIO_IT_DTIMEOUT ((uint32_t)0x00000008) -#define SDIO_IT_TXUNDERR ((uint32_t)0x00000010) -#define SDIO_IT_RXOVERR ((uint32_t)0x00000020) -#define SDIO_IT_CMDREND ((uint32_t)0x00000040) -#define SDIO_IT_CMDSENT ((uint32_t)0x00000080) -#define SDIO_IT_DATAEND ((uint32_t)0x00000100) -#define SDIO_IT_STBITERR ((uint32_t)0x00000200) -#define SDIO_IT_DBCKEND ((uint32_t)0x00000400) -#define SDIO_IT_CMDACT ((uint32_t)0x00000800) -#define SDIO_IT_TXACT ((uint32_t)0x00001000) -#define SDIO_IT_RXACT ((uint32_t)0x00002000) -#define SDIO_IT_TXFIFOHE ((uint32_t)0x00004000) -#define SDIO_IT_RXFIFOHF ((uint32_t)0x00008000) -#define SDIO_IT_TXFIFOF ((uint32_t)0x00010000) -#define SDIO_IT_RXFIFOF ((uint32_t)0x00020000) -#define SDIO_IT_TXFIFOE ((uint32_t)0x00040000) -#define SDIO_IT_RXFIFOE ((uint32_t)0x00080000) -#define SDIO_IT_TXDAVL ((uint32_t)0x00100000) -#define SDIO_IT_RXDAVL ((uint32_t)0x00200000) -#define SDIO_IT_SDIOIT ((uint32_t)0x00400000) -#define SDIO_IT_CEATAEND ((uint32_t)0x00800000) -#define IS_SDIO_IT(IT) ((((IT) & (uint32_t)0xFF000000) == 0x00) && ((IT) != (uint32_t)0x00)) -/** - * @} - */ - -/** @defgroup SDIO_Command_Index - * @{ - */ - -#define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40) -/** - * @} - */ - -/** @defgroup SDIO_Response_Type - * @{ - */ - -#define SDIO_Response_No ((uint32_t)0x00000000) -#define SDIO_Response_Short ((uint32_t)0x00000040) -#define SDIO_Response_Long ((uint32_t)0x000000C0) -#define IS_SDIO_RESPONSE(RESPONSE) (((RESPONSE) == SDIO_Response_No) || \ - ((RESPONSE) == SDIO_Response_Short) || \ - ((RESPONSE) == SDIO_Response_Long)) -/** - * @} - */ - -/** @defgroup SDIO_Wait_Interrupt_State - * @{ - */ - -#define SDIO_Wait_No ((uint32_t)0x00000000) /*!< SDIO No Wait, TimeOut is enabled */ -#define SDIO_Wait_IT ((uint32_t)0x00000100) /*!< SDIO Wait Interrupt Request */ -#define SDIO_Wait_Pend ((uint32_t)0x00000200) /*!< SDIO Wait End of transfer */ -#define IS_SDIO_WAIT(WAIT) (((WAIT) == SDIO_Wait_No) || ((WAIT) == SDIO_Wait_IT) || \ - ((WAIT) == SDIO_Wait_Pend)) -/** - * @} - */ - -/** @defgroup SDIO_CPSM_State - * @{ - */ - -#define SDIO_CPSM_Disable ((uint32_t)0x00000000) -#define SDIO_CPSM_Enable ((uint32_t)0x00000400) -#define IS_SDIO_CPSM(CPSM) (((CPSM) == SDIO_CPSM_Enable) || ((CPSM) == SDIO_CPSM_Disable)) -/** - * @} - */ - -/** @defgroup SDIO_Response_Registers - * @{ - */ - -#define SDIO_RESP1 ((uint32_t)0x00000000) -#define SDIO_RESP2 ((uint32_t)0x00000004) -#define SDIO_RESP3 ((uint32_t)0x00000008) -#define SDIO_RESP4 ((uint32_t)0x0000000C) -#define IS_SDIO_RESP(RESP) (((RESP) == SDIO_RESP1) || ((RESP) == SDIO_RESP2) || \ - ((RESP) == SDIO_RESP3) || ((RESP) == SDIO_RESP4)) -/** - * @} - */ - -/** @defgroup SDIO_Data_Length - * @{ - */ - -#define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <= 0x01FFFFFF) -/** - * @} - */ - -/** @defgroup SDIO_Data_Block_Size - * @{ - */ - -#define SDIO_DataBlockSize_1b ((uint32_t)0x00000000) -#define SDIO_DataBlockSize_2b ((uint32_t)0x00000010) -#define SDIO_DataBlockSize_4b ((uint32_t)0x00000020) -#define SDIO_DataBlockSize_8b ((uint32_t)0x00000030) -#define SDIO_DataBlockSize_16b ((uint32_t)0x00000040) -#define SDIO_DataBlockSize_32b ((uint32_t)0x00000050) -#define SDIO_DataBlockSize_64b ((uint32_t)0x00000060) -#define SDIO_DataBlockSize_128b ((uint32_t)0x00000070) -#define SDIO_DataBlockSize_256b ((uint32_t)0x00000080) -#define SDIO_DataBlockSize_512b ((uint32_t)0x00000090) -#define SDIO_DataBlockSize_1024b ((uint32_t)0x000000A0) -#define SDIO_DataBlockSize_2048b ((uint32_t)0x000000B0) -#define SDIO_DataBlockSize_4096b ((uint32_t)0x000000C0) -#define SDIO_DataBlockSize_8192b ((uint32_t)0x000000D0) -#define SDIO_DataBlockSize_16384b ((uint32_t)0x000000E0) -#define IS_SDIO_BLOCK_SIZE(SIZE) (((SIZE) == SDIO_DataBlockSize_1b) || \ - ((SIZE) == SDIO_DataBlockSize_2b) || \ - ((SIZE) == SDIO_DataBlockSize_4b) || \ - ((SIZE) == SDIO_DataBlockSize_8b) || \ - ((SIZE) == SDIO_DataBlockSize_16b) || \ - ((SIZE) == SDIO_DataBlockSize_32b) || \ - ((SIZE) == SDIO_DataBlockSize_64b) || \ - ((SIZE) == SDIO_DataBlockSize_128b) || \ - ((SIZE) == SDIO_DataBlockSize_256b) || \ - ((SIZE) == SDIO_DataBlockSize_512b) || \ - ((SIZE) == SDIO_DataBlockSize_1024b) || \ - ((SIZE) == SDIO_DataBlockSize_2048b) || \ - ((SIZE) == SDIO_DataBlockSize_4096b) || \ - ((SIZE) == SDIO_DataBlockSize_8192b) || \ - ((SIZE) == SDIO_DataBlockSize_16384b)) -/** - * @} - */ - -/** @defgroup SDIO_Transfer_Direction - * @{ - */ - -#define SDIO_TransferDir_ToCard ((uint32_t)0x00000000) -#define SDIO_TransferDir_ToSDIO ((uint32_t)0x00000002) -#define IS_SDIO_TRANSFER_DIR(DIR) (((DIR) == SDIO_TransferDir_ToCard) || \ - ((DIR) == SDIO_TransferDir_ToSDIO)) -/** - * @} - */ - -/** @defgroup SDIO_Transfer_Type - * @{ - */ - -#define SDIO_TransferMode_Block ((uint32_t)0x00000000) -#define SDIO_TransferMode_Stream ((uint32_t)0x00000004) -#define IS_SDIO_TRANSFER_MODE(MODE) (((MODE) == SDIO_TransferMode_Stream) || \ - ((MODE) == SDIO_TransferMode_Block)) -/** - * @} - */ - -/** @defgroup SDIO_DPSM_State - * @{ - */ - -#define SDIO_DPSM_Disable ((uint32_t)0x00000000) -#define SDIO_DPSM_Enable ((uint32_t)0x00000001) -#define IS_SDIO_DPSM(DPSM) (((DPSM) == SDIO_DPSM_Enable) || ((DPSM) == SDIO_DPSM_Disable)) -/** - * @} - */ - -/** @defgroup SDIO_Flags - * @{ - */ - -#define SDIO_FLAG_CCRCFAIL ((uint32_t)0x00000001) -#define SDIO_FLAG_DCRCFAIL ((uint32_t)0x00000002) -#define SDIO_FLAG_CTIMEOUT ((uint32_t)0x00000004) -#define SDIO_FLAG_DTIMEOUT ((uint32_t)0x00000008) -#define SDIO_FLAG_TXUNDERR ((uint32_t)0x00000010) -#define SDIO_FLAG_RXOVERR ((uint32_t)0x00000020) -#define SDIO_FLAG_CMDREND ((uint32_t)0x00000040) -#define SDIO_FLAG_CMDSENT ((uint32_t)0x00000080) -#define SDIO_FLAG_DATAEND ((uint32_t)0x00000100) -#define SDIO_FLAG_STBITERR ((uint32_t)0x00000200) -#define SDIO_FLAG_DBCKEND ((uint32_t)0x00000400) -#define SDIO_FLAG_CMDACT ((uint32_t)0x00000800) -#define SDIO_FLAG_TXACT ((uint32_t)0x00001000) -#define SDIO_FLAG_RXACT ((uint32_t)0x00002000) -#define SDIO_FLAG_TXFIFOHE ((uint32_t)0x00004000) -#define SDIO_FLAG_RXFIFOHF ((uint32_t)0x00008000) -#define SDIO_FLAG_TXFIFOF ((uint32_t)0x00010000) -#define SDIO_FLAG_RXFIFOF ((uint32_t)0x00020000) -#define SDIO_FLAG_TXFIFOE ((uint32_t)0x00040000) -#define SDIO_FLAG_RXFIFOE ((uint32_t)0x00080000) -#define SDIO_FLAG_TXDAVL ((uint32_t)0x00100000) -#define SDIO_FLAG_RXDAVL ((uint32_t)0x00200000) -#define SDIO_FLAG_SDIOIT ((uint32_t)0x00400000) -#define SDIO_FLAG_CEATAEND ((uint32_t)0x00800000) -#define IS_SDIO_FLAG(FLAG) (((FLAG) == SDIO_FLAG_CCRCFAIL) || \ - ((FLAG) == SDIO_FLAG_DCRCFAIL) || \ - ((FLAG) == SDIO_FLAG_CTIMEOUT) || \ - ((FLAG) == SDIO_FLAG_DTIMEOUT) || \ - ((FLAG) == SDIO_FLAG_TXUNDERR) || \ - ((FLAG) == SDIO_FLAG_RXOVERR) || \ - ((FLAG) == SDIO_FLAG_CMDREND) || \ - ((FLAG) == SDIO_FLAG_CMDSENT) || \ - ((FLAG) == SDIO_FLAG_DATAEND) || \ - ((FLAG) == SDIO_FLAG_STBITERR) || \ - ((FLAG) == SDIO_FLAG_DBCKEND) || \ - ((FLAG) == SDIO_FLAG_CMDACT) || \ - ((FLAG) == SDIO_FLAG_TXACT) || \ - ((FLAG) == SDIO_FLAG_RXACT) || \ - ((FLAG) == SDIO_FLAG_TXFIFOHE) || \ - ((FLAG) == SDIO_FLAG_RXFIFOHF) || \ - ((FLAG) == SDIO_FLAG_TXFIFOF) || \ - ((FLAG) == SDIO_FLAG_RXFIFOF) || \ - ((FLAG) == SDIO_FLAG_TXFIFOE) || \ - ((FLAG) == SDIO_FLAG_RXFIFOE) || \ - ((FLAG) == SDIO_FLAG_TXDAVL) || \ - ((FLAG) == SDIO_FLAG_RXDAVL) || \ - ((FLAG) == SDIO_FLAG_SDIOIT) || \ - ((FLAG) == SDIO_FLAG_CEATAEND)) - -#define IS_SDIO_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFF3FF800) == 0x00) && ((FLAG) != (uint32_t)0x00)) - -#define IS_SDIO_GET_IT(IT) (((IT) == SDIO_IT_CCRCFAIL) || \ - ((IT) == SDIO_IT_DCRCFAIL) || \ - ((IT) == SDIO_IT_CTIMEOUT) || \ - ((IT) == SDIO_IT_DTIMEOUT) || \ - ((IT) == SDIO_IT_TXUNDERR) || \ - ((IT) == SDIO_IT_RXOVERR) || \ - ((IT) == SDIO_IT_CMDREND) || \ - ((IT) == SDIO_IT_CMDSENT) || \ - ((IT) == SDIO_IT_DATAEND) || \ - ((IT) == SDIO_IT_STBITERR) || \ - ((IT) == SDIO_IT_DBCKEND) || \ - ((IT) == SDIO_IT_CMDACT) || \ - ((IT) == SDIO_IT_TXACT) || \ - ((IT) == SDIO_IT_RXACT) || \ - ((IT) == SDIO_IT_TXFIFOHE) || \ - ((IT) == SDIO_IT_RXFIFOHF) || \ - ((IT) == SDIO_IT_TXFIFOF) || \ - ((IT) == SDIO_IT_RXFIFOF) || \ - ((IT) == SDIO_IT_TXFIFOE) || \ - ((IT) == SDIO_IT_RXFIFOE) || \ - ((IT) == SDIO_IT_TXDAVL) || \ - ((IT) == SDIO_IT_RXDAVL) || \ - ((IT) == SDIO_IT_SDIOIT) || \ - ((IT) == SDIO_IT_CEATAEND)) - -#define IS_SDIO_CLEAR_IT(IT) ((((IT) & (uint32_t)0xFF3FF800) == 0x00) && ((IT) != (uint32_t)0x00)) - -/** - * @} - */ - -/** @defgroup SDIO_Read_Wait_Mode - * @{ - */ - -#define SDIO_ReadWaitMode_CLK ((uint32_t)0x00000000) -#define SDIO_ReadWaitMode_DATA2 ((uint32_t)0x00000001) -#define IS_SDIO_READWAIT_MODE(MODE) (((MODE) == SDIO_ReadWaitMode_CLK) || \ - ((MODE) == SDIO_ReadWaitMode_DATA2)) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup SDIO_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup SDIO_Exported_Functions - * @{ - */ - -void SDIO_DeInit(void); -void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct); -void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct); -void SDIO_ClockCmd(FunctionalState NewState); -void SDIO_SetPowerState(uint32_t SDIO_PowerState); -uint32_t SDIO_GetPowerState(void); -void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState); -void SDIO_DMACmd(FunctionalState NewState); -void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct); -void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct); -uint8_t SDIO_GetCommandResponse(void); -uint32_t SDIO_GetResponse(uint32_t SDIO_RESP); -void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct); -void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct); -uint32_t SDIO_GetDataCounter(void); -uint32_t SDIO_ReadData(void); -void SDIO_WriteData(uint32_t Data); -uint32_t SDIO_GetFIFOCount(void); -void SDIO_StartSDIOReadWait(FunctionalState NewState); -void SDIO_StopSDIOReadWait(FunctionalState NewState); -void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); -void SDIO_SetSDIOOperation(FunctionalState NewState); -void SDIO_SendSDIOSuspendCmd(FunctionalState NewState); -void SDIO_CommandCompletionCmd(FunctionalState NewState); -void SDIO_CEATAITCmd(FunctionalState NewState); -void SDIO_SendCEATACmd(FunctionalState NewState); -FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG); -void SDIO_ClearFlag(uint32_t SDIO_FLAG); -ITStatus SDIO_GetITStatus(uint32_t SDIO_IT); -void SDIO_ClearITPendingBit(uint32_t SDIO_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_SDIO_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h deleted file mode 100644 index 22e978145b..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h +++ /dev/null @@ -1,490 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_spi.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the SPI firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_SPI_H -#define __STM32F10x_SPI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup SPI - * @{ - */ - -/** @defgroup SPI_Exported_Types - * @{ - */ - -/** - * @brief SPI Init structure definition - */ - -typedef struct -{ - uint16_t SPI_Direction; /*!< Specifies the SPI unidirectional or bidirectional data mode. - This parameter can be a value of @ref SPI_data_direction */ - - uint16_t SPI_Mode; /*!< Specifies the SPI operating mode. - This parameter can be a value of @ref SPI_mode */ - - uint16_t SPI_DataSize; /*!< Specifies the SPI data size. - This parameter can be a value of @ref SPI_data_size */ - - uint16_t SPI_CPOL; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_Clock_Polarity */ - - uint16_t SPI_CPHA; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_Clock_Phase */ - - uint16_t SPI_NSS; /*!< Specifies whether the NSS signal is managed by - hardware (NSS pin) or by software using the SSI bit. - This parameter can be a value of @ref SPI_Slave_Select_management */ - - uint16_t SPI_BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be - used to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_BaudRate_Prescaler. - @note The communication clock is derived from the master - clock. The slave clock does not need to be set. */ - - uint16_t SPI_FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_MSB_LSB_transmission */ - - uint16_t SPI_CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. */ -}SPI_InitTypeDef; - -/** - * @brief I2S Init structure definition - */ - -typedef struct -{ - - uint16_t I2S_Mode; /*!< Specifies the I2S operating mode. - This parameter can be a value of @ref I2S_Mode */ - - uint16_t I2S_Standard; /*!< Specifies the standard used for the I2S communication. - This parameter can be a value of @ref I2S_Standard */ - - uint16_t I2S_DataFormat; /*!< Specifies the data format for the I2S communication. - This parameter can be a value of @ref I2S_Data_Format */ - - uint16_t I2S_MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. - This parameter can be a value of @ref I2S_MCLK_Output */ - - uint32_t I2S_AudioFreq; /*!< Specifies the frequency selected for the I2S communication. - This parameter can be a value of @ref I2S_Audio_Frequency */ - - uint16_t I2S_CPOL; /*!< Specifies the idle state of the I2S clock. - This parameter can be a value of @ref I2S_Clock_Polarity */ -}I2S_InitTypeDef; - -/** - * @} - */ - -/** @defgroup SPI_Exported_Constants - * @{ - */ - -#define IS_SPI_ALL_PERIPH(PERIPH) (((PERIPH) == SPI1) || \ - ((PERIPH) == SPI2) || \ - ((PERIPH) == SPI3)) - -#define IS_SPI_23_PERIPH(PERIPH) (((PERIPH) == SPI2) || \ - ((PERIPH) == SPI3)) - -/** @defgroup SPI_data_direction - * @{ - */ - -#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000) -#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400) -#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) -#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) -#define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_Direction_2Lines_FullDuplex) || \ - ((MODE) == SPI_Direction_2Lines_RxOnly) || \ - ((MODE) == SPI_Direction_1Line_Rx) || \ - ((MODE) == SPI_Direction_1Line_Tx)) -/** - * @} - */ - -/** @defgroup SPI_mode - * @{ - */ - -#define SPI_Mode_Master ((uint16_t)0x0104) -#define SPI_Mode_Slave ((uint16_t)0x0000) -#define IS_SPI_MODE(MODE) (((MODE) == SPI_Mode_Master) || \ - ((MODE) == SPI_Mode_Slave)) -/** - * @} - */ - -/** @defgroup SPI_data_size - * @{ - */ - -#define SPI_DataSize_16b ((uint16_t)0x0800) -#define SPI_DataSize_8b ((uint16_t)0x0000) -#define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_DataSize_16b) || \ - ((DATASIZE) == SPI_DataSize_8b)) -/** - * @} - */ - -/** @defgroup SPI_Clock_Polarity - * @{ - */ - -#define SPI_CPOL_Low ((uint16_t)0x0000) -#define SPI_CPOL_High ((uint16_t)0x0002) -#define IS_SPI_CPOL(CPOL) (((CPOL) == SPI_CPOL_Low) || \ - ((CPOL) == SPI_CPOL_High)) -/** - * @} - */ - -/** @defgroup SPI_Clock_Phase - * @{ - */ - -#define SPI_CPHA_1Edge ((uint16_t)0x0000) -#define SPI_CPHA_2Edge ((uint16_t)0x0001) -#define IS_SPI_CPHA(CPHA) (((CPHA) == SPI_CPHA_1Edge) || \ - ((CPHA) == SPI_CPHA_2Edge)) -/** - * @} - */ - -/** @defgroup SPI_Slave_Select_management - * @{ - */ - -#define SPI_NSS_Soft ((uint16_t)0x0200) -#define SPI_NSS_Hard ((uint16_t)0x0000) -#define IS_SPI_NSS(NSS) (((NSS) == SPI_NSS_Soft) || \ - ((NSS) == SPI_NSS_Hard)) -/** - * @} - */ - -/** @defgroup SPI_BaudRate_Prescaler - * @{ - */ - -#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) -#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) -#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) -#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) -#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) -#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) -#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) -#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) -#define IS_SPI_BAUDRATE_PRESCALER(PRESCALER) (((PRESCALER) == SPI_BaudRatePrescaler_2) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_4) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_8) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_16) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_32) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_64) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_128) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_256)) -/** - * @} - */ - -/** @defgroup SPI_MSB_LSB_transmission - * @{ - */ - -#define SPI_FirstBit_MSB ((uint16_t)0x0000) -#define SPI_FirstBit_LSB ((uint16_t)0x0080) -#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FirstBit_MSB) || \ - ((BIT) == SPI_FirstBit_LSB)) -/** - * @} - */ - -/** @defgroup I2S_Mode - * @{ - */ - -#define I2S_Mode_SlaveTx ((uint16_t)0x0000) -#define I2S_Mode_SlaveRx ((uint16_t)0x0100) -#define I2S_Mode_MasterTx ((uint16_t)0x0200) -#define I2S_Mode_MasterRx ((uint16_t)0x0300) -#define IS_I2S_MODE(MODE) (((MODE) == I2S_Mode_SlaveTx) || \ - ((MODE) == I2S_Mode_SlaveRx) || \ - ((MODE) == I2S_Mode_MasterTx) || \ - ((MODE) == I2S_Mode_MasterRx) ) -/** - * @} - */ - -/** @defgroup I2S_Standard - * @{ - */ - -#define I2S_Standard_Phillips ((uint16_t)0x0000) -#define I2S_Standard_MSB ((uint16_t)0x0010) -#define I2S_Standard_LSB ((uint16_t)0x0020) -#define I2S_Standard_PCMShort ((uint16_t)0x0030) -#define I2S_Standard_PCMLong ((uint16_t)0x00B0) -#define IS_I2S_STANDARD(STANDARD) (((STANDARD) == I2S_Standard_Phillips) || \ - ((STANDARD) == I2S_Standard_MSB) || \ - ((STANDARD) == I2S_Standard_LSB) || \ - ((STANDARD) == I2S_Standard_PCMShort) || \ - ((STANDARD) == I2S_Standard_PCMLong)) -/** - * @} - */ - -/** @defgroup I2S_Data_Format - * @{ - */ - -#define I2S_DataFormat_16b ((uint16_t)0x0000) -#define I2S_DataFormat_16bextended ((uint16_t)0x0001) -#define I2S_DataFormat_24b ((uint16_t)0x0003) -#define I2S_DataFormat_32b ((uint16_t)0x0005) -#define IS_I2S_DATA_FORMAT(FORMAT) (((FORMAT) == I2S_DataFormat_16b) || \ - ((FORMAT) == I2S_DataFormat_16bextended) || \ - ((FORMAT) == I2S_DataFormat_24b) || \ - ((FORMAT) == I2S_DataFormat_32b)) -/** - * @} - */ - -/** @defgroup I2S_MCLK_Output - * @{ - */ - -#define I2S_MCLKOutput_Enable ((uint16_t)0x0200) -#define I2S_MCLKOutput_Disable ((uint16_t)0x0000) -#define IS_I2S_MCLK_OUTPUT(OUTPUT) (((OUTPUT) == I2S_MCLKOutput_Enable) || \ - ((OUTPUT) == I2S_MCLKOutput_Disable)) -/** - * @} - */ - -/** @defgroup I2S_Audio_Frequency - * @{ - */ - -#define I2S_AudioFreq_96k ((uint32_t)96000) -#define I2S_AudioFreq_48k ((uint32_t)48000) -#define I2S_AudioFreq_44k ((uint32_t)44100) -#define I2S_AudioFreq_32k ((uint32_t)32000) -#define I2S_AudioFreq_22k ((uint32_t)22050) -#define I2S_AudioFreq_16k ((uint32_t)16000) -#define I2S_AudioFreq_11k ((uint32_t)11025) -#define I2S_AudioFreq_8k ((uint32_t)8000) -#define I2S_AudioFreq_Default ((uint32_t)2) -#define IS_I2S_AUDIO_FREQ(FREQ) (((FREQ) == I2S_AudioFreq_96k) || \ - ((FREQ) == I2S_AudioFreq_48k) || \ - ((FREQ) == I2S_AudioFreq_44k) || \ - ((FREQ) == I2S_AudioFreq_32k) || \ - ((FREQ) == I2S_AudioFreq_22k) || \ - ((FREQ) == I2S_AudioFreq_16k) || \ - ((FREQ) == I2S_AudioFreq_11k) || \ - ((FREQ) == I2S_AudioFreq_8k) || \ - ((FREQ) == I2S_AudioFreq_Default)) -/** - * @} - */ - -/** @defgroup I2S_Clock_Polarity - * @{ - */ - -#define I2S_CPOL_Low ((uint16_t)0x0000) -#define I2S_CPOL_High ((uint16_t)0x0008) -#define IS_I2S_CPOL(CPOL) (((CPOL) == I2S_CPOL_Low) || \ - ((CPOL) == I2S_CPOL_High)) -/** - * @} - */ - -/** @defgroup SPI_I2S_DMA_transfer_requests - * @{ - */ - -#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002) -#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001) -#define IS_SPI_I2S_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFFFC) == 0x00) && ((DMAREQ) != 0x00)) -/** - * @} - */ - -/** @defgroup SPI_NSS_internal_software_mangement - * @{ - */ - -#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100) -#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF) -#define IS_SPI_NSS_INTERNAL(INTERNAL) (((INTERNAL) == SPI_NSSInternalSoft_Set) || \ - ((INTERNAL) == SPI_NSSInternalSoft_Reset)) -/** - * @} - */ - -/** @defgroup SPI_CRC_Transmit_Receive - * @{ - */ - -#define SPI_CRC_Tx ((uint8_t)0x00) -#define SPI_CRC_Rx ((uint8_t)0x01) -#define IS_SPI_CRC(CRC) (((CRC) == SPI_CRC_Tx) || ((CRC) == SPI_CRC_Rx)) -/** - * @} - */ - -/** @defgroup SPI_direction_transmit_receive - * @{ - */ - -#define SPI_Direction_Rx ((uint16_t)0xBFFF) -#define SPI_Direction_Tx ((uint16_t)0x4000) -#define IS_SPI_DIRECTION(DIRECTION) (((DIRECTION) == SPI_Direction_Rx) || \ - ((DIRECTION) == SPI_Direction_Tx)) -/** - * @} - */ - -/** @defgroup SPI_I2S_interrupts_definition - * @{ - */ - -#define SPI_I2S_IT_TXE ((uint8_t)0x71) -#define SPI_I2S_IT_RXNE ((uint8_t)0x60) -#define SPI_I2S_IT_ERR ((uint8_t)0x50) -#define IS_SPI_I2S_CONFIG_IT(IT) (((IT) == SPI_I2S_IT_TXE) || \ - ((IT) == SPI_I2S_IT_RXNE) || \ - ((IT) == SPI_I2S_IT_ERR)) -#define SPI_I2S_IT_OVR ((uint8_t)0x56) -#define SPI_IT_MODF ((uint8_t)0x55) -#define SPI_IT_CRCERR ((uint8_t)0x54) -#define I2S_IT_UDR ((uint8_t)0x53) -#define IS_SPI_I2S_CLEAR_IT(IT) (((IT) == SPI_IT_CRCERR)) -#define IS_SPI_I2S_GET_IT(IT) (((IT) == SPI_I2S_IT_RXNE) || ((IT) == SPI_I2S_IT_TXE) || \ - ((IT) == I2S_IT_UDR) || ((IT) == SPI_IT_CRCERR) || \ - ((IT) == SPI_IT_MODF) || ((IT) == SPI_I2S_IT_OVR)) -/** - * @} - */ - -/** @defgroup SPI_I2S_flags_definition - * @{ - */ - -#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001) -#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002) -#define I2S_FLAG_CHSIDE ((uint16_t)0x0004) -#define I2S_FLAG_UDR ((uint16_t)0x0008) -#define SPI_FLAG_CRCERR ((uint16_t)0x0010) -#define SPI_FLAG_MODF ((uint16_t)0x0020) -#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040) -#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080) -#define IS_SPI_I2S_CLEAR_FLAG(FLAG) (((FLAG) == SPI_FLAG_CRCERR)) -#define IS_SPI_I2S_GET_FLAG(FLAG) (((FLAG) == SPI_I2S_FLAG_BSY) || ((FLAG) == SPI_I2S_FLAG_OVR) || \ - ((FLAG) == SPI_FLAG_MODF) || ((FLAG) == SPI_FLAG_CRCERR) || \ - ((FLAG) == I2S_FLAG_UDR) || ((FLAG) == I2S_FLAG_CHSIDE) || \ - ((FLAG) == SPI_I2S_FLAG_TXE) || ((FLAG) == SPI_I2S_FLAG_RXNE)) -/** - * @} - */ - -/** @defgroup SPI_CRC_polynomial - * @{ - */ - -#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL) ((POLYNOMIAL) >= 0x1) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup SPI_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup SPI_Exported_Functions - * @{ - */ - -void SPI_I2S_DeInit(SPI_TypeDef* SPIx); -void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); -void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); -void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct); -void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct); -void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); -void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); -void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); -void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); -void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); -uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); -void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft); -void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState); -void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); -void SPI_TransmitCRC(SPI_TypeDef* SPIx); -void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState); -uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC); -uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx); -void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction); -FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); -void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); -ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); -void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F10x_SPI_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h deleted file mode 100644 index de89ea64dd..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_tim.h +++ /dev/null @@ -1,1067 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_tim.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the TIM firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_TIM_H -#define __STM32F10x_TIM_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup TIM - * @{ - */ - -/** @defgroup TIM_Exported_Types - * @{ - */ - -/** - * @brief TIM Time Base Init structure definition - * @note This sturcture is used with all TIMx except for TIM6 and TIM7. - */ - -typedef struct -{ - uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between 0x0000 and 0xFFFF */ - - uint16_t TIM_CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_Counter_Mode */ - - uint16_t TIM_Period; /*!< Specifies the period value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter must be a number between 0x0000 and 0xFFFF. */ - - uint16_t TIM_ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_Clock_Division_CKD */ - - uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - This parameter must be a number between 0x00 and 0xFF. - @note This parameter is valid only for TIM1 and TIM8. */ -} TIM_TimeBaseInitTypeDef; - -/** - * @brief TIM Output Compare Init structure definition - */ - -typedef struct -{ - uint16_t TIM_OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint16_t TIM_OutputState; /*!< Specifies the TIM Output Compare state. - This parameter can be a value of @ref TIM_Output_Compare_state */ - - uint16_t TIM_OutputNState; /*!< Specifies the TIM complementary Output Compare state. - This parameter can be a value of @ref TIM_Output_Compare_N_state - @note This parameter is valid only for TIM1 and TIM8. */ - - uint16_t TIM_Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between 0x0000 and 0xFFFF */ - - uint16_t TIM_OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint16_t TIM_OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for TIM1 and TIM8. */ - - uint16_t TIM_OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for TIM1 and TIM8. */ - - uint16_t TIM_OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for TIM1 and TIM8. */ -} TIM_OCInitTypeDef; - -/** - * @brief TIM Input Capture Init structure definition - */ - -typedef struct -{ - - uint16_t TIM_Channel; /*!< Specifies the TIM channel. - This parameter can be a value of @ref TIM_Channel */ - - uint16_t TIM_ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint16_t TIM_ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint16_t TIM_ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint16_t TIM_ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between 0x0 and 0xF */ -} TIM_ICInitTypeDef; - -/** - * @brief BDTR structure definition - * @note This sturcture is used only with TIM1 and TIM8. - */ - -typedef struct -{ - - uint16_t TIM_OSSRState; /*!< Specifies the Off-State selection used in Run mode. - This parameter can be a value of @ref OSSR_Off_State_Selection_for_Run_mode_state */ - - uint16_t TIM_OSSIState; /*!< Specifies the Off-State used in Idle state. - This parameter can be a value of @ref OSSI_Off_State_Selection_for_Idle_mode_state */ - - uint16_t TIM_LOCKLevel; /*!< Specifies the LOCK level parameters. - This parameter can be a value of @ref Lock_level */ - - uint16_t TIM_DeadTime; /*!< Specifies the delay time between the switching-off and the - switching-on of the outputs. - This parameter can be a number between 0x00 and 0xFF */ - - uint16_t TIM_Break; /*!< Specifies whether the TIM Break input is enabled or not. - This parameter can be a value of @ref Break_Input_enable_disable */ - - uint16_t TIM_BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. - This parameter can be a value of @ref Break_Polarity */ - - uint16_t TIM_AutomaticOutput; /*!< Specifies whether the TIM Automatic Output feature is enabled or not. - This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ -} TIM_BDTRInitTypeDef; - -/** @defgroup TIM_Exported_constants - * @{ - */ - -#define IS_TIM_ALL_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM4) || \ - ((PERIPH) == TIM5) || \ - ((PERIPH) == TIM6) || \ - ((PERIPH) == TIM7) || \ - ((PERIPH) == TIM8) || \ - ((PERIPH) == TIM15) || \ - ((PERIPH) == TIM16) || \ - ((PERIPH) == TIM17)) - -#define IS_TIM_18_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM8)) - -#define IS_TIM_18151617_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM8) || \ - ((PERIPH) == TIM15) || \ - ((PERIPH) == TIM16) || \ - ((PERIPH) == TIM17)) - -#define IS_TIM_123458_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM4) || \ - ((PERIPH) == TIM5) || \ - ((PERIPH) == TIM8)) - -#define IS_TIM_123458151617_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM4) || \ - ((PERIPH) == TIM5) || \ - ((PERIPH) == TIM8) || \ - ((PERIPH) == TIM15) || \ - ((PERIPH) == TIM16) || \ - ((PERIPH) == TIM17)) - -#define IS_TIM_12345815_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM4) || \ - ((PERIPH) == TIM5) || \ - ((PERIPH) == TIM8) || \ - ((PERIPH) == TIM15)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_and_PWM_modes - * @{ - */ - -#define TIM_OCMode_Timing ((uint16_t)0x0000) -#define TIM_OCMode_Active ((uint16_t)0x0010) -#define TIM_OCMode_Inactive ((uint16_t)0x0020) -#define TIM_OCMode_Toggle ((uint16_t)0x0030) -#define TIM_OCMode_PWM1 ((uint16_t)0x0060) -#define TIM_OCMode_PWM2 ((uint16_t)0x0070) -#define IS_TIM_OC_MODE(MODE) (((MODE) == TIM_OCMode_Timing) || \ - ((MODE) == TIM_OCMode_Active) || \ - ((MODE) == TIM_OCMode_Inactive) || \ - ((MODE) == TIM_OCMode_Toggle)|| \ - ((MODE) == TIM_OCMode_PWM1) || \ - ((MODE) == TIM_OCMode_PWM2)) -#define IS_TIM_OCM(MODE) (((MODE) == TIM_OCMode_Timing) || \ - ((MODE) == TIM_OCMode_Active) || \ - ((MODE) == TIM_OCMode_Inactive) || \ - ((MODE) == TIM_OCMode_Toggle)|| \ - ((MODE) == TIM_OCMode_PWM1) || \ - ((MODE) == TIM_OCMode_PWM2) || \ - ((MODE) == TIM_ForcedAction_Active) || \ - ((MODE) == TIM_ForcedAction_InActive)) -/** - * @} - */ - -/** @defgroup TIM_One_Pulse_Mode - * @{ - */ - -#define TIM_OPMode_Single ((uint16_t)0x0008) -#define TIM_OPMode_Repetitive ((uint16_t)0x0000) -#define IS_TIM_OPM_MODE(MODE) (((MODE) == TIM_OPMode_Single) || \ - ((MODE) == TIM_OPMode_Repetitive)) -/** - * @} - */ - -/** @defgroup TIM_Channel - * @{ - */ - -#define TIM_Channel_1 ((uint16_t)0x0000) -#define TIM_Channel_2 ((uint16_t)0x0004) -#define TIM_Channel_3 ((uint16_t)0x0008) -#define TIM_Channel_4 ((uint16_t)0x000C) -#define IS_TIM_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ - ((CHANNEL) == TIM_Channel_2) || \ - ((CHANNEL) == TIM_Channel_3) || \ - ((CHANNEL) == TIM_Channel_4)) -#define IS_TIM_PWMI_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ - ((CHANNEL) == TIM_Channel_2)) -#define IS_TIM_COMPLEMENTARY_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ - ((CHANNEL) == TIM_Channel_2) || \ - ((CHANNEL) == TIM_Channel_3)) -/** - * @} - */ - -/** @defgroup TIM_Clock_Division_CKD - * @{ - */ - -#define TIM_CKD_DIV1 ((uint16_t)0x0000) -#define TIM_CKD_DIV2 ((uint16_t)0x0100) -#define TIM_CKD_DIV4 ((uint16_t)0x0200) -#define IS_TIM_CKD_DIV(DIV) (((DIV) == TIM_CKD_DIV1) || \ - ((DIV) == TIM_CKD_DIV2) || \ - ((DIV) == TIM_CKD_DIV4)) -/** - * @} - */ - -/** @defgroup TIM_Counter_Mode - * @{ - */ - -#define TIM_CounterMode_Up ((uint16_t)0x0000) -#define TIM_CounterMode_Down ((uint16_t)0x0010) -#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) -#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) -#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) -#define IS_TIM_COUNTER_MODE(MODE) (((MODE) == TIM_CounterMode_Up) || \ - ((MODE) == TIM_CounterMode_Down) || \ - ((MODE) == TIM_CounterMode_CenterAligned1) || \ - ((MODE) == TIM_CounterMode_CenterAligned2) || \ - ((MODE) == TIM_CounterMode_CenterAligned3)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Polarity - * @{ - */ - -#define TIM_OCPolarity_High ((uint16_t)0x0000) -#define TIM_OCPolarity_Low ((uint16_t)0x0002) -#define IS_TIM_OC_POLARITY(POLARITY) (((POLARITY) == TIM_OCPolarity_High) || \ - ((POLARITY) == TIM_OCPolarity_Low)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Polarity - * @{ - */ - -#define TIM_OCNPolarity_High ((uint16_t)0x0000) -#define TIM_OCNPolarity_Low ((uint16_t)0x0008) -#define IS_TIM_OCN_POLARITY(POLARITY) (((POLARITY) == TIM_OCNPolarity_High) || \ - ((POLARITY) == TIM_OCNPolarity_Low)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_state - * @{ - */ - -#define TIM_OutputState_Disable ((uint16_t)0x0000) -#define TIM_OutputState_Enable ((uint16_t)0x0001) -#define IS_TIM_OUTPUT_STATE(STATE) (((STATE) == TIM_OutputState_Disable) || \ - ((STATE) == TIM_OutputState_Enable)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_state - * @{ - */ - -#define TIM_OutputNState_Disable ((uint16_t)0x0000) -#define TIM_OutputNState_Enable ((uint16_t)0x0004) -#define IS_TIM_OUTPUTN_STATE(STATE) (((STATE) == TIM_OutputNState_Disable) || \ - ((STATE) == TIM_OutputNState_Enable)) -/** - * @} - */ - -/** @defgroup TIM_Capture_Compare_state - * @{ - */ - -#define TIM_CCx_Enable ((uint16_t)0x0001) -#define TIM_CCx_Disable ((uint16_t)0x0000) -#define IS_TIM_CCX(CCX) (((CCX) == TIM_CCx_Enable) || \ - ((CCX) == TIM_CCx_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Capture_Compare_N_state - * @{ - */ - -#define TIM_CCxN_Enable ((uint16_t)0x0004) -#define TIM_CCxN_Disable ((uint16_t)0x0000) -#define IS_TIM_CCXN(CCXN) (((CCXN) == TIM_CCxN_Enable) || \ - ((CCXN) == TIM_CCxN_Disable)) -/** - * @} - */ - -/** @defgroup Break_Input_enable_disable - * @{ - */ - -#define TIM_Break_Enable ((uint16_t)0x1000) -#define TIM_Break_Disable ((uint16_t)0x0000) -#define IS_TIM_BREAK_STATE(STATE) (((STATE) == TIM_Break_Enable) || \ - ((STATE) == TIM_Break_Disable)) -/** - * @} - */ - -/** @defgroup Break_Polarity - * @{ - */ - -#define TIM_BreakPolarity_Low ((uint16_t)0x0000) -#define TIM_BreakPolarity_High ((uint16_t)0x2000) -#define IS_TIM_BREAK_POLARITY(POLARITY) (((POLARITY) == TIM_BreakPolarity_Low) || \ - ((POLARITY) == TIM_BreakPolarity_High)) -/** - * @} - */ - -/** @defgroup TIM_AOE_Bit_Set_Reset - * @{ - */ - -#define TIM_AutomaticOutput_Enable ((uint16_t)0x4000) -#define TIM_AutomaticOutput_Disable ((uint16_t)0x0000) -#define IS_TIM_AUTOMATIC_OUTPUT_STATE(STATE) (((STATE) == TIM_AutomaticOutput_Enable) || \ - ((STATE) == TIM_AutomaticOutput_Disable)) -/** - * @} - */ - -/** @defgroup Lock_level - * @{ - */ - -#define TIM_LOCKLevel_OFF ((uint16_t)0x0000) -#define TIM_LOCKLevel_1 ((uint16_t)0x0100) -#define TIM_LOCKLevel_2 ((uint16_t)0x0200) -#define TIM_LOCKLevel_3 ((uint16_t)0x0300) -#define IS_TIM_LOCK_LEVEL(LEVEL) (((LEVEL) == TIM_LOCKLevel_OFF) || \ - ((LEVEL) == TIM_LOCKLevel_1) || \ - ((LEVEL) == TIM_LOCKLevel_2) || \ - ((LEVEL) == TIM_LOCKLevel_3)) -/** - * @} - */ - -/** @defgroup OSSI_Off_State_Selection_for_Idle_mode_state - * @{ - */ - -#define TIM_OSSIState_Enable ((uint16_t)0x0400) -#define TIM_OSSIState_Disable ((uint16_t)0x0000) -#define IS_TIM_OSSI_STATE(STATE) (((STATE) == TIM_OSSIState_Enable) || \ - ((STATE) == TIM_OSSIState_Disable)) -/** - * @} - */ - -/** @defgroup OSSR_Off_State_Selection_for_Run_mode_state - * @{ - */ - -#define TIM_OSSRState_Enable ((uint16_t)0x0800) -#define TIM_OSSRState_Disable ((uint16_t)0x0000) -#define IS_TIM_OSSR_STATE(STATE) (((STATE) == TIM_OSSRState_Enable) || \ - ((STATE) == TIM_OSSRState_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Idle_State - * @{ - */ - -#define TIM_OCIdleState_Set ((uint16_t)0x0100) -#define TIM_OCIdleState_Reset ((uint16_t)0x0000) -#define IS_TIM_OCIDLE_STATE(STATE) (((STATE) == TIM_OCIdleState_Set) || \ - ((STATE) == TIM_OCIdleState_Reset)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Idle_State - * @{ - */ - -#define TIM_OCNIdleState_Set ((uint16_t)0x0200) -#define TIM_OCNIdleState_Reset ((uint16_t)0x0000) -#define IS_TIM_OCNIDLE_STATE(STATE) (((STATE) == TIM_OCNIdleState_Set) || \ - ((STATE) == TIM_OCNIdleState_Reset)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Polarity - * @{ - */ - -#define TIM_ICPolarity_Rising ((uint16_t)0x0000) -#define TIM_ICPolarity_Falling ((uint16_t)0x0002) -#define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \ - ((POLARITY) == TIM_ICPolarity_Falling)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Selection - * @{ - */ - -#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC2, IC1, IC4 or IC3, respectively. */ -#define TIM_ICSelection_TRC ((uint16_t)0x0003) /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ -#define IS_TIM_IC_SELECTION(SELECTION) (((SELECTION) == TIM_ICSelection_DirectTI) || \ - ((SELECTION) == TIM_ICSelection_IndirectTI) || \ - ((SELECTION) == TIM_ICSelection_TRC)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Prescaler - * @{ - */ - -#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /*!< Capture performed each time an edge is detected on the capture input. */ -#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /*!< Capture performed once every 2 events. */ -#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /*!< Capture performed once every 4 events. */ -#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /*!< Capture performed once every 8 events. */ -#define IS_TIM_IC_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ICPSC_DIV1) || \ - ((PRESCALER) == TIM_ICPSC_DIV2) || \ - ((PRESCALER) == TIM_ICPSC_DIV4) || \ - ((PRESCALER) == TIM_ICPSC_DIV8)) -/** - * @} - */ - -/** @defgroup TIM_interrupt_sources - * @{ - */ - -#define TIM_IT_Update ((uint16_t)0x0001) -#define TIM_IT_CC1 ((uint16_t)0x0002) -#define TIM_IT_CC2 ((uint16_t)0x0004) -#define TIM_IT_CC3 ((uint16_t)0x0008) -#define TIM_IT_CC4 ((uint16_t)0x0010) -#define TIM_IT_COM ((uint16_t)0x0020) -#define TIM_IT_Trigger ((uint16_t)0x0040) -#define TIM_IT_Break ((uint16_t)0x0080) -#define IS_TIM_IT(IT) ((((IT) & (uint16_t)0xFF00) == 0x0000) && ((IT) != 0x0000)) - -#define IS_TIM_GET_IT(IT) (((IT) == TIM_IT_Update) || \ - ((IT) == TIM_IT_CC1) || \ - ((IT) == TIM_IT_CC2) || \ - ((IT) == TIM_IT_CC3) || \ - ((IT) == TIM_IT_CC4) || \ - ((IT) == TIM_IT_COM) || \ - ((IT) == TIM_IT_Trigger) || \ - ((IT) == TIM_IT_Break)) -/** - * @} - */ - -/** @defgroup TIM_DMA_Base_address - * @{ - */ - -#define TIM_DMABase_CR1 ((uint16_t)0x0000) -#define TIM_DMABase_CR2 ((uint16_t)0x0001) -#define TIM_DMABase_SMCR ((uint16_t)0x0002) -#define TIM_DMABase_DIER ((uint16_t)0x0003) -#define TIM_DMABase_SR ((uint16_t)0x0004) -#define TIM_DMABase_EGR ((uint16_t)0x0005) -#define TIM_DMABase_CCMR1 ((uint16_t)0x0006) -#define TIM_DMABase_CCMR2 ((uint16_t)0x0007) -#define TIM_DMABase_CCER ((uint16_t)0x0008) -#define TIM_DMABase_CNT ((uint16_t)0x0009) -#define TIM_DMABase_PSC ((uint16_t)0x000A) -#define TIM_DMABase_ARR ((uint16_t)0x000B) -#define TIM_DMABase_RCR ((uint16_t)0x000C) -#define TIM_DMABase_CCR1 ((uint16_t)0x000D) -#define TIM_DMABase_CCR2 ((uint16_t)0x000E) -#define TIM_DMABase_CCR3 ((uint16_t)0x000F) -#define TIM_DMABase_CCR4 ((uint16_t)0x0010) -#define TIM_DMABase_BDTR ((uint16_t)0x0011) -#define TIM_DMABase_DCR ((uint16_t)0x0012) -#define IS_TIM_DMA_BASE(BASE) (((BASE) == TIM_DMABase_CR1) || \ - ((BASE) == TIM_DMABase_CR2) || \ - ((BASE) == TIM_DMABase_SMCR) || \ - ((BASE) == TIM_DMABase_DIER) || \ - ((BASE) == TIM_DMABase_SR) || \ - ((BASE) == TIM_DMABase_EGR) || \ - ((BASE) == TIM_DMABase_CCMR1) || \ - ((BASE) == TIM_DMABase_CCMR2) || \ - ((BASE) == TIM_DMABase_CCER) || \ - ((BASE) == TIM_DMABase_CNT) || \ - ((BASE) == TIM_DMABase_PSC) || \ - ((BASE) == TIM_DMABase_ARR) || \ - ((BASE) == TIM_DMABase_RCR) || \ - ((BASE) == TIM_DMABase_CCR1) || \ - ((BASE) == TIM_DMABase_CCR2) || \ - ((BASE) == TIM_DMABase_CCR3) || \ - ((BASE) == TIM_DMABase_CCR4) || \ - ((BASE) == TIM_DMABase_BDTR) || \ - ((BASE) == TIM_DMABase_DCR)) -/** - * @} - */ - -/** @defgroup TIM_DMA_Burst_Length - * @{ - */ - -#define TIM_DMABurstLength_1Byte ((uint16_t)0x0000) -#define TIM_DMABurstLength_2Bytes ((uint16_t)0x0100) -#define TIM_DMABurstLength_3Bytes ((uint16_t)0x0200) -#define TIM_DMABurstLength_4Bytes ((uint16_t)0x0300) -#define TIM_DMABurstLength_5Bytes ((uint16_t)0x0400) -#define TIM_DMABurstLength_6Bytes ((uint16_t)0x0500) -#define TIM_DMABurstLength_7Bytes ((uint16_t)0x0600) -#define TIM_DMABurstLength_8Bytes ((uint16_t)0x0700) -#define TIM_DMABurstLength_9Bytes ((uint16_t)0x0800) -#define TIM_DMABurstLength_10Bytes ((uint16_t)0x0900) -#define TIM_DMABurstLength_11Bytes ((uint16_t)0x0A00) -#define TIM_DMABurstLength_12Bytes ((uint16_t)0x0B00) -#define TIM_DMABurstLength_13Bytes ((uint16_t)0x0C00) -#define TIM_DMABurstLength_14Bytes ((uint16_t)0x0D00) -#define TIM_DMABurstLength_15Bytes ((uint16_t)0x0E00) -#define TIM_DMABurstLength_16Bytes ((uint16_t)0x0F00) -#define TIM_DMABurstLength_17Bytes ((uint16_t)0x1000) -#define TIM_DMABurstLength_18Bytes ((uint16_t)0x1100) -#define IS_TIM_DMA_LENGTH(LENGTH) (((LENGTH) == TIM_DMABurstLength_1Byte) || \ - ((LENGTH) == TIM_DMABurstLength_2Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_3Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_4Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_5Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_6Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_7Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_8Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_9Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_10Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_11Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_12Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_13Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_14Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_15Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_16Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_17Bytes) || \ - ((LENGTH) == TIM_DMABurstLength_18Bytes)) -/** - * @} - */ - -/** @defgroup TIM_DMA_sources - * @{ - */ - -#define TIM_DMA_Update ((uint16_t)0x0100) -#define TIM_DMA_CC1 ((uint16_t)0x0200) -#define TIM_DMA_CC2 ((uint16_t)0x0400) -#define TIM_DMA_CC3 ((uint16_t)0x0800) -#define TIM_DMA_CC4 ((uint16_t)0x1000) -#define TIM_DMA_COM ((uint16_t)0x2000) -#define TIM_DMA_Trigger ((uint16_t)0x4000) -#define IS_TIM_DMA_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0x80FF) == 0x0000) && ((SOURCE) != 0x0000)) - -/** - * @} - */ - -/** @defgroup TIM_External_Trigger_Prescaler - * @{ - */ - -#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) -#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) -#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) -#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) -#define IS_TIM_EXT_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ExtTRGPSC_OFF) || \ - ((PRESCALER) == TIM_ExtTRGPSC_DIV2) || \ - ((PRESCALER) == TIM_ExtTRGPSC_DIV4) || \ - ((PRESCALER) == TIM_ExtTRGPSC_DIV8)) -/** - * @} - */ - -/** @defgroup TIM_Internal_Trigger_Selection - * @{ - */ - -#define TIM_TS_ITR0 ((uint16_t)0x0000) -#define TIM_TS_ITR1 ((uint16_t)0x0010) -#define TIM_TS_ITR2 ((uint16_t)0x0020) -#define TIM_TS_ITR3 ((uint16_t)0x0030) -#define TIM_TS_TI1F_ED ((uint16_t)0x0040) -#define TIM_TS_TI1FP1 ((uint16_t)0x0050) -#define TIM_TS_TI2FP2 ((uint16_t)0x0060) -#define TIM_TS_ETRF ((uint16_t)0x0070) -#define IS_TIM_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ - ((SELECTION) == TIM_TS_ITR1) || \ - ((SELECTION) == TIM_TS_ITR2) || \ - ((SELECTION) == TIM_TS_ITR3) || \ - ((SELECTION) == TIM_TS_TI1F_ED) || \ - ((SELECTION) == TIM_TS_TI1FP1) || \ - ((SELECTION) == TIM_TS_TI2FP2) || \ - ((SELECTION) == TIM_TS_ETRF)) -#define IS_TIM_INTERNAL_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ - ((SELECTION) == TIM_TS_ITR1) || \ - ((SELECTION) == TIM_TS_ITR2) || \ - ((SELECTION) == TIM_TS_ITR3)) -/** - * @} - */ - -/** @defgroup TIM_TIx_External_Clock_Source - * @{ - */ - -#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) -#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) -#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) -#define IS_TIM_TIXCLK_SOURCE(SOURCE) (((SOURCE) == TIM_TIxExternalCLK1Source_TI1) || \ - ((SOURCE) == TIM_TIxExternalCLK1Source_TI2) || \ - ((SOURCE) == TIM_TIxExternalCLK1Source_TI1ED)) -/** - * @} - */ - -/** @defgroup TIM_External_Trigger_Polarity - * @{ - */ -#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) -#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) -#define IS_TIM_EXT_POLARITY(POLARITY) (((POLARITY) == TIM_ExtTRGPolarity_Inverted) || \ - ((POLARITY) == TIM_ExtTRGPolarity_NonInverted)) -/** - * @} - */ - -/** @defgroup TIM_Prescaler_Reload_Mode - * @{ - */ - -#define TIM_PSCReloadMode_Update ((uint16_t)0x0000) -#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001) -#define IS_TIM_PRESCALER_RELOAD(RELOAD) (((RELOAD) == TIM_PSCReloadMode_Update) || \ - ((RELOAD) == TIM_PSCReloadMode_Immediate)) -/** - * @} - */ - -/** @defgroup TIM_Forced_Action - * @{ - */ - -#define TIM_ForcedAction_Active ((uint16_t)0x0050) -#define TIM_ForcedAction_InActive ((uint16_t)0x0040) -#define IS_TIM_FORCED_ACTION(ACTION) (((ACTION) == TIM_ForcedAction_Active) || \ - ((ACTION) == TIM_ForcedAction_InActive)) -/** - * @} - */ - -/** @defgroup TIM_Encoder_Mode - * @{ - */ - -#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) -#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) -#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) -#define IS_TIM_ENCODER_MODE(MODE) (((MODE) == TIM_EncoderMode_TI1) || \ - ((MODE) == TIM_EncoderMode_TI2) || \ - ((MODE) == TIM_EncoderMode_TI12)) -/** - * @} - */ - - -/** @defgroup TIM_Event_Source - * @{ - */ - -#define TIM_EventSource_Update ((uint16_t)0x0001) -#define TIM_EventSource_CC1 ((uint16_t)0x0002) -#define TIM_EventSource_CC2 ((uint16_t)0x0004) -#define TIM_EventSource_CC3 ((uint16_t)0x0008) -#define TIM_EventSource_CC4 ((uint16_t)0x0010) -#define TIM_EventSource_COM ((uint16_t)0x0020) -#define TIM_EventSource_Trigger ((uint16_t)0x0040) -#define TIM_EventSource_Break ((uint16_t)0x0080) -#define IS_TIM_EVENT_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0xFF00) == 0x0000) && ((SOURCE) != 0x0000)) - -/** - * @} - */ - -/** @defgroup TIM_Update_Source - * @{ - */ - -#define TIM_UpdateSource_Global ((uint16_t)0x0000) /*!< Source of update is the counter overflow/underflow - or the setting of UG bit, or an update generation - through the slave mode controller. */ -#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /*!< Source of update is counter overflow/underflow. */ -#define IS_TIM_UPDATE_SOURCE(SOURCE) (((SOURCE) == TIM_UpdateSource_Global) || \ - ((SOURCE) == TIM_UpdateSource_Regular)) -/** - * @} - */ - -/** @defgroup TIM_Ouput_Compare_Preload_State - * @{ - */ - -#define TIM_OCPreload_Enable ((uint16_t)0x0008) -#define TIM_OCPreload_Disable ((uint16_t)0x0000) -#define IS_TIM_OCPRELOAD_STATE(STATE) (((STATE) == TIM_OCPreload_Enable) || \ - ((STATE) == TIM_OCPreload_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Ouput_Compare_Fast_State - * @{ - */ - -#define TIM_OCFast_Enable ((uint16_t)0x0004) -#define TIM_OCFast_Disable ((uint16_t)0x0000) -#define IS_TIM_OCFAST_STATE(STATE) (((STATE) == TIM_OCFast_Enable) || \ - ((STATE) == TIM_OCFast_Disable)) - -/** - * @} - */ - -/** @defgroup TIM_Ouput_Compare_Clear_State - * @{ - */ - -#define TIM_OCClear_Enable ((uint16_t)0x0080) -#define TIM_OCClear_Disable ((uint16_t)0x0000) -#define IS_TIM_OCCLEAR_STATE(STATE) (((STATE) == TIM_OCClear_Enable) || \ - ((STATE) == TIM_OCClear_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Trigger_Output_Source - * @{ - */ - -#define TIM_TRGOSource_Reset ((uint16_t)0x0000) -#define TIM_TRGOSource_Enable ((uint16_t)0x0010) -#define TIM_TRGOSource_Update ((uint16_t)0x0020) -#define TIM_TRGOSource_OC1 ((uint16_t)0x0030) -#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) -#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) -#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) -#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) -#define IS_TIM_TRGO_SOURCE(SOURCE) (((SOURCE) == TIM_TRGOSource_Reset) || \ - ((SOURCE) == TIM_TRGOSource_Enable) || \ - ((SOURCE) == TIM_TRGOSource_Update) || \ - ((SOURCE) == TIM_TRGOSource_OC1) || \ - ((SOURCE) == TIM_TRGOSource_OC1Ref) || \ - ((SOURCE) == TIM_TRGOSource_OC2Ref) || \ - ((SOURCE) == TIM_TRGOSource_OC3Ref) || \ - ((SOURCE) == TIM_TRGOSource_OC4Ref)) -/** - * @} - */ - -/** @defgroup TIM_Slave_Mode - * @{ - */ - -#define TIM_SlaveMode_Reset ((uint16_t)0x0004) -#define TIM_SlaveMode_Gated ((uint16_t)0x0005) -#define TIM_SlaveMode_Trigger ((uint16_t)0x0006) -#define TIM_SlaveMode_External1 ((uint16_t)0x0007) -#define IS_TIM_SLAVE_MODE(MODE) (((MODE) == TIM_SlaveMode_Reset) || \ - ((MODE) == TIM_SlaveMode_Gated) || \ - ((MODE) == TIM_SlaveMode_Trigger) || \ - ((MODE) == TIM_SlaveMode_External1)) -/** - * @} - */ - -/** @defgroup TIM_Master_Slave_Mode - * @{ - */ - -#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080) -#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000) -#define IS_TIM_MSM_STATE(STATE) (((STATE) == TIM_MasterSlaveMode_Enable) || \ - ((STATE) == TIM_MasterSlaveMode_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Flags - * @{ - */ - -#define TIM_FLAG_Update ((uint16_t)0x0001) -#define TIM_FLAG_CC1 ((uint16_t)0x0002) -#define TIM_FLAG_CC2 ((uint16_t)0x0004) -#define TIM_FLAG_CC3 ((uint16_t)0x0008) -#define TIM_FLAG_CC4 ((uint16_t)0x0010) -#define TIM_FLAG_COM ((uint16_t)0x0020) -#define TIM_FLAG_Trigger ((uint16_t)0x0040) -#define TIM_FLAG_Break ((uint16_t)0x0080) -#define TIM_FLAG_CC1OF ((uint16_t)0x0200) -#define TIM_FLAG_CC2OF ((uint16_t)0x0400) -#define TIM_FLAG_CC3OF ((uint16_t)0x0800) -#define TIM_FLAG_CC4OF ((uint16_t)0x1000) -#define IS_TIM_GET_FLAG(FLAG) (((FLAG) == TIM_FLAG_Update) || \ - ((FLAG) == TIM_FLAG_CC1) || \ - ((FLAG) == TIM_FLAG_CC2) || \ - ((FLAG) == TIM_FLAG_CC3) || \ - ((FLAG) == TIM_FLAG_CC4) || \ - ((FLAG) == TIM_FLAG_COM) || \ - ((FLAG) == TIM_FLAG_Trigger) || \ - ((FLAG) == TIM_FLAG_Break) || \ - ((FLAG) == TIM_FLAG_CC1OF) || \ - ((FLAG) == TIM_FLAG_CC2OF) || \ - ((FLAG) == TIM_FLAG_CC3OF) || \ - ((FLAG) == TIM_FLAG_CC4OF)) - - -#define IS_TIM_CLEAR_FLAG(TIM_FLAG) ((((TIM_FLAG) & (uint16_t)0xE100) == 0x0000) && ((TIM_FLAG) != 0x0000)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Filer_Value - * @{ - */ - -#define IS_TIM_IC_FILTER(ICFILTER) ((ICFILTER) <= 0xF) -/** - * @} - */ - -/** @defgroup TIM_External_Trigger_Filter - * @{ - */ - -#define IS_TIM_EXT_FILTER(EXTFILTER) ((EXTFILTER) <= 0xF) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions - * @{ - */ - -void TIM_DeInit(TIM_TypeDef* TIMx); -void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); -void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); -void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); -void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct); -void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); -void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct); -void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct); -void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); -void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource); -void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength); -void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState); -void TIM_InternalClockConfig(TIM_TypeDef* TIMx); -void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); -void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, - uint16_t TIM_ICPolarity, uint16_t ICFilter); -void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter); -void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, - uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); -void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter); -void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); -void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); -void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); -void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, - uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); -void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); -void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); -void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); -void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); -void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN); -void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); -void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource); -void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode); -void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource); -void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); -void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode); -void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter); -void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload); -void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); -void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); -void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); -void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4); -void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD); -uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx); -uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx); -uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx); -uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx); -uint16_t TIM_GetCounter(TIM_TypeDef* TIMx); -uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); -FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); -void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); -ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); -void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F10x_TIM_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h deleted file mode 100644 index bbf39eea26..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h +++ /dev/null @@ -1,411 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_usart.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the USART - * firmware library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_USART_H -#define __STM32F10x_USART_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup USART - * @{ - */ - -/** @defgroup USART_Exported_Types - * @{ - */ - -/** - * @brief USART Init Structure definition - */ - -typedef struct -{ - uint32_t USART_BaudRate; /*!< This member configures the USART communication baud rate. - The baud rate is computed using the following formula: - - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate))) - - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */ - - uint16_t USART_WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. - This parameter can be a value of @ref USART_Word_Length */ - - uint16_t USART_StopBits; /*!< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref USART_Stop_Bits */ - - uint16_t USART_Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref USART_Parity - @note When parity is enabled, the computed parity is inserted - at the MSB position of the transmitted data (9th bit when - the word length is set to 9 data bits; 8th bit when the - word length is set to 8 data bits). */ - - uint16_t USART_Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. - This parameter can be a value of @ref USART_Mode */ - - uint16_t USART_HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabled - or disabled. - This parameter can be a value of @ref USART_Hardware_Flow_Control */ -} USART_InitTypeDef; - -/** - * @brief USART Clock Init Structure definition - */ - -typedef struct -{ - - uint16_t USART_Clock; /*!< Specifies whether the USART clock is enabled or disabled. - This parameter can be a value of @ref USART_Clock */ - - uint16_t USART_CPOL; /*!< Specifies the steady state value of the serial clock. - This parameter can be a value of @ref USART_Clock_Polarity */ - - uint16_t USART_CPHA; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref USART_Clock_Phase */ - - uint16_t USART_LastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted - data bit (MSB) has to be output on the SCLK pin in synchronous mode. - This parameter can be a value of @ref USART_Last_Bit */ -} USART_ClockInitTypeDef; - -/** - * @} - */ - -/** @defgroup USART_Exported_Constants - * @{ - */ - -#define IS_USART_ALL_PERIPH(PERIPH) (((PERIPH) == USART1) || \ - ((PERIPH) == USART2) || \ - ((PERIPH) == USART3) || \ - ((PERIPH) == UART4) || \ - ((PERIPH) == UART5)) - -#define IS_USART_123_PERIPH(PERIPH) (((PERIPH) == USART1) || \ - ((PERIPH) == USART2) || \ - ((PERIPH) == USART3)) - -#define IS_USART_1234_PERIPH(PERIPH) (((PERIPH) == USART1) || \ - ((PERIPH) == USART2) || \ - ((PERIPH) == USART3) || \ - ((PERIPH) == UART4)) -/** @defgroup USART_Word_Length - * @{ - */ - -#define USART_WordLength_8b ((uint16_t)0x0000) -#define USART_WordLength_9b ((uint16_t)0x1000) - -#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \ - ((LENGTH) == USART_WordLength_9b)) -/** - * @} - */ - -/** @defgroup USART_Stop_Bits - * @{ - */ - -#define USART_StopBits_1 ((uint16_t)0x0000) -#define USART_StopBits_0_5 ((uint16_t)0x1000) -#define USART_StopBits_2 ((uint16_t)0x2000) -#define USART_StopBits_1_5 ((uint16_t)0x3000) -#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \ - ((STOPBITS) == USART_StopBits_0_5) || \ - ((STOPBITS) == USART_StopBits_2) || \ - ((STOPBITS) == USART_StopBits_1_5)) -/** - * @} - */ - -/** @defgroup USART_Parity - * @{ - */ - -#define USART_Parity_No ((uint16_t)0x0000) -#define USART_Parity_Even ((uint16_t)0x0400) -#define USART_Parity_Odd ((uint16_t)0x0600) -#define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \ - ((PARITY) == USART_Parity_Even) || \ - ((PARITY) == USART_Parity_Odd)) -/** - * @} - */ - -/** @defgroup USART_Mode - * @{ - */ - -#define USART_Mode_Rx ((uint16_t)0x0004) -#define USART_Mode_Tx ((uint16_t)0x0008) -#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00)) -/** - * @} - */ - -/** @defgroup USART_Hardware_Flow_Control - * @{ - */ -#define USART_HardwareFlowControl_None ((uint16_t)0x0000) -#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) -#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) -#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) -#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\ - (((CONTROL) == USART_HardwareFlowControl_None) || \ - ((CONTROL) == USART_HardwareFlowControl_RTS) || \ - ((CONTROL) == USART_HardwareFlowControl_CTS) || \ - ((CONTROL) == USART_HardwareFlowControl_RTS_CTS)) -/** - * @} - */ - -/** @defgroup USART_Clock - * @{ - */ -#define USART_Clock_Disable ((uint16_t)0x0000) -#define USART_Clock_Enable ((uint16_t)0x0800) -#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \ - ((CLOCK) == USART_Clock_Enable)) -/** - * @} - */ - -/** @defgroup USART_Clock_Polarity - * @{ - */ - -#define USART_CPOL_Low ((uint16_t)0x0000) -#define USART_CPOL_High ((uint16_t)0x0400) -#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High)) - -/** - * @} - */ - -/** @defgroup USART_Clock_Phase - * @{ - */ - -#define USART_CPHA_1Edge ((uint16_t)0x0000) -#define USART_CPHA_2Edge ((uint16_t)0x0200) -#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge)) - -/** - * @} - */ - -/** @defgroup USART_Last_Bit - * @{ - */ - -#define USART_LastBit_Disable ((uint16_t)0x0000) -#define USART_LastBit_Enable ((uint16_t)0x0100) -#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \ - ((LASTBIT) == USART_LastBit_Enable)) -/** - * @} - */ - -/** @defgroup USART_Interrupt_definition - * @{ - */ - -#define USART_IT_PE ((uint16_t)0x0028) -#define USART_IT_TXE ((uint16_t)0x0727) -#define USART_IT_TC ((uint16_t)0x0626) -#define USART_IT_RXNE ((uint16_t)0x0525) -#define USART_IT_IDLE ((uint16_t)0x0424) -#define USART_IT_LBD ((uint16_t)0x0846) -#define USART_IT_CTS ((uint16_t)0x096A) -#define USART_IT_ERR ((uint16_t)0x0060) -#define USART_IT_ORE ((uint16_t)0x0360) -#define USART_IT_NE ((uint16_t)0x0260) -#define USART_IT_FE ((uint16_t)0x0160) -#define IS_USART_CONFIG_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ - ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ - ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ - ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ERR)) -#define IS_USART_GET_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ - ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ - ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ - ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ORE) || \ - ((IT) == USART_IT_NE) || ((IT) == USART_IT_FE)) -#define IS_USART_CLEAR_IT(IT) (((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ - ((IT) == USART_IT_LBD) || ((IT) == USART_IT_CTS)) -/** - * @} - */ - -/** @defgroup USART_DMA_Requests - * @{ - */ - -#define USART_DMAReq_Tx ((uint16_t)0x0080) -#define USART_DMAReq_Rx ((uint16_t)0x0040) -#define IS_USART_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFF3F) == 0x00) && ((DMAREQ) != (uint16_t)0x00)) - -/** - * @} - */ - -/** @defgroup USART_WakeUp_methods - * @{ - */ - -#define USART_WakeUp_IdleLine ((uint16_t)0x0000) -#define USART_WakeUp_AddressMark ((uint16_t)0x0800) -#define IS_USART_WAKEUP(WAKEUP) (((WAKEUP) == USART_WakeUp_IdleLine) || \ - ((WAKEUP) == USART_WakeUp_AddressMark)) -/** - * @} - */ - -/** @defgroup USART_LIN_Break_Detection_Length - * @{ - */ - -#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000) -#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020) -#define IS_USART_LIN_BREAK_DETECT_LENGTH(LENGTH) \ - (((LENGTH) == USART_LINBreakDetectLength_10b) || \ - ((LENGTH) == USART_LINBreakDetectLength_11b)) -/** - * @} - */ - -/** @defgroup USART_IrDA_Low_Power - * @{ - */ - -#define USART_IrDAMode_LowPower ((uint16_t)0x0004) -#define USART_IrDAMode_Normal ((uint16_t)0x0000) -#define IS_USART_IRDA_MODE(MODE) (((MODE) == USART_IrDAMode_LowPower) || \ - ((MODE) == USART_IrDAMode_Normal)) -/** - * @} - */ - -/** @defgroup USART_Flags - * @{ - */ - -#define USART_FLAG_CTS ((uint16_t)0x0200) -#define USART_FLAG_LBD ((uint16_t)0x0100) -#define USART_FLAG_TXE ((uint16_t)0x0080) -#define USART_FLAG_TC ((uint16_t)0x0040) -#define USART_FLAG_RXNE ((uint16_t)0x0020) -#define USART_FLAG_IDLE ((uint16_t)0x0010) -#define USART_FLAG_ORE ((uint16_t)0x0008) -#define USART_FLAG_NE ((uint16_t)0x0004) -#define USART_FLAG_FE ((uint16_t)0x0002) -#define USART_FLAG_PE ((uint16_t)0x0001) -#define IS_USART_FLAG(FLAG) (((FLAG) == USART_FLAG_PE) || ((FLAG) == USART_FLAG_TXE) || \ - ((FLAG) == USART_FLAG_TC) || ((FLAG) == USART_FLAG_RXNE) || \ - ((FLAG) == USART_FLAG_IDLE) || ((FLAG) == USART_FLAG_LBD) || \ - ((FLAG) == USART_FLAG_CTS) || ((FLAG) == USART_FLAG_ORE) || \ - ((FLAG) == USART_FLAG_NE) || ((FLAG) == USART_FLAG_FE)) - -#define IS_USART_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFC9F) == 0x00) && ((FLAG) != (uint16_t)0x00)) -#define IS_USART_PERIPH_FLAG(PERIPH, USART_FLAG) ((((*(uint32_t*)&(PERIPH)) != UART4_BASE) &&\ - ((*(uint32_t*)&(PERIPH)) != UART5_BASE)) \ - || ((USART_FLAG) != USART_FLAG_CTS)) -#define IS_USART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 0x0044AA21)) -#define IS_USART_ADDRESS(ADDRESS) ((ADDRESS) <= 0xF) -#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF) - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup USART_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USART_Exported_Functions - * @{ - */ - -void USART_DeInit(USART_TypeDef* USARTx); -void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); -void USART_StructInit(USART_InitTypeDef* USART_InitStruct); -void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct); -void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct); -void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); -void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState); -void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address); -void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp); -void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength); -void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); -uint16_t USART_ReceiveData(USART_TypeDef* USARTx); -void USART_SendBreak(USART_TypeDef* USARTx); -void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime); -void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler); -void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode); -void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState); -FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); -void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); -ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); -void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_USART_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h deleted file mode 100644 index 9828e1e3af..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_wwdg.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_wwdg.h - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file contains all the functions prototypes for the WWDG firmware - * library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_WWDG_H -#define __STM32F10x_WWDG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @addtogroup WWDG - * @{ - */ - -/** @defgroup WWDG_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup WWDG_Exported_Constants - * @{ - */ - -/** @defgroup WWDG_Prescaler - * @{ - */ - -#define WWDG_Prescaler_1 ((uint32_t)0x00000000) -#define WWDG_Prescaler_2 ((uint32_t)0x00000080) -#define WWDG_Prescaler_4 ((uint32_t)0x00000100) -#define WWDG_Prescaler_8 ((uint32_t)0x00000180) -#define IS_WWDG_PRESCALER(PRESCALER) (((PRESCALER) == WWDG_Prescaler_1) || \ - ((PRESCALER) == WWDG_Prescaler_2) || \ - ((PRESCALER) == WWDG_Prescaler_4) || \ - ((PRESCALER) == WWDG_Prescaler_8)) -#define IS_WWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0x7F) -#define IS_WWDG_COUNTER(COUNTER) (((COUNTER) >= 0x40) && ((COUNTER) <= 0x7F)) - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup WWDG_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup WWDG_Exported_Functions - * @{ - */ - -void WWDG_DeInit(void); -void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); -void WWDG_SetWindowValue(uint8_t WindowValue); -void WWDG_EnableIT(void); -void WWDG_SetCounter(uint8_t Counter); -void WWDG_Enable(uint8_t Counter); -FlagStatus WWDG_GetFlagStatus(void); -void WWDG_ClearFlag(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F10x_WWDG_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c deleted file mode 100644 index 5ccce16e24..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c +++ /dev/null @@ -1,223 +0,0 @@ -/** - ****************************************************************************** - * @file misc.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the miscellaneous firmware functions (add-on - * to CMSIS functions). - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "misc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup MISC - * @brief MISC driver modules - * @{ - */ - -/** @defgroup MISC_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup MISC_Private_Defines - * @{ - */ - -#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) -/** - * @} - */ - -/** @defgroup MISC_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup MISC_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup MISC_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup MISC_Private_Functions - * @{ - */ - -/** - * @brief Configures the priority grouping: pre-emption priority and subpriority. - * @param NVIC_PriorityGroup: specifies the priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority - * 4 bits for subpriority - * @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority - * 3 bits for subpriority - * @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority - * 2 bits for subpriority - * @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority - * 1 bits for subpriority - * @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority - * 0 bits for subpriority - * @retval None - */ -void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup)); - - /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */ - SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; -} - -/** - * @brief Initializes the NVIC peripheral according to the specified - * parameters in the NVIC_InitStruct. - * @param NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains - * the configuration information for the specified NVIC peripheral. - * @retval None - */ -void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) -{ - uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd)); - assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority)); - assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority)); - - if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) - { - /* Compute the Corresponding IRQ Priority --------------------------------*/ - tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; - tmppre = (0x4 - tmppriority); - tmpsub = tmpsub >> tmppriority; - - tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre; - tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub; - tmppriority = tmppriority << 0x04; - - NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority; - - /* Enable the Selected IRQ Channels --------------------------------------*/ - NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = - (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); - } - else - { - /* Disable the Selected IRQ Channels -------------------------------------*/ - NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = - (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); - } -} - -/** - * @brief Sets the vector table location and Offset. - * @param NVIC_VectTab: specifies if the vector table is in RAM or FLASH memory. - * This parameter can be one of the following values: - * @arg NVIC_VectTab_RAM - * @arg NVIC_VectTab_FLASH - * @param Offset: Vector Table base offset field. This value must be a multiple of 0x100. - * @retval None - */ -void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) -{ - /* Check the parameters */ - assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); - assert_param(IS_NVIC_OFFSET(Offset)); - - SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80); -} - -/** - * @brief Selects the condition for the system to enter low power mode. - * @param LowPowerMode: Specifies the new mode for the system to enter low power mode. - * This parameter can be one of the following values: - * @arg NVIC_LP_SEVONPEND - * @arg NVIC_LP_SLEEPDEEP - * @arg NVIC_LP_SLEEPONEXIT - * @param NewState: new state of LP condition. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_NVIC_LP(LowPowerMode)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - SCB->SCR |= LowPowerMode; - } - else - { - SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode); - } -} - -/** - * @brief Configures the SysTick clock source. - * @param SysTick_CLKSource: specifies the SysTick clock source. - * This parameter can be one of the following values: - * @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source. - * @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source. - * @retval None - */ -void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) -{ - /* Check the parameters */ - assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); - if (SysTick_CLKSource == SysTick_CLKSource_HCLK) - { - SysTick->CTRL |= SysTick_CLKSource_HCLK; - } - else - { - SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c deleted file mode 100644 index 4528da7188..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c +++ /dev/null @@ -1,1306 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_adc.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the ADC firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_adc.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup ADC - * @brief ADC driver modules - * @{ - */ - -/** @defgroup ADC_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup ADC_Private_Defines - * @{ - */ - -/* ADC DISCNUM mask */ -#define CR1_DISCNUM_Reset ((uint32_t)0xFFFF1FFF) - -/* ADC DISCEN mask */ -#define CR1_DISCEN_Set ((uint32_t)0x00000800) -#define CR1_DISCEN_Reset ((uint32_t)0xFFFFF7FF) - -/* ADC JAUTO mask */ -#define CR1_JAUTO_Set ((uint32_t)0x00000400) -#define CR1_JAUTO_Reset ((uint32_t)0xFFFFFBFF) - -/* ADC JDISCEN mask */ -#define CR1_JDISCEN_Set ((uint32_t)0x00001000) -#define CR1_JDISCEN_Reset ((uint32_t)0xFFFFEFFF) - -/* ADC AWDCH mask */ -#define CR1_AWDCH_Reset ((uint32_t)0xFFFFFFE0) - -/* ADC Analog watchdog enable mode mask */ -#define CR1_AWDMode_Reset ((uint32_t)0xFF3FFDFF) - -/* CR1 register Mask */ -#define CR1_CLEAR_Mask ((uint32_t)0xFFF0FEFF) - -/* ADC ADON mask */ -#define CR2_ADON_Set ((uint32_t)0x00000001) -#define CR2_ADON_Reset ((uint32_t)0xFFFFFFFE) - -/* ADC DMA mask */ -#define CR2_DMA_Set ((uint32_t)0x00000100) -#define CR2_DMA_Reset ((uint32_t)0xFFFFFEFF) - -/* ADC RSTCAL mask */ -#define CR2_RSTCAL_Set ((uint32_t)0x00000008) - -/* ADC CAL mask */ -#define CR2_CAL_Set ((uint32_t)0x00000004) - -/* ADC SWSTART mask */ -#define CR2_SWSTART_Set ((uint32_t)0x00400000) - -/* ADC EXTTRIG mask */ -#define CR2_EXTTRIG_Set ((uint32_t)0x00100000) -#define CR2_EXTTRIG_Reset ((uint32_t)0xFFEFFFFF) - -/* ADC Software start mask */ -#define CR2_EXTTRIG_SWSTART_Set ((uint32_t)0x00500000) -#define CR2_EXTTRIG_SWSTART_Reset ((uint32_t)0xFFAFFFFF) - -/* ADC JEXTSEL mask */ -#define CR2_JEXTSEL_Reset ((uint32_t)0xFFFF8FFF) - -/* ADC JEXTTRIG mask */ -#define CR2_JEXTTRIG_Set ((uint32_t)0x00008000) -#define CR2_JEXTTRIG_Reset ((uint32_t)0xFFFF7FFF) - -/* ADC JSWSTART mask */ -#define CR2_JSWSTART_Set ((uint32_t)0x00200000) - -/* ADC injected software start mask */ -#define CR2_JEXTTRIG_JSWSTART_Set ((uint32_t)0x00208000) -#define CR2_JEXTTRIG_JSWSTART_Reset ((uint32_t)0xFFDF7FFF) - -/* ADC TSPD mask */ -#define CR2_TSVREFE_Set ((uint32_t)0x00800000) -#define CR2_TSVREFE_Reset ((uint32_t)0xFF7FFFFF) - -/* CR2 register Mask */ -#define CR2_CLEAR_Mask ((uint32_t)0xFFF1F7FD) - -/* ADC SQx mask */ -#define SQR3_SQ_Set ((uint32_t)0x0000001F) -#define SQR2_SQ_Set ((uint32_t)0x0000001F) -#define SQR1_SQ_Set ((uint32_t)0x0000001F) - -/* SQR1 register Mask */ -#define SQR1_CLEAR_Mask ((uint32_t)0xFF0FFFFF) - -/* ADC JSQx mask */ -#define JSQR_JSQ_Set ((uint32_t)0x0000001F) - -/* ADC JL mask */ -#define JSQR_JL_Set ((uint32_t)0x00300000) -#define JSQR_JL_Reset ((uint32_t)0xFFCFFFFF) - -/* ADC SMPx mask */ -#define SMPR1_SMP_Set ((uint32_t)0x00000007) -#define SMPR2_SMP_Set ((uint32_t)0x00000007) - -/* ADC JDRx registers offset */ -#define JDR_Offset ((uint8_t)0x28) - -/* ADC1 DR register base address */ -#define DR_ADDRESS ((uint32_t)0x4001244C) - -/** - * @} - */ - -/** @defgroup ADC_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup ADC_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup ADC_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup ADC_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the ADCx peripheral registers to their default reset values. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval None - */ -void ADC_DeInit(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - if (ADCx == ADC1) - { - /* Enable ADC1 reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); - /* Release ADC1 from reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); - } - else if (ADCx == ADC2) - { - /* Enable ADC2 reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE); - /* Release ADC2 from reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE); - } - else - { - if (ADCx == ADC3) - { - /* Enable ADC3 reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3, ENABLE); - /* Release ADC3 from reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3, DISABLE); - } - } -} - -/** - * @brief Initializes the ADCx peripheral according to the specified parameters - * in the ADC_InitStruct. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure that contains - * the configuration information for the specified ADC peripheral. - * @retval None - */ -void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct) -{ - uint32_t tmpreg1 = 0; - uint8_t tmpreg2 = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_MODE(ADC_InitStruct->ADC_Mode)); - assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode)); - assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode)); - assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv)); - assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign)); - assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfChannel)); - - /*---------------------------- ADCx CR1 Configuration -----------------*/ - /* Get the ADCx CR1 value */ - tmpreg1 = ADCx->CR1; - /* Clear DUALMOD and SCAN bits */ - tmpreg1 &= CR1_CLEAR_Mask; - /* Configure ADCx: Dual mode and scan conversion mode */ - /* Set DUALMOD bits according to ADC_Mode value */ - /* Set SCAN bit according to ADC_ScanConvMode value */ - tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_Mode | ((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8)); - /* Write to ADCx CR1 */ - ADCx->CR1 = tmpreg1; - - /*---------------------------- ADCx CR2 Configuration -----------------*/ - /* Get the ADCx CR2 value */ - tmpreg1 = ADCx->CR2; - /* Clear CONT, ALIGN and EXTSEL bits */ - tmpreg1 &= CR2_CLEAR_Mask; - /* Configure ADCx: external trigger event and continuous conversion mode */ - /* Set ALIGN bit according to ADC_DataAlign value */ - /* Set EXTSEL bits according to ADC_ExternalTrigConv value */ - /* Set CONT bit according to ADC_ContinuousConvMode value */ - tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv | - ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1)); - /* Write to ADCx CR2 */ - ADCx->CR2 = tmpreg1; - - /*---------------------------- ADCx SQR1 Configuration -----------------*/ - /* Get the ADCx SQR1 value */ - tmpreg1 = ADCx->SQR1; - /* Clear L bits */ - tmpreg1 &= SQR1_CLEAR_Mask; - /* Configure ADCx: regular channel sequence length */ - /* Set L bits according to ADC_NbrOfChannel value */ - tmpreg2 |= (uint8_t) (ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1); - tmpreg1 |= (uint32_t)tmpreg2 << 20; - /* Write to ADCx SQR1 */ - ADCx->SQR1 = tmpreg1; -} - -/** - * @brief Fills each ADC_InitStruct member with its default value. - * @param ADC_InitStruct : pointer to an ADC_InitTypeDef structure which will be initialized. - * @retval None - */ -void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct) -{ - /* Reset ADC init structure parameters values */ - /* Initialize the ADC_Mode member */ - ADC_InitStruct->ADC_Mode = ADC_Mode_Independent; - /* initialize the ADC_ScanConvMode member */ - ADC_InitStruct->ADC_ScanConvMode = DISABLE; - /* Initialize the ADC_ContinuousConvMode member */ - ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; - /* Initialize the ADC_ExternalTrigConv member */ - ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; - /* Initialize the ADC_DataAlign member */ - ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; - /* Initialize the ADC_NbrOfChannel member */ - ADC_InitStruct->ADC_NbrOfChannel = 1; -} - -/** - * @brief Enables or disables the specified ADC peripheral. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the ADCx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the ADON bit to wake up the ADC from power down mode */ - ADCx->CR2 |= CR2_ADON_Set; - } - else - { - /* Disable the selected ADC peripheral */ - ADCx->CR2 &= CR2_ADON_Reset; - } -} - -/** - * @brief Enables or disables the specified ADC DMA request. - * @param ADCx: where x can be 1 or 3 to select the ADC peripheral. - * Note: ADC2 hasn't a DMA capability. - * @param NewState: new state of the selected ADC DMA transfer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_DMA_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC DMA request */ - ADCx->CR2 |= CR2_DMA_Set; - } - else - { - /* Disable the selected ADC DMA request */ - ADCx->CR2 &= CR2_DMA_Reset; - } -} - -/** - * @brief Enables or disables the specified ADC interrupts. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_IT: specifies the ADC interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg ADC_IT_EOC: End of conversion interrupt mask - * @arg ADC_IT_AWD: Analog watchdog interrupt mask - * @arg ADC_IT_JEOC: End of injected conversion interrupt mask - * @param NewState: new state of the specified ADC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState) -{ - uint8_t itmask = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_ADC_IT(ADC_IT)); - /* Get the ADC IT index */ - itmask = (uint8_t)ADC_IT; - if (NewState != DISABLE) - { - /* Enable the selected ADC interrupts */ - ADCx->CR1 |= itmask; - } - else - { - /* Disable the selected ADC interrupts */ - ADCx->CR1 &= (~(uint32_t)itmask); - } -} - -/** - * @brief Resets the selected ADC calibration registers. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval None - */ -void ADC_ResetCalibration(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - /* Resets the selected ADC calibartion registers */ - ADCx->CR2 |= CR2_RSTCAL_Set; -} - -/** - * @brief Gets the selected ADC reset calibration registers status. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval The new state of ADC reset calibration registers (SET or RESET). - */ -FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - /* Check the status of RSTCAL bit */ - if ((ADCx->CR2 & CR2_RSTCAL_Set) != (uint32_t)RESET) - { - /* RSTCAL bit is set */ - bitstatus = SET; - } - else - { - /* RSTCAL bit is reset */ - bitstatus = RESET; - } - /* Return the RSTCAL bit status */ - return bitstatus; -} - -/** - * @brief Starts the selected ADC calibration process. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval None - */ -void ADC_StartCalibration(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - /* Enable the selected ADC calibration process */ - ADCx->CR2 |= CR2_CAL_Set; -} - -/** - * @brief Gets the selected ADC calibration status. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval The new state of ADC calibration (SET or RESET). - */ -FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - /* Check the status of CAL bit */ - if ((ADCx->CR2 & CR2_CAL_Set) != (uint32_t)RESET) - { - /* CAL bit is set: calibration on going */ - bitstatus = SET; - } - else - { - /* CAL bit is reset: end of calibration */ - bitstatus = RESET; - } - /* Return the CAL bit status */ - return bitstatus; -} - -/** - * @brief Enables or disables the selected ADC software start conversion . - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC software start conversion. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC conversion on external event and start the selected - ADC conversion */ - ADCx->CR2 |= CR2_EXTTRIG_SWSTART_Set; - } - else - { - /* Disable the selected ADC conversion on external event and stop the selected - ADC conversion */ - ADCx->CR2 &= CR2_EXTTRIG_SWSTART_Reset; - } -} - -/** - * @brief Gets the selected ADC Software start conversion Status. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval The new state of ADC software start conversion (SET or RESET). - */ -FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - /* Check the status of SWSTART bit */ - if ((ADCx->CR2 & CR2_SWSTART_Set) != (uint32_t)RESET) - { - /* SWSTART bit is set */ - bitstatus = SET; - } - else - { - /* SWSTART bit is reset */ - bitstatus = RESET; - } - /* Return the SWSTART bit status */ - return bitstatus; -} - -/** - * @brief Configures the discontinuous mode for the selected ADC regular - * group channel. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param Number: specifies the discontinuous mode regular channel - * count value. This number must be between 1 and 8. - * @retval None - */ -void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number) -{ - uint32_t tmpreg1 = 0; - uint32_t tmpreg2 = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_REGULAR_DISC_NUMBER(Number)); - /* Get the old register value */ - tmpreg1 = ADCx->CR1; - /* Clear the old discontinuous mode channel count */ - tmpreg1 &= CR1_DISCNUM_Reset; - /* Set the discontinuous mode channel count */ - tmpreg2 = Number - 1; - tmpreg1 |= tmpreg2 << 13; - /* Store the new register value */ - ADCx->CR1 = tmpreg1; -} - -/** - * @brief Enables or disables the discontinuous mode on regular group - * channel for the specified ADC - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC discontinuous mode - * on regular group channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC regular discontinuous mode */ - ADCx->CR1 |= CR1_DISCEN_Set; - } - else - { - /* Disable the selected ADC regular discontinuous mode */ - ADCx->CR1 &= CR1_DISCEN_Reset; - } -} - -/** - * @brief Configures for the selected ADC regular channel its corresponding - * rank in the sequencer and its sample time. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_Channel: the ADC channel to configure. - * This parameter can be one of the following values: - * @arg ADC_Channel_0: ADC Channel0 selected - * @arg ADC_Channel_1: ADC Channel1 selected - * @arg ADC_Channel_2: ADC Channel2 selected - * @arg ADC_Channel_3: ADC Channel3 selected - * @arg ADC_Channel_4: ADC Channel4 selected - * @arg ADC_Channel_5: ADC Channel5 selected - * @arg ADC_Channel_6: ADC Channel6 selected - * @arg ADC_Channel_7: ADC Channel7 selected - * @arg ADC_Channel_8: ADC Channel8 selected - * @arg ADC_Channel_9: ADC Channel9 selected - * @arg ADC_Channel_10: ADC Channel10 selected - * @arg ADC_Channel_11: ADC Channel11 selected - * @arg ADC_Channel_12: ADC Channel12 selected - * @arg ADC_Channel_13: ADC Channel13 selected - * @arg ADC_Channel_14: ADC Channel14 selected - * @arg ADC_Channel_15: ADC Channel15 selected - * @arg ADC_Channel_16: ADC Channel16 selected - * @arg ADC_Channel_17: ADC Channel17 selected - * @param Rank: The rank in the regular group sequencer. This parameter must be between 1 to 16. - * @param ADC_SampleTime: The sample time value to be set for the selected channel. - * This parameter can be one of the following values: - * @arg ADC_SampleTime_1Cycles5: Sample time equal to 1.5 cycles - * @arg ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles - * @arg ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles - * @arg ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles - * @arg ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles - * @arg ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles - * @arg ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles - * @arg ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles - * @retval None - */ -void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) -{ - uint32_t tmpreg1 = 0, tmpreg2 = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CHANNEL(ADC_Channel)); - assert_param(IS_ADC_REGULAR_RANK(Rank)); - assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); - /* if ADC_Channel_10 ... ADC_Channel_17 is selected */ - if (ADC_Channel > ADC_Channel_9) - { - /* Get the old register value */ - tmpreg1 = ADCx->SMPR1; - /* Calculate the mask to clear */ - tmpreg2 = SMPR1_SMP_Set << (3 * (ADC_Channel - 10)); - /* Clear the old channel sample time */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); - /* Set the new channel sample time */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->SMPR1 = tmpreg1; - } - else /* ADC_Channel include in ADC_Channel_[0..9] */ - { - /* Get the old register value */ - tmpreg1 = ADCx->SMPR2; - /* Calculate the mask to clear */ - tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel); - /* Clear the old channel sample time */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); - /* Set the new channel sample time */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->SMPR2 = tmpreg1; - } - /* For Rank 1 to 6 */ - if (Rank < 7) - { - /* Get the old register value */ - tmpreg1 = ADCx->SQR3; - /* Calculate the mask to clear */ - tmpreg2 = SQR3_SQ_Set << (5 * (Rank - 1)); - /* Clear the old SQx bits for the selected rank */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1)); - /* Set the SQx bits for the selected rank */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->SQR3 = tmpreg1; - } - /* For Rank 7 to 12 */ - else if (Rank < 13) - { - /* Get the old register value */ - tmpreg1 = ADCx->SQR2; - /* Calculate the mask to clear */ - tmpreg2 = SQR2_SQ_Set << (5 * (Rank - 7)); - /* Clear the old SQx bits for the selected rank */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7)); - /* Set the SQx bits for the selected rank */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->SQR2 = tmpreg1; - } - /* For Rank 13 to 16 */ - else - { - /* Get the old register value */ - tmpreg1 = ADCx->SQR1; - /* Calculate the mask to clear */ - tmpreg2 = SQR1_SQ_Set << (5 * (Rank - 13)); - /* Clear the old SQx bits for the selected rank */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13)); - /* Set the SQx bits for the selected rank */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->SQR1 = tmpreg1; - } -} - -/** - * @brief Enables or disables the ADCx conversion through external trigger. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC external trigger start of conversion. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC conversion on external event */ - ADCx->CR2 |= CR2_EXTTRIG_Set; - } - else - { - /* Disable the selected ADC conversion on external event */ - ADCx->CR2 &= CR2_EXTTRIG_Reset; - } -} - -/** - * @brief Returns the last ADCx conversion result data for regular channel. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval The Data conversion value. - */ -uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - /* Return the selected ADC conversion value */ - return (uint16_t) ADCx->DR; -} - -/** - * @brief Returns the last ADC1 and ADC2 conversion result data in dual mode. - * @retval The Data conversion value. - */ -uint32_t ADC_GetDualModeConversionValue(void) -{ - /* Return the dual mode conversion value */ - return (*(__IO uint32_t *) DR_ADDRESS); -} - -/** - * @brief Enables or disables the selected ADC automatic injected group - * conversion after regular one. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC auto injected conversion - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC automatic injected group conversion */ - ADCx->CR1 |= CR1_JAUTO_Set; - } - else - { - /* Disable the selected ADC automatic injected group conversion */ - ADCx->CR1 &= CR1_JAUTO_Reset; - } -} - -/** - * @brief Enables or disables the discontinuous mode for injected group - * channel for the specified ADC - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC discontinuous mode - * on injected group channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC injected discontinuous mode */ - ADCx->CR1 |= CR1_JDISCEN_Set; - } - else - { - /* Disable the selected ADC injected discontinuous mode */ - ADCx->CR1 &= CR1_JDISCEN_Reset; - } -} - -/** - * @brief Configures the ADCx external trigger for injected channels conversion. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_ExternalTrigInjecConv: specifies the ADC trigger to start injected conversion. - * This parameter can be one of the following values: - * @arg ADC_ExternalTrigInjecConv_T1_TRGO: Timer1 TRGO event selected (for ADC1, ADC2 and ADC3) - * @arg ADC_ExternalTrigInjecConv_T1_CC4: Timer1 capture compare4 selected (for ADC1, ADC2 and ADC3) - * @arg ADC_ExternalTrigInjecConv_T2_TRGO: Timer2 TRGO event selected (for ADC1 and ADC2) - * @arg ADC_ExternalTrigInjecConv_T2_CC1: Timer2 capture compare1 selected (for ADC1 and ADC2) - * @arg ADC_ExternalTrigInjecConv_T3_CC4: Timer3 capture compare4 selected (for ADC1 and ADC2) - * @arg ADC_ExternalTrigInjecConv_T4_TRGO: Timer4 TRGO event selected (for ADC1 and ADC2) - * @arg ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4: External interrupt line 15 or Timer8 - * capture compare4 event selected (for ADC1 and ADC2) - * @arg ADC_ExternalTrigInjecConv_T4_CC3: Timer4 capture compare3 selected (for ADC3 only) - * @arg ADC_ExternalTrigInjecConv_T8_CC2: Timer8 capture compare2 selected (for ADC3 only) - * @arg ADC_ExternalTrigInjecConv_T8_CC4: Timer8 capture compare4 selected (for ADC3 only) - * @arg ADC_ExternalTrigInjecConv_T5_TRGO: Timer5 TRGO event selected (for ADC3 only) - * @arg ADC_ExternalTrigInjecConv_T5_CC4: Timer5 capture compare4 selected (for ADC3 only) - * @arg ADC_ExternalTrigInjecConv_None: Injected conversion started by software and not - * by external trigger (for ADC1, ADC2 and ADC3) - * @retval None - */ -void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_EXT_INJEC_TRIG(ADC_ExternalTrigInjecConv)); - /* Get the old register value */ - tmpreg = ADCx->CR2; - /* Clear the old external event selection for injected group */ - tmpreg &= CR2_JEXTSEL_Reset; - /* Set the external event selection for injected group */ - tmpreg |= ADC_ExternalTrigInjecConv; - /* Store the new register value */ - ADCx->CR2 = tmpreg; -} - -/** - * @brief Enables or disables the ADCx injected channels conversion through - * external trigger - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC external trigger start of - * injected conversion. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC external event selection for injected group */ - ADCx->CR2 |= CR2_JEXTTRIG_Set; - } - else - { - /* Disable the selected ADC external event selection for injected group */ - ADCx->CR2 &= CR2_JEXTTRIG_Reset; - } -} - -/** - * @brief Enables or disables the selected ADC start of the injected - * channels conversion. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC software start injected conversion. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC conversion for injected group on external event and start the selected - ADC injected conversion */ - ADCx->CR2 |= CR2_JEXTTRIG_JSWSTART_Set; - } - else - { - /* Disable the selected ADC conversion on external event for injected group and stop the selected - ADC injected conversion */ - ADCx->CR2 &= CR2_JEXTTRIG_JSWSTART_Reset; - } -} - -/** - * @brief Gets the selected ADC Software start injected conversion Status. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval The new state of ADC software start injected conversion (SET or RESET). - */ -FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - /* Check the status of JSWSTART bit */ - if ((ADCx->CR2 & CR2_JSWSTART_Set) != (uint32_t)RESET) - { - /* JSWSTART bit is set */ - bitstatus = SET; - } - else - { - /* JSWSTART bit is reset */ - bitstatus = RESET; - } - /* Return the JSWSTART bit status */ - return bitstatus; -} - -/** - * @brief Configures for the selected ADC injected channel its corresponding - * rank in the sequencer and its sample time. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_Channel: the ADC channel to configure. - * This parameter can be one of the following values: - * @arg ADC_Channel_0: ADC Channel0 selected - * @arg ADC_Channel_1: ADC Channel1 selected - * @arg ADC_Channel_2: ADC Channel2 selected - * @arg ADC_Channel_3: ADC Channel3 selected - * @arg ADC_Channel_4: ADC Channel4 selected - * @arg ADC_Channel_5: ADC Channel5 selected - * @arg ADC_Channel_6: ADC Channel6 selected - * @arg ADC_Channel_7: ADC Channel7 selected - * @arg ADC_Channel_8: ADC Channel8 selected - * @arg ADC_Channel_9: ADC Channel9 selected - * @arg ADC_Channel_10: ADC Channel10 selected - * @arg ADC_Channel_11: ADC Channel11 selected - * @arg ADC_Channel_12: ADC Channel12 selected - * @arg ADC_Channel_13: ADC Channel13 selected - * @arg ADC_Channel_14: ADC Channel14 selected - * @arg ADC_Channel_15: ADC Channel15 selected - * @arg ADC_Channel_16: ADC Channel16 selected - * @arg ADC_Channel_17: ADC Channel17 selected - * @param Rank: The rank in the injected group sequencer. This parameter must be between 1 and 4. - * @param ADC_SampleTime: The sample time value to be set for the selected channel. - * This parameter can be one of the following values: - * @arg ADC_SampleTime_1Cycles5: Sample time equal to 1.5 cycles - * @arg ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles - * @arg ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles - * @arg ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles - * @arg ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles - * @arg ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles - * @arg ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles - * @arg ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles - * @retval None - */ -void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) -{ - uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CHANNEL(ADC_Channel)); - assert_param(IS_ADC_INJECTED_RANK(Rank)); - assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); - /* if ADC_Channel_10 ... ADC_Channel_17 is selected */ - if (ADC_Channel > ADC_Channel_9) - { - /* Get the old register value */ - tmpreg1 = ADCx->SMPR1; - /* Calculate the mask to clear */ - tmpreg2 = SMPR1_SMP_Set << (3*(ADC_Channel - 10)); - /* Clear the old channel sample time */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_SampleTime << (3*(ADC_Channel - 10)); - /* Set the new channel sample time */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->SMPR1 = tmpreg1; - } - else /* ADC_Channel include in ADC_Channel_[0..9] */ - { - /* Get the old register value */ - tmpreg1 = ADCx->SMPR2; - /* Calculate the mask to clear */ - tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel); - /* Clear the old channel sample time */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); - /* Set the new channel sample time */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->SMPR2 = tmpreg1; - } - /* Rank configuration */ - /* Get the old register value */ - tmpreg1 = ADCx->JSQR; - /* Get JL value: Number = JL+1 */ - tmpreg3 = (tmpreg1 & JSQR_JL_Set)>> 20; - /* Calculate the mask to clear: ((Rank-1)+(4-JL-1)) */ - tmpreg2 = JSQR_JSQ_Set << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); - /* Clear the old JSQx bits for the selected rank */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set: ((Rank-1)+(4-JL-1)) */ - tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); - /* Set the JSQx bits for the selected rank */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->JSQR = tmpreg1; -} - -/** - * @brief Configures the sequencer length for injected channels - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param Length: The sequencer length. - * This parameter must be a number between 1 to 4. - * @retval None - */ -void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length) -{ - uint32_t tmpreg1 = 0; - uint32_t tmpreg2 = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_INJECTED_LENGTH(Length)); - - /* Get the old register value */ - tmpreg1 = ADCx->JSQR; - /* Clear the old injected sequnence lenght JL bits */ - tmpreg1 &= JSQR_JL_Reset; - /* Set the injected sequnence lenght JL bits */ - tmpreg2 = Length - 1; - tmpreg1 |= tmpreg2 << 20; - /* Store the new register value */ - ADCx->JSQR = tmpreg1; -} - -/** - * @brief Set the injected channels conversion value offset - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_InjectedChannel: the ADC injected channel to set its offset. - * This parameter can be one of the following values: - * @arg ADC_InjectedChannel_1: Injected Channel1 selected - * @arg ADC_InjectedChannel_2: Injected Channel2 selected - * @arg ADC_InjectedChannel_3: Injected Channel3 selected - * @arg ADC_InjectedChannel_4: Injected Channel4 selected - * @param Offset: the offset value for the selected ADC injected channel - * This parameter must be a 12bit value. - * @retval None - */ -void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); - assert_param(IS_ADC_OFFSET(Offset)); - - tmp = (uint32_t)ADCx; - tmp += ADC_InjectedChannel; - - /* Set the selected injected channel data offset */ - *(__IO uint32_t *) tmp = (uint32_t)Offset; -} - -/** - * @brief Returns the ADC injected channel conversion result - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_InjectedChannel: the converted ADC injected channel. - * This parameter can be one of the following values: - * @arg ADC_InjectedChannel_1: Injected Channel1 selected - * @arg ADC_InjectedChannel_2: Injected Channel2 selected - * @arg ADC_InjectedChannel_3: Injected Channel3 selected - * @arg ADC_InjectedChannel_4: Injected Channel4 selected - * @retval The Data conversion value. - */ -uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); - - tmp = (uint32_t)ADCx; - tmp += ADC_InjectedChannel + JDR_Offset; - - /* Returns the selected injected channel conversion data value */ - return (uint16_t) (*(__IO uint32_t*) tmp); -} - -/** - * @brief Enables or disables the analog watchdog on single/all regular - * or injected channels - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_AnalogWatchdog: the ADC analog watchdog configuration. - * This parameter can be one of the following values: - * @arg ADC_AnalogWatchdog_SingleRegEnable: Analog watchdog on a single regular channel - * @arg ADC_AnalogWatchdog_SingleInjecEnable: Analog watchdog on a single injected channel - * @arg ADC_AnalogWatchdog_SingleRegOrInjecEnable: Analog watchdog on a single regular or injected channel - * @arg ADC_AnalogWatchdog_AllRegEnable: Analog watchdog on all regular channel - * @arg ADC_AnalogWatchdog_AllInjecEnable: Analog watchdog on all injected channel - * @arg ADC_AnalogWatchdog_AllRegAllInjecEnable: Analog watchdog on all regular and injected channels - * @arg ADC_AnalogWatchdog_None: No channel guarded by the analog watchdog - * @retval None - */ -void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_ANALOG_WATCHDOG(ADC_AnalogWatchdog)); - /* Get the old register value */ - tmpreg = ADCx->CR1; - /* Clear AWDEN, AWDENJ and AWDSGL bits */ - tmpreg &= CR1_AWDMode_Reset; - /* Set the analog watchdog enable mode */ - tmpreg |= ADC_AnalogWatchdog; - /* Store the new register value */ - ADCx->CR1 = tmpreg; -} - -/** - * @brief Configures the high and low thresholds of the analog watchdog. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param HighThreshold: the ADC analog watchdog High threshold value. - * This parameter must be a 12bit value. - * @param LowThreshold: the ADC analog watchdog Low threshold value. - * This parameter must be a 12bit value. - * @retval None - */ -void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, - uint16_t LowThreshold) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_THRESHOLD(HighThreshold)); - assert_param(IS_ADC_THRESHOLD(LowThreshold)); - /* Set the ADCx high threshold */ - ADCx->HTR = HighThreshold; - /* Set the ADCx low threshold */ - ADCx->LTR = LowThreshold; -} - -/** - * @brief Configures the analog watchdog guarded single channel - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_Channel: the ADC channel to configure for the analog watchdog. - * This parameter can be one of the following values: - * @arg ADC_Channel_0: ADC Channel0 selected - * @arg ADC_Channel_1: ADC Channel1 selected - * @arg ADC_Channel_2: ADC Channel2 selected - * @arg ADC_Channel_3: ADC Channel3 selected - * @arg ADC_Channel_4: ADC Channel4 selected - * @arg ADC_Channel_5: ADC Channel5 selected - * @arg ADC_Channel_6: ADC Channel6 selected - * @arg ADC_Channel_7: ADC Channel7 selected - * @arg ADC_Channel_8: ADC Channel8 selected - * @arg ADC_Channel_9: ADC Channel9 selected - * @arg ADC_Channel_10: ADC Channel10 selected - * @arg ADC_Channel_11: ADC Channel11 selected - * @arg ADC_Channel_12: ADC Channel12 selected - * @arg ADC_Channel_13: ADC Channel13 selected - * @arg ADC_Channel_14: ADC Channel14 selected - * @arg ADC_Channel_15: ADC Channel15 selected - * @arg ADC_Channel_16: ADC Channel16 selected - * @arg ADC_Channel_17: ADC Channel17 selected - * @retval None - */ -void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CHANNEL(ADC_Channel)); - /* Get the old register value */ - tmpreg = ADCx->CR1; - /* Clear the Analog watchdog channel select bits */ - tmpreg &= CR1_AWDCH_Reset; - /* Set the Analog watchdog channel */ - tmpreg |= ADC_Channel; - /* Store the new register value */ - ADCx->CR1 = tmpreg; -} - -/** - * @brief Enables or disables the temperature sensor and Vrefint channel. - * @param NewState: new state of the temperature sensor. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_TempSensorVrefintCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the temperature sensor and Vrefint channel*/ - ADC1->CR2 |= CR2_TSVREFE_Set; - } - else - { - /* Disable the temperature sensor and Vrefint channel*/ - ADC1->CR2 &= CR2_TSVREFE_Reset; - } -} - -/** - * @brief Checks whether the specified ADC flag is set or not. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg ADC_FLAG_AWD: Analog watchdog flag - * @arg ADC_FLAG_EOC: End of conversion flag - * @arg ADC_FLAG_JEOC: End of injected group conversion flag - * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag - * @arg ADC_FLAG_STRT: Start of regular group conversion flag - * @retval The new state of ADC_FLAG (SET or RESET). - */ -FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_GET_FLAG(ADC_FLAG)); - /* Check the status of the specified ADC flag */ - if ((ADCx->SR & ADC_FLAG) != (uint8_t)RESET) - { - /* ADC_FLAG is set */ - bitstatus = SET; - } - else - { - /* ADC_FLAG is reset */ - bitstatus = RESET; - } - /* Return the ADC_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the ADCx's pending flags. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg ADC_FLAG_AWD: Analog watchdog flag - * @arg ADC_FLAG_EOC: End of conversion flag - * @arg ADC_FLAG_JEOC: End of injected group conversion flag - * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag - * @arg ADC_FLAG_STRT: Start of regular group conversion flag - * @retval None - */ -void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG)); - /* Clear the selected ADC flags */ - ADCx->SR = ~(uint32_t)ADC_FLAG; -} - -/** - * @brief Checks whether the specified ADC interrupt has occurred or not. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_IT: specifies the ADC interrupt source to check. - * This parameter can be one of the following values: - * @arg ADC_IT_EOC: End of conversion interrupt mask - * @arg ADC_IT_AWD: Analog watchdog interrupt mask - * @arg ADC_IT_JEOC: End of injected conversion interrupt mask - * @retval The new state of ADC_IT (SET or RESET). - */ -ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t itmask = 0, enablestatus = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_GET_IT(ADC_IT)); - /* Get the ADC IT index */ - itmask = ADC_IT >> 8; - /* Get the ADC_IT enable bit status */ - enablestatus = (ADCx->CR1 & (uint8_t)ADC_IT) ; - /* Check the status of the specified ADC interrupt */ - if (((ADCx->SR & itmask) != (uint32_t)RESET) && enablestatus) - { - /* ADC_IT is set */ - bitstatus = SET; - } - else - { - /* ADC_IT is reset */ - bitstatus = RESET; - } - /* Return the ADC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the ADCx’s interrupt pending bits. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_IT: specifies the ADC interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg ADC_IT_EOC: End of conversion interrupt mask - * @arg ADC_IT_AWD: Analog watchdog interrupt mask - * @arg ADC_IT_JEOC: End of injected conversion interrupt mask - * @retval None - */ -void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT) -{ - uint8_t itmask = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_IT(ADC_IT)); - /* Get the ADC IT index */ - itmask = (uint8_t)(ADC_IT >> 8); - /* Clear the selected ADC interrupt pending bits */ - ADCx->SR = ~(uint32_t)itmask; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c deleted file mode 100644 index a640868bae..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c +++ /dev/null @@ -1,311 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_bkp.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the BKP firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_bkp.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup BKP - * @brief BKP driver modules - * @{ - */ - -/** @defgroup BKP_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup BKP_Private_Defines - * @{ - */ - -/* ------------ BKP registers bit address in the alias region --------------- */ -#define BKP_OFFSET (BKP_BASE - PERIPH_BASE) - -/* --- CR Register ----*/ - -/* Alias word address of TPAL bit */ -#define CR_OFFSET (BKP_OFFSET + 0x30) -#define TPAL_BitNumber 0x01 -#define CR_TPAL_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPAL_BitNumber * 4)) - -/* Alias word address of TPE bit */ -#define TPE_BitNumber 0x00 -#define CR_TPE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPE_BitNumber * 4)) - -/* --- CSR Register ---*/ - -/* Alias word address of TPIE bit */ -#define CSR_OFFSET (BKP_OFFSET + 0x34) -#define TPIE_BitNumber 0x02 -#define CSR_TPIE_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TPIE_BitNumber * 4)) - -/* Alias word address of TIF bit */ -#define TIF_BitNumber 0x09 -#define CSR_TIF_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TIF_BitNumber * 4)) - -/* Alias word address of TEF bit */ -#define TEF_BitNumber 0x08 -#define CSR_TEF_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TEF_BitNumber * 4)) - -/* ---------------------- BKP registers bit mask ------------------------ */ - -/* RTCCR register bit mask */ -#define RTCCR_CAL_Mask ((uint16_t)0xFF80) -#define RTCCR_Mask ((uint16_t)0xFC7F) - -/* CSR register bit mask */ -#define CSR_CTE_Set ((uint16_t)0x0001) -#define CSR_CTI_Set ((uint16_t)0x0002) - -/** - * @} - */ - - -/** @defgroup BKP_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup BKP_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup BKP_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup BKP_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the BKP peripheral registers to their default reset values. - * @param None - * @retval None - */ -void BKP_DeInit(void) -{ - RCC_BackupResetCmd(ENABLE); - RCC_BackupResetCmd(DISABLE); -} - -/** - * @brief Configures the Tamper Pin active level. - * @param BKP_TamperPinLevel: specifies the Tamper Pin active level. - * This parameter can be one of the following values: - * @arg BKP_TamperPinLevel_High: Tamper pin active on high level - * @arg BKP_TamperPinLevel_Low: Tamper pin active on low level - * @retval None - */ -void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel) -{ - /* Check the parameters */ - assert_param(IS_BKP_TAMPER_PIN_LEVEL(BKP_TamperPinLevel)); - *(__IO uint32_t *) CR_TPAL_BB = BKP_TamperPinLevel; -} - -/** - * @brief Enables or disables the Tamper Pin activation. - * @param NewState: new state of the Tamper Pin activation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void BKP_TamperPinCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CR_TPE_BB = (uint32_t)NewState; -} - -/** - * @brief Enables or disables the Tamper Pin Interrupt. - * @param NewState: new state of the Tamper Pin Interrupt. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void BKP_ITConfig(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CSR_TPIE_BB = (uint32_t)NewState; -} - -/** - * @brief Select the RTC output source to output on the Tamper pin. - * @param BKP_RTCOutputSource: specifies the RTC output source. - * This parameter can be one of the following values: - * @arg BKP_RTCOutputSource_None: no RTC output on the Tamper pin. - * @arg BKP_RTCOutputSource_CalibClock: output the RTC clock with frequency - * divided by 64 on the Tamper pin. - * @arg BKP_RTCOutputSource_Alarm: output the RTC Alarm pulse signal on - * the Tamper pin. - * @arg BKP_RTCOutputSource_Second: output the RTC Second pulse signal on - * the Tamper pin. - * @retval None - */ -void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource) -{ - uint16_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_BKP_RTC_OUTPUT_SOURCE(BKP_RTCOutputSource)); - tmpreg = BKP->RTCCR; - /* Clear CCO, ASOE and ASOS bits */ - tmpreg &= RTCCR_Mask; - - /* Set CCO, ASOE and ASOS bits according to BKP_RTCOutputSource value */ - tmpreg |= BKP_RTCOutputSource; - /* Store the new value */ - BKP->RTCCR = tmpreg; -} - -/** - * @brief Sets RTC Clock Calibration value. - * @param CalibrationValue: specifies the RTC Clock Calibration value. - * This parameter must be a number between 0 and 0x7F. - * @retval None - */ -void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue) -{ - uint16_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_BKP_CALIBRATION_VALUE(CalibrationValue)); - tmpreg = BKP->RTCCR; - /* Clear CAL[6:0] bits */ - tmpreg &= RTCCR_CAL_Mask; - /* Set CAL[6:0] bits according to CalibrationValue value */ - tmpreg |= CalibrationValue; - /* Store the new value */ - BKP->RTCCR = tmpreg; -} - -/** - * @brief Writes user data to the specified Data Backup Register. - * @param BKP_DR: specifies the Data Backup Register. - * This parameter can be BKP_DRx where x:[1, 42] - * @param Data: data to write - * @retval None - */ -void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_BKP_DR(BKP_DR)); - - tmp = (uint32_t)BKP_BASE; - tmp += BKP_DR; - - *(__IO uint32_t *) tmp = Data; -} - -/** - * @brief Reads data from the specified Data Backup Register. - * @param BKP_DR: specifies the Data Backup Register. - * This parameter can be BKP_DRx where x:[1, 42] - * @retval The content of the specified Data Backup Register - */ -uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_BKP_DR(BKP_DR)); - - tmp = (uint32_t)BKP_BASE; - tmp += BKP_DR; - - return (*(__IO uint16_t *) tmp); -} - -/** - * @brief Checks whether the Tamper Pin Event flag is set or not. - * @param None - * @retval The new state of the Tamper Pin Event flag (SET or RESET). - */ -FlagStatus BKP_GetFlagStatus(void) -{ - return (FlagStatus)(*(__IO uint32_t *) CSR_TEF_BB); -} - -/** - * @brief Clears Tamper Pin Event pending flag. - * @param None - * @retval None - */ -void BKP_ClearFlag(void) -{ - /* Set CTE bit to clear Tamper Pin Event flag */ - BKP->CSR |= CSR_CTE_Set; -} - -/** - * @brief Checks whether the Tamper Pin Interrupt has occurred or not. - * @param None - * @retval The new state of the Tamper Pin Interrupt (SET or RESET). - */ -ITStatus BKP_GetITStatus(void) -{ - return (ITStatus)(*(__IO uint32_t *) CSR_TIF_BB); -} - -/** - * @brief Clears Tamper Pin Interrupt pending bit. - * @param None - * @retval None - */ -void BKP_ClearITPendingBit(void) -{ - /* Set CTI bit to clear Tamper Pin Interrupt pending bit */ - BKP->CSR |= CSR_CTI_Set; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c deleted file mode 100644 index 6e4723850a..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c +++ /dev/null @@ -1,990 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_can.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the CAN firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_can.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup CAN - * @brief CAN driver modules - * @{ - */ - -/** @defgroup CAN_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup CAN_Private_Defines - * @{ - */ - -/* CAN Master Control Register bits */ -#define MCR_INRQ ((uint32_t)0x00000001) /* Initialization request */ -#define MCR_SLEEP ((uint32_t)0x00000002) /* Sleep mode request */ -#define MCR_TXFP ((uint32_t)0x00000004) /* Transmit FIFO priority */ -#define MCR_RFLM ((uint32_t)0x00000008) /* Receive FIFO locked mode */ -#define MCR_NART ((uint32_t)0x00000010) /* No automatic retransmission */ -#define MCR_AWUM ((uint32_t)0x00000020) /* Automatic wake up mode */ -#define MCR_ABOM ((uint32_t)0x00000040) /* Automatic bus-off management */ -#define MCR_TTCM ((uint32_t)0x00000080) /* time triggered communication */ -#define MCR_RESET ((uint32_t)0x00008000) /* time triggered communication */ -#define MCR_DBF ((uint32_t)0x00010000) /* software master reset */ - -/* CAN Master Status Register bits */ -#define MSR_INAK ((uint32_t)0x00000001) /* Initialization acknowledge */ -#define MSR_WKUI ((uint32_t)0x00000008) /* Wake-up interrupt */ -#define MSR_SLAKI ((uint32_t)0x00000010) /* Sleep acknowledge interrupt */ - -/* CAN Transmit Status Register bits */ -#define TSR_RQCP0 ((uint32_t)0x00000001) /* Request completed mailbox0 */ -#define TSR_TXOK0 ((uint32_t)0x00000002) /* Transmission OK of mailbox0 */ -#define TSR_ABRQ0 ((uint32_t)0x00000080) /* Abort request for mailbox0 */ -#define TSR_RQCP1 ((uint32_t)0x00000100) /* Request completed mailbox1 */ -#define TSR_TXOK1 ((uint32_t)0x00000200) /* Transmission OK of mailbox1 */ -#define TSR_ABRQ1 ((uint32_t)0x00008000) /* Abort request for mailbox1 */ -#define TSR_RQCP2 ((uint32_t)0x00010000) /* Request completed mailbox2 */ -#define TSR_TXOK2 ((uint32_t)0x00020000) /* Transmission OK of mailbox2 */ -#define TSR_ABRQ2 ((uint32_t)0x00800000) /* Abort request for mailbox2 */ -#define TSR_TME0 ((uint32_t)0x04000000) /* Transmit mailbox 0 empty */ -#define TSR_TME1 ((uint32_t)0x08000000) /* Transmit mailbox 1 empty */ -#define TSR_TME2 ((uint32_t)0x10000000) /* Transmit mailbox 2 empty */ - -/* CAN Receive FIFO 0 Register bits */ -#define RF0R_FULL0 ((uint32_t)0x00000008) /* FIFO 0 full */ -#define RF0R_FOVR0 ((uint32_t)0x00000010) /* FIFO 0 overrun */ -#define RF0R_RFOM0 ((uint32_t)0x00000020) /* Release FIFO 0 output mailbox */ - -/* CAN Receive FIFO 1 Register bits */ -#define RF1R_FULL1 ((uint32_t)0x00000008) /* FIFO 1 full */ -#define RF1R_FOVR1 ((uint32_t)0x00000010) /* FIFO 1 overrun */ -#define RF1R_RFOM1 ((uint32_t)0x00000020) /* Release FIFO 1 output mailbox */ - -/* CAN Error Status Register bits */ -#define ESR_EWGF ((uint32_t)0x00000001) /* Error warning flag */ -#define ESR_EPVF ((uint32_t)0x00000002) /* Error passive flag */ -#define ESR_BOFF ((uint32_t)0x00000004) /* Bus-off flag */ - -/* CAN Mailbox Transmit Request */ -#define TMIDxR_TXRQ ((uint32_t)0x00000001) /* Transmit mailbox request */ - -/* CAN Filter Master Register bits */ -#define FMR_FINIT ((uint32_t)0x00000001) /* Filter init mode */ - -/* Time out for INAK bit */ -#define INAK_TimeOut ((uint32_t)0x0000FFFF) - -/* Time out for SLAK bit */ -#define SLAK_TimeOut ((uint32_t)0x0000FFFF) - -/** - * @} - */ - -/** @defgroup CAN_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup CAN_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup CAN_Private_FunctionPrototypes - * @{ - */ - -static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit); - -/** - * @} - */ - -/** @defgroup CAN_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the CAN peripheral registers to their default reset values. - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @retval None. - */ -void CAN_DeInit(CAN_TypeDef* CANx) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - if (CANx == CAN1) - { - /* Enable CAN1 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE); - /* Release CAN1 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE); - } - else - { - /* Enable CAN2 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, ENABLE); - /* Release CAN2 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, DISABLE); - } -} - -/** - * @brief Initializes the CAN peripheral according to the specified - * parameters in the CAN_InitStruct. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure that - * contains the configuration information for the CAN peripheral. - * @retval Constant indicates initialization succeed which will be - * CANINITFAILED or CANINITOK. - */ -uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct) -{ - uint8_t InitStatus = CANINITFAILED; - uint32_t wait_ack = 0x00000000; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TTCM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_ABOM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_AWUM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_NART)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_RFLM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TXFP)); - assert_param(IS_CAN_MODE(CAN_InitStruct->CAN_Mode)); - assert_param(IS_CAN_SJW(CAN_InitStruct->CAN_SJW)); - assert_param(IS_CAN_BS1(CAN_InitStruct->CAN_BS1)); - assert_param(IS_CAN_BS2(CAN_InitStruct->CAN_BS2)); - assert_param(IS_CAN_PRESCALER(CAN_InitStruct->CAN_Prescaler)); - - /* exit from sleep mode */ - CANx->MCR &= ~MCR_SLEEP; - - /* Request initialisation */ - CANx->MCR |= MCR_INRQ ; - - /* Wait the acknowledge */ - while (((CANx->MSR & MSR_INAK) != MSR_INAK) && (wait_ack != INAK_TimeOut)) - { - wait_ack++; - } - - /* ...and check acknowledged */ - if ((CANx->MSR & MSR_INAK) != MSR_INAK) - { - InitStatus = CANINITFAILED; - } - else - { - /* Set the time triggered communication mode */ - if (CAN_InitStruct->CAN_TTCM == ENABLE) - { - CANx->MCR |= MCR_TTCM; - } - else - { - CANx->MCR &= ~MCR_TTCM; - } - - /* Set the automatic bus-off management */ - if (CAN_InitStruct->CAN_ABOM == ENABLE) - { - CANx->MCR |= MCR_ABOM; - } - else - { - CANx->MCR &= ~MCR_ABOM; - } - - /* Set the automatic wake-up mode */ - if (CAN_InitStruct->CAN_AWUM == ENABLE) - { - CANx->MCR |= MCR_AWUM; - } - else - { - CANx->MCR &= ~MCR_AWUM; - } - - /* Set the no automatic retransmission */ - if (CAN_InitStruct->CAN_NART == ENABLE) - { - CANx->MCR |= MCR_NART; - } - else - { - CANx->MCR &= ~MCR_NART; - } - - /* Set the receive FIFO locked mode */ - if (CAN_InitStruct->CAN_RFLM == ENABLE) - { - CANx->MCR |= MCR_RFLM; - } - else - { - CANx->MCR &= ~MCR_RFLM; - } - - /* Set the transmit FIFO priority */ - if (CAN_InitStruct->CAN_TXFP == ENABLE) - { - CANx->MCR |= MCR_TXFP; - } - else - { - CANx->MCR &= ~MCR_TXFP; - } - - /* Set the bit timing register */ - CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | - ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | - ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1); - - /* Request leave initialisation */ - CANx->MCR &= ~MCR_INRQ; - - /* Wait the acknowledge */ - wait_ack = 0x00; - - while (((CANx->MSR & MSR_INAK) == MSR_INAK) && (wait_ack != INAK_TimeOut)) - { - wait_ack++; - } - - /* ...and check acknowledged */ - if ((CANx->MSR & MSR_INAK) == MSR_INAK) - { - InitStatus = CANINITFAILED; - } - else - { - InitStatus = CANINITOK ; - } - } - - /* At this step, return the status of initialization */ - return InitStatus; -} - -/** - * @brief Initializes the CAN peripheral according to the specified - * parameters in the CAN_FilterInitStruct. - * @param CAN_FilterInitStruct: pointer to a CAN_FilterInitTypeDef - * structure that contains the configuration information. - * @retval None. - */ -void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct) -{ - uint32_t filter_number_bit_pos = 0; - /* Check the parameters */ - assert_param(IS_CAN_FILTER_NUMBER(CAN_FilterInitStruct->CAN_FilterNumber)); - assert_param(IS_CAN_FILTER_MODE(CAN_FilterInitStruct->CAN_FilterMode)); - assert_param(IS_CAN_FILTER_SCALE(CAN_FilterInitStruct->CAN_FilterScale)); - assert_param(IS_CAN_FILTER_FIFO(CAN_FilterInitStruct->CAN_FilterFIFOAssignment)); - assert_param(IS_FUNCTIONAL_STATE(CAN_FilterInitStruct->CAN_FilterActivation)); - - filter_number_bit_pos = ((uint32_t)0x00000001) << CAN_FilterInitStruct->CAN_FilterNumber; - - /* Initialisation mode for the filter */ - CAN1->FMR |= FMR_FINIT; - - /* Filter Deactivation */ - CAN1->FA1R &= ~(uint32_t)filter_number_bit_pos; - - /* Filter Scale */ - if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit) - { - /* 16-bit scale for the filter */ - CAN1->FS1R &= ~(uint32_t)filter_number_bit_pos; - - /* First 16-bit identifier and First 16-bit mask */ - /* Or First 16-bit identifier and Second 16-bit identifier */ - CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); - - /* Second 16-bit identifier and Second 16-bit mask */ - /* Or Third 16-bit identifier and Fourth 16-bit identifier */ - CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh); - } - - if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_32bit) - { - /* 32-bit scale for the filter */ - CAN1->FS1R |= filter_number_bit_pos; - /* 32-bit identifier or First 32-bit identifier */ - CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); - /* 32-bit mask or Second 32-bit identifier */ - CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow); - } - - /* Filter Mode */ - if (CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdMask) - { - /*Id/Mask mode for the filter*/ - CAN1->FM1R &= ~(uint32_t)filter_number_bit_pos; - } - else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ - { - /*Identifier list mode for the filter*/ - CAN1->FM1R |= (uint32_t)filter_number_bit_pos; - } - - /* Filter FIFO assignment */ - if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_FilterFIFO0) - { - /* FIFO 0 assignation for the filter */ - CAN1->FFA1R &= ~(uint32_t)filter_number_bit_pos; - } - - if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_FilterFIFO1) - { - /* FIFO 1 assignation for the filter */ - CAN1->FFA1R |= (uint32_t)filter_number_bit_pos; - } - - /* Filter activation */ - if (CAN_FilterInitStruct->CAN_FilterActivation == ENABLE) - { - CAN1->FA1R |= filter_number_bit_pos; - } - - /* Leave the initialisation mode for the filter */ - CAN1->FMR &= ~FMR_FINIT; -} - -/** - * @brief Fills each CAN_InitStruct member with its default value. - * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure which - * will be initialized. - * @retval None. - */ -void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct) -{ - /* Reset CAN init structure parameters values */ - /* Initialize the time triggered communication mode */ - CAN_InitStruct->CAN_TTCM = DISABLE; - /* Initialize the automatic bus-off management */ - CAN_InitStruct->CAN_ABOM = DISABLE; - /* Initialize the automatic wake-up mode */ - CAN_InitStruct->CAN_AWUM = DISABLE; - /* Initialize the no automatic retransmission */ - CAN_InitStruct->CAN_NART = DISABLE; - /* Initialize the receive FIFO locked mode */ - CAN_InitStruct->CAN_RFLM = DISABLE; - /* Initialize the transmit FIFO priority */ - CAN_InitStruct->CAN_TXFP = DISABLE; - /* Initialize the CAN_Mode member */ - CAN_InitStruct->CAN_Mode = CAN_Mode_Normal; - /* Initialize the CAN_SJW member */ - CAN_InitStruct->CAN_SJW = CAN_SJW_1tq; - /* Initialize the CAN_BS1 member */ - CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq; - /* Initialize the CAN_BS2 member */ - CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq; - /* Initialize the CAN_Prescaler member */ - CAN_InitStruct->CAN_Prescaler = 1; -} - -/** - * @brief Select the start bank filter for slave CAN. - * @note This function applies only to STM32 Connectivity line devices. - * @param CAN_BankNumber: Select the start slave bank filter from 1..27. - * @retval None. - */ -void CAN_SlaveStartBank(uint8_t CAN_BankNumber) -{ - /* Check the parameters */ - assert_param(IS_CAN_BANKNUMBER(CAN_BankNumber)); - /* enter Initialisation mode for the filter */ - CAN1->FMR |= FMR_FINIT; - /* Select the start slave bank */ - CAN1->FMR &= (uint32_t)0xFFFFC0F1 ; - CAN1->FMR |= (uint32_t)(CAN_BankNumber)<<8; - /* Leave Initialisation mode for the filter */ - CAN1->FMR &= ~FMR_FINIT; -} - -/** - * @brief Enables or disables the specified CAN interrupts. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_IT: specifies the CAN interrupt sources to be enabled or disabled. - * This parameter can be: CAN_IT_TME, CAN_IT_FMP0, CAN_IT_FF0, - * CAN_IT_FOV0, CAN_IT_FMP1, CAN_IT_FF1, - * CAN_IT_FOV1, CAN_IT_EWG, CAN_IT_EPV, - * CAN_IT_LEC, CAN_IT_ERR, CAN_IT_WKU or - * CAN_IT_SLK. - * @param NewState: new state of the CAN interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None. - */ -void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_ITConfig(CAN_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected CAN interrupt */ - CANx->IER |= CAN_IT; - } - else - { - /* Disable the selected CAN interrupt */ - CANx->IER &= ~CAN_IT; - } -} - -/** - * @brief Initiates the transmission of a message. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param TxMessage: pointer to a structure which contains CAN Id, CAN - * DLC and CAN datas. - * @retval The number of the mailbox that is used for transmission - * or CAN_NO_MB if there is no empty mailbox. - */ -uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) -{ - uint8_t transmit_mailbox = 0; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_IDTYPE(TxMessage->IDE)); - assert_param(IS_CAN_RTR(TxMessage->RTR)); - assert_param(IS_CAN_DLC(TxMessage->DLC)); - - /* Select one empty transmit mailbox */ - if ((CANx->TSR&TSR_TME0) == TSR_TME0) - { - transmit_mailbox = 0; - } - else if ((CANx->TSR&TSR_TME1) == TSR_TME1) - { - transmit_mailbox = 1; - } - else if ((CANx->TSR&TSR_TME2) == TSR_TME2) - { - transmit_mailbox = 2; - } - else - { - transmit_mailbox = CAN_NO_MB; - } - - if (transmit_mailbox != CAN_NO_MB) - { - /* Set up the Id */ - CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; - if (TxMessage->IDE == CAN_ID_STD) - { - assert_param(IS_CAN_STDID(TxMessage->StdId)); - CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | TxMessage->RTR); - } - else - { - assert_param(IS_CAN_EXTID(TxMessage->ExtId)); - CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId<<3) | TxMessage->IDE | - TxMessage->RTR); - } - - - /* Set up the DLC */ - TxMessage->DLC &= (uint8_t)0x0000000F; - CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0; - CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC; - - /* Set up the data field */ - CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) | - ((uint32_t)TxMessage->Data[2] << 16) | - ((uint32_t)TxMessage->Data[1] << 8) | - ((uint32_t)TxMessage->Data[0])); - CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) | - ((uint32_t)TxMessage->Data[6] << 16) | - ((uint32_t)TxMessage->Data[5] << 8) | - ((uint32_t)TxMessage->Data[4])); - /* Request transmission */ - CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ; - } - return transmit_mailbox; -} - -/** - * @brief Checks the transmission of a message. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param TransmitMailbox: the number of the mailbox that is used for transmission. - * @retval CANTXOK if the CAN driver transmits the message, CANTXFAILED in an other case. - */ -uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox) -{ - /* RQCP, TXOK and TME bits */ - uint8_t state = 0; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_TRANSMITMAILBOX(TransmitMailbox)); - switch (TransmitMailbox) - { - case (0): state |= (uint8_t)((CANx->TSR & TSR_RQCP0) << 2); - state |= (uint8_t)((CANx->TSR & TSR_TXOK0) >> 0); - state |= (uint8_t)((CANx->TSR & TSR_TME0) >> 26); - break; - case (1): state |= (uint8_t)((CANx->TSR & TSR_RQCP1) >> 6); - state |= (uint8_t)((CANx->TSR & TSR_TXOK1) >> 8); - state |= (uint8_t)((CANx->TSR & TSR_TME1) >> 27); - break; - case (2): state |= (uint8_t)((CANx->TSR & TSR_RQCP2) >> 14); - state |= (uint8_t)((CANx->TSR & TSR_TXOK2) >> 16); - state |= (uint8_t)((CANx->TSR & TSR_TME2) >> 28); - break; - default: - state = CANTXFAILED; - break; - } - switch (state) - { - /* transmit pending */ - case (0x0): state = CANTXPENDING; - break; - /* transmit failed */ - case (0x5): state = CANTXFAILED; - break; - /* transmit succedeed */ - case (0x7): state = CANTXOK; - break; - default: - state = CANTXFAILED; - break; - } - return state; -} - -/** - * @brief Cancels a transmit request. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param Mailbox: Mailbox number. - * @retval None. - */ -void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_TRANSMITMAILBOX(Mailbox)); - /* abort transmission */ - switch (Mailbox) - { - case (0): CANx->TSR |= TSR_ABRQ0; - break; - case (1): CANx->TSR |= TSR_ABRQ1; - break; - case (2): CANx->TSR |= TSR_ABRQ2; - break; - default: - break; - } -} - -/** - * @brief Releases a FIFO. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param FIFONumber: FIFO to release, CAN_FIFO0 or CAN_FIFO1. - * @retval None. - */ -void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FIFO(FIFONumber)); - /* Release FIFO0 */ - if (FIFONumber == CAN_FIFO0) - { - CANx->RF0R = RF0R_RFOM0; - } - /* Release FIFO1 */ - else /* FIFONumber == CAN_FIFO1 */ - { - CANx->RF1R = RF1R_RFOM1; - } -} - -/** - * @brief Returns the number of pending messages. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. - * @retval NbMessage which is the number of pending message. - */ -uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber) -{ - uint8_t message_pending=0; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FIFO(FIFONumber)); - if (FIFONumber == CAN_FIFO0) - { - message_pending = (uint8_t)(CANx->RF0R&(uint32_t)0x03); - } - else if (FIFONumber == CAN_FIFO1) - { - message_pending = (uint8_t)(CANx->RF1R&(uint32_t)0x03); - } - else - { - message_pending = 0; - } - return message_pending; -} - -/** - * @brief Receives a message. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. - * @param RxMessage: pointer to a structure receive message which - * contains CAN Id, CAN DLC, CAN datas and FMI number. - * @retval None. - */ -void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FIFO(FIFONumber)); - /* Get the Id */ - RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RIR; - if (RxMessage->IDE == CAN_ID_STD) - { - RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 21); - } - else - { - RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 3); - } - - RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RIR; - /* Get the DLC */ - RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RDTR; - /* Get the FMI */ - RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDTR >> 8); - /* Get the data field */ - RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDLR; - RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 8); - RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 16); - RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 24); - RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDHR; - RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 8); - RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 16); - RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 24); - /* Release the FIFO */ - CAN_FIFORelease(CANx, FIFONumber); -} - -/** - * @brief Enables or disables the DBG Freeze for CAN. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param NewState: new state of the CAN peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None. - */ -void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable Debug Freeze */ - CANx->MCR |= MCR_DBF; - } - else - { - /* Disable Debug Freeze */ - CANx->MCR &= ~MCR_DBF; - } -} - -/** - * @brief Enters the low power mode. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @retval CANSLEEPOK if sleep entered, CANSLEEPFAILED in an other case. - */ -uint8_t CAN_Sleep(CAN_TypeDef* CANx) -{ - uint8_t sleepstatus = CANSLEEPFAILED; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Request Sleep mode */ - CANx->MCR = (((CANx->MCR) & (uint32_t)(~MCR_INRQ)) | MCR_SLEEP); - - /* Sleep mode status */ - if ((CANx->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) == CAN_MSR_SLAK) - { - /* Sleep mode not entered */ - sleepstatus = CANSLEEPOK; - } - /* At this step, sleep mode status */ - return (uint8_t)sleepstatus; -} - -/** - * @brief Wakes the CAN up. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @retval CANWAKEUPOK if sleep mode left, CANWAKEUPFAILED in an other case. - */ -uint8_t CAN_WakeUp(CAN_TypeDef* CANx) -{ - uint32_t wait_slak = SLAK_TimeOut ; - uint8_t wakeupstatus = CANWAKEUPFAILED; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Wake up request */ - CANx->MCR &= ~MCR_SLEEP; - - /* Sleep mode status */ - while(((CANx->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)&&(wait_slak!=0x00)) - { - wait_slak--; - } - if((CANx->MSR & CAN_MSR_SLAK) != CAN_MSR_SLAK) - { - /* Sleep mode exited */ - wakeupstatus = CANWAKEUPOK; - } - /* At this step, sleep mode status */ - return (uint8_t)wakeupstatus; -} - -/** - * @brief Checks whether the specified CAN flag is set or not. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_FLAG: specifies the flag to check. - * This parameter can be: CAN_FLAG_EWG, CAN_FLAG_EPV or CAN_FLAG_BOF. - * @retval The new state of CAN_FLAG (SET or RESET). - */ -FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FLAG(CAN_FLAG)); - /* Check the status of the specified CAN flag */ - if ((CANx->ESR & CAN_FLAG) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - /* Return the CAN_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the CAN's pending flags. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_FLAG: specifies the flag to clear. - * @retval None. - */ -void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FLAG(CAN_FLAG)); - /* Clear the selected CAN flags */ - CANx->ESR &= ~CAN_FLAG; -} - -/** - * @brief Checks whether the specified CAN interrupt has occurred or not. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_IT: specifies the CAN interrupt source to check. - * This parameter can be: CAN_IT_RQCP0, CAN_IT_RQCP1, CAN_IT_RQCP2, - * CAN_IT_FF0, CAN_IT_FOV0, CAN_IT_FF1, - * CAN_IT_FOV1, CAN_IT_EWG, CAN_IT_EPV, - * CAN_IT_BOF, CAN_IT_WKU or CAN_IT_SLK. - * @retval The new state of CAN_IT (SET or RESET). - */ -ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT) -{ - ITStatus pendingbitstatus = RESET; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_ITStatus(CAN_IT)); - switch (CAN_IT) - { - case CAN_IT_RQCP0: - pendingbitstatus = CheckITStatus(CANx->TSR, TSR_RQCP0); - break; - case CAN_IT_RQCP1: - pendingbitstatus = CheckITStatus(CANx->TSR, TSR_RQCP1); - break; - case CAN_IT_RQCP2: - pendingbitstatus = CheckITStatus(CANx->TSR, TSR_RQCP2); - break; - case CAN_IT_FF0: - pendingbitstatus = CheckITStatus(CANx->RF0R, RF0R_FULL0); - break; - case CAN_IT_FOV0: - pendingbitstatus = CheckITStatus(CANx->RF0R, RF0R_FOVR0); - break; - case CAN_IT_FF1: - pendingbitstatus = CheckITStatus(CANx->RF1R, RF1R_FULL1); - break; - case CAN_IT_FOV1: - pendingbitstatus = CheckITStatus(CANx->RF1R, RF1R_FOVR1); - break; - case CAN_IT_EWG: - pendingbitstatus = CheckITStatus(CANx->ESR, ESR_EWGF); - break; - case CAN_IT_EPV: - pendingbitstatus = CheckITStatus(CANx->ESR, ESR_EPVF); - break; - case CAN_IT_BOF: - pendingbitstatus = CheckITStatus(CANx->ESR, ESR_BOFF); - break; - case CAN_IT_SLK: - pendingbitstatus = CheckITStatus(CANx->MSR, MSR_SLAKI); - break; - case CAN_IT_WKU: - pendingbitstatus = CheckITStatus(CANx->MSR, MSR_WKUI); - break; - default : - pendingbitstatus = RESET; - break; - } - /* Return the CAN_IT status */ - return pendingbitstatus; -} - -/** - * @brief Clears the CAN’s interrupt pending bits. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_IT: specifies the interrupt pending bit to clear. - * @retval None. - */ -void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_ITStatus(CAN_IT)); - switch (CAN_IT) - { - case CAN_IT_RQCP0: - CANx->TSR = TSR_RQCP0; /* rc_w1*/ - break; - case CAN_IT_RQCP1: - CANx->TSR = TSR_RQCP1; /* rc_w1*/ - break; - case CAN_IT_RQCP2: - CANx->TSR = TSR_RQCP2; /* rc_w1*/ - break; - case CAN_IT_FF0: - CANx->RF0R = RF0R_FULL0; /* rc_w1*/ - break; - case CAN_IT_FOV0: - CANx->RF0R = RF0R_FOVR0; /* rc_w1*/ - break; - case CAN_IT_FF1: - CANx->RF1R = RF1R_FULL1; /* rc_w1*/ - break; - case CAN_IT_FOV1: - CANx->RF1R = RF1R_FOVR1; /* rc_w1*/ - break; - case CAN_IT_EWG: - CANx->ESR &= ~ ESR_EWGF; /* rw */ - break; - case CAN_IT_EPV: - CANx->ESR &= ~ ESR_EPVF; /* rw */ - break; - case CAN_IT_BOF: - CANx->ESR &= ~ ESR_BOFF; /* rw */ - break; - case CAN_IT_WKU: - CANx->MSR = MSR_WKUI; /* rc_w1*/ - break; - case CAN_IT_SLK: - CANx->MSR = MSR_SLAKI; /* rc_w1*/ - break; - default : - break; - } -} - -/** - * @brief Checks whether the CAN interrupt has occurred or not. - * @param CAN_Reg: specifies the CAN interrupt register to check. - * @param It_Bit: specifies the interrupt source bit to check. - * @retval The new state of the CAN Interrupt (SET or RESET). - */ -static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit) -{ - ITStatus pendingbitstatus = RESET; - - if ((CAN_Reg & It_Bit) != (uint32_t)RESET) - { - /* CAN_IT is set */ - pendingbitstatus = SET; - } - else - { - /* CAN_IT is reset */ - pendingbitstatus = RESET; - } - return pendingbitstatus; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c deleted file mode 100644 index 1dd2ffdae8..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c +++ /dev/null @@ -1,432 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_cec.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the CEC firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_cec.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup CEC - * @brief CEC driver modules - * @{ - */ - -/** @defgroup CEC_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - - -/** @defgroup CEC_Private_Defines - * @{ - */ - -/* ------------ CEC registers bit address in the alias region ----------- */ -#define CEC_OFFSET (CEC_BASE - PERIPH_BASE) - -/* --- CFGR Register ---*/ - -/* Alias word address of PE bit */ -#define CFGR_OFFSET (CEC_OFFSET + 0x00) -#define PE_BitNumber 0x00 -#define CFGR_PE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (PE_BitNumber * 4)) - -/* Alias word address of IE bit */ -#define IE_BitNumber 0x01 -#define CFGR_IE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (IE_BitNumber * 4)) - -/* --- CSR Register ---*/ - -/* Alias word address of TSOM bit */ -#define CSR_OFFSET (CEC_OFFSET + 0x10) -#define TSOM_BitNumber 0x00 -#define CSR_TSOM_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TSOM_BitNumber * 4)) - -/* Alias word address of TEOM bit */ -#define TEOM_BitNumber 0x01 -#define CSR_TEOM_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (TEOM_BitNumber * 4)) - -#define CFGR_CLEAR_Mask (uint8_t)(0xF3) /* CFGR register Mask */ -#define FLAG_Mask ((uint32_t)0x00FFFFFF) /* CEC FLAG mask */ - -/** - * @} - */ - - -/** @defgroup CEC_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup CEC_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup CEC_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - - -/** @defgroup CEC_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the CEC peripheral registers to their default reset - * values. - * @param None - * @retval None - */ -void CEC_DeInit(void) -{ - /* Enable CEC reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CEC, ENABLE); - /* Release CEC from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CEC, DISABLE); -} - - -/** - * @brief Initializes the CEC peripheral according to the specified - * parameters in the CEC_InitStruct. - * @param CEC_InitStruct: pointer to an CEC_InitTypeDef structure that - * contains the configuration information for the specified - * CEC peripheral. - * @retval None - */ -void CEC_Init(CEC_InitTypeDef* CEC_InitStruct) -{ - uint16_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_CEC_BIT_TIMING_ERROR_MODE(CEC_InitStruct->CEC_BitTimingMode)); - assert_param(IS_CEC_BIT_PERIOD_ERROR_MODE(CEC_InitStruct->CEC_BitPeriodMode)); - - /*---------------------------- CEC CFGR Configuration -----------------*/ - /* Get the CEC CFGR value */ - tmpreg = CEC->CFGR; - - /* Clear BTEM and BPEM bits */ - tmpreg &= CFGR_CLEAR_Mask; - - /* Configure CEC: Bit Timing Error and Bit Period Error */ - tmpreg |= (uint16_t)(CEC_InitStruct->CEC_BitTimingMode | CEC_InitStruct->CEC_BitPeriodMode); - - /* Write to CEC CFGR register*/ - CEC->CFGR = tmpreg; - -} - -/** - * @brief Enables or disables the specified CEC peripheral. - * @param NewState: new state of the CEC peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CEC_Cmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CFGR_PE_BB = (uint32_t)NewState; - - if(NewState == DISABLE) - { - /* Wait until the PE bit is cleared by hardware (Idle Line detected) */ - while((CEC->CFGR & CEC_CFGR_PE) != (uint32_t)RESET) - { - } - } -} - -/** - * @brief Enables or disables the CEC interrupt. - * @param NewState: new state of the CEC interrupt. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CEC_ITConfig(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CFGR_IE_BB = (uint32_t)NewState; -} - -/** - * @brief Defines the Own Address of the CEC device. - * @param CEC_OwnAddress: The CEC own address - * @retval None - */ -void CEC_OwnAddressConfig(uint8_t CEC_OwnAddress) -{ - /* Check the parameters */ - assert_param(IS_CEC_ADDRESS(CEC_OwnAddress)); - - /* Set the CEC own address */ - CEC->OAR = CEC_OwnAddress; -} - -/** - * @brief Sets the CEC prescaler value. - * @param CEC_Prescaler: CEC prescaler new value - * @retval None - */ -void CEC_SetPrescaler(uint16_t CEC_Prescaler) -{ - /* Check the parameters */ - assert_param(IS_CEC_PRESCALER(CEC_Prescaler)); - - /* Set the Prescaler value*/ - CEC->PRES = CEC_Prescaler; -} - -/** - * @brief Transmits single data through the CEC peripheral. - * @param Data: the data to transmit. - * @retval None - */ -void CEC_SendDataByte(uint8_t Data) -{ - /* Transmit Data */ - CEC->TXD = Data ; -} - - -/** - * @brief Returns the most recent received data by the CEC peripheral. - * @param None - * @retval The received data. - */ -uint8_t CEC_ReceiveDataByte(void) -{ - /* Receive Data */ - return (uint8_t)(CEC->RXD); -} - -/** - * @brief Starts a new message. - * @param None - * @retval None - */ -void CEC_StartOfMessage(void) -{ - /* Starts of new message */ - *(__IO uint32_t *) CSR_TSOM_BB = (uint32_t)0x1; -} - -/** - * @brief Transmits message with or without an EOM bit. - * @param NewState: new state of the CEC Tx End Of Message. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CEC_EndOfMessageCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* The data byte will be transmitted with or without an EOM bit*/ - *(__IO uint32_t *) CSR_TEOM_BB = (uint32_t)NewState; -} - -/** - * @brief Gets the CEC flag status - * @param CEC_FLAG: specifies the CEC flag to check. - * This parameter can be one of the following values: - * @arg CEC_FLAG_BTE: Bit Timing Error - * @arg CEC_FLAG_BPE: Bit Period Error - * @arg CEC_FLAG_RBTFE: Rx Block Transfer Finished Error - * @arg CEC_FLAG_SBE: Start Bit Error - * @arg CEC_FLAG_ACKE: Block Acknowledge Error - * @arg CEC_FLAG_LINE: Line Error - * @arg CEC_FLAG_TBTFE: Tx Block Transfer Finsihed Error - * @arg CEC_FLAG_TEOM: Tx End Of Message - * @arg CEC_FLAG_TERR: Tx Error - * @arg CEC_FLAG_TBTRF: Tx Byte Transfer Request or Block Transfer Finished - * @arg CEC_FLAG_RSOM: Rx Start Of Message - * @arg CEC_FLAG_REOM: Rx End Of Message - * @arg CEC_FLAG_RERR: Rx Error - * @arg CEC_FLAG_RBTF: Rx Byte/Block Transfer Finished - * @retval The new state of CEC_FLAG (SET or RESET) - */ -FlagStatus CEC_GetFlagStatus(uint32_t CEC_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t cecreg = 0, cecbase = 0; - - /* Check the parameters */ - assert_param(IS_CEC_GET_FLAG(CEC_FLAG)); - - /* Get the CEC peripheral base address */ - cecbase = (uint32_t)(CEC_BASE); - - /* Read flag register index */ - cecreg = CEC_FLAG >> 28; - - /* Get bit[23:0] of the flag */ - CEC_FLAG &= FLAG_Mask; - - if(cecreg != 0) - { - /* Flag in CEC ESR Register */ - CEC_FLAG = (uint32_t)(CEC_FLAG >> 16); - - /* Get the CEC ESR register address */ - cecbase += 0xC; - } - else - { - /* Get the CEC CSR register address */ - cecbase += 0x10; - } - - if(((*(__IO uint32_t *)cecbase) & CEC_FLAG) != (uint32_t)RESET) - { - /* CEC_FLAG is set */ - bitstatus = SET; - } - else - { - /* CEC_FLAG is reset */ - bitstatus = RESET; - } - - /* Return the CEC_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the CEC's pending flags. - * @param CEC_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg CEC_FLAG_TERR: Tx Error - * @arg CEC_FLAG_TBTRF: Tx Byte Transfer Request or Block Transfer Finished - * @arg CEC_FLAG_RSOM: Rx Start Of Message - * @arg CEC_FLAG_REOM: Rx End Of Message - * @arg CEC_FLAG_RERR: Rx Error - * @arg CEC_FLAG_RBTF: Rx Byte/Block Transfer Finished - * @retval None - */ -void CEC_ClearFlag(uint32_t CEC_FLAG) -{ - uint32_t tmp = 0x0; - - /* Check the parameters */ - assert_param(IS_CEC_CLEAR_FLAG(CEC_FLAG)); - - tmp = CEC->CSR & 0x2; - - /* Clear the selected CEC flags */ - CEC->CSR &= (uint32_t)(((~(uint32_t)CEC_FLAG) & 0xFFFFFFFC) | tmp); -} - -/** - * @brief Checks whether the specified CEC interrupt has occurred or not. - * @param CEC_IT: specifies the CEC interrupt source to check. - * This parameter can be one of the following values: - * @arg CEC_IT_TERR: Tx Error - * @arg CEC_IT_TBTF: Tx Block Transfer Finished - * @arg CEC_IT_RERR: Rx Error - * @arg CEC_IT_RBTF: Rx Block Transfer Finished - * @retval The new state of CEC_IT (SET or RESET). - */ -ITStatus CEC_GetITStatus(uint8_t CEC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_CEC_GET_IT(CEC_IT)); - - /* Get the CEC IT enable bit status */ - enablestatus = (CEC->CFGR & (uint8_t)CEC_CFGR_IE) ; - - /* Check the status of the specified CEC interrupt */ - if (((CEC->CSR & CEC_IT) != (uint32_t)RESET) && enablestatus) - { - /* CEC_IT is set */ - bitstatus = SET; - } - else - { - /* CEC_IT is reset */ - bitstatus = RESET; - } - /* Return the CEC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the CEC's interrupt pending bits. - * @param CEC_IT: specifies the CEC interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg CEC_IT_TERR: Tx Error - * @arg CEC_IT_TBTF: Tx Block Transfer Finished - * @arg CEC_IT_RERR: Rx Error - * @arg CEC_IT_RBTF: Rx Block Transfer Finished - * @retval None - */ -void CEC_ClearITPendingBit(uint16_t CEC_IT) -{ - uint32_t tmp = 0x0; - - /* Check the parameters */ - assert_param(IS_CEC_GET_IT(CEC_IT)); - - tmp = CEC->CSR & 0x2; - - /* Clear the selected CEC interrupt pending bits */ - CEC->CSR &= (uint32_t)(((~(uint32_t)CEC_IT) & 0xFFFFFFFC) | tmp); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c deleted file mode 100644 index 13f07fc206..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c +++ /dev/null @@ -1,163 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_crc.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the CRC firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_crc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup CRC - * @brief CRC driver modules - * @{ - */ - -/** @defgroup CRC_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup CRC_Private_Defines - * @{ - */ - -/* CR register bit mask */ - -#define CR_RESET_Set ((uint32_t)0x00000001) - -/** - * @} - */ - -/** @defgroup CRC_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup CRC_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup CRC_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup CRC_Private_Functions - * @{ - */ - -/** - * @brief Resets the CRC Data register (DR). - * @param None - * @retval None - */ -void CRC_ResetDR(void) -{ - /* Reset CRC generator */ - CRC->CR = CR_RESET_Set; -} - -/** - * @brief Computes the 32-bit CRC of a given data word(32-bit). - * @param Data: data word(32-bit) to compute its CRC - * @retval 32-bit CRC - */ -uint32_t CRC_CalcCRC(uint32_t Data) -{ - CRC->DR = Data; - - return (CRC->DR); -} - -/** - * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). - * @param pBuffer: pointer to the buffer containing the data to be computed - * @param BufferLength: length of the buffer to be computed - * @retval 32-bit CRC - */ -uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength) -{ - uint32_t index = 0; - - for(index = 0; index < BufferLength; index++) - { - CRC->DR = pBuffer[index]; - } - return (CRC->DR); -} - -/** - * @brief Returns the current CRC value. - * @param None - * @retval 32-bit CRC - */ -uint32_t CRC_GetCRC(void) -{ - return (CRC->DR); -} - -/** - * @brief Stores a 8-bit data in the Independent Data(ID) register. - * @param IDValue: 8-bit value to be stored in the ID register - * @retval None - */ -void CRC_SetIDRegister(uint8_t IDValue) -{ - CRC->IDR = IDValue; -} - -/** - * @brief Returns the 8-bit data stored in the Independent Data(ID) register - * @param None - * @retval 8-bit value of the ID register - */ -uint8_t CRC_GetIDRegister(void) -{ - return (CRC->IDR); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c deleted file mode 100644 index eeb0d22e1e..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c +++ /dev/null @@ -1,579 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_dac.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the DAC firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_dac.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup DAC - * @brief DAC driver modules - * @{ - */ - -/** @defgroup DAC_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup DAC_Private_Defines - * @{ - */ - -/* DAC EN mask */ -#define CR_EN_Set ((uint32_t)0x00000001) - -/* DAC DMAEN mask */ -#define CR_DMAEN_Set ((uint32_t)0x00001000) - -/* CR register Mask */ -#define CR_CLEAR_Mask ((uint32_t)0x00000FFE) - -/* DAC SWTRIG mask */ -#define SWTRIGR_SWTRIG_Set ((uint32_t)0x00000001) - -/* DAC Dual Channels SWTRIG masks */ -#define DUAL_SWTRIG_Set ((uint32_t)0x00000003) -#define DUAL_SWTRIG_Reset ((uint32_t)0xFFFFFFFC) - -/* DHR registers offsets */ -#define DHR12R1_Offset ((uint32_t)0x00000008) -#define DHR12R2_Offset ((uint32_t)0x00000014) -#define DHR12RD_Offset ((uint32_t)0x00000020) - -/* DOR register offset */ -#define DOR_Offset ((uint32_t)0x0000002C) -/** - * @} - */ - -/** @defgroup DAC_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup DAC_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup DAC_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup DAC_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the DAC peripheral registers to their default reset values. - * @param None - * @retval None - */ -void DAC_DeInit(void) -{ - /* Enable DAC reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE); - /* Release DAC from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE); -} - -/** - * @brief Initializes the DAC peripheral according to the specified - * parameters in the DAC_InitStruct. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure that - * contains the configuration information for the specified DAC channel. - * @retval None - */ -void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct) -{ - uint32_t tmpreg1 = 0, tmpreg2 = 0; - /* Check the DAC parameters */ - assert_param(IS_DAC_TRIGGER(DAC_InitStruct->DAC_Trigger)); - assert_param(IS_DAC_GENERATE_WAVE(DAC_InitStruct->DAC_WaveGeneration)); - assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude)); - assert_param(IS_DAC_OUTPUT_BUFFER_STATE(DAC_InitStruct->DAC_OutputBuffer)); -/*---------------------------- DAC CR Configuration --------------------------*/ - /* Get the DAC CR value */ - tmpreg1 = DAC->CR; - /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */ - tmpreg1 &= ~(CR_CLEAR_Mask << DAC_Channel); - /* Configure for the selected DAC channel: buffer output, trigger, wave genration, - mask/amplitude for wave genration */ - /* Set TSELx and TENx bits according to DAC_Trigger value */ - /* Set WAVEx bits according to DAC_WaveGeneration value */ - /* Set MAMPx bits according to DAC_LFSRUnmask_TriangleAmplitude value */ - /* Set BOFFx bit according to DAC_OutputBuffer value */ - tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration | - DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | DAC_InitStruct->DAC_OutputBuffer); - /* Calculate CR register value depending on DAC_Channel */ - tmpreg1 |= tmpreg2 << DAC_Channel; - /* Write to DAC CR */ - DAC->CR = tmpreg1; -} - -/** - * @brief Fills each DAC_InitStruct member with its default value. - * @param DAC_InitStruct : pointer to a DAC_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct) -{ -/*--------------- Reset DAC init structure parameters values -----------------*/ - /* Initialize the DAC_Trigger member */ - DAC_InitStruct->DAC_Trigger = DAC_Trigger_None; - /* Initialize the DAC_WaveGeneration member */ - DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None; - /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ - DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; - /* Initialize the DAC_OutputBuffer member */ - DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable; -} - -/** - * @brief Enables or disables the specified DAC channel. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param NewState: new state of the DAC channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected DAC channel */ - DAC->CR |= CR_EN_Set << DAC_Channel; - } - else - { - /* Disable the selected DAC channel */ - DAC->CR &= ~(CR_EN_Set << DAC_Channel); - } -} -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -/** - * @brief Enables or disables the specified DAC interrupts. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_IT: specifies the DAC interrupt sources to be enabled or disabled. - * This parameter can be the following values: - * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask - * @param NewState: new state of the specified DAC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_DAC_IT(DAC_IT)); - - if (NewState != DISABLE) - { - /* Enable the selected DAC interrupts */ - DAC->CR |= (DAC_IT << DAC_Channel); - } - else - { - /* Disable the selected DAC interrupts */ - DAC->CR &= (~(uint32_t)(DAC_IT << DAC_Channel)); - } -} -#endif - -/** - * @brief Enables or disables the specified DAC channel DMA request. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param NewState: new state of the selected DAC channel DMA request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected DAC channel DMA request */ - DAC->CR |= CR_DMAEN_Set << DAC_Channel; - } - else - { - /* Disable the selected DAC channel DMA request */ - DAC->CR &= ~(CR_DMAEN_Set << DAC_Channel); - } -} - -/** - * @brief Enables or disables the selected DAC channel software trigger. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param NewState: new state of the selected DAC channel software trigger. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable software trigger for the selected DAC channel */ - DAC->SWTRIGR |= SWTRIGR_SWTRIG_Set << (DAC_Channel >> 4); - } - else - { - /* Disable software trigger for the selected DAC channel */ - DAC->SWTRIGR &= ~(SWTRIGR_SWTRIG_Set << (DAC_Channel >> 4)); - } -} - -/** - * @brief Enables or disables simultaneously the two DAC channels software - * triggers. - * @param NewState: new state of the DAC channels software triggers. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_DualSoftwareTriggerCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable software trigger for both DAC channels */ - DAC->SWTRIGR |= DUAL_SWTRIG_Set ; - } - else - { - /* Disable software trigger for both DAC channels */ - DAC->SWTRIGR &= DUAL_SWTRIG_Reset; - } -} - -/** - * @brief Enables or disables the selected DAC channel wave generation. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_Wave: Specifies the wave type to enable or disable. - * This parameter can be one of the following values: - * @arg DAC_Wave_Noise: noise wave generation - * @arg DAC_Wave_Triangle: triangle wave generation - * @param NewState: new state of the selected DAC channel wave generation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_WAVE(DAC_Wave)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected wave generation for the selected DAC channel */ - DAC->CR |= DAC_Wave << DAC_Channel; - } - else - { - /* Disable the selected wave generation for the selected DAC channel */ - DAC->CR &= ~(DAC_Wave << DAC_Channel); - } -} - -/** - * @brief Set the specified data holding register value for DAC channel1. - * @param DAC_Align: Specifies the data alignement for DAC channel1. - * This parameter can be one of the following values: - * @arg DAC_Align_8b_R: 8bit right data alignement selected - * @arg DAC_Align_12b_L: 12bit left data alignement selected - * @arg DAC_Align_12b_R: 12bit right data alignement selected - * @param Data : Data to be loaded in the selected data holding register. - * @retval None - */ -void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_ALIGN(DAC_Align)); - assert_param(IS_DAC_DATA(Data)); - - tmp = (uint32_t)DAC_BASE; - tmp += DHR12R1_Offset + DAC_Align; - - /* Set the DAC channel1 selected data holding register */ - *(__IO uint32_t *) tmp = Data; -} - -/** - * @brief Set the specified data holding register value for DAC channel2. - * @param DAC_Align: Specifies the data alignement for DAC channel2. - * This parameter can be one of the following values: - * @arg DAC_Align_8b_R: 8bit right data alignement selected - * @arg DAC_Align_12b_L: 12bit left data alignement selected - * @arg DAC_Align_12b_R: 12bit right data alignement selected - * @param Data : Data to be loaded in the selected data holding register. - * @retval None - */ -void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_ALIGN(DAC_Align)); - assert_param(IS_DAC_DATA(Data)); - - tmp = (uint32_t)DAC_BASE; - tmp += DHR12R2_Offset + DAC_Align; - - /* Set the DAC channel2 selected data holding register */ - *(__IO uint32_t *)tmp = Data; -} - -/** - * @brief Set the specified data holding register value for dual channel - * DAC. - * @param DAC_Align: Specifies the data alignement for dual channel DAC. - * This parameter can be one of the following values: - * @arg DAC_Align_8b_R: 8bit right data alignement selected - * @arg DAC_Align_12b_L: 12bit left data alignement selected - * @arg DAC_Align_12b_R: 12bit right data alignement selected - * @param Data2: Data for DAC Channel2 to be loaded in the selected data - * holding register. - * @param Data1: Data for DAC Channel1 to be loaded in the selected data - * holding register. - * @retval None - */ -void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1) -{ - uint32_t data = 0, tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_ALIGN(DAC_Align)); - assert_param(IS_DAC_DATA(Data1)); - assert_param(IS_DAC_DATA(Data2)); - - /* Calculate and set dual DAC data holding register value */ - if (DAC_Align == DAC_Align_8b_R) - { - data = ((uint32_t)Data2 << 8) | Data1; - } - else - { - data = ((uint32_t)Data2 << 16) | Data1; - } - - tmp = (uint32_t)DAC_BASE; - tmp += DHR12RD_Offset + DAC_Align; - - /* Set the dual DAC selected data holding register */ - *(__IO uint32_t *)tmp = data; -} - -/** - * @brief Returns the last data output value of the selected DAC cahnnel. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @retval The selected DAC channel data output value. - */ -uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - - tmp = (uint32_t) DAC_BASE ; - tmp += DOR_Offset + ((uint32_t)DAC_Channel >> 2); - - /* Returns the DAC channel data output register value */ - return (uint16_t) (*(__IO uint32_t*) tmp); -} - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) -/** - * @brief Checks whether the specified DAC flag is set or not. - * @param DAC_Channel: thee selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_FLAG: specifies the flag to check. - * This parameter can be only of the following value: - * @arg DAC_FLAG_DMAUDR: DMA underrun flag - * @retval The new state of DAC_FLAG (SET or RESET). - */ -FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_FLAG(DAC_FLAG)); - - /* Check the status of the specified DAC flag */ - if ((DAC->SR & (DAC_FLAG << DAC_Channel)) != (uint8_t)RESET) - { - /* DAC_FLAG is set */ - bitstatus = SET; - } - else - { - /* DAC_FLAG is reset */ - bitstatus = RESET; - } - /* Return the DAC_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the DAC channelx's pending flags. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_FLAG: specifies the flag to clear. - * This parameter can be of the following value: - * @arg DAC_FLAG_DMAUDR: DMA underrun flag - * @retval None - */ -void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_FLAG(DAC_FLAG)); - - /* Clear the selected DAC flags */ - DAC->SR = (DAC_FLAG << DAC_Channel); -} - -/** - * @brief Checks whether the specified DAC interrupt has occurred or not. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_IT: specifies the DAC interrupt source to check. - * This parameter can be the following values: - * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask - * @retval The new state of DAC_IT (SET or RESET). - */ -ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_IT(DAC_IT)); - - /* Get the DAC_IT enable bit status */ - enablestatus = (DAC->CR & (DAC_IT << DAC_Channel)) ; - - /* Check the status of the specified DAC interrupt */ - if (((DAC->SR & (DAC_IT << DAC_Channel)) != (uint32_t)RESET) && enablestatus) - { - /* DAC_IT is set */ - bitstatus = SET; - } - else - { - /* DAC_IT is reset */ - bitstatus = RESET; - } - /* Return the DAC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the DAC channelx’s interrupt pending bits. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_IT: specifies the DAC interrupt pending bit to clear. - * This parameter can be the following values: - * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask - * @retval None - */ -void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_IT(DAC_IT)); - - /* Clear the selected DAC interrupt pending bits */ - DAC->SR = (DAC_IT << DAC_Channel); -} -#endif - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c deleted file mode 100644 index 269d15195f..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c +++ /dev/null @@ -1,155 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_dbgmcu.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the DBGMCU firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_dbgmcu.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup DBGMCU - * @brief DBGMCU driver modules - * @{ - */ - -/** @defgroup DBGMCU_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup DBGMCU_Private_Defines - * @{ - */ - -#define IDCODE_DEVID_Mask ((uint32_t)0x00000FFF) -/** - * @} - */ - -/** @defgroup DBGMCU_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup DBGMCU_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup DBGMCU_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup DBGMCU_Private_Functions - * @{ - */ - -/** - * @brief Returns the device revision identifier. - * @param None - * @retval Device revision identifier - */ -uint32_t DBGMCU_GetREVID(void) -{ - return(DBGMCU->IDCODE >> 16); -} - -/** - * @brief Returns the device identifier. - * @param None - * @retval Device identifier - */ -uint32_t DBGMCU_GetDEVID(void) -{ - return(DBGMCU->IDCODE & IDCODE_DEVID_Mask); -} - -/** - * @brief Configures the specified peripheral and low power mode behavior - * when the MCU under Debug mode. - * @param DBGMCU_Periph: specifies the peripheral and low power mode. - * This parameter can be any combination of the following values: - * @arg DBGMCU_SLEEP: Keep debugger connection during SLEEP mode - * @arg DBGMCU_STOP: Keep debugger connection during STOP mode - * @arg DBGMCU_STANDBY: Keep debugger connection during STANDBY mode - * @arg DBGMCU_IWDG_STOP: Debug IWDG stopped when Core is halted - * @arg DBGMCU_WWDG_STOP: Debug WWDG stopped when Core is halted - * @arg DBGMCU_TIM1_STOP: TIM1 counter stopped when Core is halted - * @arg DBGMCU_TIM2_STOP: TIM2 counter stopped when Core is halted - * @arg DBGMCU_TIM3_STOP: TIM3 counter stopped when Core is halted - * @arg DBGMCU_TIM4_STOP: TIM4 counter stopped when Core is halted - * @arg DBGMCU_CAN1_STOP: Debug CAN2 stopped when Core is halted - * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted - * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted - * @arg DBGMCU_TIM5_STOP: TIM5 counter stopped when Core is halted - * @arg DBGMCU_TIM6_STOP: TIM6 counter stopped when Core is halted - * @arg DBGMCU_TIM7_STOP: TIM7 counter stopped when Core is halted - * @arg DBGMCU_TIM8_STOP: TIM8 counter stopped when Core is halted - * @arg DBGMCU_CAN2_STOP: Debug CAN2 stopped when Core is halted - * @arg DBGMCU_TIM15_STOP: TIM15 counter stopped when Core is halted - * @arg DBGMCU_TIM16_STOP: TIM16 counter stopped when Core is halted - * @arg DBGMCU_TIM17_STOP: TIM17 counter stopped when Core is halted - * @param NewState: new state of the specified peripheral in Debug mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DBGMCU_PERIPH(DBGMCU_Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - DBGMCU->CR |= DBGMCU_Periph; - } - else - { - DBGMCU->CR &= ~DBGMCU_Periph; - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c deleted file mode 100644 index cd8e43dd78..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c +++ /dev/null @@ -1,693 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_dma.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the DMA firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_dma.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup DMA - * @brief DMA driver modules - * @{ - */ - -/** @defgroup DMA_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup DMA_Private_Defines - * @{ - */ - -/* DMA ENABLE mask */ -#define CCR_ENABLE_Set ((uint32_t)0x00000001) -#define CCR_ENABLE_Reset ((uint32_t)0xFFFFFFFE) - -/* DMA1 Channelx interrupt pending bit masks */ -#define DMA1_Channel1_IT_Mask ((uint32_t)0x0000000F) -#define DMA1_Channel2_IT_Mask ((uint32_t)0x000000F0) -#define DMA1_Channel3_IT_Mask ((uint32_t)0x00000F00) -#define DMA1_Channel4_IT_Mask ((uint32_t)0x0000F000) -#define DMA1_Channel5_IT_Mask ((uint32_t)0x000F0000) -#define DMA1_Channel6_IT_Mask ((uint32_t)0x00F00000) -#define DMA1_Channel7_IT_Mask ((uint32_t)0x0F000000) - -/* DMA2 Channelx interrupt pending bit masks */ -#define DMA2_Channel1_IT_Mask ((uint32_t)0x0000000F) -#define DMA2_Channel2_IT_Mask ((uint32_t)0x000000F0) -#define DMA2_Channel3_IT_Mask ((uint32_t)0x00000F00) -#define DMA2_Channel4_IT_Mask ((uint32_t)0x0000F000) -#define DMA2_Channel5_IT_Mask ((uint32_t)0x000F0000) - -/* DMA2 FLAG mask */ -#define FLAG_Mask ((uint32_t)0x10000000) - -/* DMA registers Masks */ -#define CCR_CLEAR_Mask ((uint32_t)0xFFFF800F) - -/** - * @} - */ - -/** @defgroup DMA_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup DMA_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup DMA_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup DMA_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the DMAy Channelx registers to their default reset - * values. - * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and - * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. - * @retval None - */ -void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - /* Disable the selected DMAy Channelx */ - DMAy_Channelx->CCR &= CCR_ENABLE_Reset; - /* Reset DMAy Channelx control register */ - DMAy_Channelx->CCR = 0; - - /* Reset DMAy Channelx remaining bytes register */ - DMAy_Channelx->CNDTR = 0; - - /* Reset DMAy Channelx peripheral address register */ - DMAy_Channelx->CPAR = 0; - - /* Reset DMAy Channelx memory address register */ - DMAy_Channelx->CMAR = 0; - - if (DMAy_Channelx == DMA1_Channel1) - { - /* Reset interrupt pending bits for DMA1 Channel1 */ - DMA1->IFCR |= DMA1_Channel1_IT_Mask; - } - else if (DMAy_Channelx == DMA1_Channel2) - { - /* Reset interrupt pending bits for DMA1 Channel2 */ - DMA1->IFCR |= DMA1_Channel2_IT_Mask; - } - else if (DMAy_Channelx == DMA1_Channel3) - { - /* Reset interrupt pending bits for DMA1 Channel3 */ - DMA1->IFCR |= DMA1_Channel3_IT_Mask; - } - else if (DMAy_Channelx == DMA1_Channel4) - { - /* Reset interrupt pending bits for DMA1 Channel4 */ - DMA1->IFCR |= DMA1_Channel4_IT_Mask; - } - else if (DMAy_Channelx == DMA1_Channel5) - { - /* Reset interrupt pending bits for DMA1 Channel5 */ - DMA1->IFCR |= DMA1_Channel5_IT_Mask; - } - else if (DMAy_Channelx == DMA1_Channel6) - { - /* Reset interrupt pending bits for DMA1 Channel6 */ - DMA1->IFCR |= DMA1_Channel6_IT_Mask; - } - else if (DMAy_Channelx == DMA1_Channel7) - { - /* Reset interrupt pending bits for DMA1 Channel7 */ - DMA1->IFCR |= DMA1_Channel7_IT_Mask; - } - else if (DMAy_Channelx == DMA2_Channel1) - { - /* Reset interrupt pending bits for DMA2 Channel1 */ - DMA2->IFCR |= DMA2_Channel1_IT_Mask; - } - else if (DMAy_Channelx == DMA2_Channel2) - { - /* Reset interrupt pending bits for DMA2 Channel2 */ - DMA2->IFCR |= DMA2_Channel2_IT_Mask; - } - else if (DMAy_Channelx == DMA2_Channel3) - { - /* Reset interrupt pending bits for DMA2 Channel3 */ - DMA2->IFCR |= DMA2_Channel3_IT_Mask; - } - else if (DMAy_Channelx == DMA2_Channel4) - { - /* Reset interrupt pending bits for DMA2 Channel4 */ - DMA2->IFCR |= DMA2_Channel4_IT_Mask; - } - else - { - if (DMAy_Channelx == DMA2_Channel5) - { - /* Reset interrupt pending bits for DMA2 Channel5 */ - DMA2->IFCR |= DMA2_Channel5_IT_Mask; - } - } -} - -/** - * @brief Initializes the DMAy Channelx according to the specified - * parameters in the DMA_InitStruct. - * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and - * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. - * @param DMA_InitStruct: pointer to a DMA_InitTypeDef structure that - * contains the configuration information for the specified DMA Channel. - * @retval None - */ -void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - assert_param(IS_DMA_DIR(DMA_InitStruct->DMA_DIR)); - assert_param(IS_DMA_BUFFER_SIZE(DMA_InitStruct->DMA_BufferSize)); - assert_param(IS_DMA_PERIPHERAL_INC_STATE(DMA_InitStruct->DMA_PeripheralInc)); - assert_param(IS_DMA_MEMORY_INC_STATE(DMA_InitStruct->DMA_MemoryInc)); - assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(DMA_InitStruct->DMA_PeripheralDataSize)); - assert_param(IS_DMA_MEMORY_DATA_SIZE(DMA_InitStruct->DMA_MemoryDataSize)); - assert_param(IS_DMA_MODE(DMA_InitStruct->DMA_Mode)); - assert_param(IS_DMA_PRIORITY(DMA_InitStruct->DMA_Priority)); - assert_param(IS_DMA_M2M_STATE(DMA_InitStruct->DMA_M2M)); - -/*--------------------------- DMAy Channelx CCR Configuration -----------------*/ - /* Get the DMAy_Channelx CCR value */ - tmpreg = DMAy_Channelx->CCR; - /* Clear MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */ - tmpreg &= CCR_CLEAR_Mask; - /* Configure DMAy Channelx: data transfer, data size, priority level and mode */ - /* Set DIR bit according to DMA_DIR value */ - /* Set CIRC bit according to DMA_Mode value */ - /* Set PINC bit according to DMA_PeripheralInc value */ - /* Set MINC bit according to DMA_MemoryInc value */ - /* Set PSIZE bits according to DMA_PeripheralDataSize value */ - /* Set MSIZE bits according to DMA_MemoryDataSize value */ - /* Set PL bits according to DMA_Priority value */ - /* Set the MEM2MEM bit according to DMA_M2M value */ - tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode | - DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc | - DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize | - DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M; - - /* Write to DMAy Channelx CCR */ - DMAy_Channelx->CCR = tmpreg; - -/*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/ - /* Write to DMAy Channelx CNDTR */ - DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize; - -/*--------------------------- DMAy Channelx CPAR Configuration ----------------*/ - /* Write to DMAy Channelx CPAR */ - DMAy_Channelx->CPAR = DMA_InitStruct->DMA_PeripheralBaseAddr; - -/*--------------------------- DMAy Channelx CMAR Configuration ----------------*/ - /* Write to DMAy Channelx CMAR */ - DMAy_Channelx->CMAR = DMA_InitStruct->DMA_MemoryBaseAddr; -} - -/** - * @brief Fills each DMA_InitStruct member with its default value. - * @param DMA_InitStruct : pointer to a DMA_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct) -{ -/*-------------- Reset DMA init structure parameters values ------------------*/ - /* Initialize the DMA_PeripheralBaseAddr member */ - DMA_InitStruct->DMA_PeripheralBaseAddr = 0; - /* Initialize the DMA_MemoryBaseAddr member */ - DMA_InitStruct->DMA_MemoryBaseAddr = 0; - /* Initialize the DMA_DIR member */ - DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralSRC; - /* Initialize the DMA_BufferSize member */ - DMA_InitStruct->DMA_BufferSize = 0; - /* Initialize the DMA_PeripheralInc member */ - DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable; - /* Initialize the DMA_MemoryInc member */ - DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable; - /* Initialize the DMA_PeripheralDataSize member */ - DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - /* Initialize the DMA_MemoryDataSize member */ - DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - /* Initialize the DMA_Mode member */ - DMA_InitStruct->DMA_Mode = DMA_Mode_Normal; - /* Initialize the DMA_Priority member */ - DMA_InitStruct->DMA_Priority = DMA_Priority_Low; - /* Initialize the DMA_M2M member */ - DMA_InitStruct->DMA_M2M = DMA_M2M_Disable; -} - -/** - * @brief Enables or disables the specified DMAy Channelx. - * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and - * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. - * @param NewState: new state of the DMAy Channelx. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected DMAy Channelx */ - DMAy_Channelx->CCR |= CCR_ENABLE_Set; - } - else - { - /* Disable the selected DMAy Channelx */ - DMAy_Channelx->CCR &= CCR_ENABLE_Reset; - } -} - -/** - * @brief Enables or disables the specified DMAy Channelx interrupts. - * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and - * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. - * @param DMA_IT: specifies the DMA interrupts sources to be enabled - * or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask - * @arg DMA_IT_HT: Half transfer interrupt mask - * @arg DMA_IT_TE: Transfer error interrupt mask - * @param NewState: new state of the specified DMA interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - assert_param(IS_DMA_CONFIG_IT(DMA_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected DMA interrupts */ - DMAy_Channelx->CCR |= DMA_IT; - } - else - { - /* Disable the selected DMA interrupts */ - DMAy_Channelx->CCR &= ~DMA_IT; - } -} - -/** - * @brief Returns the number of remaining data units in the current - * DMAy Channelx transfer. - * @param DMAy_Channelx: where y can be 1 or 2 to select the DMA and - * x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel. - * @retval The number of remaining data units in the current DMAy Channelx - * transfer. - */ -uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx)); - /* Return the number of remaining data units for DMAy Channelx */ - return ((uint16_t)(DMAy_Channelx->CNDTR)); -} - -/** - * @brief Checks whether the specified DMAy Channelx flag is set or not. - * @param DMA_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. - * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. - * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. - * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. - * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. - * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. - * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. - * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. - * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. - * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. - * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. - * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. - * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. - * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. - * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. - * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. - * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. - * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. - * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. - * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. - * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag. - * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. - * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. - * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. - * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. - * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. - * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. - * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. - * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. - * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. - * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. - * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. - * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. - * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. - * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. - * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. - * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. - * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. - * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. - * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. - * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. - * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. - * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. - * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. - * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. - * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. - * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. - * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. - * @retval The new state of DMA_FLAG (SET or RESET). - */ -FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_DMA_GET_FLAG(DMA_FLAG)); - - /* Calculate the used DMA */ - if ((DMA_FLAG & FLAG_Mask) != (uint32_t)RESET) - { - /* Get DMA2 ISR register value */ - tmpreg = DMA2->ISR ; - } - else - { - /* Get DMA1 ISR register value */ - tmpreg = DMA1->ISR ; - } - - /* Check the status of the specified DMA flag */ - if ((tmpreg & DMA_FLAG) != (uint32_t)RESET) - { - /* DMA_FLAG is set */ - bitstatus = SET; - } - else - { - /* DMA_FLAG is reset */ - bitstatus = RESET; - } - - /* Return the DMA_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the DMAy Channelx's pending flags. - * @param DMA_FLAG: specifies the flag to clear. - * This parameter can be any combination (for the same DMA) of the following values: - * @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag. - * @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag. - * @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag. - * @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag. - * @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag. - * @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag. - * @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag. - * @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag. - * @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag. - * @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag. - * @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag. - * @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag. - * @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag. - * @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. - * @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. - * @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. - * @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag. - * @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag. - * @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag. - * @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag. - * @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag. - * @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag. - * @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag. - * @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag. - * @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag. - * @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag. - * @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag. - * @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag. - * @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag. - * @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag. - * @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag. - * @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag. - * @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag. - * @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag. - * @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag. - * @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag. - * @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag. - * @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag. - * @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag. - * @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag. - * @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag. - * @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag. - * @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag. - * @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag. - * @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag. - * @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag. - * @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag. - * @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag. - * @retval None - */ -void DMA_ClearFlag(uint32_t DMA_FLAG) -{ - /* Check the parameters */ - assert_param(IS_DMA_CLEAR_FLAG(DMA_FLAG)); - /* Calculate the used DMA */ - - if ((DMA_FLAG & FLAG_Mask) != (uint32_t)RESET) - { - /* Clear the selected DMA flags */ - DMA2->IFCR = DMA_FLAG; - } - else - { - /* Clear the selected DMA flags */ - DMA1->IFCR = DMA_FLAG; - } -} - -/** - * @brief Checks whether the specified DMAy Channelx interrupt has occurred or not. - * @param DMA_IT: specifies the DMA interrupt source to check. - * This parameter can be one of the following values: - * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. - * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. - * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. - * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. - * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. - * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. - * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. - * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. - * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. - * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. - * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. - * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. - * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. - * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. - * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. - * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. - * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. - * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. - * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. - * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. - * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt. - * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. - * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. - * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. - * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. - * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. - * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. - * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. - * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. - * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. - * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. - * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. - * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. - * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. - * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. - * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. - * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. - * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. - * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. - * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. - * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. - * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. - * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. - * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. - * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. - * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. - * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. - * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. - * @retval The new state of DMA_IT (SET or RESET). - */ -ITStatus DMA_GetITStatus(uint32_t DMA_IT) -{ - ITStatus bitstatus = RESET; - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_DMA_GET_IT(DMA_IT)); - - /* Calculate the used DMA */ - if ((DMA_IT & FLAG_Mask) != (uint32_t)RESET) - { - /* Get DMA2 ISR register value */ - tmpreg = DMA2->ISR ; - } - else - { - /* Get DMA1 ISR register value */ - tmpreg = DMA1->ISR ; - } - - /* Check the status of the specified DMA interrupt */ - if ((tmpreg & DMA_IT) != (uint32_t)RESET) - { - /* DMA_IT is set */ - bitstatus = SET; - } - else - { - /* DMA_IT is reset */ - bitstatus = RESET; - } - /* Return the DMA_IT status */ - return bitstatus; -} - -/** - * @brief Clears the DMAy Channelx’s interrupt pending bits. - * @param DMA_IT: specifies the DMA interrupt pending bit to clear. - * This parameter can be any combination (for the same DMA) of the following values: - * @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt. - * @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt. - * @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt. - * @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt. - * @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt. - * @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt. - * @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt. - * @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt. - * @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt. - * @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt. - * @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt. - * @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt. - * @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt. - * @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt. - * @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt. - * @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt. - * @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt. - * @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt. - * @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt. - * @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt. - * @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt. - * @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt. - * @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt. - * @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt. - * @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt. - * @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt. - * @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt. - * @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt. - * @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt. - * @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt. - * @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt. - * @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt. - * @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt. - * @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt. - * @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt. - * @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt. - * @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt. - * @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt. - * @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt. - * @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt. - * @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt. - * @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt. - * @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt. - * @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt. - * @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt. - * @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt. - * @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt. - * @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt. - * @retval None - */ -void DMA_ClearITPendingBit(uint32_t DMA_IT) -{ - /* Check the parameters */ - assert_param(IS_DMA_CLEAR_IT(DMA_IT)); - - /* Calculate the used DMA */ - if ((DMA_IT & FLAG_Mask) != (uint32_t)RESET) - { - /* Clear the selected DMA interrupt pending bits */ - DMA2->IFCR = DMA_IT; - } - else - { - /* Clear the selected DMA interrupt pending bits */ - DMA1->IFCR = DMA_IT; - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c deleted file mode 100644 index a79f575d68..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c +++ /dev/null @@ -1,268 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_exti.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the EXTI firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_exti.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup EXTI - * @brief EXTI driver modules - * @{ - */ - -/** @defgroup EXTI_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup EXTI_Private_Defines - * @{ - */ - -#define EXTI_LineNone ((uint32_t)0x00000) /* No interrupt selected */ - -/** - * @} - */ - -/** @defgroup EXTI_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup EXTI_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup EXTI_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup EXTI_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the EXTI peripheral registers to their default reset values. - * @param None - * @retval None - */ -void EXTI_DeInit(void) -{ - EXTI->IMR = 0x00000000; - EXTI->EMR = 0x00000000; - EXTI->RTSR = 0x00000000; - EXTI->FTSR = 0x00000000; - EXTI->PR = 0x000FFFFF; -} - -/** - * @brief Initializes the EXTI peripheral according to the specified - * parameters in the EXTI_InitStruct. - * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure - * that contains the configuration information for the EXTI peripheral. - * @retval None - */ -void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) -{ - uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode)); - assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger)); - assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line)); - assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd)); - - tmp = (uint32_t)EXTI_BASE; - - if (EXTI_InitStruct->EXTI_LineCmd != DISABLE) - { - /* Clear EXTI line configuration */ - EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line; - EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line; - - tmp += EXTI_InitStruct->EXTI_Mode; - - *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line; - EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line; - - /* Select the trigger for the selected external interrupts */ - if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) - { - /* Rising Falling edge */ - EXTI->RTSR |= EXTI_InitStruct->EXTI_Line; - EXTI->FTSR |= EXTI_InitStruct->EXTI_Line; - } - else - { - tmp = (uint32_t)EXTI_BASE; - tmp += EXTI_InitStruct->EXTI_Trigger; - - *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; - } - } - else - { - tmp += EXTI_InitStruct->EXTI_Mode; - - /* Disable the selected external lines */ - *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line; - } -} - -/** - * @brief Fills each EXTI_InitStruct member with its reset value. - * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) -{ - EXTI_InitStruct->EXTI_Line = EXTI_LineNone; - EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; - EXTI_InitStruct->EXTI_LineCmd = DISABLE; -} - -/** - * @brief Generates a Software interrupt. - * @param EXTI_Line: specifies the EXTI lines to be enabled or disabled. - * This parameter can be any combination of EXTI_Linex where x can be (0..19). - * @retval None - */ -void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(EXTI_Line)); - - EXTI->SWIER |= EXTI_Line; -} - -/** - * @brief Checks whether the specified EXTI line flag is set or not. - * @param EXTI_Line: specifies the EXTI line flag to check. - * This parameter can be: - * @arg EXTI_Linex: External interrupt line x where x(0..19) - * @retval The new state of EXTI_Line (SET or RESET). - */ -FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_GET_EXTI_LINE(EXTI_Line)); - - if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the EXTI’s line pending flags. - * @param EXTI_Line: specifies the EXTI lines flags to clear. - * This parameter can be any combination of EXTI_Linex where x can be (0..19). - * @retval None - */ -void EXTI_ClearFlag(uint32_t EXTI_Line) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(EXTI_Line)); - - EXTI->PR = EXTI_Line; -} - -/** - * @brief Checks whether the specified EXTI line is asserted or not. - * @param EXTI_Line: specifies the EXTI line to check. - * This parameter can be: - * @arg EXTI_Linex: External interrupt line x where x(0..19) - * @retval The new state of EXTI_Line (SET or RESET). - */ -ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - /* Check the parameters */ - assert_param(IS_GET_EXTI_LINE(EXTI_Line)); - - enablestatus = EXTI->IMR & EXTI_Line; - if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the EXTI’s line pending bits. - * @param EXTI_Line: specifies the EXTI lines to clear. - * This parameter can be any combination of EXTI_Linex where x can be (0..19). - * @retval None - */ -void EXTI_ClearITPendingBit(uint32_t EXTI_Line) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(EXTI_Line)); - - EXTI->PR = EXTI_Line; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c deleted file mode 100644 index df2d494f42..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c +++ /dev/null @@ -1,869 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_flash.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the FLASH firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_flash.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup FLASH - * @brief FLASH driver modules - * @{ - */ - -/** @defgroup FLASH_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup FLASH_Private_Defines - * @{ - */ - -/* Flash Access Control Register bits */ -#define ACR_LATENCY_Mask ((uint32_t)0x00000038) -#define ACR_HLFCYA_Mask ((uint32_t)0xFFFFFFF7) -#define ACR_PRFTBE_Mask ((uint32_t)0xFFFFFFEF) - -/* Flash Access Control Register bits */ -#define ACR_PRFTBS_Mask ((uint32_t)0x00000020) - -/* Flash Control Register bits */ -#define CR_PG_Set ((uint32_t)0x00000001) -#define CR_PG_Reset ((uint32_t)0x00001FFE) -#define CR_PER_Set ((uint32_t)0x00000002) -#define CR_PER_Reset ((uint32_t)0x00001FFD) -#define CR_MER_Set ((uint32_t)0x00000004) -#define CR_MER_Reset ((uint32_t)0x00001FFB) -#define CR_OPTPG_Set ((uint32_t)0x00000010) -#define CR_OPTPG_Reset ((uint32_t)0x00001FEF) -#define CR_OPTER_Set ((uint32_t)0x00000020) -#define CR_OPTER_Reset ((uint32_t)0x00001FDF) -#define CR_STRT_Set ((uint32_t)0x00000040) -#define CR_LOCK_Set ((uint32_t)0x00000080) - -/* FLASH Mask */ -#define RDPRT_Mask ((uint32_t)0x00000002) -#define WRP0_Mask ((uint32_t)0x000000FF) -#define WRP1_Mask ((uint32_t)0x0000FF00) -#define WRP2_Mask ((uint32_t)0x00FF0000) -#define WRP3_Mask ((uint32_t)0xFF000000) - -/* FLASH Keys */ -#define RDP_Key ((uint16_t)0x00A5) -#define FLASH_KEY1 ((uint32_t)0x45670123) -#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) - -/* Delay definition */ -#define EraseTimeout ((uint32_t)0x000B0000) -#define ProgramTimeout ((uint32_t)0x00002000) - -/** - * @} - */ - -/** @defgroup FLASH_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup FLASH_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup FLASH_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup FLASH_Private_Functions - * @{ - */ - -/** - * @brief Sets the code latency value. - * @param FLASH_Latency: specifies the FLASH Latency value. - * This parameter can be one of the following values: - * @arg FLASH_Latency_0: FLASH Zero Latency cycle - * @arg FLASH_Latency_1: FLASH One Latency cycle - * @arg FLASH_Latency_2: FLASH Two Latency cycles - * @retval None - */ -void FLASH_SetLatency(uint32_t FLASH_Latency) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_FLASH_LATENCY(FLASH_Latency)); - - /* Read the ACR register */ - tmpreg = FLASH->ACR; - - /* Sets the Latency value */ - tmpreg &= ACR_LATENCY_Mask; - tmpreg |= FLASH_Latency; - - /* Write the ACR register */ - FLASH->ACR = tmpreg; -} - -/** - * @brief Enables or disables the Half cycle flash access. - * @param FLASH_HalfCycleAccess: specifies the FLASH Half cycle Access mode. - * This parameter can be one of the following values: - * @arg FLASH_HalfCycleAccess_Enable: FLASH Half Cycle Enable - * @arg FLASH_HalfCycleAccess_Disable: FLASH Half Cycle Disable - * @retval None - */ -void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess) -{ - /* Check the parameters */ - assert_param(IS_FLASH_HALFCYCLEACCESS_STATE(FLASH_HalfCycleAccess)); - - /* Enable or disable the Half cycle access */ - FLASH->ACR &= ACR_HLFCYA_Mask; - FLASH->ACR |= FLASH_HalfCycleAccess; -} - -/** - * @brief Enables or disables the Prefetch Buffer. - * @param FLASH_PrefetchBuffer: specifies the Prefetch buffer status. - * This parameter can be one of the following values: - * @arg FLASH_PrefetchBuffer_Enable: FLASH Prefetch Buffer Enable - * @arg FLASH_PrefetchBuffer_Disable: FLASH Prefetch Buffer Disable - * @retval None - */ -void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer) -{ - /* Check the parameters */ - assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer)); - - /* Enable or disable the Prefetch Buffer */ - FLASH->ACR &= ACR_PRFTBE_Mask; - FLASH->ACR |= FLASH_PrefetchBuffer; -} - -/** - * @brief Unlocks the FLASH Program Erase Controller. - * @param None - * @retval None - */ -void FLASH_Unlock(void) -{ - /* Authorize the FPEC Access */ - FLASH->KEYR = FLASH_KEY1; - FLASH->KEYR = FLASH_KEY2; -} - -/** - * @brief Locks the FLASH Program Erase Controller. - * @param None - * @retval None - */ -void FLASH_Lock(void) -{ - /* Set the Lock Bit to lock the FPEC and the FCR */ - FLASH->CR |= CR_LOCK_Set; -} - -/** - * @brief Erases a specified FLASH page. - * @param Page_Address: The page address to be erased. - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_ErasePage(uint32_t Page_Address) -{ - FLASH_Status status = FLASH_COMPLETE; - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Page_Address)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(EraseTimeout); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to erase the page */ - FLASH->CR|= CR_PER_Set; - FLASH->AR = Page_Address; - FLASH->CR|= CR_STRT_Set; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(EraseTimeout); - if(status != FLASH_TIMEOUT) - { - /* if the erase operation is completed, disable the PER Bit */ - FLASH->CR &= CR_PER_Reset; - } - } - /* Return the Erase Status */ - return status; -} - -/** - * @brief Erases all FLASH pages. - * @param None - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_EraseAllPages(void) -{ - FLASH_Status status = FLASH_COMPLETE; - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(EraseTimeout); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to erase all pages */ - FLASH->CR |= CR_MER_Set; - FLASH->CR |= CR_STRT_Set; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(EraseTimeout); - if(status != FLASH_TIMEOUT) - { - /* if the erase operation is completed, disable the MER Bit */ - FLASH->CR &= CR_MER_Reset; - } - } - /* Return the Erase Status */ - return status; -} - -/** - * @brief Erases the FLASH option bytes. - * @note This functions erases all option bytes except the Read protection - * (RDP). - * @param None - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_EraseOptionBytes(void) -{ - uint16_t rdptmp = RDP_Key; - - FLASH_Status status = FLASH_COMPLETE; - - /* Get the actual read protection Option Byte value */ - if(FLASH_GetReadOutProtectionStatus() != RESET) - { - rdptmp = 0x00; - } - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(EraseTimeout); - if(status == FLASH_COMPLETE) - { - /* Authorize the small information block programming */ - FLASH->OPTKEYR = FLASH_KEY1; - FLASH->OPTKEYR = FLASH_KEY2; - - /* if the previous operation is completed, proceed to erase the option bytes */ - FLASH->CR |= CR_OPTER_Set; - FLASH->CR |= CR_STRT_Set; - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(EraseTimeout); - - if(status == FLASH_COMPLETE) - { - /* if the erase operation is completed, disable the OPTER Bit */ - FLASH->CR &= CR_OPTER_Reset; - - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= CR_OPTPG_Set; - /* Restore the last read protection Option Byte value */ - OB->RDP = (uint16_t)rdptmp; - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= CR_OPTPG_Reset; - } - } - else - { - if (status != FLASH_TIMEOUT) - { - /* Disable the OPTPG Bit */ - FLASH->CR &= CR_OPTPG_Reset; - } - } - } - /* Return the erase status */ - return status; -} - -/** - * @brief Programs a word at a specified address. - * @param Address: specifies the address to be programmed. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to program the new first - half word */ - FLASH->CR |= CR_PG_Set; - - *(__IO uint16_t*)Address = (uint16_t)Data; - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to program the new second - half word */ - tmp = Address + 2; - - *(__IO uint16_t*) tmp = Data >> 16; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - - if(status != FLASH_TIMEOUT) - { - /* Disable the PG Bit */ - FLASH->CR &= CR_PG_Reset; - } - } - else - { - if (status != FLASH_TIMEOUT) - { - /* Disable the PG Bit */ - FLASH->CR &= CR_PG_Reset; - } - } - } - /* Return the Program Status */ - return status; -} - -/** - * @brief Programs a half word at a specified address. - * @param Address: specifies the address to be programmed. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to program the new data */ - FLASH->CR |= CR_PG_Set; - - *(__IO uint16_t*)Address = Data; - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the PG Bit */ - FLASH->CR &= CR_PG_Reset; - } - } - /* Return the Program Status */ - return status; -} - -/** - * @brief Programs a half word at a specified Option Byte Data address. - * @param Address: specifies the address to be programmed. - * This parameter can be 0x1FFFF804 or 0x1FFFF806. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - /* Check the parameters */ - assert_param(IS_OB_DATA_ADDRESS(Address)); - status = FLASH_WaitForLastOperation(ProgramTimeout); - if(status == FLASH_COMPLETE) - { - /* Authorize the small information block programming */ - FLASH->OPTKEYR = FLASH_KEY1; - FLASH->OPTKEYR = FLASH_KEY2; - /* Enables the Option Bytes Programming operation */ - FLASH->CR |= CR_OPTPG_Set; - *(__IO uint16_t*)Address = Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= CR_OPTPG_Reset; - } - } - /* Return the Option Byte Data Program Status */ - return status; -} - -/** - * @brief Write protects the desired pages - * @param FLASH_Pages: specifies the address of the pages to be write protected. - * This parameter can be: - * @arg For @b STM32_Low-density_devices: value between FLASH_WRProt_Pages0to3 and FLASH_WRProt_Pages28to31 - * @arg For @b STM32_Medium-density_devices: value between FLASH_WRProt_Pages0to3 - * and FLASH_WRProt_Pages124to127 - * @arg For @b STM32_High-density_devices: value between FLASH_WRProt_Pages0to1 and - * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to255 - * @arg For @b STM32_Connectivity_line_devices: value between FLASH_WRProt_Pages0to1 and - * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to127 - * @arg FLASH_WRProt_AllPages - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages) -{ - uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF; - - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_FLASH_WRPROT_PAGE(FLASH_Pages)); - - FLASH_Pages = (uint32_t)(~FLASH_Pages); - WRP0_Data = (uint16_t)(FLASH_Pages & WRP0_Mask); - WRP1_Data = (uint16_t)((FLASH_Pages & WRP1_Mask) >> 8); - WRP2_Data = (uint16_t)((FLASH_Pages & WRP2_Mask) >> 16); - WRP3_Data = (uint16_t)((FLASH_Pages & WRP3_Mask) >> 24); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - - if(status == FLASH_COMPLETE) - { - /* Authorizes the small information block programming */ - FLASH->OPTKEYR = FLASH_KEY1; - FLASH->OPTKEYR = FLASH_KEY2; - FLASH->CR |= CR_OPTPG_Set; - if(WRP0_Data != 0xFF) - { - OB->WRP0 = WRP0_Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - } - if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF)) - { - OB->WRP1 = WRP1_Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - } - if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF)) - { - OB->WRP2 = WRP2_Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - } - - if((status == FLASH_COMPLETE)&& (WRP3_Data != 0xFF)) - { - OB->WRP3 = WRP3_Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - } - - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= CR_OPTPG_Reset; - } - } - /* Return the write protection operation Status */ - return status; -} - -/** - * @brief Enables or disables the read out protection. - * @note If the user has already programmed the other option bytes before calling - * this function, he must re-program them since this function erases all option bytes. - * @param Newstate: new state of the ReadOut Protection. - * This parameter can be: ENABLE or DISABLE. - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState) -{ - FLASH_Status status = FLASH_COMPLETE; - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - status = FLASH_WaitForLastOperation(EraseTimeout); - if(status == FLASH_COMPLETE) - { - /* Authorizes the small information block programming */ - FLASH->OPTKEYR = FLASH_KEY1; - FLASH->OPTKEYR = FLASH_KEY2; - FLASH->CR |= CR_OPTER_Set; - FLASH->CR |= CR_STRT_Set; - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(EraseTimeout); - if(status == FLASH_COMPLETE) - { - /* if the erase operation is completed, disable the OPTER Bit */ - FLASH->CR &= CR_OPTER_Reset; - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= CR_OPTPG_Set; - if(NewState != DISABLE) - { - OB->RDP = 0x00; - } - else - { - OB->RDP = RDP_Key; - } - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(EraseTimeout); - - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= CR_OPTPG_Reset; - } - } - else - { - if(status != FLASH_TIMEOUT) - { - /* Disable the OPTER Bit */ - FLASH->CR &= CR_OPTER_Reset; - } - } - } - /* Return the protection operation Status */ - return status; -} - -/** - * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. - * @param OB_IWDG: Selects the IWDG mode - * This parameter can be one of the following values: - * @arg OB_IWDG_SW: Software IWDG selected - * @arg OB_IWDG_HW: Hardware IWDG selected - * @param OB_STOP: Reset event when entering STOP mode. - * This parameter can be one of the following values: - * @arg OB_STOP_NoRST: No reset generated when entering in STOP - * @arg OB_STOP_RST: Reset generated when entering in STOP - * @param OB_STDBY: Reset event when entering Standby mode. - * This parameter can be one of the following values: - * @arg OB_STDBY_NoRST: No reset generated when entering in STANDBY - * @arg OB_STDBY_RST: Reset generated when entering in STANDBY - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_IWDG_SOURCE(OB_IWDG)); - assert_param(IS_OB_STOP_SOURCE(OB_STOP)); - assert_param(IS_OB_STDBY_SOURCE(OB_STDBY)); - - /* Authorize the small information block programming */ - FLASH->OPTKEYR = FLASH_KEY1; - FLASH->OPTKEYR = FLASH_KEY2; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - - if(status == FLASH_COMPLETE) - { - /* Enable the Option Bytes Programming operation */ - FLASH->CR |= CR_OPTPG_Set; - - OB->USER = OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)0xF8))); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(ProgramTimeout); - if(status != FLASH_TIMEOUT) - { - /* if the program operation is completed, disable the OPTPG Bit */ - FLASH->CR &= CR_OPTPG_Reset; - } - } - /* Return the Option Byte program Status */ - return status; -} - -/** - * @brief Returns the FLASH User Option Bytes values. - * @param None - * @retval The FLASH User Option Bytes values:IWDG_SW(Bit0), RST_STOP(Bit1) - * and RST_STDBY(Bit2). - */ -uint32_t FLASH_GetUserOptionByte(void) -{ - /* Return the User Option Byte */ - return (uint32_t)(FLASH->OBR >> 2); -} - -/** - * @brief Returns the FLASH Write Protection Option Bytes Register value. - * @param None - * @retval The FLASH Write Protection Option Bytes Register value - */ -uint32_t FLASH_GetWriteProtectionOptionByte(void) -{ - /* Return the Falsh write protection Register value */ - return (uint32_t)(FLASH->WRPR); -} - -/** - * @brief Checks whether the FLASH Read Out Protection Status is set or not. - * @param None - * @retval FLASH ReadOut Protection Status(SET or RESET) - */ -FlagStatus FLASH_GetReadOutProtectionStatus(void) -{ - FlagStatus readoutstatus = RESET; - if ((FLASH->OBR & RDPRT_Mask) != (uint32_t)RESET) - { - readoutstatus = SET; - } - else - { - readoutstatus = RESET; - } - return readoutstatus; -} - -/** - * @brief Checks whether the FLASH Prefetch Buffer status is set or not. - * @param None - * @retval FLASH Prefetch Buffer Status (SET or RESET). - */ -FlagStatus FLASH_GetPrefetchBufferStatus(void) -{ - FlagStatus bitstatus = RESET; - - if ((FLASH->ACR & ACR_PRFTBS_Mask) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the new state of FLASH Prefetch Buffer Status (SET or RESET) */ - return bitstatus; -} - -/** - * @brief Enables or disables the specified FLASH interrupts. - * @param FLASH_IT: specifies the FLASH interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg FLASH_IT_ERROR: FLASH Error Interrupt - * @arg FLASH_IT_EOP: FLASH end of operation Interrupt - * @param NewState: new state of the specified Flash interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FLASH_ITConfig(uint16_t FLASH_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FLASH_IT(FLASH_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if(NewState != DISABLE) - { - /* Enable the interrupt sources */ - FLASH->CR |= FLASH_IT; - } - else - { - /* Disable the interrupt sources */ - FLASH->CR &= ~(uint32_t)FLASH_IT; - } -} - -/** - * @brief Checks whether the specified FLASH flag is set or not. - * @param FLASH_FLAG: specifies the FLASH flag to check. - * This parameter can be one of the following values: - * @arg FLASH_FLAG_BSY: FLASH Busy flag - * @arg FLASH_FLAG_PGERR: FLASH Program error flag - * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag - * @arg FLASH_FLAG_EOP: FLASH End of Operation flag - * @arg FLASH_FLAG_OPTERR: FLASH Option Byte error flag - * @retval The new state of FLASH_FLAG (SET or RESET). - */ -FlagStatus FLASH_GetFlagStatus(uint16_t FLASH_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ; - if(FLASH_FLAG == FLASH_FLAG_OPTERR) - { - if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - } - else - { - if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - } - /* Return the new state of FLASH_FLAG (SET or RESET) */ - return bitstatus; -} - -/** - * @brief Clears the FLASH’s pending flags. - * @param FLASH_FLAG: specifies the FLASH flags to clear. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_PGERR: FLASH Program error flag - * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag - * @arg FLASH_FLAG_EOP: FLASH End of Operation flag - * @retval None - */ -void FLASH_ClearFlag(uint16_t FLASH_FLAG) -{ - /* Check the parameters */ - assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ; - - /* Clear the flags */ - FLASH->SR = FLASH_FLAG; -} - -/** - * @brief Returns the FLASH Status. - * @param None - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, - * FLASH_ERROR_WRP or FLASH_COMPLETE - */ -FLASH_Status FLASH_GetStatus(void) -{ - FLASH_Status flashstatus = FLASH_COMPLETE; - - if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) - { - flashstatus = FLASH_BUSY; - } - else - { - if((FLASH->SR & FLASH_FLAG_PGERR) != 0) - { - flashstatus = FLASH_ERROR_PG; - } - else - { - if((FLASH->SR & FLASH_FLAG_WRPRTERR) != 0 ) - { - flashstatus = FLASH_ERROR_WRP; - } - else - { - flashstatus = FLASH_COMPLETE; - } - } - } - /* Return the Flash Status */ - return flashstatus; -} - -/** - * @brief Waits for a Flash operation to complete or a TIMEOUT to occur. - * @param Timeout: FLASH progamming Timeout - * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. - */ -FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check for the Flash Status */ - status = FLASH_GetStatus(); - /* Wait for a Flash operation to complete or a TIMEOUT to occur */ - while((status == FLASH_BUSY) && (Timeout != 0x00)) - { - status = FLASH_GetStatus(); - Timeout--; - } - if(Timeout == 0x00 ) - { - status = FLASH_TIMEOUT; - } - /* Return the operation status */ - return status; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c deleted file mode 100644 index e5736872ea..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c +++ /dev/null @@ -1,858 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_fsmc.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the FSMC firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_fsmc.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup FSMC - * @brief FSMC driver modules - * @{ - */ - -/** @defgroup FSMC_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup FSMC_Private_Defines - * @{ - */ - -/* --------------------- FSMC registers bit mask ---------------------------- */ - -/* FSMC BCRx Mask */ -#define BCR_MBKEN_Set ((uint32_t)0x00000001) -#define BCR_MBKEN_Reset ((uint32_t)0x000FFFFE) -#define BCR_FACCEN_Set ((uint32_t)0x00000040) - -/* FSMC PCRx Mask */ -#define PCR_PBKEN_Set ((uint32_t)0x00000004) -#define PCR_PBKEN_Reset ((uint32_t)0x000FFFFB) -#define PCR_ECCEN_Set ((uint32_t)0x00000040) -#define PCR_ECCEN_Reset ((uint32_t)0x000FFFBF) -#define PCR_MemoryType_NAND ((uint32_t)0x00000008) -/** - * @} - */ - -/** @defgroup FSMC_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup FSMC_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup FSMC_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup FSMC_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the FSMC NOR/SRAM Banks registers to their default - * reset values. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 - * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 - * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 - * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 - * @retval None - */ -void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank) -{ - /* Check the parameter */ - assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); - - /* FSMC_Bank1_NORSRAM1 */ - if(FSMC_Bank == FSMC_Bank1_NORSRAM1) - { - FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB; - } - /* FSMC_Bank1_NORSRAM2, FSMC_Bank1_NORSRAM3 or FSMC_Bank1_NORSRAM4 */ - else - { - FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2; - } - FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF; - FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; -} - -/** - * @brief Deinitializes the FSMC NAND Banks registers to their default reset values. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @retval None - */ -void FSMC_NANDDeInit(uint32_t FSMC_Bank) -{ - /* Check the parameter */ - assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - /* Set the FSMC_Bank2 registers to their reset values */ - FSMC_Bank2->PCR2 = 0x00000018; - FSMC_Bank2->SR2 = 0x00000040; - FSMC_Bank2->PMEM2 = 0xFCFCFCFC; - FSMC_Bank2->PATT2 = 0xFCFCFCFC; - } - /* FSMC_Bank3_NAND */ - else - { - /* Set the FSMC_Bank3 registers to their reset values */ - FSMC_Bank3->PCR3 = 0x00000018; - FSMC_Bank3->SR3 = 0x00000040; - FSMC_Bank3->PMEM3 = 0xFCFCFCFC; - FSMC_Bank3->PATT3 = 0xFCFCFCFC; - } -} - -/** - * @brief Deinitializes the FSMC PCCARD Bank registers to their default reset values. - * @param None - * @retval None - */ -void FSMC_PCCARDDeInit(void) -{ - /* Set the FSMC_Bank4 registers to their reset values */ - FSMC_Bank4->PCR4 = 0x00000018; - FSMC_Bank4->SR4 = 0x00000000; - FSMC_Bank4->PMEM4 = 0xFCFCFCFC; - FSMC_Bank4->PATT4 = 0xFCFCFCFC; - FSMC_Bank4->PIO4 = 0xFCFCFCFC; -} - -/** - * @brief Initializes the FSMC NOR/SRAM Banks according to the specified - * parameters in the FSMC_NORSRAMInitStruct. - * @param FSMC_NORSRAMInitStruct : pointer to a FSMC_NORSRAMInitTypeDef - * structure that contains the configuration information for - * the FSMC NOR/SRAM specified Banks. - * @retval None - */ -void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) -{ - /* Check the parameters */ - assert_param(IS_FSMC_NORSRAM_BANK(FSMC_NORSRAMInitStruct->FSMC_Bank)); - assert_param(IS_FSMC_MUX(FSMC_NORSRAMInitStruct->FSMC_DataAddressMux)); - assert_param(IS_FSMC_MEMORY(FSMC_NORSRAMInitStruct->FSMC_MemoryType)); - assert_param(IS_FSMC_MEMORY_WIDTH(FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth)); - assert_param(IS_FSMC_BURSTMODE(FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode)); - assert_param(IS_FSMC_WAIT_POLARITY(FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity)); - assert_param(IS_FSMC_WRAP_MODE(FSMC_NORSRAMInitStruct->FSMC_WrapMode)); - assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive)); - assert_param(IS_FSMC_WRITE_OPERATION(FSMC_NORSRAMInitStruct->FSMC_WriteOperation)); - assert_param(IS_FSMC_WAITE_SIGNAL(FSMC_NORSRAMInitStruct->FSMC_WaitSignal)); - assert_param(IS_FSMC_EXTENDED_MODE(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode)); - assert_param(IS_FSMC_WRITE_BURST(FSMC_NORSRAMInitStruct->FSMC_WriteBurst)); - assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime)); - assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime)); - assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime)); - assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration)); - assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision)); - assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency)); - assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode)); - - /* Bank1 NOR/SRAM control register configuration */ - FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = - (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | - FSMC_NORSRAMInitStruct->FSMC_MemoryType | - FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | - FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | - FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | - FSMC_NORSRAMInitStruct->FSMC_WrapMode | - FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | - FSMC_NORSRAMInitStruct->FSMC_WriteOperation | - FSMC_NORSRAMInitStruct->FSMC_WaitSignal | - FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | - FSMC_NORSRAMInitStruct->FSMC_WriteBurst; - if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) - { - FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)BCR_FACCEN_Set; - } - /* Bank1 NOR/SRAM timing register configuration */ - FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] = - (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; - - - /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ - if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) - { - assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime)); - assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime)); - assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime)); - assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision)); - assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency)); - assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode)); - FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = - (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | - (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4 )| - (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | - (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision << 20) | - (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency << 24) | - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; - } - else - { - FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; - } -} - -/** - * @brief Initializes the FSMC NAND Banks according to the specified - * parameters in the FSMC_NANDInitStruct. - * @param FSMC_NANDInitStruct : pointer to a FSMC_NANDInitTypeDef - * structure that contains the configuration information for the FSMC NAND specified Banks. - * @retval None - */ -void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) -{ - uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000; - - /* Check the parameters */ - assert_param( IS_FSMC_NAND_BANK(FSMC_NANDInitStruct->FSMC_Bank)); - assert_param( IS_FSMC_WAIT_FEATURE(FSMC_NANDInitStruct->FSMC_Waitfeature)); - assert_param( IS_FSMC_MEMORY_WIDTH(FSMC_NANDInitStruct->FSMC_MemoryDataWidth)); - assert_param( IS_FSMC_ECC_STATE(FSMC_NANDInitStruct->FSMC_ECC)); - assert_param( IS_FSMC_ECCPAGE_SIZE(FSMC_NANDInitStruct->FSMC_ECCPageSize)); - assert_param( IS_FSMC_TCLR_TIME(FSMC_NANDInitStruct->FSMC_TCLRSetupTime)); - assert_param( IS_FSMC_TAR_TIME(FSMC_NANDInitStruct->FSMC_TARSetupTime)); - assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); - assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); - - /* Set the tmppcr value according to FSMC_NANDInitStruct parameters */ - tmppcr = (uint32_t)FSMC_NANDInitStruct->FSMC_Waitfeature | - PCR_MemoryType_NAND | - FSMC_NANDInitStruct->FSMC_MemoryDataWidth | - FSMC_NANDInitStruct->FSMC_ECC | - FSMC_NANDInitStruct->FSMC_ECCPageSize | - (FSMC_NANDInitStruct->FSMC_TCLRSetupTime << 9 )| - (FSMC_NANDInitStruct->FSMC_TARSetupTime << 13); - - /* Set tmppmem value according to FSMC_CommonSpaceTimingStructure parameters */ - tmppmem = (uint32_t)FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | - (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); - - /* Set tmppatt value according to FSMC_AttributeSpaceTimingStructure parameters */ - tmppatt = (uint32_t)FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | - (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); - - if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) - { - /* FSMC_Bank2_NAND registers configuration */ - FSMC_Bank2->PCR2 = tmppcr; - FSMC_Bank2->PMEM2 = tmppmem; - FSMC_Bank2->PATT2 = tmppatt; - } - else - { - /* FSMC_Bank3_NAND registers configuration */ - FSMC_Bank3->PCR3 = tmppcr; - FSMC_Bank3->PMEM3 = tmppmem; - FSMC_Bank3->PATT3 = tmppatt; - } -} - -/** - * @brief Initializes the FSMC PCCARD Bank according to the specified - * parameters in the FSMC_PCCARDInitStruct. - * @param FSMC_PCCARDInitStruct : pointer to a FSMC_PCCARDInitTypeDef - * structure that contains the configuration information for the FSMC PCCARD Bank. - * @retval None - */ -void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) -{ - /* Check the parameters */ - assert_param(IS_FSMC_WAIT_FEATURE(FSMC_PCCARDInitStruct->FSMC_Waitfeature)); - assert_param(IS_FSMC_TCLR_TIME(FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime)); - assert_param(IS_FSMC_TAR_TIME(FSMC_PCCARDInitStruct->FSMC_TARSetupTime)); - - assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); - - assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); - assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime)); - - /* Set the PCR4 register value according to FSMC_PCCARDInitStruct parameters */ - FSMC_Bank4->PCR4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_Waitfeature | - FSMC_MemoryDataWidth_16b | - (FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime << 9) | - (FSMC_PCCARDInitStruct->FSMC_TARSetupTime << 13); - - /* Set PMEM4 register value according to FSMC_CommonSpaceTimingStructure parameters */ - FSMC_Bank4->PMEM4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | - (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); - - /* Set PATT4 register value according to FSMC_AttributeSpaceTimingStructure parameters */ - FSMC_Bank4->PATT4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | - (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); - - /* Set PIO4 register value according to FSMC_IOSpaceTimingStructure parameters */ - FSMC_Bank4->PIO4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime | - (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime << 24); -} - -/** - * @brief Fills each FSMC_NORSRAMInitStruct member with its default value. - * @param FSMC_NORSRAMInitStruct: pointer to a FSMC_NORSRAMInitTypeDef - * structure which will be initialized. - * @retval None - */ -void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) -{ - /* Reset NOR/SRAM Init structure parameters values */ - FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; - FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; - FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; - FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; - FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; - FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; - FSMC_NORSRAMInitStruct->FSMC_WrapMode = FSMC_WrapMode_Disable; - FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; - FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; - FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; - FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; - FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime = 0xFF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime = 0xFF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; -} - -/** - * @brief Fills each FSMC_NANDInitStruct member with its default value. - * @param FSMC_NANDInitStruct: pointer to a FSMC_NANDInitTypeDef - * structure which will be initialized. - * @retval None - */ -void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) -{ - /* Reset NAND Init structure parameters values */ - FSMC_NANDInitStruct->FSMC_Bank = FSMC_Bank2_NAND; - FSMC_NANDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; - FSMC_NANDInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; - FSMC_NANDInitStruct->FSMC_ECC = FSMC_ECC_Disable; - FSMC_NANDInitStruct->FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes; - FSMC_NANDInitStruct->FSMC_TCLRSetupTime = 0x0; - FSMC_NANDInitStruct->FSMC_TARSetupTime = 0x0; - FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; -} - -/** - * @brief Fills each FSMC_PCCARDInitStruct member with its default value. - * @param FSMC_PCCARDInitStruct: pointer to a FSMC_PCCARDInitTypeDef - * structure which will be initialized. - * @retval None - */ -void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) -{ - /* Reset PCCARD Init structure parameters values */ - FSMC_PCCARDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; - FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime = 0x0; - FSMC_PCCARDInitStruct->FSMC_TARSetupTime = 0x0; - FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; -} - -/** - * @brief Enables or disables the specified NOR/SRAM Memory Bank. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 - * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 - * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 - * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 - * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState) -{ - assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected NOR/SRAM Bank by setting the PBKEN bit in the BCRx register */ - FSMC_Bank1->BTCR[FSMC_Bank] |= BCR_MBKEN_Set; - } - else - { - /* Disable the selected NOR/SRAM Bank by clearing the PBKEN bit in the BCRx register */ - FSMC_Bank1->BTCR[FSMC_Bank] &= BCR_MBKEN_Reset; - } -} - -/** - * @brief Enables or disables the specified NAND Memory Bank. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState) -{ - assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected NAND Bank by setting the PBKEN bit in the PCRx register */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->PCR2 |= PCR_PBKEN_Set; - } - else - { - FSMC_Bank3->PCR3 |= PCR_PBKEN_Set; - } - } - else - { - /* Disable the selected NAND Bank by clearing the PBKEN bit in the PCRx register */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->PCR2 &= PCR_PBKEN_Reset; - } - else - { - FSMC_Bank3->PCR3 &= PCR_PBKEN_Reset; - } - } -} - -/** - * @brief Enables or disables the PCCARD Memory Bank. - * @param NewState: new state of the PCCARD Memory Bank. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_PCCARDCmd(FunctionalState NewState) -{ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the PCCARD Bank by setting the PBKEN bit in the PCR4 register */ - FSMC_Bank4->PCR4 |= PCR_PBKEN_Set; - } - else - { - /* Disable the PCCARD Bank by clearing the PBKEN bit in the PCR4 register */ - FSMC_Bank4->PCR4 &= PCR_PBKEN_Reset; - } -} - -/** - * @brief Enables or disables the FSMC NAND ECC feature. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @param NewState: new state of the FSMC NAND ECC feature. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState) -{ - assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected NAND Bank ECC function by setting the ECCEN bit in the PCRx register */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->PCR2 |= PCR_ECCEN_Set; - } - else - { - FSMC_Bank3->PCR3 |= PCR_ECCEN_Set; - } - } - else - { - /* Disable the selected NAND Bank ECC function by clearing the ECCEN bit in the PCRx register */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->PCR2 &= PCR_ECCEN_Reset; - } - else - { - FSMC_Bank3->PCR3 &= PCR_ECCEN_Reset; - } - } -} - -/** - * @brief Returns the error correction code register value. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @retval The Error Correction Code (ECC) value. - */ -uint32_t FSMC_GetECC(uint32_t FSMC_Bank) -{ - uint32_t eccval = 0x00000000; - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - /* Get the ECCR2 register value */ - eccval = FSMC_Bank2->ECCR2; - } - else - { - /* Get the ECCR3 register value */ - eccval = FSMC_Bank3->ECCR3; - } - /* Return the error correction code value */ - return(eccval); -} - -/** - * @brief Enables or disables the specified FSMC interrupts. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_IT: specifies the FSMC interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. - * @arg FSMC_IT_Level: Level edge detection interrupt. - * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. - * @param NewState: new state of the specified FSMC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState) -{ - assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); - assert_param(IS_FSMC_IT(FSMC_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected FSMC_Bank2 interrupts */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->SR2 |= FSMC_IT; - } - /* Enable the selected FSMC_Bank3 interrupts */ - else if (FSMC_Bank == FSMC_Bank3_NAND) - { - FSMC_Bank3->SR3 |= FSMC_IT; - } - /* Enable the selected FSMC_Bank4 interrupts */ - else - { - FSMC_Bank4->SR4 |= FSMC_IT; - } - } - else - { - /* Disable the selected FSMC_Bank2 interrupts */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - - FSMC_Bank2->SR2 &= (uint32_t)~FSMC_IT; - } - /* Disable the selected FSMC_Bank3 interrupts */ - else if (FSMC_Bank == FSMC_Bank3_NAND) - { - FSMC_Bank3->SR3 &= (uint32_t)~FSMC_IT; - } - /* Disable the selected FSMC_Bank4 interrupts */ - else - { - FSMC_Bank4->SR4 &= (uint32_t)~FSMC_IT; - } - } -} - -/** - * @brief Checks whether the specified FSMC flag is set or not. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg FSMC_FLAG_RisingEdge: Rising egde detection Flag. - * @arg FSMC_FLAG_Level: Level detection Flag. - * @arg FSMC_FLAG_FallingEdge: Falling egde detection Flag. - * @arg FSMC_FLAG_FEMPT: Fifo empty Flag. - * @retval The new state of FSMC_FLAG (SET or RESET). - */ -FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t tmpsr = 0x00000000; - - /* Check the parameters */ - assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); - assert_param(IS_FSMC_GET_FLAG(FSMC_FLAG)); - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - tmpsr = FSMC_Bank2->SR2; - } - else if(FSMC_Bank == FSMC_Bank3_NAND) - { - tmpsr = FSMC_Bank3->SR3; - } - /* FSMC_Bank4_PCCARD*/ - else - { - tmpsr = FSMC_Bank4->SR4; - } - - /* Get the flag status */ - if ((tmpsr & FSMC_FLAG) != (uint16_t)RESET ) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @brief Clears the FSMC’s pending flags. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg FSMC_FLAG_RisingEdge: Rising egde detection Flag. - * @arg FSMC_FLAG_Level: Level detection Flag. - * @arg FSMC_FLAG_FallingEdge: Falling egde detection Flag. - * @retval None - */ -void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); - assert_param(IS_FSMC_CLEAR_FLAG(FSMC_FLAG)) ; - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->SR2 &= ~FSMC_FLAG; - } - else if(FSMC_Bank == FSMC_Bank3_NAND) - { - FSMC_Bank3->SR3 &= ~FSMC_FLAG; - } - /* FSMC_Bank4_PCCARD*/ - else - { - FSMC_Bank4->SR4 &= ~FSMC_FLAG; - } -} - -/** - * @brief Checks whether the specified FSMC interrupt has occurred or not. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_IT: specifies the FSMC interrupt source to check. - * This parameter can be one of the following values: - * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. - * @arg FSMC_IT_Level: Level edge detection interrupt. - * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. - * @retval The new state of FSMC_IT (SET or RESET). - */ -ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0; - - /* Check the parameters */ - assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); - assert_param(IS_FSMC_GET_IT(FSMC_IT)); - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - tmpsr = FSMC_Bank2->SR2; - } - else if(FSMC_Bank == FSMC_Bank3_NAND) - { - tmpsr = FSMC_Bank3->SR3; - } - /* FSMC_Bank4_PCCARD*/ - else - { - tmpsr = FSMC_Bank4->SR4; - } - - itstatus = tmpsr & FSMC_IT; - - itenable = tmpsr & (FSMC_IT >> 3); - if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the FSMC’s interrupt pending bits. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_IT: specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. - * @arg FSMC_IT_Level: Level edge detection interrupt. - * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. - * @retval None - */ -void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT) -{ - /* Check the parameters */ - assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); - assert_param(IS_FSMC_IT(FSMC_IT)); - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->SR2 &= ~(FSMC_IT >> 3); - } - else if(FSMC_Bank == FSMC_Bank3_NAND) - { - FSMC_Bank3->SR3 &= ~(FSMC_IT >> 3); - } - /* FSMC_Bank4_PCCARD*/ - else - { - FSMC_Bank4->SR4 &= ~(FSMC_IT >> 3); - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c deleted file mode 100644 index f2322a95d4..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c +++ /dev/null @@ -1,636 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_gpio.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the GPIO firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_gpio.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup GPIO - * @brief GPIO driver modules - * @{ - */ - -/** @defgroup GPIO_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup GPIO_Private_Defines - * @{ - */ - -/* ------------ RCC registers bit address in the alias region ----------------*/ -#define AFIO_OFFSET (AFIO_BASE - PERIPH_BASE) - -/* --- EVENTCR Register -----*/ - -/* Alias word address of EVOE bit */ -#define EVCR_OFFSET (AFIO_OFFSET + 0x00) -#define EVOE_BitNumber ((uint8_t)0x07) -#define EVCR_EVOE_BB (PERIPH_BB_BASE + (EVCR_OFFSET * 32) + (EVOE_BitNumber * 4)) - - -/* --- MAPR Register ---*/ -/* Alias word address of MII_RMII_SEL bit */ -#define MAPR_OFFSET (AFIO_OFFSET + 0x04) -#define MII_RMII_SEL_BitNumber ((u8)0x17) -#define MAPR_MII_RMII_SEL_BB (PERIPH_BB_BASE + (MAPR_OFFSET * 32) + (MII_RMII_SEL_BitNumber * 4)) - - -#define EVCR_PORTPINCONFIG_MASK ((uint16_t)0xFF80) -#define LSB_MASK ((uint16_t)0xFFFF) -#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000) -#define DBGAFR_SWJCFG_MASK ((uint32_t)0xF0FFFFFF) -#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000) -#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000) -/** - * @} - */ - -/** @defgroup GPIO_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup GPIO_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup GPIO_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup GPIO_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the GPIOx peripheral registers to their default reset values. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @retval None - */ -void GPIO_DeInit(GPIO_TypeDef* GPIOx) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - if (GPIOx == GPIOA) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE); - } - else if (GPIOx == GPIOB) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE); - } - else if (GPIOx == GPIOC) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE); - } - else if (GPIOx == GPIOD) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE); - } - else if (GPIOx == GPIOE) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE); - } - else if (GPIOx == GPIOF) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE); - } - else - { - if (GPIOx == GPIOG) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE); - } - } -} - -/** - * @brief Deinitializes the Alternate Functions (remap, event control - * and EXTI configuration) registers to their default reset values. - * @param None - * @retval None - */ -void GPIO_AFIODeInit(void) -{ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE); -} - -/** - * @brief Initializes the GPIOx peripheral according to the specified - * parameters in the GPIO_InitStruct. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that - * contains the configuration information for the specified GPIO peripheral. - * @retval None - */ -void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) -{ - uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; - uint32_t tmpreg = 0x00, pinmask = 0x00; - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); - assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); - -/*---------------------------- GPIO Mode Configuration -----------------------*/ - currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F); - if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00) - { - /* Check the parameters */ - assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); - /* Output mode */ - currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed; - } -/*---------------------------- GPIO CRL Configuration ------------------------*/ - /* Configure the eight low port pins */ - if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00) - { - tmpreg = GPIOx->CRL; - for (pinpos = 0x00; pinpos < 0x08; pinpos++) - { - pos = ((uint32_t)0x01) << pinpos; - /* Get the port pins position */ - currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; - if (currentpin == pos) - { - pos = pinpos << 2; - /* Clear the corresponding low control register bits */ - pinmask = ((uint32_t)0x0F) << pos; - tmpreg &= ~pinmask; - /* Write the mode configuration in the corresponding bits */ - tmpreg |= (currentmode << pos); - /* Reset the corresponding ODR bit */ - if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) - { - GPIOx->BRR = (((uint32_t)0x01) << pinpos); - } - else - { - /* Set the corresponding ODR bit */ - if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) - { - GPIOx->BSRR = (((uint32_t)0x01) << pinpos); - } - } - } - } - GPIOx->CRL = tmpreg; - } -/*---------------------------- GPIO CRH Configuration ------------------------*/ - /* Configure the eight high port pins */ - if (GPIO_InitStruct->GPIO_Pin > 0x00FF) - { - tmpreg = GPIOx->CRH; - for (pinpos = 0x00; pinpos < 0x08; pinpos++) - { - pos = (((uint32_t)0x01) << (pinpos + 0x08)); - /* Get the port pins position */ - currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos); - if (currentpin == pos) - { - pos = pinpos << 2; - /* Clear the corresponding high control register bits */ - pinmask = ((uint32_t)0x0F) << pos; - tmpreg &= ~pinmask; - /* Write the mode configuration in the corresponding bits */ - tmpreg |= (currentmode << pos); - /* Reset the corresponding ODR bit */ - if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) - { - GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08)); - } - /* Set the corresponding ODR bit */ - if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) - { - GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08)); - } - } - } - GPIOx->CRH = tmpreg; - } -} - -/** - * @brief Fills each GPIO_InitStruct member with its default value. - * @param GPIO_InitStruct : pointer to a GPIO_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) -{ - /* Reset GPIO init structure parameters values */ - GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; - GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING; -} - -/** - * @brief Reads the specified input port pin. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bit to read. - * This parameter can be GPIO_Pin_x where x can be (0..15). - * @retval The input port pin value. - */ -uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint8_t bitstatus = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); - - if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) - { - bitstatus = (uint8_t)Bit_SET; - } - else - { - bitstatus = (uint8_t)Bit_RESET; - } - return bitstatus; -} - -/** - * @brief Reads the specified GPIO input data port. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @retval GPIO input data port value. - */ -uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - return ((uint16_t)GPIOx->IDR); -} - -/** - * @brief Reads the specified output data port bit. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bit to read. - * This parameter can be GPIO_Pin_x where x can be (0..15). - * @retval The output port pin value. - */ -uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint8_t bitstatus = 0x00; - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); - - if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET) - { - bitstatus = (uint8_t)Bit_SET; - } - else - { - bitstatus = (uint8_t)Bit_RESET; - } - return bitstatus; -} - -/** - * @brief Reads the specified GPIO output data port. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @retval GPIO output data port value. - */ -uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - return ((uint16_t)GPIOx->ODR); -} - -/** - * @brief Sets the selected data port bits. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bits to be written. - * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). - * @retval None - */ -void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - GPIOx->BSRR = GPIO_Pin; -} - -/** - * @brief Clears the selected data port bits. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bits to be written. - * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). - * @retval None - */ -void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - GPIOx->BRR = GPIO_Pin; -} - -/** - * @brief Sets or clears the selected data port bit. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bit to be written. - * This parameter can be one of GPIO_Pin_x where x can be (0..15). - * @param BitVal: specifies the value to be written to the selected bit. - * This parameter can be one of the BitAction enum values: - * @arg Bit_RESET: to clear the port pin - * @arg Bit_SET: to set the port pin - * @retval None - */ -void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); - assert_param(IS_GPIO_BIT_ACTION(BitVal)); - - if (BitVal != Bit_RESET) - { - GPIOx->BSRR = GPIO_Pin; - } - else - { - GPIOx->BRR = GPIO_Pin; - } -} - -/** - * @brief Writes data to the specified GPIO data port. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @param PortVal: specifies the value to be written to the port output data register. - * @retval None - */ -void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - GPIOx->ODR = PortVal; -} - -/** - * @brief Locks GPIO Pins configuration registers. - * @param GPIOx: where x can be (A..G) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bit to be written. - * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). - * @retval None - */ -void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint32_t tmp = 0x00010000; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - tmp |= GPIO_Pin; - /* Set LCKK bit */ - GPIOx->LCKR = tmp; - /* Reset LCKK bit */ - GPIOx->LCKR = GPIO_Pin; - /* Set LCKK bit */ - GPIOx->LCKR = tmp; - /* Read LCKK bit*/ - tmp = GPIOx->LCKR; - /* Read LCKK bit*/ - tmp = GPIOx->LCKR; -} - -/** - * @brief Selects the GPIO pin used as Event output. - * @param GPIO_PortSource: selects the GPIO port to be used as source - * for Event output. - * This parameter can be GPIO_PortSourceGPIOx where x can be (A..E). - * @param GPIO_PinSource: specifies the pin for the Event output. - * This parameter can be GPIO_PinSourcex where x can be (0..15). - * @retval None - */ -void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) -{ - uint32_t tmpreg = 0x00; - /* Check the parameters */ - assert_param(IS_GPIO_EVENTOUT_PORT_SOURCE(GPIO_PortSource)); - assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); - - tmpreg = AFIO->EVCR; - /* Clear the PORT[6:4] and PIN[3:0] bits */ - tmpreg &= EVCR_PORTPINCONFIG_MASK; - tmpreg |= (uint32_t)GPIO_PortSource << 0x04; - tmpreg |= GPIO_PinSource; - AFIO->EVCR = tmpreg; -} - -/** - * @brief Enables or disables the Event Output. - * @param NewState: new state of the Event output. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void GPIO_EventOutputCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) EVCR_EVOE_BB = (uint32_t)NewState; -} - -/** - * @brief Changes the mapping of the specified pin. - * @param GPIO_Remap: selects the pin to remap. - * This parameter can be one of the following values: - * @arg GPIO_Remap_SPI1 - * @arg GPIO_Remap_I2C1 - * @arg GPIO_Remap_USART1 - * @arg GPIO_Remap_USART2 - * @arg GPIO_PartialRemap_USART3 - * @arg GPIO_FullRemap_USART3 - * @arg GPIO_PartialRemap_TIM1 - * @arg GPIO_FullRemap_TIM1 - * @arg GPIO_PartialRemap1_TIM2 - * @arg GPIO_PartialRemap2_TIM2 - * @arg GPIO_FullRemap_TIM2 - * @arg GPIO_PartialRemap_TIM3 - * @arg GPIO_FullRemap_TIM3 - * @arg GPIO_Remap_TIM4 - * @arg GPIO_Remap1_CAN1 - * @arg GPIO_Remap2_CAN1 - * @arg GPIO_Remap_PD01 - * @arg GPIO_Remap_TIM5CH4_LSI - * @arg GPIO_Remap_ADC1_ETRGINJ - * @arg GPIO_Remap_ADC1_ETRGREG - * @arg GPIO_Remap_ADC2_ETRGINJ - * @arg GPIO_Remap_ADC2_ETRGREG - * @arg GPIO_Remap_ETH - * @arg GPIO_Remap_CAN2 - * @arg GPIO_Remap_SWJ_NoJTRST - * @arg GPIO_Remap_SWJ_JTAGDisable - * @arg GPIO_Remap_SWJ_Disable - * @arg GPIO_Remap_SPI3 - * @arg GPIO_Remap_TIM2ITR1_PTP_SOF - * @arg GPIO_Remap_PTP_PPS - * @arg GPIO_Remap_TIM15 - * @arg GPIO_Remap_TIM16 - * @arg GPIO_Remap_TIM17 - * @arg GPIO_Remap_CEC - * @arg GPIO_Remap_TIM1_DMA - * @note If the GPIO_Remap_TIM2ITR1_PTP_SOF is enabled the TIM2 ITR1 is connected - * to Ethernet PTP output. When Reset TIM2 ITR1 is connected to USB OTG SOF output. - * @param NewState: new state of the port pin remapping. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) -{ - uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_REMAP(GPIO_Remap)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if((GPIO_Remap & 0x80000000) == 0x80000000) - { - tmpreg = AFIO->MAPR2; - } - else - { - tmpreg = AFIO->MAPR; - } - - tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10; - tmp = GPIO_Remap & LSB_MASK; - - if ((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) - { - tmpreg &= DBGAFR_SWJCFG_MASK; - AFIO->MAPR &= DBGAFR_SWJCFG_MASK; - } - else if ((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) - { - tmp1 = ((uint32_t)0x03) << tmpmask; - tmpreg &= ~tmp1; - tmpreg |= ~DBGAFR_SWJCFG_MASK; - } - else - { - tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15)*0x10)); - tmpreg |= ~DBGAFR_SWJCFG_MASK; - } - - if (NewState != DISABLE) - { - tmpreg |= (tmp << ((GPIO_Remap >> 0x15)*0x10)); - } - - if((GPIO_Remap & 0x80000000) == 0x80000000) - { - AFIO->MAPR2 = tmpreg; - } - else - { - AFIO->MAPR = tmpreg; - } -} - -/** - * @brief Selects the GPIO pin used as EXTI Line. - * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines. - * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). - * @param GPIO_PinSource: specifies the EXTI line to be configured. - * This parameter can be GPIO_PinSourcex where x can be (0..15). - * @retval None - */ -void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) -{ - uint32_t tmp = 0x00; - /* Check the parameters */ - assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource)); - assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); - - tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); - AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; - AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); -} - -/** - * @brief Selects the Ethernet media interface. - * @note This function applies only to STM32 Connectivity line devices. - * @param GPIO_ETH_MediaInterface: specifies the Media Interface mode. - * This parameter can be one of the following values: - * @arg GPIO_ETH_MediaInterface_MII: MII mode - * @arg GPIO_ETH_MediaInterface_RMII: RMII mode - * @retval None - */ -void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface) -{ - assert_param(IS_GPIO_ETH_MEDIA_INTERFACE(GPIO_ETH_MediaInterface)); - - /* Configure MII_RMII selection bit */ - *(__IO uint32_t *) MAPR_MII_RMII_SEL_BB = GPIO_ETH_MediaInterface; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c deleted file mode 100644 index 9fe53c3e03..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c +++ /dev/null @@ -1,1162 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_i2c.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the I2C firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_i2c.h" -#include "stm32f10x_rcc.h" - - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup I2C - * @brief I2C driver modules - * @{ - */ - -/** @defgroup I2C_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup I2C_Private_Defines - * @{ - */ - -/* I2C SPE mask */ -#define CR1_PE_Set ((uint16_t)0x0001) -#define CR1_PE_Reset ((uint16_t)0xFFFE) - -/* I2C START mask */ -#define CR1_START_Set ((uint16_t)0x0100) -#define CR1_START_Reset ((uint16_t)0xFEFF) - -/* I2C STOP mask */ -#define CR1_STOP_Set ((uint16_t)0x0200) -#define CR1_STOP_Reset ((uint16_t)0xFDFF) - -/* I2C ACK mask */ -#define CR1_ACK_Set ((uint16_t)0x0400) -#define CR1_ACK_Reset ((uint16_t)0xFBFF) - -/* I2C ENGC mask */ -#define CR1_ENGC_Set ((uint16_t)0x0040) -#define CR1_ENGC_Reset ((uint16_t)0xFFBF) - -/* I2C SWRST mask */ -#define CR1_SWRST_Set ((uint16_t)0x8000) -#define CR1_SWRST_Reset ((uint16_t)0x7FFF) - -/* I2C PEC mask */ -#define CR1_PEC_Set ((uint16_t)0x1000) -#define CR1_PEC_Reset ((uint16_t)0xEFFF) - -/* I2C ENPEC mask */ -#define CR1_ENPEC_Set ((uint16_t)0x0020) -#define CR1_ENPEC_Reset ((uint16_t)0xFFDF) - -/* I2C ENARP mask */ -#define CR1_ENARP_Set ((uint16_t)0x0010) -#define CR1_ENARP_Reset ((uint16_t)0xFFEF) - -/* I2C NOSTRETCH mask */ -#define CR1_NOSTRETCH_Set ((uint16_t)0x0080) -#define CR1_NOSTRETCH_Reset ((uint16_t)0xFF7F) - -/* I2C registers Masks */ -#define CR1_CLEAR_Mask ((uint16_t)0xFBF5) - -/* I2C DMAEN mask */ -#define CR2_DMAEN_Set ((uint16_t)0x0800) -#define CR2_DMAEN_Reset ((uint16_t)0xF7FF) - -/* I2C LAST mask */ -#define CR2_LAST_Set ((uint16_t)0x1000) -#define CR2_LAST_Reset ((uint16_t)0xEFFF) - -/* I2C FREQ mask */ -#define CR2_FREQ_Reset ((uint16_t)0xFFC0) - -/* I2C ADD0 mask */ -#define OAR1_ADD0_Set ((uint16_t)0x0001) -#define OAR1_ADD0_Reset ((uint16_t)0xFFFE) - -/* I2C ENDUAL mask */ -#define OAR2_ENDUAL_Set ((uint16_t)0x0001) -#define OAR2_ENDUAL_Reset ((uint16_t)0xFFFE) - -/* I2C ADD2 mask */ -#define OAR2_ADD2_Reset ((uint16_t)0xFF01) - -/* I2C F/S mask */ -#define CCR_FS_Set ((uint16_t)0x8000) - -/* I2C CCR mask */ -#define CCR_CCR_Set ((uint16_t)0x0FFF) - -/* I2C FLAG mask */ -#define FLAG_Mask ((uint32_t)0x00FFFFFF) - -/* I2C Interrupt Enable mask */ -#define ITEN_Mask ((uint32_t)0x07000000) - -/** - * @} - */ - -/** @defgroup I2C_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup I2C_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup I2C_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup I2C_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the I2Cx peripheral registers to their default reset values. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @retval None - */ -void I2C_DeInit(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - if (I2Cx == I2C1) - { - /* Enable I2C1 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); - /* Release I2C1 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); - } - else - { - /* Enable I2C2 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE); - /* Release I2C2 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); - } -} - -/** - * @brief Initializes the I2Cx peripheral according to the specified - * parameters in the I2C_InitStruct. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_InitStruct: pointer to a I2C_InitTypeDef structure that - * contains the configuration information for the specified I2C peripheral. - * @retval None - */ -void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct) -{ - uint16_t tmpreg = 0, freqrange = 0; - uint16_t result = 0x04; - uint32_t pclk1 = 8000000; - RCC_ClocksTypeDef rcc_clocks; - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed)); - assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode)); - assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle)); - assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1)); - assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack)); - assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress)); - -/*---------------------------- I2Cx CR2 Configuration ------------------------*/ - /* Get the I2Cx CR2 value */ - tmpreg = I2Cx->CR2; - /* Clear frequency FREQ[5:0] bits */ - tmpreg &= CR2_FREQ_Reset; - /* Get pclk1 frequency value */ - RCC_GetClocksFreq(&rcc_clocks); - pclk1 = rcc_clocks.PCLK1_Frequency; - /* Set frequency bits depending on pclk1 value */ - freqrange = (uint16_t)(pclk1 / 1000000); - tmpreg |= freqrange; - /* Write to I2Cx CR2 */ - I2Cx->CR2 = tmpreg; - -/*---------------------------- I2Cx CCR Configuration ------------------------*/ - /* Disable the selected I2C peripheral to configure TRISE */ - I2Cx->CR1 &= CR1_PE_Reset; - /* Reset tmpreg value */ - /* Clear F/S, DUTY and CCR[11:0] bits */ - tmpreg = 0; - - /* Configure speed in standard mode */ - if (I2C_InitStruct->I2C_ClockSpeed <= 100000) - { - /* Standard mode speed calculate */ - result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1)); - /* Test if CCR value is under 0x4*/ - if (result < 0x04) - { - /* Set minimum allowed value */ - result = 0x04; - } - /* Set speed value for standard mode */ - tmpreg |= result; - /* Set Maximum Rise Time for standard mode */ - I2Cx->TRISE = freqrange + 1; - } - /* Configure speed in fast mode */ - else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/ - { - if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2) - { - /* Fast mode speed calculate: Tlow/Thigh = 2 */ - result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3)); - } - else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/ - { - /* Fast mode speed calculate: Tlow/Thigh = 16/9 */ - result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25)); - /* Set DUTY bit */ - result |= I2C_DutyCycle_16_9; - } - - /* Test if CCR value is under 0x1*/ - if ((result & CCR_CCR_Set) == 0) - { - /* Set minimum allowed value */ - result |= (uint16_t)0x0001; - } - /* Set speed value and set F/S bit for fast mode */ - tmpreg |= (uint16_t)(result | CCR_FS_Set); - /* Set Maximum Rise Time for fast mode */ - I2Cx->TRISE = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1); - } - - /* Write to I2Cx CCR */ - I2Cx->CCR = tmpreg; - /* Enable the selected I2C peripheral */ - I2Cx->CR1 |= CR1_PE_Set; - -/*---------------------------- I2Cx CR1 Configuration ------------------------*/ - /* Get the I2Cx CR1 value */ - tmpreg = I2Cx->CR1; - /* Clear ACK, SMBTYPE and SMBUS bits */ - tmpreg &= CR1_CLEAR_Mask; - /* Configure I2Cx: mode and acknowledgement */ - /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */ - /* Set ACK bit according to I2C_Ack value */ - tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack); - /* Write to I2Cx CR1 */ - I2Cx->CR1 = tmpreg; - -/*---------------------------- I2Cx OAR1 Configuration -----------------------*/ - /* Set I2Cx Own Address1 and acknowledged address */ - I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1); -} - -/** - * @brief Fills each I2C_InitStruct member with its default value. - * @param I2C_InitStruct: pointer to an I2C_InitTypeDef structure which will be initialized. - * @retval None - */ -void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct) -{ -/*---------------- Reset I2C init structure parameters values ----------------*/ - /* initialize the I2C_ClockSpeed member */ - I2C_InitStruct->I2C_ClockSpeed = 5000; - /* Initialize the I2C_Mode member */ - I2C_InitStruct->I2C_Mode = I2C_Mode_I2C; - /* Initialize the I2C_DutyCycle member */ - I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2; - /* Initialize the I2C_OwnAddress1 member */ - I2C_InitStruct->I2C_OwnAddress1 = 0; - /* Initialize the I2C_Ack member */ - I2C_InitStruct->I2C_Ack = I2C_Ack_Disable; - /* Initialize the I2C_AcknowledgedAddress member */ - I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; -} - -/** - * @brief Enables or disables the specified I2C peripheral. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2Cx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C peripheral */ - I2Cx->CR1 |= CR1_PE_Set; - } - else - { - /* Disable the selected I2C peripheral */ - I2Cx->CR1 &= CR1_PE_Reset; - } -} - -/** - * @brief Enables or disables the specified I2C DMA requests. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C DMA transfer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C DMA requests */ - I2Cx->CR2 |= CR2_DMAEN_Set; - } - else - { - /* Disable the selected I2C DMA requests */ - I2Cx->CR2 &= CR2_DMAEN_Reset; - } -} - -/** - * @brief Specifies if the next DMA transfer will be the last one. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C DMA last transfer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Next DMA transfer is the last transfer */ - I2Cx->CR2 |= CR2_LAST_Set; - } - else - { - /* Next DMA transfer is not the last transfer */ - I2Cx->CR2 &= CR2_LAST_Reset; - } -} - -/** - * @brief Generates I2Cx communication START condition. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C START condition generation. - * This parameter can be: ENABLE or DISABLE. - * @retval None. - */ -void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Generate a START condition */ - I2Cx->CR1 |= CR1_START_Set; - } - else - { - /* Disable the START condition generation */ - I2Cx->CR1 &= CR1_START_Reset; - } -} - -/** - * @brief Generates I2Cx communication STOP condition. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C STOP condition generation. - * This parameter can be: ENABLE or DISABLE. - * @retval None. - */ -void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Generate a STOP condition */ - I2Cx->CR1 |= CR1_STOP_Set; - } - else - { - /* Disable the STOP condition generation */ - I2Cx->CR1 &= CR1_STOP_Reset; - } -} - -/** - * @brief Enables or disables the specified I2C acknowledge feature. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C Acknowledgement. - * This parameter can be: ENABLE or DISABLE. - * @retval None. - */ -void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the acknowledgement */ - I2Cx->CR1 |= CR1_ACK_Set; - } - else - { - /* Disable the acknowledgement */ - I2Cx->CR1 &= CR1_ACK_Reset; - } -} - -/** - * @brief Configures the specified I2C own address2. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param Address: specifies the 7bit I2C own address2. - * @retval None. - */ -void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address) -{ - uint16_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - /* Get the old register value */ - tmpreg = I2Cx->OAR2; - - /* Reset I2Cx Own address2 bit [7:1] */ - tmpreg &= OAR2_ADD2_Reset; - - /* Set I2Cx Own address2 */ - tmpreg |= (uint16_t)((uint16_t)Address & (uint16_t)0x00FE); - - /* Store the new register value */ - I2Cx->OAR2 = tmpreg; -} - -/** - * @brief Enables or disables the specified I2C dual addressing mode. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C dual addressing mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable dual addressing mode */ - I2Cx->OAR2 |= OAR2_ENDUAL_Set; - } - else - { - /* Disable dual addressing mode */ - I2Cx->OAR2 &= OAR2_ENDUAL_Reset; - } -} - -/** - * @brief Enables or disables the specified I2C general call feature. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C General call. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable generall call */ - I2Cx->CR1 |= CR1_ENGC_Set; - } - else - { - /* Disable generall call */ - I2Cx->CR1 &= CR1_ENGC_Reset; - } -} - -/** - * @brief Enables or disables the specified I2C interrupts. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_IT: specifies the I2C interrupts sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg I2C_IT_BUF: Buffer interrupt mask - * @arg I2C_IT_EVT: Event interrupt mask - * @arg I2C_IT_ERR: Error interrupt mask - * @param NewState: new state of the specified I2C interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_I2C_CONFIG_IT(I2C_IT)); - - if (NewState != DISABLE) - { - /* Enable the selected I2C interrupts */ - I2Cx->CR2 |= I2C_IT; - } - else - { - /* Disable the selected I2C interrupts */ - I2Cx->CR2 &= (uint16_t)~I2C_IT; - } -} - -/** - * @brief Sends a data byte through the I2Cx peripheral. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param Data: Byte to be transmitted.. - * @retval None - */ -void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - /* Write in the DR register the data to be sent */ - I2Cx->DR = Data; -} - -/** - * @brief Returns the most recent received data by the I2Cx peripheral. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @retval The value of the received data. - */ -uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - /* Return the data in the DR register */ - return (uint8_t)I2Cx->DR; -} - -/** - * @brief Transmits the address byte to select the slave device. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param Address: specifies the slave address which will be transmitted - * @param I2C_Direction: specifies whether the I2C device will be a - * Transmitter or a Receiver. This parameter can be one of the following values - * @arg I2C_Direction_Transmitter: Transmitter mode - * @arg I2C_Direction_Receiver: Receiver mode - * @retval None. - */ -void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_DIRECTION(I2C_Direction)); - /* Test on the direction to set/reset the read/write bit */ - if (I2C_Direction != I2C_Direction_Transmitter) - { - /* Set the address bit0 for read */ - Address |= OAR1_ADD0_Set; - } - else - { - /* Reset the address bit0 for write */ - Address &= OAR1_ADD0_Reset; - } - /* Send the address */ - I2Cx->DR = Address; -} - -/** - * @brief Reads the specified I2C register and returns its value. - * @param I2C_Register: specifies the register to read. - * This parameter can be one of the following values: - * @arg I2C_Register_CR1: CR1 register. - * @arg I2C_Register_CR2: CR2 register. - * @arg I2C_Register_OAR1: OAR1 register. - * @arg I2C_Register_OAR2: OAR2 register. - * @arg I2C_Register_DR: DR register. - * @arg I2C_Register_SR1: SR1 register. - * @arg I2C_Register_SR2: SR2 register. - * @arg I2C_Register_CCR: CCR register. - * @arg I2C_Register_TRISE: TRISE register. - * @retval The value of the read register. - */ -uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_REGISTER(I2C_Register)); - - tmp = (uint32_t) I2Cx; - tmp += I2C_Register; - - /* Return the selected register value */ - return (*(__IO uint16_t *) tmp); -} - -/** - * @brief Enables or disables the specified I2C software reset. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C software reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Peripheral under reset */ - I2Cx->CR1 |= CR1_SWRST_Set; - } - else - { - /* Peripheral not under reset */ - I2Cx->CR1 &= CR1_SWRST_Reset; - } -} - -/** - * @brief Drives the SMBusAlert pin high or low for the specified I2C. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_SMBusAlert: specifies SMBAlert pin level. - * This parameter can be one of the following values: - * @arg I2C_SMBusAlert_Low: SMBAlert pin driven low - * @arg I2C_SMBusAlert_High: SMBAlert pin driven high - * @retval None - */ -void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_SMBUS_ALERT(I2C_SMBusAlert)); - if (I2C_SMBusAlert == I2C_SMBusAlert_Low) - { - /* Drive the SMBusAlert pin Low */ - I2Cx->CR1 |= I2C_SMBusAlert_Low; - } - else - { - /* Drive the SMBusAlert pin High */ - I2Cx->CR1 &= I2C_SMBusAlert_High; - } -} - -/** - * @brief Enables or disables the specified I2C PEC transfer. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2C PEC transmission. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C PEC transmission */ - I2Cx->CR1 |= CR1_PEC_Set; - } - else - { - /* Disable the selected I2C PEC transmission */ - I2Cx->CR1 &= CR1_PEC_Reset; - } -} - -/** - * @brief Selects the specified I2C PEC position. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_PECPosition: specifies the PEC position. - * This parameter can be one of the following values: - * @arg I2C_PECPosition_Next: indicates that the next byte is PEC - * @arg I2C_PECPosition_Current: indicates that current byte is PEC - * @retval None - */ -void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_PEC_POSITION(I2C_PECPosition)); - if (I2C_PECPosition == I2C_PECPosition_Next) - { - /* Next byte in shift register is PEC */ - I2Cx->CR1 |= I2C_PECPosition_Next; - } - else - { - /* Current byte in shift register is PEC */ - I2Cx->CR1 &= I2C_PECPosition_Current; - } -} - -/** - * @brief Enables or disables the PEC value calculation of the transfered bytes. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2Cx PEC value calculation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C PEC calculation */ - I2Cx->CR1 |= CR1_ENPEC_Set; - } - else - { - /* Disable the selected I2C PEC calculation */ - I2Cx->CR1 &= CR1_ENPEC_Reset; - } -} - -/** - * @brief Returns the PEC value for the specified I2C. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @retval The PEC value. - */ -uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - /* Return the selected I2C PEC value */ - return ((I2Cx->SR2) >> 8); -} - -/** - * @brief Enables or disables the specified I2C ARP. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2Cx ARP. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C ARP */ - I2Cx->CR1 |= CR1_ENARP_Set; - } - else - { - /* Disable the selected I2C ARP */ - I2Cx->CR1 &= CR1_ENARP_Reset; - } -} - -/** - * @brief Enables or disables the specified I2C Clock stretching. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param NewState: new state of the I2Cx Clock stretching. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState == DISABLE) - { - /* Enable the selected I2C Clock stretching */ - I2Cx->CR1 |= CR1_NOSTRETCH_Set; - } - else - { - /* Disable the selected I2C Clock stretching */ - I2Cx->CR1 &= CR1_NOSTRETCH_Reset; - } -} - -/** - * @brief Selects the specified I2C fast mode duty cycle. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_DutyCycle: specifies the fast mode duty cycle. - * This parameter can be one of the following values: - * @arg I2C_DutyCycle_2: I2C fast mode Tlow/Thigh = 2 - * @arg I2C_DutyCycle_16_9: I2C fast mode Tlow/Thigh = 16/9 - * @retval None - */ -void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle)); - if (I2C_DutyCycle != I2C_DutyCycle_16_9) - { - /* I2C fast mode Tlow/Thigh=2 */ - I2Cx->CCR &= I2C_DutyCycle_2; - } - else - { - /* I2C fast mode Tlow/Thigh=16/9 */ - I2Cx->CCR |= I2C_DutyCycle_16_9; - } -} - -/** - * @brief Returns the last I2Cx Event. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @retval The last event - */ -uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx) -{ - uint32_t lastevent = 0; - uint32_t flag1 = 0, flag2 = 0; - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - /* Read the I2Cx status register */ - flag1 = I2Cx->SR1; - flag2 = I2Cx->SR2; - flag2 = flag2 << 16; - /* Get the last event value from I2C status register */ - lastevent = (flag1 | flag2) & FLAG_Mask; - /* Return status */ - return lastevent; -} - -/** - * @brief Checks whether the last I2Cx Event is equal to the one passed - * as parameter. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_EVENT: specifies the event to be checked. - * This parameter can be one of the following values: - * @arg I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1 - * @arg I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1 - * @arg I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED : EV1 - * @arg I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED : EV1 - * @arg I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1 - * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2 - * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) : EV2 - * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) : EV2 - * @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3 - * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) : EV3 - * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) : EV3 - * @arg I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2 - * @arg I2C_EVENT_SLAVE_STOP_DETECTED : EV4 - * @arg I2C_EVENT_MASTER_MODE_SELECT : EV5 - * @arg I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6 - * @arg I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6 - * @arg I2C_EVENT_MASTER_BYTE_RECEIVED : EV7 - * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8 - * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2 - * @arg I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9 - * @retval An ErrorStatus enumuration value: - * - SUCCESS: Last event is equal to the I2C_EVENT - * - ERROR: Last event is different from the I2C_EVENT - */ -ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) -{ - uint32_t lastevent = 0; - uint32_t flag1 = 0, flag2 = 0; - ErrorStatus status = ERROR; - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_EVENT(I2C_EVENT)); - /* Read the I2Cx status register */ - flag1 = I2Cx->SR1; - flag2 = I2Cx->SR2; - flag2 = flag2 << 16; - /* Get the last event value from I2C status register */ - lastevent = (flag1 | flag2) & FLAG_Mask; - /* Check whether the last event is equal to I2C_EVENT */ - if (lastevent == I2C_EVENT ) - { - /* SUCCESS: last event is equal to I2C_EVENT */ - status = SUCCESS; - } - else - { - /* ERROR: last event is different from I2C_EVENT */ - status = ERROR; - } - /* Return status */ - return status; -} - -/** - * @brief Checks whether the specified I2C flag is set or not. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg I2C_FLAG_DUALF: Dual flag (Slave mode) - * @arg I2C_FLAG_SMBHOST: SMBus host header (Slave mode) - * @arg I2C_FLAG_SMBDEFAULT: SMBus default header (Slave mode) - * @arg I2C_FLAG_GENCALL: General call header flag (Slave mode) - * @arg I2C_FLAG_TRA: Transmitter/Receiver flag - * @arg I2C_FLAG_BUSY: Bus busy flag - * @arg I2C_FLAG_MSL: Master/Slave flag - * @arg I2C_FLAG_SMBALERT: SMBus Alert flag - * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag - * @arg I2C_FLAG_PECERR: PEC error in reception flag - * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_FLAG_BERR: Bus error flag - * @arg I2C_FLAG_TXE: Data register empty flag (Transmitter) - * @arg I2C_FLAG_RXNE: Data register not empty (Receiver) flag - * @arg I2C_FLAG_STOPF: Stop detection flag (Slave mode) - * @arg I2C_FLAG_ADD10: 10-bit header sent flag (Master mode) - * @arg I2C_FLAG_BTF: Byte transfer finished flag - * @arg I2C_FLAG_ADDR: Address sent flag (Master mode) “ADSL” - * Address matched flag (Slave mode)”ENDAD” - * @arg I2C_FLAG_SB: Start bit flag (Master mode) - * @retval The new state of I2C_FLAG (SET or RESET). - */ -FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) -{ - FlagStatus bitstatus = RESET; - __IO uint32_t i2creg = 0, i2cxbase = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_GET_FLAG(I2C_FLAG)); - - /* Get the I2Cx peripheral base address */ - i2cxbase = (uint32_t)I2Cx; - - /* Read flag register index */ - i2creg = I2C_FLAG >> 28; - - /* Get bit[23:0] of the flag */ - I2C_FLAG &= FLAG_Mask; - - if(i2creg != 0) - { - /* Get the I2Cx SR1 register address */ - i2cxbase += 0x14; - } - else - { - /* Flag in I2Cx SR2 Register */ - I2C_FLAG = (uint32_t)(I2C_FLAG >> 16); - /* Get the I2Cx SR2 register address */ - i2cxbase += 0x18; - } - - if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET) - { - /* I2C_FLAG is set */ - bitstatus = SET; - } - else - { - /* I2C_FLAG is reset */ - bitstatus = RESET; - } - - /* Return the I2C_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the I2Cx's pending flags. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg I2C_FLAG_SMBALERT: SMBus Alert flag - * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag - * @arg I2C_FLAG_PECERR: PEC error in reception flag - * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_FLAG_BERR: Bus error flag - * - * @note - * - STOPF (STOP detection) is cleared by software sequence: a read operation - * to I2C_SR1 register (I2C_GetFlagStatus()) followed by a write operation - * to I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). - * - ADD10 (10-bit header sent) is cleared by software sequence: a read - * operation to I2C_SR1 (I2C_GetFlagStatus()) followed by writing the - * second byte of the address in DR register. - * - BTF (Byte Transfer Finished) is cleared by software sequence: a read - * operation to I2C_SR1 register (I2C_GetFlagStatus()) followed by a - * read/write to I2C_DR register (I2C_SendData()). - * - ADDR (Address sent) is cleared by software sequence: a read operation to - * I2C_SR1 register (I2C_GetFlagStatus()) followed by a read operation to - * I2C_SR2 register ((void)(I2Cx->SR2)). - * - SB (Start Bit) is cleared software sequence: a read operation to I2C_SR1 - * register (I2C_GetFlagStatus()) followed by a write operation to I2C_DR - * register (I2C_SendData()). - * @retval None - */ -void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) -{ - uint32_t flagpos = 0; - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_CLEAR_FLAG(I2C_FLAG)); - /* Get the I2C flag position */ - flagpos = I2C_FLAG & FLAG_Mask; - /* Clear the selected I2C flag */ - I2Cx->SR1 = (uint16_t)~flagpos; -} - -/** - * @brief Checks whether the specified I2C interrupt has occurred or not. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_IT: specifies the interrupt source to check. - * This parameter can be one of the following values: - * @arg I2C_IT_SMBALERT: SMBus Alert flag - * @arg I2C_IT_TIMEOUT: Timeout or Tlow error flag - * @arg I2C_IT_PECERR: PEC error in reception flag - * @arg I2C_IT_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_IT_AF: Acknowledge failure flag - * @arg I2C_IT_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_IT_BERR: Bus error flag - * @arg I2C_IT_TXE: Data register empty flag (Transmitter) - * @arg I2C_IT_RXNE: Data register not empty (Receiver) flag - * @arg I2C_IT_STOPF: Stop detection flag (Slave mode) - * @arg I2C_IT_ADD10: 10-bit header sent flag (Master mode) - * @arg I2C_IT_BTF: Byte transfer finished flag - * @arg I2C_IT_ADDR: Address sent flag (Master mode) “ADSL” - * Address matched flag (Slave mode)”ENDAD” - * @arg I2C_IT_SB: Start bit flag (Master mode) - * @retval The new state of I2C_IT (SET or RESET). - */ -ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_GET_IT(I2C_IT)); - /* Check if the interrupt source is enabled or not */ - enablestatus = (uint32_t)(((I2C_IT & ITEN_Mask) >> 16) & (I2Cx->CR2)) ; - /* Get bit[23:0] of the flag */ - I2C_IT &= FLAG_Mask; - /* Check the status of the specified I2C flag */ - if (((I2Cx->SR1 & I2C_IT) != (uint32_t)RESET) && enablestatus) - { - /* I2C_IT is set */ - bitstatus = SET; - } - else - { - /* I2C_IT is reset */ - bitstatus = RESET; - } - /* Return the I2C_IT status */ - return bitstatus; -} - -/** - * @brief Clears the I2Cx’s interrupt pending bits. - * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral. - * @param I2C_IT: specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg I2C_IT_SMBALERT: SMBus Alert interrupt - * @arg I2C_IT_TIMEOUT: Timeout or Tlow error interrupt - * @arg I2C_IT_PECERR: PEC error in reception interrupt - * @arg I2C_IT_OVR: Overrun/Underrun interrupt (Slave mode) - * @arg I2C_IT_AF: Acknowledge failure interrupt - * @arg I2C_IT_ARLO: Arbitration lost interrupt (Master mode) - * @arg I2C_IT_BERR: Bus error interrupt - * - * @note - * - STOPF (STOP detection) is cleared by software sequence: a read operation - * to I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to - * I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). - * - ADD10 (10-bit header sent) is cleared by software sequence: a read - * operation to I2C_SR1 (I2C_GetITStatus()) followed by writing the second - * byte of the address in I2C_DR register. - * - BTF (Byte Transfer Finished) is cleared by software sequence: a read - * operation to I2C_SR1 register (I2C_GetITStatus()) followed by a - * read/write to I2C_DR register (I2C_SendData()). - * - ADDR (Address sent) is cleared by software sequence: a read operation to - * I2C_SR1 register (I2C_GetITStatus()) followed by a read operation to - * I2C_SR2 register ((void)(I2Cx->SR2)). - * - SB (Start Bit) is cleared by software sequence: a read operation to - * I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to - * I2C_DR register (I2C_SendData()). - * @retval None - */ -void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT) -{ - uint32_t flagpos = 0; - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_CLEAR_IT(I2C_IT)); - /* Get the I2C flag position */ - flagpos = I2C_IT & FLAG_Mask; - /* Clear the selected I2C flag */ - I2Cx->SR1 = (uint16_t)~flagpos; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c deleted file mode 100644 index f157ad5384..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c +++ /dev/null @@ -1,189 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_iwdg.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the IWDG firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_iwdg.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup IWDG - * @brief IWDG driver modules - * @{ - */ - -/** @defgroup IWDG_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup IWDG_Private_Defines - * @{ - */ - -/* ---------------------- IWDG registers bit mask ----------------------------*/ - -/* KR register bit mask */ -#define KR_KEY_Reload ((uint16_t)0xAAAA) -#define KR_KEY_Enable ((uint16_t)0xCCCC) - -/** - * @} - */ - -/** @defgroup IWDG_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup IWDG_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup IWDG_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup IWDG_Private_Functions - * @{ - */ - -/** - * @brief Enables or disables write access to IWDG_PR and IWDG_RLR registers. - * @param IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers. - * This parameter can be one of the following values: - * @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers - * @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers - * @retval None - */ -void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) -{ - /* Check the parameters */ - assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); - IWDG->KR = IWDG_WriteAccess; -} - -/** - * @brief Sets IWDG Prescaler value. - * @param IWDG_Prescaler: specifies the IWDG Prescaler value. - * This parameter can be one of the following values: - * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 - * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 - * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 - * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 - * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 - * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 - * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 - * @retval None - */ -void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) -{ - /* Check the parameters */ - assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); - IWDG->PR = IWDG_Prescaler; -} - -/** - * @brief Sets IWDG Reload value. - * @param Reload: specifies the IWDG Reload value. - * This parameter must be a number between 0 and 0x0FFF. - * @retval None - */ -void IWDG_SetReload(uint16_t Reload) -{ - /* Check the parameters */ - assert_param(IS_IWDG_RELOAD(Reload)); - IWDG->RLR = Reload; -} - -/** - * @brief Reloads IWDG counter with value defined in the reload register - * (write access to IWDG_PR and IWDG_RLR registers disabled). - * @param None - * @retval None - */ -void IWDG_ReloadCounter(void) -{ - IWDG->KR = KR_KEY_Reload; -} - -/** - * @brief Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled). - * @param None - * @retval None - */ -void IWDG_Enable(void) -{ - IWDG->KR = KR_KEY_Enable; -} - -/** - * @brief Checks whether the specified IWDG flag is set or not. - * @param IWDG_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg IWDG_FLAG_PVU: Prescaler Value Update on going - * @arg IWDG_FLAG_RVU: Reload Value Update on going - * @retval The new state of IWDG_FLAG (SET or RESET). - */ -FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_IWDG_FLAG(IWDG_FLAG)); - if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c deleted file mode 100644 index 9066cdebf3..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c +++ /dev/null @@ -1,316 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_pwr.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the PWR firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_pwr.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup PWR - * @brief PWR driver modules - * @{ - */ - -/** @defgroup PWR_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup PWR_Private_Defines - * @{ - */ - -/* --------- PWR registers bit address in the alias region ---------- */ -#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) - -/* --- CR Register ---*/ - -/* Alias word address of DBP bit */ -#define CR_OFFSET (PWR_OFFSET + 0x00) -#define DBP_BitNumber 0x08 -#define CR_DBP_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (DBP_BitNumber * 4)) - -/* Alias word address of PVDE bit */ -#define PVDE_BitNumber 0x04 -#define CR_PVDE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PVDE_BitNumber * 4)) - -/* --- CSR Register ---*/ - -/* Alias word address of EWUP bit */ -#define CSR_OFFSET (PWR_OFFSET + 0x04) -#define EWUP_BitNumber 0x08 -#define CSR_EWUP_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (EWUP_BitNumber * 4)) - -/* ------------------ PWR registers bit mask ------------------------ */ - -/* CR register bit mask */ -#define CR_PDDS_Set ((uint32_t)0x00000002) -#define CR_DS_Mask ((uint32_t)0xFFFFFFFC) -#define CR_CWUF_Set ((uint32_t)0x00000004) -#define CR_PLS_Mask ((uint32_t)0xFFFFFF1F) - -/* --------- Cortex System Control register bit mask ---------------- */ - -/* Cortex System Control register address */ -#define SCB_SysCtrl ((uint32_t)0xE000ED10) - -/* SLEEPDEEP bit mask */ -#define SysCtrl_SLEEPDEEP_Set ((uint32_t)0x00000004) -#define SysCtrl_SLEEPDEEP_Reset ((uint32_t)0xFFFFFFFB) - -/** - * @} - */ - -/** @defgroup PWR_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup PWR_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup PWR_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup PWR_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the PWR peripheral registers to their default reset values. - * @param None - * @retval None - */ -void PWR_DeInit(void) -{ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE); -} - -/** - * @brief Enables or disables access to the RTC and backup registers. - * @param NewState: new state of the access to the RTC and backup registers. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_BackupAccessCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState; -} - -/** - * @brief Enables or disables the Power Voltage Detector(PVD). - * @param NewState: new state of the PVD. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_PVDCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState; -} - -/** - * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). - * @param PWR_PVDLevel: specifies the PVD detection level - * This parameter can be one of the following values: - * @arg PWR_PVDLevel_2V2: PVD detection level set to 2.2V - * @arg PWR_PVDLevel_2V3: PVD detection level set to 2.3V - * @arg PWR_PVDLevel_2V4: PVD detection level set to 2.4V - * @arg PWR_PVDLevel_2V5: PVD detection level set to 2.5V - * @arg PWR_PVDLevel_2V6: PVD detection level set to 2.6V - * @arg PWR_PVDLevel_2V7: PVD detection level set to 2.7V - * @arg PWR_PVDLevel_2V8: PVD detection level set to 2.8V - * @arg PWR_PVDLevel_2V9: PVD detection level set to 2.9V - * @retval None - */ -void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel)); - tmpreg = PWR->CR; - /* Clear PLS[7:5] bits */ - tmpreg &= CR_PLS_Mask; - /* Set PLS[7:5] bits according to PWR_PVDLevel value */ - tmpreg |= PWR_PVDLevel; - /* Store the new value */ - PWR->CR = tmpreg; -} - -/** - * @brief Enables or disables the WakeUp Pin functionality. - * @param NewState: new state of the WakeUp Pin functionality. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_WakeUpPinCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState; -} - -/** - * @brief Enters STOP mode. - * @param PWR_Regulator: specifies the regulator state in STOP mode. - * This parameter can be one of the following values: - * @arg PWR_Regulator_ON: STOP mode with regulator ON - * @arg PWR_Regulator_LowPower: STOP mode with regulator in low power mode - * @param PWR_STOPEntry: specifies if STOP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_STOPEntry_WFI: enter STOP mode with WFI instruction - * @arg PWR_STOPEntry_WFE: enter STOP mode with WFE instruction - * @retval None - */ -void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(PWR_Regulator)); - assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry)); - - /* Select the regulator state in STOP mode ---------------------------------*/ - tmpreg = PWR->CR; - /* Clear PDDS and LPDS bits */ - tmpreg &= CR_DS_Mask; - /* Set LPDS bit according to PWR_Regulator value */ - tmpreg |= PWR_Regulator; - /* Store the new value */ - PWR->CR = tmpreg; - /* Set SLEEPDEEP bit of Cortex System Control Register */ - *(__IO uint32_t *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set; - - /* Select STOP mode entry --------------------------------------------------*/ - if(PWR_STOPEntry == PWR_STOPEntry_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __WFE(); - } - - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - *(__IO uint32_t *) SCB_SysCtrl &= SysCtrl_SLEEPDEEP_Reset; -} - -/** - * @brief Enters STANDBY mode. - * @param None - * @retval None - */ -void PWR_EnterSTANDBYMode(void) -{ - /* Clear Wake-up flag */ - PWR->CR |= CR_CWUF_Set; - /* Select STANDBY mode */ - PWR->CR |= CR_PDDS_Set; - /* Set SLEEPDEEP bit of Cortex System Control Register */ - *(__IO uint32_t *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set; -/* This option is used to ensure that store operations are completed */ -#if defined ( __CC_ARM ) - __force_stores(); -#endif - /* Request Wait For Interrupt */ - __WFI(); -} - -/** - * @brief Checks whether the specified PWR flag is set or not. - * @param PWR_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag - * @arg PWR_FLAG_SB: StandBy flag - * @arg PWR_FLAG_PVDO: PVD Output - * @retval The new state of PWR_FLAG (SET or RESET). - */ -FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_PWR_GET_FLAG(PWR_FLAG)); - - if ((PWR->CSR & PWR_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @brief Clears the PWR's pending flags. - * @param PWR_FLAG: specifies the flag to clear. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag - * @arg PWR_FLAG_SB: StandBy flag - * @retval None - */ -void PWR_ClearFlag(uint32_t PWR_FLAG) -{ - /* Check the parameters */ - assert_param(IS_PWR_CLEAR_FLAG(PWR_FLAG)); - - PWR->CR |= PWR_FLAG << 2; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c deleted file mode 100644 index 55ae18dee6..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c +++ /dev/null @@ -1,1473 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_rcc.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the RCC firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup RCC - * @brief RCC driver modules - * @{ - */ - -/** @defgroup RCC_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup RCC_Private_Defines - * @{ - */ - -/* ------------ RCC registers bit address in the alias region ----------- */ -#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) - -/* --- CR Register ---*/ - -/* Alias word address of HSION bit */ -#define CR_OFFSET (RCC_OFFSET + 0x00) -#define HSION_BitNumber 0x00 -#define CR_HSION_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BitNumber * 4)) - -/* Alias word address of PLLON bit */ -#define PLLON_BitNumber 0x18 -#define CR_PLLON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BitNumber * 4)) - -#ifdef STM32F10X_CL - /* Alias word address of PLL2ON bit */ - #define PLL2ON_BitNumber 0x1A - #define CR_PLL2ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL2ON_BitNumber * 4)) - - /* Alias word address of PLL3ON bit */ - #define PLL3ON_BitNumber 0x1C - #define CR_PLL3ON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLL3ON_BitNumber * 4)) -#endif /* STM32F10X_CL */ - -/* Alias word address of CSSON bit */ -#define CSSON_BitNumber 0x13 -#define CR_CSSON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BitNumber * 4)) - -/* --- CFGR Register ---*/ - -/* Alias word address of USBPRE bit */ -#define CFGR_OFFSET (RCC_OFFSET + 0x04) - -#ifndef STM32F10X_CL - #define USBPRE_BitNumber 0x16 - #define CFGR_USBPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (USBPRE_BitNumber * 4)) -#else - #define OTGFSPRE_BitNumber 0x16 - #define CFGR_OTGFSPRE_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (OTGFSPRE_BitNumber * 4)) -#endif /* STM32F10X_CL */ - -/* --- BDCR Register ---*/ - -/* Alias word address of RTCEN bit */ -#define BDCR_OFFSET (RCC_OFFSET + 0x20) -#define RTCEN_BitNumber 0x0F -#define BDCR_RTCEN_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (RTCEN_BitNumber * 4)) - -/* Alias word address of BDRST bit */ -#define BDRST_BitNumber 0x10 -#define BDCR_BDRST_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (BDRST_BitNumber * 4)) - -/* --- CSR Register ---*/ - -/* Alias word address of LSION bit */ -#define CSR_OFFSET (RCC_OFFSET + 0x24) -#define LSION_BitNumber 0x00 -#define CSR_LSION_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4)) - -#ifdef STM32F10X_CL -/* --- CFGR2 Register ---*/ - - /* Alias word address of I2S2SRC bit */ - #define CFGR2_OFFSET (RCC_OFFSET + 0x2C) - #define I2S2SRC_BitNumber 0x11 - #define CFGR2_I2S2SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S2SRC_BitNumber * 4)) - - /* Alias word address of I2S3SRC bit */ - #define I2S3SRC_BitNumber 0x12 - #define CFGR2_I2S3SRC_BB (PERIPH_BB_BASE + (CFGR2_OFFSET * 32) + (I2S3SRC_BitNumber * 4)) -#endif /* STM32F10X_CL */ - -/* ---------------------- RCC registers bit mask ------------------------ */ - -/* CR register bit mask */ -#define CR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF) -#define CR_HSEBYP_Set ((uint32_t)0x00040000) -#define CR_HSEON_Reset ((uint32_t)0xFFFEFFFF) -#define CR_HSEON_Set ((uint32_t)0x00010000) -#define CR_HSITRIM_Mask ((uint32_t)0xFFFFFF07) - -/* CFGR register bit mask */ -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_CL) - #define CFGR_PLL_Mask ((uint32_t)0xFFC2FFFF) -#else - #define CFGR_PLL_Mask ((uint32_t)0xFFC0FFFF) -#endif /* STM32F10X_CL */ - -#define CFGR_PLLMull_Mask ((uint32_t)0x003C0000) -#define CFGR_PLLSRC_Mask ((uint32_t)0x00010000) -#define CFGR_PLLXTPRE_Mask ((uint32_t)0x00020000) -#define CFGR_SWS_Mask ((uint32_t)0x0000000C) -#define CFGR_SW_Mask ((uint32_t)0xFFFFFFFC) -#define CFGR_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F) -#define CFGR_HPRE_Set_Mask ((uint32_t)0x000000F0) -#define CFGR_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF) -#define CFGR_PPRE1_Set_Mask ((uint32_t)0x00000700) -#define CFGR_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF) -#define CFGR_PPRE2_Set_Mask ((uint32_t)0x00003800) -#define CFGR_ADCPRE_Reset_Mask ((uint32_t)0xFFFF3FFF) -#define CFGR_ADCPRE_Set_Mask ((uint32_t)0x0000C000) - -/* CSR register bit mask */ -#define CSR_RMVF_Set ((uint32_t)0x01000000) - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_CL) -/* CFGR2 register bit mask */ - #define CFGR2_PREDIV1SRC ((uint32_t)0x00010000) - #define CFGR2_PREDIV1 ((uint32_t)0x0000000F) -#endif -#ifdef STM32F10X_CL - #define CFGR2_PREDIV2 ((uint32_t)0x000000F0) - #define CFGR2_PLL2MUL ((uint32_t)0x00000F00) - #define CFGR2_PLL3MUL ((uint32_t)0x0000F000) -#endif /* STM32F10X_CL */ - -/* RCC Flag Mask */ -#define FLAG_Mask ((uint8_t)0x1F) - -#ifndef HSI_Value -/* Typical Value of the HSI in Hz */ - #define HSI_Value ((uint32_t)8000000) -#endif /* HSI_Value */ - -/* CIR register byte 2 (Bits[15:8]) base address */ -#define CIR_BYTE2_ADDRESS ((uint32_t)0x40021009) - -/* CIR register byte 3 (Bits[23:16]) base address */ -#define CIR_BYTE3_ADDRESS ((uint32_t)0x4002100A) - -/* CFGR register byte 4 (Bits[31:24]) base address */ -#define CFGR_BYTE4_ADDRESS ((uint32_t)0x40021007) - -/* BDCR register base address */ -#define BDCR_ADDRESS (PERIPH_BASE + BDCR_OFFSET) - -#ifndef HSEStartUp_TimeOut -/* Time out for HSE start up */ - #define HSEStartUp_TimeOut ((uint16_t)0x0500) -#endif /* HSEStartUp_TimeOut */ - -/** - * @} - */ - -/** @defgroup RCC_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup RCC_Private_Variables - * @{ - */ - -static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; -static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8}; - -/** - * @} - */ - -/** @defgroup RCC_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup RCC_Private_Functions - * @{ - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @param None - * @retval None - */ -void RCC_DeInit(void) -{ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ -#ifndef STM32F10X_CL - RCC->CFGR &= (uint32_t)0xF8FF0000; -#else - RCC->CFGR &= (uint32_t)0xF0FF0000; -#endif /* STM32F10X_CL */ - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ - RCC->CFGR &= (uint32_t)0xFF80FFFF; - -#ifdef STM32F10X_CL - /* Reset PLL2ON and PLL3ON bits */ - RCC->CR &= (uint32_t)0xEBFFFFFF; - - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x00FF0000; - - /* Reset CFGR2 register */ - RCC->CFGR2 = 0x00000000; -#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x009F0000; - - /* Reset CFGR2 register */ - RCC->CFGR2 = 0x00000000; -#else - /* Disable all interrupts and clear pending bits */ - RCC->CIR = 0x009F0000; -#endif /* STM32F10X_CL */ - -} - -/** - * @brief Configures the External High Speed oscillator (HSE). - * @note HSE can not be stopped if it is used directly or through the PLL as system clock. - * @param RCC_HSE: specifies the new state of the HSE. - * This parameter can be one of the following values: - * @arg RCC_HSE_OFF: HSE oscillator OFF - * @arg RCC_HSE_ON: HSE oscillator ON - * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock - * @retval None - */ -void RCC_HSEConfig(uint32_t RCC_HSE) -{ - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_HSE)); - /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ - /* Reset HSEON bit */ - RCC->CR &= CR_HSEON_Reset; - /* Reset HSEBYP bit */ - RCC->CR &= CR_HSEBYP_Reset; - /* Configure HSE (RCC_HSE_OFF is already covered by the code section above) */ - switch(RCC_HSE) - { - case RCC_HSE_ON: - /* Set HSEON bit */ - RCC->CR |= CR_HSEON_Set; - break; - - case RCC_HSE_Bypass: - /* Set HSEBYP and HSEON bits */ - RCC->CR |= CR_HSEBYP_Set | CR_HSEON_Set; - break; - - default: - break; - } -} - -/** - * @brief Waits for HSE start-up. - * @param None - * @retval An ErrorStatus enumuration value: - * - SUCCESS: HSE oscillator is stable and ready to use - * - ERROR: HSE oscillator not yet ready - */ -ErrorStatus RCC_WaitForHSEStartUp(void) -{ - __IO uint32_t StartUpCounter = 0; - ErrorStatus status = ERROR; - FlagStatus HSEStatus = RESET; - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); - StartUpCounter++; - } while((StartUpCounter != HSEStartUp_TimeOut) && (HSEStatus == RESET)); - - if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) - { - status = SUCCESS; - } - else - { - status = ERROR; - } - return (status); -} - -/** - * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. - * @param HSICalibrationValue: specifies the calibration trimming value. - * This parameter must be a number between 0 and 0x1F. - * @retval None - */ -void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_RCC_CALIBRATION_VALUE(HSICalibrationValue)); - tmpreg = RCC->CR; - /* Clear HSITRIM[4:0] bits */ - tmpreg &= CR_HSITRIM_Mask; - /* Set the HSITRIM[4:0] bits according to HSICalibrationValue value */ - tmpreg |= (uint32_t)HSICalibrationValue << 3; - /* Store the new value */ - RCC->CR = tmpreg; -} - -/** - * @brief Enables or disables the Internal High Speed oscillator (HSI). - * @note HSI can not be stopped if it is used directly or through the PLL as system clock. - * @param NewState: new state of the HSI. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_HSICmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CR_HSION_BB = (uint32_t)NewState; -} - -/** - * @brief Configures the PLL clock source and multiplication factor. - * @note This function must be used only when the PLL is disabled. - * @param RCC_PLLSource: specifies the PLL entry clock source. - * For @b STM32_Connectivity_line_devices or @b STM32_Value_line_devices, - * this parameter can be one of the following values: - * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry - * @arg RCC_PLLSource_PREDIV1: PREDIV1 clock selected as PLL clock entry - * For @b other_STM32_devices, this parameter can be one of the following values: - * @arg RCC_PLLSource_HSI_Div2: HSI oscillator clock divided by 2 selected as PLL clock entry - * @arg RCC_PLLSource_HSE_Div1: HSE oscillator clock selected as PLL clock entry - * @arg RCC_PLLSource_HSE_Div2: HSE oscillator clock divided by 2 selected as PLL clock entry - * @param RCC_PLLMul: specifies the PLL multiplication factor. - * For @b STM32_Connectivity_line_devices, this parameter can be RCC_PLLMul_x where x:{[4,9], 6_5} - * For @b other_STM32_devices, this parameter can be RCC_PLLMul_x where x:[2,16] - * @retval None - */ -void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource)); - assert_param(IS_RCC_PLL_MUL(RCC_PLLMul)); - - tmpreg = RCC->CFGR; - /* Clear PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ - tmpreg &= CFGR_PLL_Mask; - /* Set the PLL configuration bits */ - tmpreg |= RCC_PLLSource | RCC_PLLMul; - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Enables or disables the PLL. - * @note The PLL can not be disabled if it is used as system clock. - * @param NewState: new state of the PLL. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_PLLCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CR_PLLON_BB = (uint32_t)NewState; -} - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_CL) -/** - * @brief Configures the PREDIV1 division factor. - * @note - * - This function must be used only when the PLL is disabled. - * - This function applies only to STM32 Connectivity line and Value line - * devices. - * @param RCC_PREDIV1_Source: specifies the PREDIV1 clock source. - * This parameter can be one of the following values: - * @arg RCC_PREDIV1_Source_HSE: HSE selected as PREDIV1 clock - * @arg RCC_PREDIV1_Source_PLL2: PLL2 selected as PREDIV1 clock - * @note - * For @b STM32_Value_line_devices this parameter is always RCC_PREDIV1_Source_HSE - * @param RCC_PREDIV1_Div: specifies the PREDIV1 clock division factor. - * This parameter can be RCC_PREDIV1_Divx where x:[1,16] - * @retval None - */ -void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_PREDIV1_SOURCE(RCC_PREDIV1_Source)); - assert_param(IS_RCC_PREDIV1(RCC_PREDIV1_Div)); - - tmpreg = RCC->CFGR2; - /* Clear PREDIV1[3:0] and PREDIV1SRC bits */ - tmpreg &= ~(CFGR2_PREDIV1 | CFGR2_PREDIV1SRC); - /* Set the PREDIV1 clock source and division factor */ - tmpreg |= RCC_PREDIV1_Source | RCC_PREDIV1_Div ; - /* Store the new value */ - RCC->CFGR2 = tmpreg; -} -#endif - -#ifdef STM32F10X_CL -/** - * @brief Configures the PREDIV2 division factor. - * @note - * - This function must be used only when both PLL2 and PLL3 are disabled. - * - This function applies only to STM32 Connectivity line devices. - * @param RCC_PREDIV2_Div: specifies the PREDIV2 clock division factor. - * This parameter can be RCC_PREDIV2_Divx where x:[1,16] - * @retval None - */ -void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_PREDIV2(RCC_PREDIV2_Div)); - - tmpreg = RCC->CFGR2; - /* Clear PREDIV2[3:0] bits */ - tmpreg &= ~CFGR2_PREDIV2; - /* Set the PREDIV2 division factor */ - tmpreg |= RCC_PREDIV2_Div; - /* Store the new value */ - RCC->CFGR2 = tmpreg; -} - -/** - * @brief Configures the PLL2 multiplication factor. - * @note - * - This function must be used only when the PLL2 is disabled. - * - This function applies only to STM32 Connectivity line devices. - * @param RCC_PLL2Mul: specifies the PLL2 multiplication factor. - * This parameter can be RCC_PLL2Mul_x where x:{[8,14], 16, 20} - * @retval None - */ -void RCC_PLL2Config(uint32_t RCC_PLL2Mul) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_PLL2_MUL(RCC_PLL2Mul)); - - tmpreg = RCC->CFGR2; - /* Clear PLL2Mul[3:0] bits */ - tmpreg &= ~CFGR2_PLL2MUL; - /* Set the PLL2 configuration bits */ - tmpreg |= RCC_PLL2Mul; - /* Store the new value */ - RCC->CFGR2 = tmpreg; -} - - -/** - * @brief Enables or disables the PLL2. - * @note - * - The PLL2 can not be disabled if it is used indirectly as system clock - * (i.e. it is used as PLL clock entry that is used as System clock). - * - This function applies only to STM32 Connectivity line devices. - * @param NewState: new state of the PLL2. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_PLL2Cmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CR_PLL2ON_BB = (uint32_t)NewState; -} - - -/** - * @brief Configures the PLL3 multiplication factor. - * @note - * - This function must be used only when the PLL3 is disabled. - * - This function applies only to STM32 Connectivity line devices. - * @param RCC_PLL3Mul: specifies the PLL3 multiplication factor. - * This parameter can be RCC_PLL3Mul_x where x:{[8,14], 16, 20} - * @retval None - */ -void RCC_PLL3Config(uint32_t RCC_PLL3Mul) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_PLL3_MUL(RCC_PLL3Mul)); - - tmpreg = RCC->CFGR2; - /* Clear PLL3Mul[3:0] bits */ - tmpreg &= ~CFGR2_PLL3MUL; - /* Set the PLL3 configuration bits */ - tmpreg |= RCC_PLL3Mul; - /* Store the new value */ - RCC->CFGR2 = tmpreg; -} - - -/** - * @brief Enables or disables the PLL3. - * @note This function applies only to STM32 Connectivity line devices. - * @param NewState: new state of the PLL3. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_PLL3Cmd(FunctionalState NewState) -{ - /* Check the parameters */ - - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CR_PLL3ON_BB = (uint32_t)NewState; -} -#endif /* STM32F10X_CL */ - -/** - * @brief Configures the system clock (SYSCLK). - * @param RCC_SYSCLKSource: specifies the clock source used as system clock. - * This parameter can be one of the following values: - * @arg RCC_SYSCLKSource_HSI: HSI selected as system clock - * @arg RCC_SYSCLKSource_HSE: HSE selected as system clock - * @arg RCC_SYSCLKSource_PLLCLK: PLL selected as system clock - * @retval None - */ -void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource)); - tmpreg = RCC->CFGR; - /* Clear SW[1:0] bits */ - tmpreg &= CFGR_SW_Mask; - /* Set SW[1:0] bits according to RCC_SYSCLKSource value */ - tmpreg |= RCC_SYSCLKSource; - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Returns the clock source used as system clock. - * @param None - * @retval The clock source used as system clock. The returned value can - * be one of the following: - * - 0x00: HSI used as system clock - * - 0x04: HSE used as system clock - * - 0x08: PLL used as system clock - */ -uint8_t RCC_GetSYSCLKSource(void) -{ - return ((uint8_t)(RCC->CFGR & CFGR_SWS_Mask)); -} - -/** - * @brief Configures the AHB clock (HCLK). - * @param RCC_SYSCLK: defines the AHB clock divider. This clock is derived from - * the system clock (SYSCLK). - * This parameter can be one of the following values: - * @arg RCC_SYSCLK_Div1: AHB clock = SYSCLK - * @arg RCC_SYSCLK_Div2: AHB clock = SYSCLK/2 - * @arg RCC_SYSCLK_Div4: AHB clock = SYSCLK/4 - * @arg RCC_SYSCLK_Div8: AHB clock = SYSCLK/8 - * @arg RCC_SYSCLK_Div16: AHB clock = SYSCLK/16 - * @arg RCC_SYSCLK_Div64: AHB clock = SYSCLK/64 - * @arg RCC_SYSCLK_Div128: AHB clock = SYSCLK/128 - * @arg RCC_SYSCLK_Div256: AHB clock = SYSCLK/256 - * @arg RCC_SYSCLK_Div512: AHB clock = SYSCLK/512 - * @retval None - */ -void RCC_HCLKConfig(uint32_t RCC_SYSCLK) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_RCC_HCLK(RCC_SYSCLK)); - tmpreg = RCC->CFGR; - /* Clear HPRE[3:0] bits */ - tmpreg &= CFGR_HPRE_Reset_Mask; - /* Set HPRE[3:0] bits according to RCC_SYSCLK value */ - tmpreg |= RCC_SYSCLK; - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Configures the Low Speed APB clock (PCLK1). - * @param RCC_HCLK: defines the APB1 clock divider. This clock is derived from - * the AHB clock (HCLK). - * This parameter can be one of the following values: - * @arg RCC_HCLK_Div1: APB1 clock = HCLK - * @arg RCC_HCLK_Div2: APB1 clock = HCLK/2 - * @arg RCC_HCLK_Div4: APB1 clock = HCLK/4 - * @arg RCC_HCLK_Div8: APB1 clock = HCLK/8 - * @arg RCC_HCLK_Div16: APB1 clock = HCLK/16 - * @retval None - */ -void RCC_PCLK1Config(uint32_t RCC_HCLK) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_RCC_PCLK(RCC_HCLK)); - tmpreg = RCC->CFGR; - /* Clear PPRE1[2:0] bits */ - tmpreg &= CFGR_PPRE1_Reset_Mask; - /* Set PPRE1[2:0] bits according to RCC_HCLK value */ - tmpreg |= RCC_HCLK; - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Configures the High Speed APB clock (PCLK2). - * @param RCC_HCLK: defines the APB2 clock divider. This clock is derived from - * the AHB clock (HCLK). - * This parameter can be one of the following values: - * @arg RCC_HCLK_Div1: APB2 clock = HCLK - * @arg RCC_HCLK_Div2: APB2 clock = HCLK/2 - * @arg RCC_HCLK_Div4: APB2 clock = HCLK/4 - * @arg RCC_HCLK_Div8: APB2 clock = HCLK/8 - * @arg RCC_HCLK_Div16: APB2 clock = HCLK/16 - * @retval None - */ -void RCC_PCLK2Config(uint32_t RCC_HCLK) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_RCC_PCLK(RCC_HCLK)); - tmpreg = RCC->CFGR; - /* Clear PPRE2[2:0] bits */ - tmpreg &= CFGR_PPRE2_Reset_Mask; - /* Set PPRE2[2:0] bits according to RCC_HCLK value */ - tmpreg |= RCC_HCLK << 3; - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Enables or disables the specified RCC interrupts. - * @param RCC_IT: specifies the RCC interrupt sources to be enabled or disabled. - * - * For @b STM32_Connectivity_line_devices, this parameter can be any combination - * of the following values - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: PLL ready interrupt - * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt - * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt - * - * For @b other_STM32_devices, this parameter can be any combination of the - * following values - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: PLL ready interrupt - * - * @param NewState: new state of the specified RCC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_IT(RCC_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Perform Byte access to RCC_CIR bits to enable the selected interrupts */ - *(__IO uint8_t *) CIR_BYTE2_ADDRESS |= RCC_IT; - } - else - { - /* Perform Byte access to RCC_CIR bits to disable the selected interrupts */ - *(__IO uint8_t *) CIR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT; - } -} - -#ifndef STM32F10X_CL -/** - * @brief Configures the USB clock (USBCLK). - * @param RCC_USBCLKSource: specifies the USB clock source. This clock is - * derived from the PLL output. - * This parameter can be one of the following values: - * @arg RCC_USBCLKSource_PLLCLK_1Div5: PLL clock divided by 1,5 selected as USB - * clock source - * @arg RCC_USBCLKSource_PLLCLK_Div1: PLL clock selected as USB clock source - * @retval None - */ -void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource) -{ - /* Check the parameters */ - assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource)); - - *(__IO uint32_t *) CFGR_USBPRE_BB = RCC_USBCLKSource; -} -#else -/** - * @brief Configures the USB OTG FS clock (OTGFSCLK). - * This function applies only to STM32 Connectivity line devices. - * @param RCC_OTGFSCLKSource: specifies the USB OTG FS clock source. - * This clock is derived from the PLL output. - * This parameter can be one of the following values: - * @arg RCC_OTGFSCLKSource_PLLVCO_Div3: PLL VCO clock divided by 2 selected as USB OTG FS clock source - * @arg RCC_OTGFSCLKSource_PLLVCO_Div2: PLL VCO clock divided by 2 selected as USB OTG FS clock source - * @retval None - */ -void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource) -{ - /* Check the parameters */ - assert_param(IS_RCC_OTGFSCLK_SOURCE(RCC_OTGFSCLKSource)); - - *(__IO uint32_t *) CFGR_OTGFSPRE_BB = RCC_OTGFSCLKSource; -} -#endif /* STM32F10X_CL */ - -/** - * @brief Configures the ADC clock (ADCCLK). - * @param RCC_PCLK2: defines the ADC clock divider. This clock is derived from - * the APB2 clock (PCLK2). - * This parameter can be one of the following values: - * @arg RCC_PCLK2_Div2: ADC clock = PCLK2/2 - * @arg RCC_PCLK2_Div4: ADC clock = PCLK2/4 - * @arg RCC_PCLK2_Div6: ADC clock = PCLK2/6 - * @arg RCC_PCLK2_Div8: ADC clock = PCLK2/8 - * @retval None - */ -void RCC_ADCCLKConfig(uint32_t RCC_PCLK2) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_RCC_ADCCLK(RCC_PCLK2)); - tmpreg = RCC->CFGR; - /* Clear ADCPRE[1:0] bits */ - tmpreg &= CFGR_ADCPRE_Reset_Mask; - /* Set ADCPRE[1:0] bits according to RCC_PCLK2 value */ - tmpreg |= RCC_PCLK2; - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -#ifdef STM32F10X_CL -/** - * @brief Configures the I2S2 clock source(I2S2CLK). - * @note - * - This function must be called before enabling I2S2 APB clock. - * - This function applies only to STM32 Connectivity line devices. - * @param RCC_I2S2CLKSource: specifies the I2S2 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2S2CLKSource_SYSCLK: system clock selected as I2S2 clock entry - * @arg RCC_I2S2CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S2 clock entry - * @retval None - */ -void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource) -{ - /* Check the parameters */ - assert_param(IS_RCC_I2S2CLK_SOURCE(RCC_I2S2CLKSource)); - - *(__IO uint32_t *) CFGR2_I2S2SRC_BB = RCC_I2S2CLKSource; -} - -/** - * @brief Configures the I2S3 clock source(I2S2CLK). - * @note - * - This function must be called before enabling I2S3 APB clock. - * - This function applies only to STM32 Connectivity line devices. - * @param RCC_I2S3CLKSource: specifies the I2S3 clock source. - * This parameter can be one of the following values: - * @arg RCC_I2S3CLKSource_SYSCLK: system clock selected as I2S3 clock entry - * @arg RCC_I2S3CLKSource_PLL3_VCO: PLL3 VCO clock selected as I2S3 clock entry - * @retval None - */ -void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource) -{ - /* Check the parameters */ - assert_param(IS_RCC_I2S3CLK_SOURCE(RCC_I2S3CLKSource)); - - *(__IO uint32_t *) CFGR2_I2S3SRC_BB = RCC_I2S3CLKSource; -} -#endif /* STM32F10X_CL */ - -/** - * @brief Configures the External Low Speed oscillator (LSE). - * @param RCC_LSE: specifies the new state of the LSE. - * This parameter can be one of the following values: - * @arg RCC_LSE_OFF: LSE oscillator OFF - * @arg RCC_LSE_ON: LSE oscillator ON - * @arg RCC_LSE_Bypass: LSE oscillator bypassed with external clock - * @retval None - */ -void RCC_LSEConfig(uint8_t RCC_LSE) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_LSE)); - /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/ - /* Reset LSEON bit */ - *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; - /* Reset LSEBYP bit */ - *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; - /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */ - switch(RCC_LSE) - { - case RCC_LSE_ON: - /* Set LSEON bit */ - *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON; - break; - - case RCC_LSE_Bypass: - /* Set LSEBYP and LSEON bits */ - *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON; - break; - - default: - break; - } -} - -/** - * @brief Enables or disables the Internal Low Speed oscillator (LSI). - * @note LSI can not be disabled if the IWDG is running. - * @param NewState: new state of the LSI. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_LSICmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState; -} - -/** - * @brief Configures the RTC clock (RTCCLK). - * @note Once the RTC clock is selected it can’t be changed unless the Backup domain is reset. - * @param RCC_RTCCLKSource: specifies the RTC clock source. - * This parameter can be one of the following values: - * @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock - * @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock - * @arg RCC_RTCCLKSource_HSE_Div128: HSE clock divided by 128 selected as RTC clock - * @retval None - */ -void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource) -{ - /* Check the parameters */ - assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource)); - /* Select the RTC clock source */ - RCC->BDCR |= RCC_RTCCLKSource; -} - -/** - * @brief Enables or disables the RTC clock. - * @note This function must be used only after the RTC clock was selected using the RCC_RTCCLKConfig function. - * @param NewState: new state of the RTC clock. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_RTCCLKCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState; -} - -/** - * @brief Returns the frequencies of different on chip clocks. - * @param RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold - * the clocks frequencies. - * @retval None - */ -void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) -{ - uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0; - -#ifdef STM32F10X_CL - uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0; -#endif /* STM32F10X_CL */ - -#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - uint32_t prediv1factor = 0; -#endif - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & CFGR_SWS_Mask; - - switch (tmp) - { - case 0x00: /* HSI used as system clock */ - RCC_Clocks->SYSCLK_Frequency = HSI_Value; - break; - case 0x04: /* HSE used as system clock */ - RCC_Clocks->SYSCLK_Frequency = HSE_Value; - break; - case 0x08: /* PLL used as system clock */ - - /* Get PLL clock source and multiplication factor ----------------------*/ - pllmull = RCC->CFGR & CFGR_PLLMull_Mask; - pllsource = RCC->CFGR & CFGR_PLLSRC_Mask; - -#ifndef STM32F10X_CL - pllmull = ( pllmull >> 18) + 2; - - if (pllsource == 0x00) - {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ - RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull; - } - else - { - #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) - prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1; - /* HSE oscillator clock selected as PREDIV1 clock entry */ - RCC_Clocks->SYSCLK_Frequency = (HSE_Value / prediv1factor) * pllmull; - #else - /* HSE selected as PLL clock entry */ - if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (uint32_t)RESET) - {/* HSE oscillator clock divided by 2 */ - RCC_Clocks->SYSCLK_Frequency = (HSE_Value >> 1) * pllmull; - } - else - { - RCC_Clocks->SYSCLK_Frequency = HSE_Value * pllmull; - } - #endif - } -#else - pllmull = pllmull >> 18; - - if (pllmull != 0x0D) - { - pllmull += 2; - } - else - { /* PLL multiplication factor = PLL input clock * 6.5 */ - pllmull = 13 / 2; - } - - if (pllsource == 0x00) - {/* HSI oscillator clock divided by 2 selected as PLL clock entry */ - RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) * pllmull; - } - else - {/* PREDIV1 selected as PLL clock entry */ - - /* Get PREDIV1 clock source and division factor */ - prediv1source = RCC->CFGR2 & CFGR2_PREDIV1SRC; - prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1; - - if (prediv1source == 0) - { /* HSE oscillator clock selected as PREDIV1 clock entry */ - RCC_Clocks->SYSCLK_Frequency = (HSE_Value / prediv1factor) * pllmull; - } - else - {/* PLL2 clock selected as PREDIV1 clock entry */ - - /* Get PREDIV2 division factor and PLL2 multiplication factor */ - prediv2factor = ((RCC->CFGR2 & CFGR2_PREDIV2) >> 4) + 1; - pll2mull = ((RCC->CFGR2 & CFGR2_PLL2MUL) >> 8 ) + 2; - RCC_Clocks->SYSCLK_Frequency = (((HSE_Value / prediv2factor) * pll2mull) / prediv1factor) * pllmull; - } - } -#endif /* STM32F10X_CL */ - break; - - default: - RCC_Clocks->SYSCLK_Frequency = HSI_Value; - break; - } - - /* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/ - /* Get HCLK prescaler */ - tmp = RCC->CFGR & CFGR_HPRE_Set_Mask; - tmp = tmp >> 4; - presc = APBAHBPrescTable[tmp]; - /* HCLK clock frequency */ - RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; - /* Get PCLK1 prescaler */ - tmp = RCC->CFGR & CFGR_PPRE1_Set_Mask; - tmp = tmp >> 8; - presc = APBAHBPrescTable[tmp]; - /* PCLK1 clock frequency */ - RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; - /* Get PCLK2 prescaler */ - tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask; - tmp = tmp >> 11; - presc = APBAHBPrescTable[tmp]; - /* PCLK2 clock frequency */ - RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; - /* Get ADCCLK prescaler */ - tmp = RCC->CFGR & CFGR_ADCPRE_Set_Mask; - tmp = tmp >> 14; - presc = ADCPrescTable[tmp]; - /* ADCCLK clock frequency */ - RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; -} - -/** - * @brief Enables or disables the AHB peripheral clock. - * @param RCC_AHBPeriph: specifies the AHB peripheral to gates its clock. - * - * For @b STM32_Connectivity_line_devices, this parameter can be any combination - * of the following values: - * @arg RCC_AHBPeriph_DMA1 - * @arg RCC_AHBPeriph_DMA2 - * @arg RCC_AHBPeriph_SRAM - * @arg RCC_AHBPeriph_FLITF - * @arg RCC_AHBPeriph_CRC - * @arg RCC_AHBPeriph_OTG_FS - * @arg RCC_AHBPeriph_ETH_MAC - * @arg RCC_AHBPeriph_ETH_MAC_Tx - * @arg RCC_AHBPeriph_ETH_MAC_Rx - * - * For @b other_STM32_devices, this parameter can be any combination of the - * following values: - * @arg RCC_AHBPeriph_DMA1 - * @arg RCC_AHBPeriph_DMA2 - * @arg RCC_AHBPeriph_SRAM - * @arg RCC_AHBPeriph_FLITF - * @arg RCC_AHBPeriph_CRC - * @arg RCC_AHBPeriph_FSMC - * @arg RCC_AHBPeriph_SDIO - * - * @note SRAM and FLITF clock can be disabled only during sleep mode. - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->AHBENR |= RCC_AHBPeriph; - } - else - { - RCC->AHBENR &= ~RCC_AHBPeriph; - } -} - -/** - * @brief Enables or disables the High Speed APB (APB2) peripheral clock. - * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, - * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, - * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, - * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, - * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, - * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17 - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->APB2ENR |= RCC_APB2Periph; - } - else - { - RCC->APB2ENR &= ~RCC_APB2Periph; - } -} - -/** - * @brief Enables or disables the Low Speed APB (APB1) peripheral clock. - * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, - * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, - * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, - * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, - * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, - * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, - * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->APB1ENR |= RCC_APB1Periph; - } - else - { - RCC->APB1ENR &= ~RCC_APB1Periph; - } -} - -#ifdef STM32F10X_CL -/** - * @brief Forces or releases AHB peripheral reset. - * @note This function applies only to STM32 Connectivity line devices. - * @param RCC_AHBPeriph: specifies the AHB peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_AHBPeriph_OTG_FS - * @arg RCC_AHBPeriph_ETH_MAC - * @param NewState: new state of the specified peripheral reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB_PERIPH_RESET(RCC_AHBPeriph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->AHBRSTR |= RCC_AHBPeriph; - } - else - { - RCC->AHBRSTR &= ~RCC_AHBPeriph; - } -} -#endif /* STM32F10X_CL */ - -/** - * @brief Forces or releases High Speed APB (APB2) peripheral reset. - * @param RCC_APB2Periph: specifies the APB2 peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, - * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, - * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, - * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, - * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3 - * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17 - * @param NewState: new state of the specified peripheral reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->APB2RSTR |= RCC_APB2Periph; - } - else - { - RCC->APB2RSTR &= ~RCC_APB2Periph; - } -} - -/** - * @brief Forces or releases Low Speed APB (APB1) peripheral reset. - * @param RCC_APB1Periph: specifies the APB1 peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, - * RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, - * RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, - * RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, - * RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, - * RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, - * RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->APB1RSTR |= RCC_APB1Periph; - } - else - { - RCC->APB1RSTR &= ~RCC_APB1Periph; - } -} - -/** - * @brief Forces or releases the Backup domain reset. - * @param NewState: new state of the Backup domain reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_BackupResetCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) BDCR_BDRST_BB = (uint32_t)NewState; -} - -/** - * @brief Enables or disables the Clock Security System. - * @param NewState: new state of the Clock Security System.. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_ClockSecuritySystemCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CR_CSSON_BB = (uint32_t)NewState; -} - -/** - * @brief Selects the clock source to output on MCO pin. - * @param RCC_MCO: specifies the clock source to output. - * - * For @b STM32_Connectivity_line_devices, this parameter can be one of the - * following values: - * @arg RCC_MCO_NoClock: No clock selected - * @arg RCC_MCO_SYSCLK: System clock selected - * @arg RCC_MCO_HSI: HSI oscillator clock selected - * @arg RCC_MCO_HSE: HSE oscillator clock selected - * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected - * @arg RCC_MCO_PLL2CLK: PLL2 clock selected - * @arg RCC_MCO_PLL3CLK_Div2: PLL3 clock divided by 2 selected - * @arg RCC_MCO_XT1: External 3-25 MHz oscillator clock selected - * @arg RCC_MCO_PLL3CLK: PLL3 clock selected - * - * For @b other_STM32_devices, this parameter can be one of the following values: - * @arg RCC_MCO_NoClock: No clock selected - * @arg RCC_MCO_SYSCLK: System clock selected - * @arg RCC_MCO_HSI: HSI oscillator clock selected - * @arg RCC_MCO_HSE: HSE oscillator clock selected - * @arg RCC_MCO_PLLCLK_Div2: PLL clock divided by 2 selected - * - * @retval None - */ -void RCC_MCOConfig(uint8_t RCC_MCO) -{ - /* Check the parameters */ - assert_param(IS_RCC_MCO(RCC_MCO)); - - /* Perform Byte access to MCO bits to select the MCO source */ - *(__IO uint8_t *) CFGR_BYTE4_ADDRESS = RCC_MCO; -} - -/** - * @brief Checks whether the specified RCC flag is set or not. - * @param RCC_FLAG: specifies the flag to check. - * - * For @b STM32_Connectivity_line_devices, this parameter can be one of the - * following values: - * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready - * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready - * @arg RCC_FLAG_PLLRDY: PLL clock ready - * @arg RCC_FLAG_PLL2RDY: PLL2 clock ready - * @arg RCC_FLAG_PLL3RDY: PLL3 clock ready - * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready - * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready - * @arg RCC_FLAG_PINRST: Pin reset - * @arg RCC_FLAG_PORRST: POR/PDR reset - * @arg RCC_FLAG_SFTRST: Software reset - * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset - * @arg RCC_FLAG_WWDGRST: Window Watchdog reset - * @arg RCC_FLAG_LPWRRST: Low Power reset - * - * For @b other_STM32_devices, this parameter can be one of the following values: - * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready - * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready - * @arg RCC_FLAG_PLLRDY: PLL clock ready - * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready - * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready - * @arg RCC_FLAG_PINRST: Pin reset - * @arg RCC_FLAG_PORRST: POR/PDR reset - * @arg RCC_FLAG_SFTRST: Software reset - * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset - * @arg RCC_FLAG_WWDGRST: Window Watchdog reset - * @arg RCC_FLAG_LPWRRST: Low Power reset - * - * @retval The new state of RCC_FLAG (SET or RESET). - */ -FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) -{ - uint32_t tmp = 0; - uint32_t statusreg = 0; - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_RCC_FLAG(RCC_FLAG)); - - /* Get the RCC register index */ - tmp = RCC_FLAG >> 5; - if (tmp == 1) /* The flag to check is in CR register */ - { - statusreg = RCC->CR; - } - else if (tmp == 2) /* The flag to check is in BDCR register */ - { - statusreg = RCC->BDCR; - } - else /* The flag to check is in CSR register */ - { - statusreg = RCC->CSR; - } - - /* Get the flag position */ - tmp = RCC_FLAG & FLAG_Mask; - if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - - /* Return the flag status */ - return bitstatus; -} - -/** - * @brief Clears the RCC reset flags. - * @note The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, - * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST - * @param None - * @retval None - */ -void RCC_ClearFlag(void) -{ - /* Set RMVF bit to clear the reset flags */ - RCC->CSR |= CSR_RMVF_Set; -} - -/** - * @brief Checks whether the specified RCC interrupt has occurred or not. - * @param RCC_IT: specifies the RCC interrupt source to check. - * - * For @b STM32_Connectivity_line_devices, this parameter can be one of the - * following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: PLL ready interrupt - * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt - * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt - * @arg RCC_IT_CSS: Clock Security System interrupt - * - * For @b other_STM32_devices, this parameter can be one of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: PLL ready interrupt - * @arg RCC_IT_CSS: Clock Security System interrupt - * - * @retval The new state of RCC_IT (SET or RESET). - */ -ITStatus RCC_GetITStatus(uint8_t RCC_IT) -{ - ITStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_RCC_GET_IT(RCC_IT)); - - /* Check the status of the specified RCC interrupt */ - if ((RCC->CIR & RCC_IT) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - - /* Return the RCC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the RCC’s interrupt pending bits. - * @param RCC_IT: specifies the interrupt pending bit to clear. - * - * For @b STM32_Connectivity_line_devices, this parameter can be any combination - * of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: PLL ready interrupt - * @arg RCC_IT_PLL2RDY: PLL2 ready interrupt - * @arg RCC_IT_PLL3RDY: PLL3 ready interrupt - * @arg RCC_IT_CSS: Clock Security System interrupt - * - * For @b other_STM32_devices, this parameter can be any combination of the - * following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: PLL ready interrupt - * - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval None - */ -void RCC_ClearITPendingBit(uint8_t RCC_IT) -{ - /* Check the parameters */ - assert_param(IS_RCC_CLEAR_IT(RCC_IT)); - - /* Perform Byte access to RCC_CIR[23:16] bits to clear the selected interrupt - pending bits */ - *(__IO uint8_t *) CIR_BYTE3_ADDRESS = RCC_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c deleted file mode 100644 index 559e3de300..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c +++ /dev/null @@ -1,341 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_rtc.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the RTC firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_rtc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup RTC - * @brief RTC driver modules - * @{ - */ - -/** @defgroup RTC_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup RTC_Private_Defines - * @{ - */ - -#define CRL_CNF_Set ((uint16_t)0x0010) /*!< Configuration Flag Enable Mask */ -#define CRL_CNF_Reset ((uint16_t)0xFFEF) /*!< Configuration Flag Disable Mask */ -#define RTC_LSB_Mask ((uint32_t)0x0000FFFF) /*!< RTC LSB Mask */ -#define PRLH_MSB_Mask ((uint32_t)0x000F0000) /*!< RTC Prescaler MSB Mask */ - -/** - * @} - */ - -/** @defgroup RTC_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup RTC_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup RTC_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup RTC_Private_Functions - * @{ - */ - -/** - * @brief Enables or disables the specified RTC interrupts. - * @param RTC_IT: specifies the RTC interrupts sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg RTC_IT_OW: Overflow interrupt - * @arg RTC_IT_ALR: Alarm interrupt - * @arg RTC_IT_SEC: Second interrupt - * @param NewState: new state of the specified RTC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RTC_IT(RTC_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RTC->CRH |= RTC_IT; - } - else - { - RTC->CRH &= (uint16_t)~RTC_IT; - } -} - -/** - * @brief Enters the RTC configuration mode. - * @param None - * @retval None - */ -void RTC_EnterConfigMode(void) -{ - /* Set the CNF flag to enter in the Configuration Mode */ - RTC->CRL |= CRL_CNF_Set; -} - -/** - * @brief Exits from the RTC configuration mode. - * @param None - * @retval None - */ -void RTC_ExitConfigMode(void) -{ - /* Reset the CNF flag to exit from the Configuration Mode */ - RTC->CRL &= CRL_CNF_Reset; -} - -/** - * @brief Gets the RTC counter value. - * @param None - * @retval RTC counter value. - */ -uint32_t RTC_GetCounter(void) -{ - uint16_t tmp = 0; - tmp = RTC->CNTL; - return (((uint32_t)RTC->CNTH << 16 ) | tmp) ; -} - -/** - * @brief Sets the RTC counter value. - * @param CounterValue: RTC counter new value. - * @retval None - */ -void RTC_SetCounter(uint32_t CounterValue) -{ - RTC_EnterConfigMode(); - /* Set RTC COUNTER MSB word */ - RTC->CNTH = CounterValue >> 16; - /* Set RTC COUNTER LSB word */ - RTC->CNTL = (CounterValue & RTC_LSB_Mask); - RTC_ExitConfigMode(); -} - -/** - * @brief Sets the RTC prescaler value. - * @param PrescalerValue: RTC prescaler new value. - * @retval None - */ -void RTC_SetPrescaler(uint32_t PrescalerValue) -{ - /* Check the parameters */ - assert_param(IS_RTC_PRESCALER(PrescalerValue)); - - RTC_EnterConfigMode(); - /* Set RTC PRESCALER MSB word */ - RTC->PRLH = (PrescalerValue & PRLH_MSB_Mask) >> 16; - /* Set RTC PRESCALER LSB word */ - RTC->PRLL = (PrescalerValue & RTC_LSB_Mask); - RTC_ExitConfigMode(); -} - -/** - * @brief Sets the RTC alarm value. - * @param AlarmValue: RTC alarm new value. - * @retval None - */ -void RTC_SetAlarm(uint32_t AlarmValue) -{ - RTC_EnterConfigMode(); - /* Set the ALARM MSB word */ - RTC->ALRH = AlarmValue >> 16; - /* Set the ALARM LSB word */ - RTC->ALRL = (AlarmValue & RTC_LSB_Mask); - RTC_ExitConfigMode(); -} - -/** - * @brief Gets the RTC divider value. - * @param None - * @retval RTC Divider value. - */ -uint32_t RTC_GetDivider(void) -{ - uint32_t tmp = 0x00; - tmp = ((uint32_t)RTC->DIVH & (uint32_t)0x000F) << 16; - tmp |= RTC->DIVL; - return tmp; -} - -/** - * @brief Waits until last write operation on RTC registers has finished. - * @note This function must be called before any write to RTC registers. - * @param None - * @retval None - */ -void RTC_WaitForLastTask(void) -{ - /* Loop until RTOFF flag is set */ - while ((RTC->CRL & RTC_FLAG_RTOFF) == (uint16_t)RESET) - { - } -} - -/** - * @brief Waits until the RTC registers (RTC_CNT, RTC_ALR and RTC_PRL) - * are synchronized with RTC APB clock. - * @note This function must be called before any read operation after an APB reset - * or an APB clock stop. - * @param None - * @retval None - */ -void RTC_WaitForSynchro(void) -{ - /* Clear RSF flag */ - RTC->CRL &= (uint16_t)~RTC_FLAG_RSF; - /* Loop until RSF flag is set */ - while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET) - { - } -} - -/** - * @brief Checks whether the specified RTC flag is set or not. - * @param RTC_FLAG: specifies the flag to check. - * This parameter can be one the following values: - * @arg RTC_FLAG_RTOFF: RTC Operation OFF flag - * @arg RTC_FLAG_RSF: Registers Synchronized flag - * @arg RTC_FLAG_OW: Overflow flag - * @arg RTC_FLAG_ALR: Alarm flag - * @arg RTC_FLAG_SEC: Second flag - * @retval The new state of RTC_FLAG (SET or RESET). - */ -FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG) -{ - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_RTC_GET_FLAG(RTC_FLAG)); - - if ((RTC->CRL & RTC_FLAG) != (uint16_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the RTC’s pending flags. - * @param RTC_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg RTC_FLAG_RSF: Registers Synchronized flag. This flag is cleared only after - * an APB reset or an APB Clock stop. - * @arg RTC_FLAG_OW: Overflow flag - * @arg RTC_FLAG_ALR: Alarm flag - * @arg RTC_FLAG_SEC: Second flag - * @retval None - */ -void RTC_ClearFlag(uint16_t RTC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_RTC_CLEAR_FLAG(RTC_FLAG)); - - /* Clear the coressponding RTC flag */ - RTC->CRL &= (uint16_t)~RTC_FLAG; -} - -/** - * @brief Checks whether the specified RTC interrupt has occured or not. - * @param RTC_IT: specifies the RTC interrupts sources to check. - * This parameter can be one of the following values: - * @arg RTC_IT_OW: Overflow interrupt - * @arg RTC_IT_ALR: Alarm interrupt - * @arg RTC_IT_SEC: Second interrupt - * @retval The new state of the RTC_IT (SET or RESET). - */ -ITStatus RTC_GetITStatus(uint16_t RTC_IT) -{ - ITStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_RTC_GET_IT(RTC_IT)); - - bitstatus = (ITStatus)(RTC->CRL & RTC_IT); - if (((RTC->CRH & RTC_IT) != (uint16_t)RESET) && (bitstatus != (uint16_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the RTC’s interrupt pending bits. - * @param RTC_IT: specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RTC_IT_OW: Overflow interrupt - * @arg RTC_IT_ALR: Alarm interrupt - * @arg RTC_IT_SEC: Second interrupt - * @retval None - */ -void RTC_ClearITPendingBit(uint16_t RTC_IT) -{ - /* Check the parameters */ - assert_param(IS_RTC_IT(RTC_IT)); - - /* Clear the coressponding RTC pending bit */ - RTC->CRL &= (uint16_t)~RTC_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c deleted file mode 100644 index 46868b3655..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c +++ /dev/null @@ -1,798 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_sdio.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the SDIO firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_sdio.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup SDIO - * @brief SDIO driver modules - * @{ - */ - -/** @defgroup SDIO_Private_TypesDefinitions - * @{ - */ - -/* ------------ SDIO registers bit address in the alias region ----------- */ -#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) - -/* --- CLKCR Register ---*/ - -/* Alias word address of CLKEN bit */ -#define CLKCR_OFFSET (SDIO_OFFSET + 0x04) -#define CLKEN_BitNumber 0x08 -#define CLKCR_CLKEN_BB (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4)) - -/* --- CMD Register ---*/ - -/* Alias word address of SDIOSUSPEND bit */ -#define CMD_OFFSET (SDIO_OFFSET + 0x0C) -#define SDIOSUSPEND_BitNumber 0x0B -#define CMD_SDIOSUSPEND_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4)) - -/* Alias word address of ENCMDCOMPL bit */ -#define ENCMDCOMPL_BitNumber 0x0C -#define CMD_ENCMDCOMPL_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4)) - -/* Alias word address of NIEN bit */ -#define NIEN_BitNumber 0x0D -#define CMD_NIEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4)) - -/* Alias word address of ATACMD bit */ -#define ATACMD_BitNumber 0x0E -#define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4)) - -/* --- DCTRL Register ---*/ - -/* Alias word address of DMAEN bit */ -#define DCTRL_OFFSET (SDIO_OFFSET + 0x2C) -#define DMAEN_BitNumber 0x03 -#define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4)) - -/* Alias word address of RWSTART bit */ -#define RWSTART_BitNumber 0x08 -#define DCTRL_RWSTART_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4)) - -/* Alias word address of RWSTOP bit */ -#define RWSTOP_BitNumber 0x09 -#define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4)) - -/* Alias word address of RWMOD bit */ -#define RWMOD_BitNumber 0x0A -#define DCTRL_RWMOD_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4)) - -/* Alias word address of SDIOEN bit */ -#define SDIOEN_BitNumber 0x0B -#define DCTRL_SDIOEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4)) - -/* ---------------------- SDIO registers bit mask ------------------------ */ - -/* --- CLKCR Register ---*/ - -/* CLKCR register clear mask */ -#define CLKCR_CLEAR_MASK ((uint32_t)0xFFFF8100) - -/* --- PWRCTRL Register ---*/ - -/* SDIO PWRCTRL Mask */ -#define PWR_PWRCTRL_MASK ((uint32_t)0xFFFFFFFC) - -/* --- DCTRL Register ---*/ - -/* SDIO DCTRL Clear Mask */ -#define DCTRL_CLEAR_MASK ((uint32_t)0xFFFFFF08) - -/* --- CMD Register ---*/ - -/* CMD Register clear mask */ -#define CMD_CLEAR_MASK ((uint32_t)0xFFFFF800) - -/* SDIO RESP Registers Address */ -#define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14)) - -/** - * @} - */ - -/** @defgroup SDIO_Private_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup SDIO_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup SDIO_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup SDIO_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup SDIO_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the SDIO peripheral registers to their default reset values. - * @param None - * @retval None - */ -void SDIO_DeInit(void) -{ - SDIO->POWER = 0x00000000; - SDIO->CLKCR = 0x00000000; - SDIO->ARG = 0x00000000; - SDIO->CMD = 0x00000000; - SDIO->DTIMER = 0x00000000; - SDIO->DLEN = 0x00000000; - SDIO->DCTRL = 0x00000000; - SDIO->ICR = 0x00C007FF; - SDIO->MASK = 0x00000000; -} - -/** - * @brief Initializes the SDIO peripheral according to the specified - * parameters in the SDIO_InitStruct. - * @param SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure - * that contains the configuration information for the SDIO peripheral. - * @retval None - */ -void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge)); - assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass)); - assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave)); - assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide)); - assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl)); - -/*---------------------------- SDIO CLKCR Configuration ------------------------*/ - /* Get the SDIO CLKCR value */ - tmpreg = SDIO->CLKCR; - - /* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits */ - tmpreg &= CLKCR_CLEAR_MASK; - - /* Set CLKDIV bits according to SDIO_ClockDiv value */ - /* Set PWRSAV bit according to SDIO_ClockPowerSave value */ - /* Set BYPASS bit according to SDIO_ClockBypass value */ - /* Set WIDBUS bits according to SDIO_BusWide value */ - /* Set NEGEDGE bits according to SDIO_ClockEdge value */ - /* Set HWFC_EN bits according to SDIO_HardwareFlowControl value */ - tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv | SDIO_InitStruct->SDIO_ClockPowerSave | - SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide | - SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl); - - /* Write to SDIO CLKCR */ - SDIO->CLKCR = tmpreg; -} - -/** - * @brief Fills each SDIO_InitStruct member with its default value. - * @param SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which - * will be initialized. - * @retval None - */ -void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct) -{ - /* SDIO_InitStruct members default value */ - SDIO_InitStruct->SDIO_ClockDiv = 0x00; - SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising; - SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable; - SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; - SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b; - SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; -} - -/** - * @brief Enables or disables the SDIO Clock. - * @param NewState: new state of the SDIO Clock. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_ClockCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState; -} - -/** - * @brief Sets the power status of the controller. - * @param SDIO_PowerState: new state of the Power state. - * This parameter can be one of the following values: - * @arg SDIO_PowerState_OFF - * @arg SDIO_PowerState_ON - * @retval None - */ -void SDIO_SetPowerState(uint32_t SDIO_PowerState) -{ - /* Check the parameters */ - assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState)); - - SDIO->POWER &= PWR_PWRCTRL_MASK; - SDIO->POWER |= SDIO_PowerState; -} - -/** - * @brief Gets the power status of the controller. - * @param None - * @retval Power status of the controller. The returned value can - * be one of the following: - * - 0x00: Power OFF - * - 0x02: Power UP - * - 0x03: Power ON - */ -uint32_t SDIO_GetPowerState(void) -{ - return (SDIO->POWER & (~PWR_PWRCTRL_MASK)); -} - -/** - * @brief Enables or disables the SDIO interrupts. - * @param SDIO_IT: specifies the SDIO interrupt sources to be enabled or disabled. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @param NewState: new state of the specified SDIO interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SDIO_IT(SDIO_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the SDIO interrupts */ - SDIO->MASK |= SDIO_IT; - } - else - { - /* Disable the SDIO interrupts */ - SDIO->MASK &= ~SDIO_IT; - } -} - -/** - * @brief Enables or disables the SDIO DMA request. - * @param NewState: new state of the selected SDIO DMA request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_DMACmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState; -} - -/** - * @brief Initializes the SDIO Command according to the specified - * parameters in the SDIO_CmdInitStruct and send the command. - * @param SDIO_CmdInitStruct : pointer to a SDIO_CmdInitTypeDef - * structure that contains the configuration information for the SDIO command. - * @retval None - */ -void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex)); - assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response)); - assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait)); - assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM)); - -/*---------------------------- SDIO ARG Configuration ------------------------*/ - /* Set the SDIO Argument value */ - SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument; - -/*---------------------------- SDIO CMD Configuration ------------------------*/ - /* Get the SDIO CMD value */ - tmpreg = SDIO->CMD; - /* Clear CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN bits */ - tmpreg &= CMD_CLEAR_MASK; - /* Set CMDINDEX bits according to SDIO_CmdIndex value */ - /* Set WAITRESP bits according to SDIO_Response value */ - /* Set WAITINT and WAITPEND bits according to SDIO_Wait value */ - /* Set CPSMEN bits according to SDIO_CPSM value */ - tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response - | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM; - - /* Write to SDIO CMD */ - SDIO->CMD = tmpreg; -} - -/** - * @brief Fills each SDIO_CmdInitStruct member with its default value. - * @param SDIO_CmdInitStruct: pointer to an SDIO_CmdInitTypeDef - * structure which will be initialized. - * @retval None - */ -void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct) -{ - /* SDIO_CmdInitStruct members default value */ - SDIO_CmdInitStruct->SDIO_Argument = 0x00; - SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00; - SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No; - SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable; -} - -/** - * @brief Returns command index of last command for which response received. - * @param None - * @retval Returns the command index of the last command response received. - */ -uint8_t SDIO_GetCommandResponse(void) -{ - return (uint8_t)(SDIO->RESPCMD); -} - -/** - * @brief Returns response received from the card for the last command. - * @param SDIO_RESP: Specifies the SDIO response register. - * This parameter can be one of the following values: - * @arg SDIO_RESP1: Response Register 1 - * @arg SDIO_RESP2: Response Register 2 - * @arg SDIO_RESP3: Response Register 3 - * @arg SDIO_RESP4: Response Register 4 - * @retval The Corresponding response register value. - */ -uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_RESP(SDIO_RESP)); - - tmp = SDIO_RESP_ADDR + SDIO_RESP; - - return (*(__IO uint32_t *) tmp); -} - -/** - * @brief Initializes the SDIO data path according to the specified - * parameters in the SDIO_DataInitStruct. - * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure that - * contains the configuration information for the SDIO command. - * @retval None - */ -void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength)); - assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize)); - assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir)); - assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode)); - assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM)); - -/*---------------------------- SDIO DTIMER Configuration ---------------------*/ - /* Set the SDIO Data TimeOut value */ - SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut; - -/*---------------------------- SDIO DLEN Configuration -----------------------*/ - /* Set the SDIO DataLength value */ - SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength; - -/*---------------------------- SDIO DCTRL Configuration ----------------------*/ - /* Get the SDIO DCTRL value */ - tmpreg = SDIO->DCTRL; - /* Clear DEN, DTMODE, DTDIR and DBCKSIZE bits */ - tmpreg &= DCTRL_CLEAR_MASK; - /* Set DEN bit according to SDIO_DPSM value */ - /* Set DTMODE bit according to SDIO_TransferMode value */ - /* Set DTDIR bit according to SDIO_TransferDir value */ - /* Set DBCKSIZE bits according to SDIO_DataBlockSize value */ - tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir - | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM; - - /* Write to SDIO DCTRL */ - SDIO->DCTRL = tmpreg; -} - -/** - * @brief Fills each SDIO_DataInitStruct member with its default value. - * @param SDIO_DataInitStruct: pointer to an SDIO_DataInitTypeDef structure which - * will be initialized. - * @retval None - */ -void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct) -{ - /* SDIO_DataInitStruct members default value */ - SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF; - SDIO_DataInitStruct->SDIO_DataLength = 0x00; - SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b; - SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard; - SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable; -} - -/** - * @brief Returns number of remaining data bytes to be transferred. - * @param None - * @retval Number of remaining data bytes to be transferred - */ -uint32_t SDIO_GetDataCounter(void) -{ - return SDIO->DCOUNT; -} - -/** - * @brief Read one data word from Rx FIFO. - * @param None - * @retval Data received - */ -uint32_t SDIO_ReadData(void) -{ - return SDIO->FIFO; -} - -/** - * @brief Write one data word to Tx FIFO. - * @param Data: 32-bit data word to write. - * @retval None - */ -void SDIO_WriteData(uint32_t Data) -{ - SDIO->FIFO = Data; -} - -/** - * @brief Returns the number of words left to be written to or read from FIFO. - * @param None - * @retval Remaining number of words. - */ -uint32_t SDIO_GetFIFOCount(void) -{ - return SDIO->FIFOCNT; -} - -/** - * @brief Starts the SD I/O Read Wait operation. - * @param NewState: new state of the Start SDIO Read Wait operation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_StartSDIOReadWait(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) DCTRL_RWSTART_BB = (uint32_t) NewState; -} - -/** - * @brief Stops the SD I/O Read Wait operation. - * @param NewState: new state of the Stop SDIO Read Wait operation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_StopSDIOReadWait(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) NewState; -} - -/** - * @brief Sets one of the two options of inserting read wait interval. - * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode. - * This parametre can be: - * @arg SDIO_ReadWaitMode_CLK: Read Wait control by stopping SDIOCLK - * @arg SDIO_ReadWaitMode_DATA2: Read Wait control using SDIO_DATA2 - * @retval None - */ -void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) -{ - /* Check the parameters */ - assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode)); - - *(__IO uint32_t *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode; -} - -/** - * @brief Enables or disables the SD I/O Mode Operation. - * @param NewState: new state of SDIO specific operation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_SetSDIOOperation(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) DCTRL_SDIOEN_BB = (uint32_t)NewState; -} - -/** - * @brief Enables or disables the SD I/O Mode suspend command sending. - * @param NewState: new state of the SD I/O Mode suspend command. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_SendSDIOSuspendCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CMD_SDIOSUSPEND_BB = (uint32_t)NewState; -} - -/** - * @brief Enables or disables the command completion signal. - * @param NewState: new state of command completion signal. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_CommandCompletionCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CMD_ENCMDCOMPL_BB = (uint32_t)NewState; -} - -/** - * @brief Enables or disables the CE-ATA interrupt. - * @param NewState: new state of CE-ATA interrupt. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_CEATAITCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)((~((uint32_t)NewState)) & ((uint32_t)0x1)); -} - -/** - * @brief Sends CE-ATA command (CMD61). - * @param NewState: new state of CE-ATA command. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_SendCEATACmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)NewState; -} - -/** - * @brief Checks whether the specified SDIO flag is set or not. - * @param SDIO_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) - * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) - * @arg SDIO_FLAG_CTIMEOUT: Command response timeout - * @arg SDIO_FLAG_DTIMEOUT: Data timeout - * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error - * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error - * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) - * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) - * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide - * bus mode. - * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) - * @arg SDIO_FLAG_CMDACT: Command transfer in progress - * @arg SDIO_FLAG_TXACT: Data transmit in progress - * @arg SDIO_FLAG_RXACT: Data receive in progress - * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty - * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full - * @arg SDIO_FLAG_TXFIFOF: Transmit FIFO full - * @arg SDIO_FLAG_RXFIFOF: Receive FIFO full - * @arg SDIO_FLAG_TXFIFOE: Transmit FIFO empty - * @arg SDIO_FLAG_RXFIFOE: Receive FIFO empty - * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO - * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO - * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval The new state of SDIO_FLAG (SET or RESET). - */ -FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG) -{ - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_SDIO_FLAG(SDIO_FLAG)); - - if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the SDIO's pending flags. - * @param SDIO_FLAG: specifies the flag to clear. - * This parameter can be one or a combination of the following values: - * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) - * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) - * @arg SDIO_FLAG_CTIMEOUT: Command response timeout - * @arg SDIO_FLAG_DTIMEOUT: Data timeout - * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error - * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error - * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) - * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) - * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide - * bus mode - * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) - * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval None - */ -void SDIO_ClearFlag(uint32_t SDIO_FLAG) -{ - /* Check the parameters */ - assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG)); - - SDIO->ICR = SDIO_FLAG; -} - -/** - * @brief Checks whether the specified SDIO interrupt has occurred or not. - * @param SDIO_IT: specifies the SDIO interrupt source to check. - * This parameter can be one of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @retval The new state of SDIO_IT (SET or RESET). - */ -ITStatus SDIO_GetITStatus(uint32_t SDIO_IT) -{ - ITStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_SDIO_GET_IT(SDIO_IT)); - if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the SDIO’s interrupt pending bits. - * @param SDIO_IT: specifies the interrupt pending bit to clear. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval None - */ -void SDIO_ClearITPendingBit(uint32_t SDIO_IT) -{ - /* Check the parameters */ - assert_param(IS_SDIO_CLEAR_IT(SDIO_IT)); - - SDIO->ICR = SDIO_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c deleted file mode 100644 index 004803d0c3..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c +++ /dev/null @@ -1,907 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_spi.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the SPI firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_spi.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup SPI - * @brief SPI driver modules - * @{ - */ - -/** @defgroup SPI_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - - -/** @defgroup SPI_Private_Defines - * @{ - */ - -/* SPI SPE mask */ -#define CR1_SPE_Set ((uint16_t)0x0040) -#define CR1_SPE_Reset ((uint16_t)0xFFBF) - -/* I2S I2SE mask */ -#define I2SCFGR_I2SE_Set ((uint16_t)0x0400) -#define I2SCFGR_I2SE_Reset ((uint16_t)0xFBFF) - -/* SPI CRCNext mask */ -#define CR1_CRCNext_Set ((uint16_t)0x1000) - -/* SPI CRCEN mask */ -#define CR1_CRCEN_Set ((uint16_t)0x2000) -#define CR1_CRCEN_Reset ((uint16_t)0xDFFF) - -/* SPI SSOE mask */ -#define CR2_SSOE_Set ((uint16_t)0x0004) -#define CR2_SSOE_Reset ((uint16_t)0xFFFB) - -/* SPI registers Masks */ -#define CR1_CLEAR_Mask ((uint16_t)0x3040) -#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040) - -/* SPI or I2S mode selection masks */ -#define SPI_Mode_Select ((uint16_t)0xF7FF) -#define I2S_Mode_Select ((uint16_t)0x0800) - -/* I2S clock source selection masks */ -#define I2S2_CLOCK_SRC ((uint32_t)(0x00020000)) -#define I2S3_CLOCK_SRC ((uint32_t)(0x00040000)) -#define I2S_MUL_MASK ((uint32_t)(0x0000F000)) -#define I2S_DIV_MASK ((uint32_t)(0x000000F0)) - -/** - * @} - */ - -/** @defgroup SPI_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup SPI_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup SPI_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup SPI_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the SPIx peripheral registers to their default - * reset values (Affects also the I2Ss). - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @retval None - */ -void SPI_I2S_DeInit(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - if (SPIx == SPI1) - { - /* Enable SPI1 reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); - /* Release SPI1 from reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); - } - else if (SPIx == SPI2) - { - /* Enable SPI2 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); - /* Release SPI2 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); - } - else - { - if (SPIx == SPI3) - { - /* Enable SPI3 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE); - /* Release SPI3 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE); - } - } -} - -/** - * @brief Initializes the SPIx peripheral according to the specified - * parameters in the SPI_InitStruct. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure that - * contains the configuration information for the specified SPI peripheral. - * @retval None - */ -void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) -{ - uint16_t tmpreg = 0; - - /* check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Check the SPI parameters */ - assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction)); - assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode)); - assert_param(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize)); - assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL)); - assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA)); - assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS)); - assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler)); - assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit)); - assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial)); - -/*---------------------------- SPIx CR1 Configuration ------------------------*/ - /* Get the SPIx CR1 value */ - tmpreg = SPIx->CR1; - /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */ - tmpreg &= CR1_CLEAR_Mask; - /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler - master/salve mode, CPOL and CPHA */ - /* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */ - /* Set SSM, SSI and MSTR bits according to SPI_Mode and SPI_NSS values */ - /* Set LSBFirst bit according to SPI_FirstBit value */ - /* Set BR bits according to SPI_BaudRatePrescaler value */ - /* Set CPOL bit according to SPI_CPOL value */ - /* Set CPHA bit according to SPI_CPHA value */ - tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode | - SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL | - SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS | - SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); - /* Write to SPIx CR1 */ - SPIx->CR1 = tmpreg; - - /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ - SPIx->I2SCFGR &= SPI_Mode_Select; - -/*---------------------------- SPIx CRCPOLY Configuration --------------------*/ - /* Write to SPIx CRCPOLY */ - SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial; -} - -/** - * @brief Initializes the SPIx peripheral according to the specified - * parameters in the I2S_InitStruct. - * @param SPIx: where x can be 2 or 3 to select the SPI peripheral - * (configured in I2S mode). - * @param I2S_InitStruct: pointer to an I2S_InitTypeDef structure that - * contains the configuration information for the specified SPI peripheral - * configured in I2S mode. - * @note - * The function calculates the optimal prescaler needed to obtain the most - * accurate audio frequency (depending on the I2S clock source, the PLL values - * and the product configuration). But in case the prescaler value is greater - * than 511, the default value (0x02) will be configured instead. * - * @retval None - */ -void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct) -{ - uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; - uint32_t tmp = 0; - RCC_ClocksTypeDef RCC_Clocks; - uint32_t sourceclock = 0; - - /* Check the I2S parameters */ - assert_param(IS_SPI_23_PERIPH(SPIx)); - assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode)); - assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard)); - assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat)); - assert_param(IS_I2S_MCLK_OUTPUT(I2S_InitStruct->I2S_MCLKOutput)); - assert_param(IS_I2S_AUDIO_FREQ(I2S_InitStruct->I2S_AudioFreq)); - assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL)); - -/*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/ - /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ - SPIx->I2SCFGR &= I2SCFGR_CLEAR_Mask; - SPIx->I2SPR = 0x0002; - - /* Get the I2SCFGR register value */ - tmpreg = SPIx->I2SCFGR; - - /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/ - if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default) - { - i2sodd = (uint16_t)0; - i2sdiv = (uint16_t)2; - } - /* If the requested audio frequency is not the default, compute the prescaler */ - else - { - /* Check the frame length (For the Prescaler computing) */ - if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b) - { - /* Packet length is 16 bits */ - packetlength = 1; - } - else - { - /* Packet length is 32 bits */ - packetlength = 2; - } - - /* Get the I2S clock source mask depending on the peripheral number */ - if(((uint32_t)SPIx) == SPI2_BASE) - { - /* The mask is relative to I2S2 */ - tmp = I2S2_CLOCK_SRC; - } - else - { - /* The mask is relative to I2S3 */ - tmp = I2S3_CLOCK_SRC; - } - - /* Check the I2S clock source configuration depending on the Device: - Only Connectivity line devices have the PLL3 VCO clock */ -#ifdef STM32F10X_CL - if((RCC->CFGR2 & tmp) != 0) - { - /* Get the configuration bits of RCC PLL3 multiplier */ - tmp = (uint32_t)((RCC->CFGR2 & I2S_MUL_MASK) >> 12); - - /* Get the value of the PLL3 multiplier */ - if((tmp > 5) && (tmp < 15)) - { - /* Multplier is between 8 and 14 (value 15 is forbidden) */ - tmp += 2; - } - else - { - if (tmp == 15) - { - /* Multiplier is 20 */ - tmp = 20; - } - } - /* Get the PREDIV2 value */ - sourceclock = (uint32_t)(((RCC->CFGR2 & I2S_DIV_MASK) >> 4) + 1); - - /* Calculate the Source Clock frequency based on PLL3 and PREDIV2 values */ - sourceclock = (uint32_t) ((HSE_Value / sourceclock) * tmp * 2); - } - else - { - /* I2S Clock source is System clock: Get System Clock frequency */ - RCC_GetClocksFreq(&RCC_Clocks); - - /* Get the source clock value: based on System Clock value */ - sourceclock = RCC_Clocks.SYSCLK_Frequency; - } -#else /* STM32F10X_HD */ - /* I2S Clock source is System clock: Get System Clock frequency */ - RCC_GetClocksFreq(&RCC_Clocks); - - /* Get the source clock value: based on System Clock value */ - sourceclock = RCC_Clocks.SYSCLK_Frequency; -#endif /* STM32F10X_CL */ - - /* Compute the Real divider depending on the MCLK output state with a flaoting point */ - if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable) - { - /* MCLK output is enabled */ - tmp = (uint16_t)(((((sourceclock / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); - } - else - { - /* MCLK output is disabled */ - tmp = (uint16_t)(((((sourceclock / (32 * packetlength)) *10 ) / I2S_InitStruct->I2S_AudioFreq)) + 5); - } - - /* Remove the flaoting point */ - tmp = tmp / 10; - - /* Check the parity of the divider */ - i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); - - /* Compute the i2sdiv prescaler */ - i2sdiv = (uint16_t)((tmp - i2sodd) / 2); - - /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ - i2sodd = (uint16_t) (i2sodd << 8); - } - - /* Test if the divider is 1 or 0 or greater than 0xFF */ - if ((i2sdiv < 2) || (i2sdiv > 0xFF)) - { - /* Set the default values */ - i2sdiv = 2; - i2sodd = 0; - } - - /* Write to SPIx I2SPR register the computed value */ - SPIx->I2SPR = (uint16_t)(i2sdiv | (uint16_t)(i2sodd | (uint16_t)I2S_InitStruct->I2S_MCLKOutput)); - - /* Configure the I2S with the SPI_InitStruct values */ - tmpreg |= (uint16_t)(I2S_Mode_Select | (uint16_t)(I2S_InitStruct->I2S_Mode | \ - (uint16_t)(I2S_InitStruct->I2S_Standard | (uint16_t)(I2S_InitStruct->I2S_DataFormat | \ - (uint16_t)I2S_InitStruct->I2S_CPOL)))); - - /* Write to SPIx I2SCFGR */ - SPIx->I2SCFGR = tmpreg; -} - -/** - * @brief Fills each SPI_InitStruct member with its default value. - * @param SPI_InitStruct : pointer to a SPI_InitTypeDef structure which will be initialized. - * @retval None - */ -void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct) -{ -/*--------------- Reset SPI init structure parameters values -----------------*/ - /* Initialize the SPI_Direction member */ - SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex; - /* initialize the SPI_Mode member */ - SPI_InitStruct->SPI_Mode = SPI_Mode_Slave; - /* initialize the SPI_DataSize member */ - SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b; - /* Initialize the SPI_CPOL member */ - SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low; - /* Initialize the SPI_CPHA member */ - SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge; - /* Initialize the SPI_NSS member */ - SPI_InitStruct->SPI_NSS = SPI_NSS_Hard; - /* Initialize the SPI_BaudRatePrescaler member */ - SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; - /* Initialize the SPI_FirstBit member */ - SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB; - /* Initialize the SPI_CRCPolynomial member */ - SPI_InitStruct->SPI_CRCPolynomial = 7; -} - -/** - * @brief Fills each I2S_InitStruct member with its default value. - * @param I2S_InitStruct : pointer to a I2S_InitTypeDef structure which will be initialized. - * @retval None - */ -void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct) -{ -/*--------------- Reset I2S init structure parameters values -----------------*/ - /* Initialize the I2S_Mode member */ - I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx; - - /* Initialize the I2S_Standard member */ - I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips; - - /* Initialize the I2S_DataFormat member */ - I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b; - - /* Initialize the I2S_MCLKOutput member */ - I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable; - - /* Initialize the I2S_AudioFreq member */ - I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default; - - /* Initialize the I2S_CPOL member */ - I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low; -} - -/** - * @brief Enables or disables the specified SPI peripheral. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param NewState: new state of the SPIx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected SPI peripheral */ - SPIx->CR1 |= CR1_SPE_Set; - } - else - { - /* Disable the selected SPI peripheral */ - SPIx->CR1 &= CR1_SPE_Reset; - } -} - -/** - * @brief Enables or disables the specified SPI peripheral (in I2S mode). - * @param SPIx: where x can be 2 or 3 to select the SPI peripheral. - * @param NewState: new state of the SPIx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_23_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected SPI peripheral (in I2S mode) */ - SPIx->I2SCFGR |= I2SCFGR_I2SE_Set; - } - else - { - /* Disable the selected SPI peripheral (in I2S mode) */ - SPIx->I2SCFGR &= I2SCFGR_I2SE_Reset; - } -} - -/** - * @brief Enables or disables the specified SPI/I2S interrupts. - * @param SPIx: where x can be - * - 1, 2 or 3 in SPI mode - * - 2 or 3 in I2S mode - * @param SPI_I2S_IT: specifies the SPI/I2S interrupt source to be enabled or disabled. - * This parameter can be one of the following values: - * @arg SPI_I2S_IT_TXE: Tx buffer empty interrupt mask - * @arg SPI_I2S_IT_RXNE: Rx buffer not empty interrupt mask - * @arg SPI_I2S_IT_ERR: Error interrupt mask - * @param NewState: new state of the specified SPI/I2S interrupt. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) -{ - uint16_t itpos = 0, itmask = 0 ; - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_SPI_I2S_CONFIG_IT(SPI_I2S_IT)); - - /* Get the SPI/I2S IT index */ - itpos = SPI_I2S_IT >> 4; - - /* Set the IT mask */ - itmask = (uint16_t)1 << (uint16_t)itpos; - - if (NewState != DISABLE) - { - /* Enable the selected SPI/I2S interrupt */ - SPIx->CR2 |= itmask; - } - else - { - /* Disable the selected SPI/I2S interrupt */ - SPIx->CR2 &= (uint16_t)~itmask; - } -} - -/** - * @brief Enables or disables the SPIx/I2Sx DMA interface. - * @param SPIx: where x can be - * - 1, 2 or 3 in SPI mode - * - 2 or 3 in I2S mode - * @param SPI_I2S_DMAReq: specifies the SPI/I2S DMA transfer request to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg SPI_I2S_DMAReq_Tx: Tx buffer DMA transfer request - * @arg SPI_I2S_DMAReq_Rx: Rx buffer DMA transfer request - * @param NewState: new state of the selected SPI/I2S DMA transfer request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_SPI_I2S_DMAREQ(SPI_I2S_DMAReq)); - if (NewState != DISABLE) - { - /* Enable the selected SPI/I2S DMA requests */ - SPIx->CR2 |= SPI_I2S_DMAReq; - } - else - { - /* Disable the selected SPI/I2S DMA requests */ - SPIx->CR2 &= (uint16_t)~SPI_I2S_DMAReq; - } -} - -/** - * @brief Transmits a Data through the SPIx/I2Sx peripheral. - * @param SPIx: where x can be - * - 1, 2 or 3 in SPI mode - * - 2 or 3 in I2S mode - * @param Data : Data to be transmitted. - * @retval None - */ -void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Write in the DR register the data to be sent */ - SPIx->DR = Data; -} - -/** - * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. - * @param SPIx: where x can be - * - 1, 2 or 3 in SPI mode - * - 2 or 3 in I2S mode - * @retval The value of the received data. - */ -uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Return the data in the DR register */ - return SPIx->DR; -} - -/** - * @brief Configures internally by software the NSS pin for the selected SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_NSSInternalSoft: specifies the SPI NSS internal state. - * This parameter can be one of the following values: - * @arg SPI_NSSInternalSoft_Set: Set NSS pin internally - * @arg SPI_NSSInternalSoft_Reset: Reset NSS pin internally - * @retval None - */ -void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_NSS_INTERNAL(SPI_NSSInternalSoft)); - if (SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset) - { - /* Set NSS pin internally by software */ - SPIx->CR1 |= SPI_NSSInternalSoft_Set; - } - else - { - /* Reset NSS pin internally by software */ - SPIx->CR1 &= SPI_NSSInternalSoft_Reset; - } -} - -/** - * @brief Enables or disables the SS output for the selected SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param NewState: new state of the SPIx SS output. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected SPI SS output */ - SPIx->CR2 |= CR2_SSOE_Set; - } - else - { - /* Disable the selected SPI SS output */ - SPIx->CR2 &= CR2_SSOE_Reset; - } -} - -/** - * @brief Configures the data size for the selected SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_DataSize: specifies the SPI data size. - * This parameter can be one of the following values: - * @arg SPI_DataSize_16b: Set data frame format to 16bit - * @arg SPI_DataSize_8b: Set data frame format to 8bit - * @retval None - */ -void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_DATASIZE(SPI_DataSize)); - /* Clear DFF bit */ - SPIx->CR1 &= (uint16_t)~SPI_DataSize_16b; - /* Set new DFF bit value */ - SPIx->CR1 |= SPI_DataSize; -} - -/** - * @brief Transmit the SPIx CRC value. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @retval None - */ -void SPI_TransmitCRC(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Enable the selected SPI CRC transmission */ - SPIx->CR1 |= CR1_CRCNext_Set; -} - -/** - * @brief Enables or disables the CRC value calculation of the transfered bytes. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param NewState: new state of the SPIx CRC value calculation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected SPI CRC calculation */ - SPIx->CR1 |= CR1_CRCEN_Set; - } - else - { - /* Disable the selected SPI CRC calculation */ - SPIx->CR1 &= CR1_CRCEN_Reset; - } -} - -/** - * @brief Returns the transmit or the receive CRC register value for the specified SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_CRC: specifies the CRC register to be read. - * This parameter can be one of the following values: - * @arg SPI_CRC_Tx: Selects Tx CRC register - * @arg SPI_CRC_Rx: Selects Rx CRC register - * @retval The selected CRC register value.. - */ -uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC) -{ - uint16_t crcreg = 0; - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_CRC(SPI_CRC)); - if (SPI_CRC != SPI_CRC_Rx) - { - /* Get the Tx CRC register */ - crcreg = SPIx->TXCRCR; - } - else - { - /* Get the Rx CRC register */ - crcreg = SPIx->RXCRCR; - } - /* Return the selected CRC register */ - return crcreg; -} - -/** - * @brief Returns the CRC Polynomial register value for the specified SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @retval The CRC Polynomial register value. - */ -uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Return the CRC polynomial register */ - return SPIx->CRCPR; -} - -/** - * @brief Selects the data transfer direction in bi-directional mode for the specified SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_Direction: specifies the data transfer direction in bi-directional mode. - * This parameter can be one of the following values: - * @arg SPI_Direction_Tx: Selects Tx transmission direction - * @arg SPI_Direction_Rx: Selects Rx receive direction - * @retval None - */ -void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_DIRECTION(SPI_Direction)); - if (SPI_Direction == SPI_Direction_Tx) - { - /* Set the Tx only mode */ - SPIx->CR1 |= SPI_Direction_Tx; - } - else - { - /* Set the Rx only mode */ - SPIx->CR1 &= SPI_Direction_Rx; - } -} - -/** - * @brief Checks whether the specified SPI/I2S flag is set or not. - * @param SPIx: where x can be - * - 1, 2 or 3 in SPI mode - * - 2 or 3 in I2S mode - * @param SPI_I2S_FLAG: specifies the SPI/I2S flag to check. - * This parameter can be one of the following values: - * @arg SPI_I2S_FLAG_TXE: Transmit buffer empty flag. - * @arg SPI_I2S_FLAG_RXNE: Receive buffer not empty flag. - * @arg SPI_I2S_FLAG_BSY: Busy flag. - * @arg SPI_I2S_FLAG_OVR: Overrun flag. - * @arg SPI_FLAG_MODF: Mode Fault flag. - * @arg SPI_FLAG_CRCERR: CRC Error flag. - * @arg I2S_FLAG_UDR: Underrun Error flag. - * @arg I2S_FLAG_CHSIDE: Channel Side flag. - * @retval The new state of SPI_I2S_FLAG (SET or RESET). - */ -FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG)); - /* Check the status of the specified SPI/I2S flag */ - if ((SPIx->SR & SPI_I2S_FLAG) != (uint16_t)RESET) - { - /* SPI_I2S_FLAG is set */ - bitstatus = SET; - } - else - { - /* SPI_I2S_FLAG is reset */ - bitstatus = RESET; - } - /* Return the SPI_I2S_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the SPIx CRC Error (CRCERR) flag. - * @param SPIx: where x can be - * - 1, 2 or 3 in SPI mode - * @param SPI_I2S_FLAG: specifies the SPI flag to clear. - * This function clears only CRCERR flag. - * @note - * - OVR (OverRun error) flag is cleared by software sequence: a read - * operation to SPI_DR register (SPI_I2S_ReceiveData()) followed by a read - * operation to SPI_SR register (SPI_I2S_GetFlagStatus()). - * - UDR (UnderRun error) flag is cleared by a read operation to - * SPI_SR register (SPI_I2S_GetFlagStatus()). - * - MODF (Mode Fault) flag is cleared by software sequence: a read/write - * operation to SPI_SR register (SPI_I2S_GetFlagStatus()) followed by a - * write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). - * @retval None - */ -void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_I2S_CLEAR_FLAG(SPI_I2S_FLAG)); - - /* Clear the selected SPI CRC Error (CRCERR) flag */ - SPIx->SR = (uint16_t)~SPI_I2S_FLAG; -} - -/** - * @brief Checks whether the specified SPI/I2S interrupt has occurred or not. - * @param SPIx: where x can be - * - 1, 2 or 3 in SPI mode - * - 2 or 3 in I2S mode - * @param SPI_I2S_IT: specifies the SPI/I2S interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_I2S_IT_TXE: Transmit buffer empty interrupt. - * @arg SPI_I2S_IT_RXNE: Receive buffer not empty interrupt. - * @arg SPI_I2S_IT_OVR: Overrun interrupt. - * @arg SPI_IT_MODF: Mode Fault interrupt. - * @arg SPI_IT_CRCERR: CRC Error interrupt. - * @arg I2S_IT_UDR: Underrun Error interrupt. - * @retval The new state of SPI_I2S_IT (SET or RESET). - */ -ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) -{ - ITStatus bitstatus = RESET; - uint16_t itpos = 0, itmask = 0, enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_I2S_GET_IT(SPI_I2S_IT)); - - /* Get the SPI/I2S IT index */ - itpos = 0x01 << (SPI_I2S_IT & 0x0F); - - /* Get the SPI/I2S IT mask */ - itmask = SPI_I2S_IT >> 4; - - /* Set the IT mask */ - itmask = 0x01 << itmask; - - /* Get the SPI_I2S_IT enable bit status */ - enablestatus = (SPIx->CR2 & itmask) ; - - /* Check the status of the specified SPI/I2S interrupt */ - if (((SPIx->SR & itpos) != (uint16_t)RESET) && enablestatus) - { - /* SPI_I2S_IT is set */ - bitstatus = SET; - } - else - { - /* SPI_I2S_IT is reset */ - bitstatus = RESET; - } - /* Return the SPI_I2S_IT status */ - return bitstatus; -} - -/** - * @brief Clears the SPIx CRC Error (CRCERR) interrupt pending bit. - * @param SPIx: where x can be - * - 1, 2 or 3 in SPI mode - * @param SPI_I2S_IT: specifies the SPI interrupt pending bit to clear. - * This function clears only CRCERR intetrrupt pending bit. - * @note - * - OVR (OverRun Error) interrupt pending bit is cleared by software - * sequence: a read operation to SPI_DR register (SPI_I2S_ReceiveData()) - * followed by a read operation to SPI_SR register (SPI_I2S_GetITStatus()). - * - UDR (UnderRun Error) interrupt pending bit is cleared by a read - * operation to SPI_SR register (SPI_I2S_GetITStatus()). - * - MODF (Mode Fault) interrupt pending bit is cleared by software sequence: - * a read/write operation to SPI_SR register (SPI_I2S_GetITStatus()) - * followed by a write operation to SPI_CR1 register (SPI_Cmd() to enable - * the SPI). - * @retval None - */ -void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) -{ - uint16_t itpos = 0; - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_I2S_CLEAR_IT(SPI_I2S_IT)); - - /* Get the SPI IT index */ - itpos = 0x01 << (SPI_I2S_IT & 0x0F); - - /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */ - SPIx->SR = (uint16_t)~itpos; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c deleted file mode 100644 index 10aa8dcd59..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c +++ /dev/null @@ -1,2832 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_tim.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the TIM firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_tim.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup TIM - * @brief TIM driver modules - * @{ - */ - -/** @defgroup TIM_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_Defines - * @{ - */ - -/* ---------------------- TIM registers bit mask ------------------------ */ -#define CR1_CEN_Set ((uint16_t)0x0001) -#define CR1_CEN_Reset ((uint16_t)0x03FE) -#define CR1_UDIS_Set ((uint16_t)0x0002) -#define CR1_UDIS_Reset ((uint16_t)0x03FD) -#define CR1_URS_Set ((uint16_t)0x0004) -#define CR1_URS_Reset ((uint16_t)0x03FB) -#define CR1_OPM_Reset ((uint16_t)0x03F7) -#define CR1_CounterMode_Mask ((uint16_t)0x038F) -#define CR1_ARPE_Set ((uint16_t)0x0080) -#define CR1_ARPE_Reset ((uint16_t)0x037F) -#define CR1_CKD_Mask ((uint16_t)0x00FF) -#define CR2_CCPC_Set ((uint16_t)0x0001) -#define CR2_CCPC_Reset ((uint16_t)0xFFFE) -#define CR2_CCUS_Set ((uint16_t)0x0004) -#define CR2_CCUS_Reset ((uint16_t)0xFFFB) -#define CR2_CCDS_Set ((uint16_t)0x0008) -#define CR2_CCDS_Reset ((uint16_t)0xFFF7) -#define CR2_MMS_Mask ((uint16_t)0xFF8F) -#define CR2_TI1S_Set ((uint16_t)0x0080) -#define CR2_TI1S_Reset ((uint16_t)0xFF7F) -#define CR2_OIS1_Reset ((uint16_t)0x7EFF) -#define CR2_OIS1N_Reset ((uint16_t)0x7DFF) -#define CR2_OIS2_Reset ((uint16_t)0x7BFF) -#define CR2_OIS2N_Reset ((uint16_t)0x77FF) -#define CR2_OIS3_Reset ((uint16_t)0x6FFF) -#define CR2_OIS3N_Reset ((uint16_t)0x5FFF) -#define CR2_OIS4_Reset ((uint16_t)0x3FFF) -#define SMCR_SMS_Mask ((uint16_t)0xFFF8) -#define SMCR_ETR_Mask ((uint16_t)0x00FF) -#define SMCR_TS_Mask ((uint16_t)0xFF8F) -#define SMCR_MSM_Reset ((uint16_t)0xFF7F) -#define SMCR_ECE_Set ((uint16_t)0x4000) -#define CCMR_CC13S_Mask ((uint16_t)0xFFFC) -#define CCMR_CC24S_Mask ((uint16_t)0xFCFF) -#define CCMR_TI13Direct_Set ((uint16_t)0x0001) -#define CCMR_TI24Direct_Set ((uint16_t)0x0100) -#define CCMR_OC13FE_Reset ((uint16_t)0xFFFB) -#define CCMR_OC24FE_Reset ((uint16_t)0xFBFF) -#define CCMR_OC13PE_Reset ((uint16_t)0xFFF7) -#define CCMR_OC24PE_Reset ((uint16_t)0xF7FF) -#define CCMR_OC13M_Mask ((uint16_t)0xFF8F) -#define CCMR_OC24M_Mask ((uint16_t)0x8FFF) -#define CCMR_OC13CE_Reset ((uint16_t)0xFF7F) -#define CCMR_OC24CE_Reset ((uint16_t)0x7FFF) -#define CCMR_IC13PSC_Mask ((uint16_t)0xFFF3) -#define CCMR_IC24PSC_Mask ((uint16_t)0xF3FF) -#define CCMR_IC13F_Mask ((uint16_t)0xFF0F) -#define CCMR_IC24F_Mask ((uint16_t)0x0FFF) -#define CCMR_Offset ((uint16_t)0x0018) -#define CCER_CCE_Set ((uint16_t)0x0001) -#define CCER_CCNE_Set ((uint16_t)0x0004) -#define CCER_CC1P_Reset ((uint16_t)0xFFFD) -#define CCER_CC2P_Reset ((uint16_t)0xFFDF) -#define CCER_CC3P_Reset ((uint16_t)0xFDFF) -#define CCER_CC4P_Reset ((uint16_t)0xDFFF) -#define CCER_CC1NP_Reset ((uint16_t)0xFFF7) -#define CCER_CC2NP_Reset ((uint16_t)0xFF7F) -#define CCER_CC3NP_Reset ((uint16_t)0xF7FF) -#define CCER_CC1E_Set ((uint16_t)0x0001) -#define CCER_CC1E_Reset ((uint16_t)0xFFFE) -#define CCER_CC1NE_Reset ((uint16_t)0xFFFB) -#define CCER_CC2E_Set ((uint16_t)0x0010) -#define CCER_CC2E_Reset ((uint16_t)0xFFEF) -#define CCER_CC2NE_Reset ((uint16_t)0xFFBF) -#define CCER_CC3E_Set ((uint16_t)0x0100) -#define CCER_CC3E_Reset ((uint16_t)0xFEFF) -#define CCER_CC3NE_Reset ((uint16_t)0xFBFF) -#define CCER_CC4E_Set ((uint16_t)0x1000) -#define CCER_CC4E_Reset ((uint16_t)0xEFFF) -#define BDTR_MOE_Set ((uint16_t)0x8000) -#define BDTR_MOE_Reset ((uint16_t)0x7FFF) -/** - * @} - */ - -/** @defgroup TIM_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_FunctionPrototypes - * @{ - */ - -static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -/** - * @} - */ - -/** @defgroup TIM_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup TIM_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the TIMx peripheral registers to their default reset values. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @retval None - */ -void TIM_DeInit(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - if (TIMx == TIM1) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE); - } - else if (TIMx == TIM2) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE); - } - else if (TIMx == TIM3) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE); - } - else if (TIMx == TIM4) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); - } - else if (TIMx == TIM5) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE); - } - else if (TIMx == TIM6) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE); - } - else if (TIMx == TIM7) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE); - } - else if (TIMx == TIM8) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE); - } - else if (TIMx == TIM15) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM15, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM15, DISABLE); - } - else if (TIMx == TIM16) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM16, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM16, DISABLE); - } - else - { - if (TIMx == TIM17) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM17, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM17, DISABLE); - } - } -} - -/** - * @brief Initializes the TIMx Time Base Unit peripheral according to - * the specified parameters in the TIM_TimeBaseInitStruct. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef - * structure that contains the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode)); - assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision)); - - /* Select the Counter Mode and set the clock division */ - if((((uint32_t) TIMx) == TIM1_BASE) || (((uint32_t) TIMx) == TIM8_BASE) || - (((uint32_t) TIMx) == TIM2_BASE) || (((uint32_t) TIMx) == TIM3_BASE) || - (((uint32_t) TIMx) == TIM4_BASE) || (((uint32_t) TIMx) == TIM5_BASE)) - { - TIMx->CR1 &= CR1_CKD_Mask & CR1_CounterMode_Mask; - TIMx->CR1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision | - TIM_TimeBaseInitStruct->TIM_CounterMode; - } - if((((uint32_t) TIMx) != TIM6_BASE) && (((uint32_t) TIMx) != TIM7_BASE)) - { - TIMx->CR1 &= CR1_CKD_Mask; - TIMx->CR1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision; - } - - /* Set the Autoreload value */ - TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ; - - /* Set the Prescaler value */ - TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; - - if ((((uint32_t) TIMx) == TIM1_BASE) || (((uint32_t) TIMx) == TIM8_BASE) || - (((uint32_t) TIMx) == TIM15_BASE) || (((uint32_t) TIMx) == TIM16_BASE)|| - (((uint32_t) TIMx) == TIM17_BASE)) - { - /* Set the Repetition Counter value */ - TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; - } - - /* Generate an update event to reload the Prescaler value immediatly */ - TIMx->EGR = TIM_PSCReloadMode_Immediate; -} - -/** - * @brief Initializes the TIMx Channel1 according to the specified - * parameters in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure - * that contains the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= CCER_CC1E_Reset; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= CCMR_OC13M_Mask & CCMR_CC13S_Mask; - - /* Select the Output Compare Mode */ - tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= CCER_CC1P_Reset; - /* Set the Output Compare Polarity */ - tmpccer |= TIM_OCInitStruct->TIM_OCPolarity; - - /* Set the Output State */ - tmpccer |= TIM_OCInitStruct->TIM_OutputState; - - if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) TIMx == TIM8_BASE)|| - ((uint32_t) TIMx == TIM15_BASE)||((uint32_t) TIMx == TIM16_BASE)|| - ((uint32_t) TIMx == TIM17_BASE)) - { - assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= CCER_CC1NP_Reset; - /* Set the Output N Polarity */ - tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity; - /* Reset the Output N State */ - tmpccer &= CCER_CC1NE_Reset; - - /* Set the Output N State */ - tmpccer |= TIM_OCInitStruct->TIM_OutputNState; - /* Reset the Ouput Compare and Output Compare N IDLE State */ - tmpcr2 &= CR2_OIS1_Reset; - tmpcr2 &= CR2_OIS1N_Reset; - /* Set the Output Idle state */ - tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState; - /* Set the Output N Idle state */ - tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState; - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIMx Channel2 according to the specified - * parameters in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure - * that contains the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= CCER_CC2E_Reset; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= CCMR_OC24M_Mask & CCMR_CC24S_Mask; - - /* Select the Output Compare Mode */ - tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); - - /* Reset the Output Polarity level */ - tmpccer &= CCER_CC2P_Reset; - /* Set the Output Compare Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4); - - /* Set the Output State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4); - - if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) TIMx == TIM8_BASE)) - { - assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= CCER_CC2NP_Reset; - /* Set the Output N Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4); - /* Reset the Output N State */ - tmpccer &= CCER_CC2NE_Reset; - - /* Set the Output N State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4); - /* Reset the Ouput Compare and Output Compare N IDLE State */ - tmpcr2 &= CR2_OIS2_Reset; - tmpcr2 &= CR2_OIS2N_Reset; - /* Set the Output Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2); - /* Set the Output N Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 2); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIMx Channel3 according to the specified - * parameters in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure - * that contains the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= CCER_CC3E_Reset; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= CCMR_OC13M_Mask & CCMR_CC13S_Mask; - - /* Select the Output Compare Mode */ - tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= CCER_CC3P_Reset; - /* Set the Output Compare Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8); - - /* Set the Output State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8); - - if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) TIMx == TIM8_BASE)) - { - assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= CCER_CC3NP_Reset; - /* Set the Output N Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 8); - /* Reset the Output N State */ - tmpccer &= CCER_CC3NE_Reset; - - /* Set the Output N State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 8); - /* Reset the Ouput Compare and Output Compare N IDLE State */ - tmpcr2 &= CR2_OIS3_Reset; - tmpcr2 &= CR2_OIS3N_Reset; - /* Set the Output Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 4); - /* Set the Output N Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 4); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIMx Channel4 according to the specified - * parameters in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure - * that contains the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - /* Disable the Channel 2: Reset the CC4E Bit */ - TIMx->CCER &= CCER_CC4E_Reset; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= CCMR_OC24M_Mask & CCMR_CC24S_Mask; - - /* Select the Output Compare Mode */ - tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); - - /* Reset the Output Polarity level */ - tmpccer &= CCER_CC4P_Reset; - /* Set the Output Compare Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12); - - /* Set the Output State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12); - - if(((uint32_t) TIMx == TIM1_BASE) || ((uint32_t) TIMx == TIM8_BASE)) - { - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - /* Reset the Ouput Compare IDLE State */ - tmpcr2 &= CR2_OIS4_Reset; - /* Set the Output Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 6); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR4 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIM peripheral according to the specified - * parameters in the TIM_ICInitStruct. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure - * that contains the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) -{ - /* Check the parameters */ - assert_param(IS_TIM_CHANNEL(TIM_ICInitStruct->TIM_Channel)); - assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); - assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler)); - assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter)); - - if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) - { - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - /* TI1 Configuration */ - TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2) - { - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - /* TI2 Configuration */ - TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3) - { - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - /* TI3 Configuration */ - TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else - { - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - /* TI4 Configuration */ - TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } -} - -/** - * @brief Configures the TIM peripheral according to the specified - * parameters in the TIM_ICInitStruct to measure an external PWM signal. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure - * that contains the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) -{ - uint16_t icoppositepolarity = TIM_ICPolarity_Rising; - uint16_t icoppositeselection = TIM_ICSelection_DirectTI; - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - /* Select the Opposite Input Polarity */ - if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising) - { - icoppositepolarity = TIM_ICPolarity_Falling; - } - else - { - icoppositepolarity = TIM_ICPolarity_Rising; - } - /* Select the Opposite Input */ - if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI) - { - icoppositeselection = TIM_ICSelection_IndirectTI; - } - else - { - icoppositeselection = TIM_ICSelection_DirectTI; - } - if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) - { - /* TI1 Configuration */ - TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - /* TI2 Configuration */ - TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else - { - /* TI2 Configuration */ - TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - /* TI1 Configuration */ - TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } -} - -/** - * @brief Configures the: Break feature, dead time, Lock level, the OSSI, - * the OSSR State and the AOE(automatic output enable). - * @param TIMx: where x can be 1 or 8 to select the TIM - * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure that - * contains the BDTR Register configuration information for the TIM peripheral. - * @retval None - */ -void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct) -{ - /* Check the parameters */ - assert_param(IS_TIM_18151617_PERIPH(TIMx)); - assert_param(IS_TIM_OSSR_STATE(TIM_BDTRInitStruct->TIM_OSSRState)); - assert_param(IS_TIM_OSSI_STATE(TIM_BDTRInitStruct->TIM_OSSIState)); - assert_param(IS_TIM_LOCK_LEVEL(TIM_BDTRInitStruct->TIM_LOCKLevel)); - assert_param(IS_TIM_BREAK_STATE(TIM_BDTRInitStruct->TIM_Break)); - assert_param(IS_TIM_BREAK_POLARITY(TIM_BDTRInitStruct->TIM_BreakPolarity)); - assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTRInitStruct->TIM_AutomaticOutput)); - /* Set the Lock level, the Break enable Bit and the Ploarity, the OSSR State, - the OSSI State, the dead time value and the Automatic Output Enable Bit */ - TIMx->BDTR = (uint32_t)TIM_BDTRInitStruct->TIM_OSSRState | TIM_BDTRInitStruct->TIM_OSSIState | - TIM_BDTRInitStruct->TIM_LOCKLevel | TIM_BDTRInitStruct->TIM_DeadTime | - TIM_BDTRInitStruct->TIM_Break | TIM_BDTRInitStruct->TIM_BreakPolarity | - TIM_BDTRInitStruct->TIM_AutomaticOutput; -} - -/** - * @brief Fills each TIM_TimeBaseInitStruct member with its default value. - * @param TIM_TimeBaseInitStruct : pointer to a TIM_TimeBaseInitTypeDef - * structure which will be initialized. - * @retval None - */ -void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) -{ - /* Set the default configuration */ - TIM_TimeBaseInitStruct->TIM_Period = 0xFFFF; - TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000; - TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1; - TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000; -} - -/** - * @brief Fills each TIM_OCInitStruct member with its default value. - * @param TIM_OCInitStruct : pointer to a TIM_OCInitTypeDef structure which will - * be initialized. - * @retval None - */ -void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - /* Set the default configuration */ - TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing; - TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable; - TIM_OCInitStruct->TIM_OutputNState = TIM_OutputNState_Disable; - TIM_OCInitStruct->TIM_Pulse = 0x0000; - TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High; - TIM_OCInitStruct->TIM_OCNPolarity = TIM_OCPolarity_High; - TIM_OCInitStruct->TIM_OCIdleState = TIM_OCIdleState_Reset; - TIM_OCInitStruct->TIM_OCNIdleState = TIM_OCNIdleState_Reset; -} - -/** - * @brief Fills each TIM_ICInitStruct member with its default value. - * @param TIM_ICInitStruct : pointer to a TIM_ICInitTypeDef structure which will - * be initialized. - * @retval None - */ -void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct) -{ - /* Set the default configuration */ - TIM_ICInitStruct->TIM_Channel = TIM_Channel_1; - TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising; - TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI; - TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1; - TIM_ICInitStruct->TIM_ICFilter = 0x00; -} - -/** - * @brief Fills each TIM_BDTRInitStruct member with its default value. - * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure which - * will be initialized. - * @retval None - */ -void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct) -{ - /* Set the default configuration */ - TIM_BDTRInitStruct->TIM_OSSRState = TIM_OSSRState_Disable; - TIM_BDTRInitStruct->TIM_OSSIState = TIM_OSSIState_Disable; - TIM_BDTRInitStruct->TIM_LOCKLevel = TIM_LOCKLevel_OFF; - TIM_BDTRInitStruct->TIM_DeadTime = 0x00; - TIM_BDTRInitStruct->TIM_Break = TIM_Break_Disable; - TIM_BDTRInitStruct->TIM_BreakPolarity = TIM_BreakPolarity_Low; - TIM_BDTRInitStruct->TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; -} - -/** - * @brief Enables or disables the specified TIM peripheral. - * @param TIMx: where x can be 1 to 8 to select the TIMx peripheral. - * @param NewState: new state of the TIMx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the TIM Counter */ - TIMx->CR1 |= CR1_CEN_Set; - } - else - { - /* Disable the TIM Counter */ - TIMx->CR1 &= CR1_CEN_Reset; - } -} - -/** - * @brief Enables or disables the TIM peripheral Main Outputs. - * @param TIMx: where x can be 1 or 8 to select the TIMx peripheral. - * @param NewState: new state of the TIM peripheral Main Outputs. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_18151617_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the TIM Main Output */ - TIMx->BDTR |= BDTR_MOE_Set; - } - else - { - /* Disable the TIM Main Output */ - TIMx->BDTR &= BDTR_MOE_Reset; - } -} - -/** - * @brief Enables or disables the specified TIM interrupts. - * @param TIMx: where x can be 1 to 8 to select the TIMx peripheral. - * @param TIM_IT: specifies the TIM interrupts sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg TIM_IT_Update: TIM update Interrupt source - * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source - * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source - * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source - * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source - * @arg TIM_IT_COM: TIM Commutation Interrupt source - * @arg TIM_IT_Trigger: TIM Trigger Interrupt source - * @arg TIM_IT_Break: TIM Break Interrupt source - * @note - * - TIM6 and TIM7 can only generate an update interrupt. - * - TIM_IT_COM and TIM_IT_Break are used only with TIM1 and TIM8. - * @param NewState: new state of the TIM interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_IT(TIM_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Interrupt sources */ - TIMx->DIER |= TIM_IT; - } - else - { - /* Disable the Interrupt sources */ - TIMx->DIER &= (uint16_t)~TIM_IT; - } -} - -/** - * @brief Configures the TIMx event to be generate by software. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param TIM_EventSource: specifies the event source. - * This parameter can be one or more of the following values: - * @arg TIM_EventSource_Update: Timer update Event source - * @arg TIM_EventSource_CC1: Timer Capture Compare 1 Event source - * @arg TIM_EventSource_CC2: Timer Capture Compare 2 Event source - * @arg TIM_EventSource_CC3: Timer Capture Compare 3 Event source - * @arg TIM_EventSource_CC4: Timer Capture Compare 4 Event source - * @arg TIM_EventSource_COM: Timer COM event source - * @arg TIM_EventSource_Trigger: Timer Trigger Event source - * @arg TIM_EventSource_Break: Timer Break event source - * @note - * - TIM6 and TIM7 can only generate an update event. - * - TIM_EventSource_COM and TIM_EventSource_Break are used only with TIM1 and TIM8. - * @retval None - */ -void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_EVENT_SOURCE(TIM_EventSource)); - - /* Set the event sources */ - TIMx->EGR = TIM_EventSource; -} - -/** - * @brief Configures the TIMx’s DMA interface. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_DMABase: DMA Base address. - * This parameter can be one of the following values: - * @arg TIM_DMABase_CR, TIM_DMABase_CR2, TIM_DMABase_SMCR, - * TIM_DMABase_DIER, TIM1_DMABase_SR, TIM_DMABase_EGR, - * TIM_DMABase_CCMR1, TIM_DMABase_CCMR2, TIM_DMABase_CCER, - * TIM_DMABase_CNT, TIM_DMABase_PSC, TIM_DMABase_ARR, - * TIM_DMABase_RCR, TIM_DMABase_CCR1, TIM_DMABase_CCR2, - * TIM_DMABase_CCR3, TIM_DMABase_CCR4, TIM_DMABase_BDTR, - * TIM_DMABase_DCR. - * @param TIM_DMABurstLength: DMA Burst length. - * This parameter can be one value between: - * TIM_DMABurstLength_1Byte and TIM_DMABurstLength_18Bytes. - * @retval None - */ -void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_DMA_BASE(TIM_DMABase)); - assert_param(IS_TIM_DMA_LENGTH(TIM_DMABurstLength)); - /* Set the DMA Base and the DMA Burst Length */ - TIMx->DCR = TIM_DMABase | TIM_DMABurstLength; -} - -/** - * @brief Enables or disables the TIMx’s DMA Requests. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param TIM_DMASource: specifies the DMA Request sources. - * This parameter can be any combination of the following values: - * @arg TIM_DMA_Update: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_Trigger: TIM Trigger DMA source - * @param NewState: new state of the DMA Request sources. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_DMA_SOURCE(TIM_DMASource)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the DMA sources */ - TIMx->DIER |= TIM_DMASource; - } - else - { - /* Disable the DMA sources */ - TIMx->DIER &= (uint16_t)~TIM_DMASource; - } -} - -/** - * @brief Configures the TIMx interrnal Clock - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @retval None - */ -void TIM_InternalClockConfig(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - /* Disable slave mode to clock the prescaler directly with the internal clock */ - TIMx->SMCR &= SMCR_SMS_Mask; -} - -/** - * @brief Configures the TIMx Internal Trigger as External Clock - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ITRSource: Trigger source. - * This parameter can be one of the following values: - * @param TIM_TS_ITR0: Internal Trigger 0 - * @param TIM_TS_ITR1: Internal Trigger 1 - * @param TIM_TS_ITR2: Internal Trigger 2 - * @param TIM_TS_ITR3: Internal Trigger 3 - * @retval None - */ -void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource)); - /* Select the Internal Trigger */ - TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource); - /* Select the External clock mode1 */ - TIMx->SMCR |= TIM_SlaveMode_External1; -} - -/** - * @brief Configures the TIMx Trigger as External Clock - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_TIxExternalCLKSource: Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TIxExternalCLK1Source_TI1ED: TI1 Edge Detector - * @arg TIM_TIxExternalCLK1Source_TI1: Filtered Timer Input 1 - * @arg TIM_TIxExternalCLK1Source_TI2: Filtered Timer Input 2 - * @param TIM_ICPolarity: specifies the TIx Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param ICFilter : specifies the filter value. - * This parameter must be a value between 0x0 and 0xF. - * @retval None - */ -void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, - uint16_t TIM_ICPolarity, uint16_t ICFilter) -{ - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_TIXCLK_SOURCE(TIM_TIxExternalCLKSource)); - assert_param(IS_TIM_IC_POLARITY(TIM_ICPolarity)); - assert_param(IS_TIM_IC_FILTER(ICFilter)); - /* Configure the Timer Input Clock Source */ - if (TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2) - { - TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); - } - else - { - TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); - } - /* Select the Trigger source */ - TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource); - /* Select the External clock mode1 */ - TIMx->SMCR |= TIM_SlaveMode_External1; -} - -/** - * @brief Configures the External clock Mode1 - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter) -{ - uint16_t tmpsmcr = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); - assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); - assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); - /* Configure the ETR Clock source */ - TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the SMS Bits */ - tmpsmcr &= SMCR_SMS_Mask; - /* Select the External clock mode1 */ - tmpsmcr |= TIM_SlaveMode_External1; - /* Select the Trigger selection : ETRF */ - tmpsmcr &= SMCR_TS_Mask; - tmpsmcr |= TIM_TS_ETRF; - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Configures the External clock Mode2 - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, - uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); - assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); - assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); - /* Configure the ETR Clock source */ - TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); - /* Enable the External clock mode2 */ - TIMx->SMCR |= SMCR_ECE_Set; -} - -/** - * @brief Configures the TIMx External Trigger (ETR). - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter) -{ - uint16_t tmpsmcr = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); - assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); - assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); - tmpsmcr = TIMx->SMCR; - /* Reset the ETR Bits */ - tmpsmcr &= SMCR_ETR_Mask; - /* Set the Prescaler, the Filter value and the Polarity */ - tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8))); - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Configures the TIMx Prescaler. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param Prescaler: specifies the Prescaler Register value - * @param TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode - * This parameter can be one of the following values: - * @arg TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event. - * @arg TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediatly. - * @retval None - */ -void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode)); - /* Set the Prescaler value */ - TIMx->PSC = Prescaler; - /* Set or reset the UG Bit */ - TIMx->EGR = TIM_PSCReloadMode; -} - -/** - * @brief Specifies the TIMx Counter Mode to be used. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_CounterMode: specifies the Counter Mode to be used - * This parameter can be one of the following values: - * @arg TIM_CounterMode_Up: TIM Up Counting Mode - * @arg TIM_CounterMode_Down: TIM Down Counting Mode - * @arg TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1 - * @arg TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2 - * @arg TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3 - * @retval None - */ -void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode) -{ - uint16_t tmpcr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode)); - tmpcr1 = TIMx->CR1; - /* Reset the CMS and DIR Bits */ - tmpcr1 &= CR1_CounterMode_Mask; - /* Set the Counter Mode */ - tmpcr1 |= TIM_CounterMode; - /* Write to TIMx CR1 register */ - TIMx->CR1 = tmpcr1; -} - -/** - * @brief Selects the Input Trigger source - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_InputTriggerSource: The Input Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @arg TIM_TS_TI1F_ED: TI1 Edge Detector - * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 - * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 - * @arg TIM_TS_ETRF: External Trigger input - * @retval None - */ -void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) -{ - uint16_t tmpsmcr = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource)); - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the TS Bits */ - tmpsmcr &= SMCR_TS_Mask; - /* Set the Input Trigger source */ - tmpsmcr |= TIM_InputTriggerSource; - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Configures the TIMx Encoder Interface. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_EncoderMode: specifies the TIMx Encoder Mode. - * This parameter can be one of the following values: - * @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level. - * @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level. - * @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending - * on the level of the other input. - * @param TIM_IC1Polarity: specifies the IC1 Polarity - * This parmeter can be one of the following values: - * @arg TIM_ICPolarity_Falling: IC Falling edge. - * @arg TIM_ICPolarity_Rising: IC Rising edge. - * @param TIM_IC2Polarity: specifies the IC2 Polarity - * This parmeter can be one of the following values: - * @arg TIM_ICPolarity_Falling: IC Falling edge. - * @arg TIM_ICPolarity_Rising: IC Rising edge. - * @retval None - */ -void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, - uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) -{ - uint16_t tmpsmcr = 0; - uint16_t tmpccmr1 = 0; - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode)); - assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity)); - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = TIMx->CCMR1; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Set the encoder Mode */ - tmpsmcr &= SMCR_SMS_Mask; - tmpsmcr |= TIM_EncoderMode; - - /* Select the Capture Compare 1 and the Capture Compare 2 as input */ - tmpccmr1 &= CCMR_CC13S_Mask & CCMR_CC24S_Mask; - tmpccmr1 |= CCMR_TI13Direct_Set | CCMR_TI24Direct_Set; - - /* Set the TI1 and the TI2 Polarities */ - tmpccer &= CCER_CC1P_Reset & CCER_CC2P_Reset; - tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4)); - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmr1; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Forces the TIMx output 1 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC1REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC1REF. - * @retval None - */ -void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC1M Bits */ - tmpccmr1 &= CCMR_OC13M_Mask; - /* Configure The Forced output Mode */ - tmpccmr1 |= TIM_ForcedAction; - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Forces the TIMx output 2 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC2REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC2REF. - * @retval None - */ -void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC2M Bits */ - tmpccmr1 &= CCMR_OC24M_Mask; - /* Configure The Forced output Mode */ - tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8); - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Forces the TIMx output 3 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC3REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC3REF. - * @retval None - */ -void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr2 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC1M Bits */ - tmpccmr2 &= CCMR_OC13M_Mask; - /* Configure The Forced output Mode */ - tmpccmr2 |= TIM_ForcedAction; - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Forces the TIMx output 4 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC4REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC4REF. - * @retval None - */ -void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr2 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC2M Bits */ - tmpccmr2 &= CCMR_OC24M_Mask; - /* Configure The Forced output Mode */ - tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8); - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Enables or disables TIMx peripheral Preload register on ARR. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param NewState: new state of the TIMx peripheral Preload register - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the ARR Preload Bit */ - TIMx->CR1 |= CR1_ARPE_Set; - } - else - { - /* Reset the ARR Preload Bit */ - TIMx->CR1 &= CR1_ARPE_Reset; - } -} - -/** - * @brief Selects the TIM peripheral Commutation event. - * @param TIMx: where x can be 1 or 8 to select the TIMx peripheral - * @param NewState: new state of the Commutation event. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_18151617_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the COM Bit */ - TIMx->CR2 |= CR2_CCUS_Set; - } - else - { - /* Reset the COM Bit */ - TIMx->CR2 &= CR2_CCUS_Reset; - } -} - -/** - * @brief Selects the TIMx peripheral Capture Compare DMA source. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param NewState: new state of the Capture Compare DMA source - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the CCDS Bit */ - TIMx->CR2 |= CR2_CCDS_Set; - } - else - { - /* Reset the CCDS Bit */ - TIMx->CR2 &= CR2_CCDS_Reset; - } -} - -/** - * @brief Sets or Resets the TIM peripheral Capture Compare Preload Control bit. - * @param TIMx: where x can be 1 or 8 to select the TIMx peripheral - * @param NewState: new state of the Capture Compare Preload Control bit - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_18151617_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the CCPC Bit */ - TIMx->CR2 |= CR2_CCPC_Set; - } - else - { - /* Reset the CCPC Bit */ - TIMx->CR2 &= CR2_CCPC_Reset; - } -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR1. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC1PE Bit */ - tmpccmr1 &= CCMR_OC13PE_Reset; - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr1 |= TIM_OCPreload; - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR2. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC2PE Bit */ - tmpccmr1 &= CCMR_OC24PE_Reset; - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8); - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR3. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr2 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC3PE Bit */ - tmpccmr2 &= CCMR_OC13PE_Reset; - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr2 |= TIM_OCPreload; - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR4. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr2 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC4PE Bit */ - tmpccmr2 &= CCMR_OC24PE_Reset; - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8); - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Configures the TIMx Output Compare 1 Fast feature. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC1FE Bit */ - tmpccmr1 &= CCMR_OC13FE_Reset; - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr1 |= TIM_OCFast; - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Configures the TIMx Output Compare 2 Fast feature. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC2FE Bit */ - tmpccmr1 &= CCMR_OC24FE_Reset; - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr1 |= (uint16_t)(TIM_OCFast << 8); - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Configures the TIMx Output Compare 3 Fast feature. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr2 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - /* Get the TIMx CCMR2 register value */ - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC3FE Bit */ - tmpccmr2 &= CCMR_OC13FE_Reset; - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr2 |= TIM_OCFast; - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Configures the TIMx Output Compare 4 Fast feature. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr2 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - /* Get the TIMx CCMR2 register value */ - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC4FE Bit */ - tmpccmr2 &= CCMR_OC24FE_Reset; - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr2 |= (uint16_t)(TIM_OCFast << 8); - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Clears or safeguards the OCREF1 signal on an external event - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC1CE Bit */ - tmpccmr1 &= CCMR_OC13CE_Reset; - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr1 |= TIM_OCClear; - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Clears or safeguards the OCREF2 signal on an external event - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr1 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - tmpccmr1 = TIMx->CCMR1; - /* Reset the OC2CE Bit */ - tmpccmr1 &= CCMR_OC24CE_Reset; - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr1 |= (uint16_t)(TIM_OCClear << 8); - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Clears or safeguards the OCREF3 signal on an external event - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr2 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC3CE Bit */ - tmpccmr2 &= CCMR_OC13CE_Reset; - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr2 |= TIM_OCClear; - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Clears or safeguards the OCREF4 signal on an external event - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr2 = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - tmpccmr2 = TIMx->CCMR2; - /* Reset the OC4CE Bit */ - tmpccmr2 &= CCMR_OC24CE_Reset; - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr2 |= (uint16_t)(TIM_OCClear << 8); - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Configures the TIMx channel 1 polarity. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPolarity: specifies the OC1 Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - tmpccer = TIMx->CCER; - /* Set or Reset the CC1P Bit */ - tmpccer &= CCER_CC1P_Reset; - tmpccer |= TIM_OCPolarity; - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx Channel 1N polarity. - * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. - * @param TIM_OCNPolarity: specifies the OC1N Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCNPolarity_High: Output Compare active high - * @arg TIM_OCNPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) -{ - uint16_t tmpccer = 0; - /* Check the parameters */ - assert_param(IS_TIM_18151617_PERIPH(TIMx)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC1NP Bit */ - tmpccer &= CCER_CC1NP_Reset; - tmpccer |= TIM_OCNPolarity; - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx channel 2 polarity. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPolarity: specifies the OC2 Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - tmpccer = TIMx->CCER; - /* Set or Reset the CC2P Bit */ - tmpccer &= CCER_CC2P_Reset; - tmpccer |= (uint16_t)(TIM_OCPolarity << 4); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx Channel 2N polarity. - * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. - * @param TIM_OCNPolarity: specifies the OC2N Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCNPolarity_High: Output Compare active high - * @arg TIM_OCNPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) -{ - uint16_t tmpccer = 0; - /* Check the parameters */ - assert_param(IS_TIM_18_PERIPH(TIMx)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC2NP Bit */ - tmpccer &= CCER_CC2NP_Reset; - tmpccer |= (uint16_t)(TIM_OCNPolarity << 4); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx channel 3 polarity. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPolarity: specifies the OC3 Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - tmpccer = TIMx->CCER; - /* Set or Reset the CC3P Bit */ - tmpccer &= CCER_CC3P_Reset; - tmpccer |= (uint16_t)(TIM_OCPolarity << 8); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx Channel 3N polarity. - * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. - * @param TIM_OCNPolarity: specifies the OC3N Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCNPolarity_High: Output Compare active high - * @arg TIM_OCNPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_18_PERIPH(TIMx)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); - - tmpccer = TIMx->CCER; - /* Set or Reset the CC3NP Bit */ - tmpccer &= CCER_CC3NP_Reset; - tmpccer |= (uint16_t)(TIM_OCNPolarity << 8); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx channel 4 polarity. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPolarity: specifies the OC4 Polarity - * This parmeter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - tmpccer = TIMx->CCER; - /* Set or Reset the CC4P Bit */ - tmpccer &= CCER_CC4P_Reset; - tmpccer |= (uint16_t)(TIM_OCPolarity << 12); - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel x. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_Channel: specifies the TIM Channel - * This parmeter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @arg TIM_Channel_4: TIM Channel 4 - * @param TIM_CCx: specifies the TIM Channel CCxE bit new state. - * This parameter can be: TIM_CCx_Enable or TIM_CCx_Disable. - * @retval None - */ -void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx) -{ - uint16_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_CCX(TIM_CCx)); - - tmp = CCER_CCE_Set << TIM_Channel; - - /* Reset the CCxE Bit */ - TIMx->CCER &= (uint16_t)~ tmp; - - /* Set or reset the CCxE Bit */ - TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel); -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel xN. - * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. - * @param TIM_Channel: specifies the TIM Channel - * This parmeter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @param TIM_CCxN: specifies the TIM Channel CCxNE bit new state. - * This parameter can be: TIM_CCxN_Enable or TIM_CCxN_Disable. - * @retval None - */ -void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN) -{ - uint16_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_TIM_18151617_PERIPH(TIMx)); - assert_param(IS_TIM_COMPLEMENTARY_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_CCXN(TIM_CCxN)); - - tmp = CCER_CCNE_Set << TIM_Channel; - - /* Reset the CCxNE Bit */ - TIMx->CCER &= (uint16_t) ~tmp; - - /* Set or reset the CCxNE Bit */ - TIMx->CCER |= (uint16_t)(TIM_CCxN << TIM_Channel); -} - -/** - * @brief Selects the TIM Ouput Compare Mode. - * @note This function disables the selected channel before changing the Ouput - * Compare Mode. - * User has to enable this channel using TIM_CCxCmd and TIM_CCxNCmd functions. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_Channel: specifies the TIM Channel - * This parmeter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @arg TIM_Channel_4: TIM Channel 4 - * @param TIM_OCMode: specifies the TIM Output Compare Mode. - * This paramter can be one of the following values: - * @arg TIM_OCMode_Timing - * @arg TIM_OCMode_Active - * @arg TIM_OCMode_Toggle - * @arg TIM_OCMode_PWM1 - * @arg TIM_OCMode_PWM2 - * @arg TIM_ForcedAction_Active - * @arg TIM_ForcedAction_InActive - * @retval None - */ -void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) -{ - uint32_t tmp = 0; - uint16_t tmp1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_OCM(TIM_OCMode)); - - tmp = (uint32_t) TIMx; - tmp += CCMR_Offset; - - tmp1 = CCER_CCE_Set << (uint16_t)TIM_Channel; - - /* Disable the Channel: Reset the CCxE Bit */ - TIMx->CCER &= (uint16_t) ~tmp1; - - if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) - { - tmp += (TIM_Channel>>1); - - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= CCMR_OC13M_Mask; - - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= TIM_OCMode; - } - else - { - tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1; - - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= CCMR_OC24M_Mask; - - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); - } -} - -/** - * @brief Enables or Disables the TIMx Update event. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param NewState: new state of the TIMx UDIS bit - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the Update Disable Bit */ - TIMx->CR1 |= CR1_UDIS_Set; - } - else - { - /* Reset the Update Disable Bit */ - TIMx->CR1 &= CR1_UDIS_Reset; - } -} - -/** - * @brief Configures the TIMx Update Request Interrupt source. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param TIM_UpdateSource: specifies the Update source. - * This parameter can be one of the following values: - * @arg TIM_UpdateSource_Regular: Source of update is the counter overflow/underflow - or the setting of UG bit, or an update generation - through the slave mode controller. - * @arg TIM_UpdateSource_Global: Source of update is counter overflow/underflow. - * @retval None - */ -void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_UPDATE_SOURCE(TIM_UpdateSource)); - if (TIM_UpdateSource != TIM_UpdateSource_Global) - { - /* Set the URS Bit */ - TIMx->CR1 |= CR1_URS_Set; - } - else - { - /* Reset the URS Bit */ - TIMx->CR1 &= CR1_URS_Reset; - } -} - -/** - * @brief Enables or disables the TIMx’s Hall sensor interface. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param NewState: new state of the TIMx Hall sensor interface. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the TI1S Bit */ - TIMx->CR2 |= CR2_TI1S_Set; - } - else - { - /* Reset the TI1S Bit */ - TIMx->CR2 &= CR2_TI1S_Reset; - } -} - -/** - * @brief Selects the TIMx’s One Pulse Mode. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param TIM_OPMode: specifies the OPM Mode to be used. - * This parameter can be one of the following values: - * @arg TIM_OPMode_Single - * @arg TIM_OPMode_Repetitive - * @retval None - */ -void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_OPM_MODE(TIM_OPMode)); - /* Reset the OPM Bit */ - TIMx->CR1 &= CR1_OPM_Reset; - /* Configure the OPM Mode */ - TIMx->CR1 |= TIM_OPMode; -} - -/** - * @brief Selects the TIMx Trigger Output Mode. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param TIM_TRGOSource: specifies the Trigger Output source. - * This paramter can be one of the following values: - * - * - For all TIMx - * @arg TIM_TRGOSource_Reset: The UG bit in the TIM_EGR register is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_Enable: The Counter Enable CEN is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_Update: The update event is selected as the trigger output (TRGO). - * - * - For all TIMx except TIM6 and TIM7 - * @arg TIM_TRGOSource_OC1: The trigger output sends a positive pulse when the CC1IF flag - * is to be set, as soon as a capture or compare match occurs (TRGO). - * @arg TIM_TRGOSource_OC1Ref: OC1REF signal is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_OC2Ref: OC2REF signal is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_OC3Ref: OC3REF signal is used as the trigger output (TRGO). - * @arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output (TRGO). - * - * @retval None - */ -void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_TRGO_SOURCE(TIM_TRGOSource)); - /* Reset the MMS Bits */ - TIMx->CR2 &= CR2_MMS_Mask; - /* Select the TRGO source */ - TIMx->CR2 |= TIM_TRGOSource; -} - -/** - * @brief Selects the TIMx Slave Mode. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_SlaveMode: specifies the Timer Slave Mode. - * This paramter can be one of the following values: - * @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes - * the counter and triggers an update of the registers. - * @arg TIM_SlaveMode_Gated: The counter clock is enabled when the trigger signal (TRGI) is high. - * @arg TIM_SlaveMode_Trigger: The counter starts at a rising edge of the trigger TRGI. - * @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter. - * @retval None - */ -void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_SLAVE_MODE(TIM_SlaveMode)); - /* Reset the SMS Bits */ - TIMx->SMCR &= SMCR_SMS_Mask; - /* Select the Slave Mode */ - TIMx->SMCR |= TIM_SlaveMode; -} - -/** - * @brief Sets or Resets the TIMx Master/Slave Mode. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_MasterSlaveMode: specifies the Timer Master Slave Mode. - * This paramter can be one of the following values: - * @arg TIM_MasterSlaveMode_Enable: synchronization between the current timer - * and its slaves (through TRGO). - * @arg TIM_MasterSlaveMode_Disable: No action - * @retval None - */ -void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_MSM_STATE(TIM_MasterSlaveMode)); - /* Reset the MSM Bit */ - TIMx->SMCR &= SMCR_MSM_Reset; - - /* Set or Reset the MSM Bit */ - TIMx->SMCR |= TIM_MasterSlaveMode; -} - -/** - * @brief Sets the TIMx Counter Register value - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param Counter: specifies the Counter register new value. - * @retval None - */ -void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - /* Set the Counter Register value */ - TIMx->CNT = Counter; -} - -/** - * @brief Sets the TIMx Autoreload Register value - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param Autoreload: specifies the Autoreload register new value. - * @retval None - */ -void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - /* Set the Autoreload Register value */ - TIMx->ARR = Autoreload; -} - -/** - * @brief Sets the TIMx Capture Compare1 Register value - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param Compare1: specifies the Capture Compare1 register new value. - * @retval None - */ -void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - /* Set the Capture Compare1 Register value */ - TIMx->CCR1 = Compare1; -} - -/** - * @brief Sets the TIMx Capture Compare2 Register value - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param Compare2: specifies the Capture Compare2 register new value. - * @retval None - */ -void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2) -{ - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - /* Set the Capture Compare2 Register value */ - TIMx->CCR2 = Compare2; -} - -/** - * @brief Sets the TIMx Capture Compare3 Register value - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param Compare3: specifies the Capture Compare3 register new value. - * @retval None - */ -void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - /* Set the Capture Compare3 Register value */ - TIMx->CCR3 = Compare3; -} - -/** - * @brief Sets the TIMx Capture Compare4 Register value - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param Compare4: specifies the Capture Compare4 register new value. - * @retval None - */ -void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - /* Set the Capture Compare4 Register value */ - TIMx->CCR4 = Compare4; -} - -/** - * @brief Sets the TIMx Input Capture 1 prescaler. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPSC: specifies the Input Capture1 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - /* Reset the IC1PSC Bits */ - TIMx->CCMR1 &= CCMR_IC13PSC_Mask; - /* Set the IC1PSC value */ - TIMx->CCMR1 |= TIM_ICPSC; -} - -/** - * @brief Sets the TIMx Input Capture 2 prescaler. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPSC: specifies the Input Capture2 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - /* Reset the IC2PSC Bits */ - TIMx->CCMR1 &= CCMR_IC24PSC_Mask; - /* Set the IC2PSC value */ - TIMx->CCMR1 |= (uint16_t)(TIM_ICPSC << 8); -} - -/** - * @brief Sets the TIMx Input Capture 3 prescaler. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPSC: specifies the Input Capture3 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - /* Reset the IC3PSC Bits */ - TIMx->CCMR2 &= CCMR_IC13PSC_Mask; - /* Set the IC3PSC value */ - TIMx->CCMR2 |= TIM_ICPSC; -} - -/** - * @brief Sets the TIMx Input Capture 4 prescaler. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPSC: specifies the Input Capture4 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - /* Reset the IC4PSC Bits */ - TIMx->CCMR2 &= CCMR_IC24PSC_Mask; - /* Set the IC4PSC value */ - TIMx->CCMR2 |= (uint16_t)(TIM_ICPSC << 8); -} - -/** - * @brief Sets the TIMx Clock Division value. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_CKD: specifies the clock division value. - * This parameter can be one of the following value: - * @arg TIM_CKD_DIV1: TDTS = Tck_tim - * @arg TIM_CKD_DIV2: TDTS = 2*Tck_tim - * @arg TIM_CKD_DIV4: TDTS = 4*Tck_tim - * @retval None - */ -void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - assert_param(IS_TIM_CKD_DIV(TIM_CKD)); - /* Reset the CKD Bits */ - TIMx->CR1 &= CR1_CKD_Mask; - /* Set the CKD value */ - TIMx->CR1 |= TIM_CKD; -} - -/** - * @brief Gets the TIMx Input Capture 1 value. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @retval Capture Compare 1 Register value. - */ -uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458151617_PERIPH(TIMx)); - /* Get the Capture 1 Register value */ - return TIMx->CCR1; -} - -/** - * @brief Gets the TIMx Input Capture 2 value. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @retval Capture Compare 2 Register value. - */ -uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_12345815_PERIPH(TIMx)); - /* Get the Capture 2 Register value */ - return TIMx->CCR2; -} - -/** - * @brief Gets the TIMx Input Capture 3 value. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @retval Capture Compare 3 Register value. - */ -uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - /* Get the Capture 3 Register value */ - return TIMx->CCR3; -} - -/** - * @brief Gets the TIMx Input Capture 4 value. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @retval Capture Compare 4 Register value. - */ -uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_123458_PERIPH(TIMx)); - /* Get the Capture 4 Register value */ - return TIMx->CCR4; -} - -/** - * @brief Gets the TIMx Counter value. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @retval Counter Register value. - */ -uint16_t TIM_GetCounter(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - /* Get the Counter Register value */ - return TIMx->CNT; -} - -/** - * @brief Gets the TIMx Prescaler value. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @retval Prescaler Register value. - */ -uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - /* Get the Prescaler Register value */ - return TIMx->PSC; -} - -/** - * @brief Checks whether the specified TIM flag is set or not. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param TIM_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg TIM_FLAG_Update: TIM update Flag - * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag - * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag - * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag - * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag - * @arg TIM_FLAG_COM: TIM Commutation Flag - * @arg TIM_FLAG_Trigger: TIM Trigger Flag - * @arg TIM_FLAG_Break: TIM Break Flag - * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag - * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag - * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag - * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag - * @note - * - TIM6 and TIM7 can have only one update flag. - * - TIM_FLAG_COM and TIM_FLAG_Break are used only with TIM1 and TIM8. - * @retval The new state of TIM_FLAG (SET or RESET). - */ -FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) -{ - ITStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_GET_FLAG(TIM_FLAG)); - - if ((TIMx->SR & TIM_FLAG) != (uint16_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the TIMx's pending flags. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param TIM_FLAG: specifies the flag bit to clear. - * This parameter can be any combination of the following values: - * @arg TIM_FLAG_Update: TIM update Flag - * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag - * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag - * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag - * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag - * @arg TIM_FLAG_COM: TIM Commutation Flag - * @arg TIM_FLAG_Trigger: TIM Trigger Flag - * @arg TIM_FLAG_Break: TIM Break Flag - * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag - * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag - * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag - * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag - * @note - * - TIM6 and TIM7 can have only one update flag. - * - TIM_FLAG_COM and TIM_FLAG_Break are used only with TIM1 and TIM8. - * @retval None - */ -void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG)); - - /* Clear the flags */ - TIMx->SR = (uint16_t)~TIM_FLAG; -} - -/** - * @brief Checks whether the TIM interrupt has occurred or not. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param TIM_IT: specifies the TIM interrupt source to check. - * This parameter can be one of the following values: - * @arg TIM_IT_Update: TIM update Interrupt source - * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source - * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source - * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source - * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source - * @arg TIM_IT_COM: TIM Commutation Interrupt source - * @arg TIM_IT_Trigger: TIM Trigger Interrupt source - * @arg TIM_IT_Break: TIM Break Interrupt source - * @note - * - TIM6 and TIM7 can generate only an update interrupt. - * - TIM_IT_COM and TIM_IT_Break are used only with TIM1 and TIM8. - * @retval The new state of the TIM_IT(SET or RESET). - */ -ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT) -{ - ITStatus bitstatus = RESET; - uint16_t itstatus = 0x0, itenable = 0x0; - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_GET_IT(TIM_IT)); - - itstatus = TIMx->SR & TIM_IT; - - itenable = TIMx->DIER & TIM_IT; - if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the TIMx's interrupt pending bits. - * @param TIMx: where x can be 1 to 8 to select the TIM peripheral. - * @param TIM_IT: specifies the pending bit to clear. - * This parameter can be any combination of the following values: - * @arg TIM_IT_Update: TIM1 update Interrupt source - * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source - * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source - * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source - * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source - * @arg TIM_IT_COM: TIM Commutation Interrupt source - * @arg TIM_IT_Trigger: TIM Trigger Interrupt source - * @arg TIM_IT_Break: TIM Break Interrupt source - * @note - * - TIM6 and TIM7 can generate only an update interrupt. - * - TIM_IT_COM and TIM_IT_Break are used only with TIM1 and TIM8. - * @retval None - */ -void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_IT(TIM_IT)); - /* Clear the IT pending Bit */ - TIMx->SR = (uint16_t)~TIM_IT; -} - -/** - * @brief Configure the TI1 as Input. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 1 is selected to be connected to IC1. - * @arg TIM_ICSelection_IndirectTI: TIM Input 1 is selected to be connected to IC2. - * @arg TIM_ICSelection_TRC: TIM Input 1 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr1 = 0, tmpccer = 0; - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= CCER_CC1E_Reset; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - /* Select the Input and set the filter */ - tmpccmr1 &= CCMR_CC13S_Mask & CCMR_IC13F_Mask; - tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= CCER_CC1P_Reset; - tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)CCER_CC1E_Set); - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI2 as Input. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 2 is selected to be connected to IC2. - * @arg TIM_ICSelection_IndirectTI: TIM Input 2 is selected to be connected to IC1. - * @arg TIM_ICSelection_TRC: TIM Input 2 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0; - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= CCER_CC2E_Reset; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - tmp = (uint16_t)(TIM_ICPolarity << 4); - /* Select the Input and set the filter */ - tmpccmr1 &= CCMR_CC24S_Mask & CCMR_IC24F_Mask; - tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12); - tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8); - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= CCER_CC2P_Reset; - tmpccer |= (uint16_t)(tmp | (uint16_t)CCER_CC2E_Set); - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI3 as Input. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 3 is selected to be connected to IC3. - * @arg TIM_ICSelection_IndirectTI: TIM Input 3 is selected to be connected to IC4. - * @arg TIM_ICSelection_TRC: TIM Input 3 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; - /* Disable the Channel 3: Reset the CC3E Bit */ - TIMx->CCER &= CCER_CC3E_Reset; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - tmp = (uint16_t)(TIM_ICPolarity << 8); - /* Select the Input and set the filter */ - tmpccmr2 &= CCMR_CC13S_Mask & CCMR_IC13F_Mask; - tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); - /* Select the Polarity and set the CC3E Bit */ - tmpccer &= CCER_CC3P_Reset; - tmpccer |= (uint16_t)(tmp | (uint16_t)CCER_CC3E_Set); - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI1 as Input. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 4 is selected to be connected to IC4. - * @arg TIM_ICSelection_IndirectTI: TIM Input 4 is selected to be connected to IC3. - * @arg TIM_ICSelection_TRC: TIM Input 4 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= CCER_CC4E_Reset; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - tmp = (uint16_t)(TIM_ICPolarity << 12); - - /* Select the Input and set the filter */ - tmpccmr2 &= CCMR_CC24S_Mask & CCMR_IC24F_Mask; - tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8); - tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12); - - /* Select the Polarity and set the CC4E Bit */ - tmpccer &= CCER_CC4P_Reset; - tmpccer |= (uint16_t)(tmp | (uint16_t)CCER_CC4E_Set); - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer ; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c deleted file mode 100644 index c23a51d48f..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c +++ /dev/null @@ -1,1054 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_usart.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the USART firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_usart.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup USART - * @brief USART driver modules - * @{ - */ - -/** @defgroup USART_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup USART_Private_Defines - * @{ - */ - -#define CR1_UE_Set ((uint16_t)0x2000) /*!< USART Enable Mask */ -#define CR1_UE_Reset ((uint16_t)0xDFFF) /*!< USART Disable Mask */ - -#define CR1_WAKE_Mask ((uint16_t)0xF7FF) /*!< USART WakeUp Method Mask */ - -#define CR1_RWU_Set ((uint16_t)0x0002) /*!< USART mute mode Enable Mask */ -#define CR1_RWU_Reset ((uint16_t)0xFFFD) /*!< USART mute mode Enable Mask */ -#define CR1_SBK_Set ((uint16_t)0x0001) /*!< USART Break Character send Mask */ -#define CR1_CLEAR_Mask ((uint16_t)0xE9F3) /*!< USART CR1 Mask */ -#define CR2_Address_Mask ((uint16_t)0xFFF0) /*!< USART address Mask */ - -#define CR2_LINEN_Set ((uint16_t)0x4000) /*!< USART LIN Enable Mask */ -#define CR2_LINEN_Reset ((uint16_t)0xBFFF) /*!< USART LIN Disable Mask */ - -#define CR2_LBDL_Mask ((uint16_t)0xFFDF) /*!< USART LIN Break detection Mask */ -#define CR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /*!< USART CR2 STOP Bits Mask */ -#define CR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /*!< USART CR2 Clock Mask */ - -#define CR3_SCEN_Set ((uint16_t)0x0020) /*!< USART SC Enable Mask */ -#define CR3_SCEN_Reset ((uint16_t)0xFFDF) /*!< USART SC Disable Mask */ - -#define CR3_NACK_Set ((uint16_t)0x0010) /*!< USART SC NACK Enable Mask */ -#define CR3_NACK_Reset ((uint16_t)0xFFEF) /*!< USART SC NACK Disable Mask */ - -#define CR3_HDSEL_Set ((uint16_t)0x0008) /*!< USART Half-Duplex Enable Mask */ -#define CR3_HDSEL_Reset ((uint16_t)0xFFF7) /*!< USART Half-Duplex Disable Mask */ - -#define CR3_IRLP_Mask ((uint16_t)0xFFFB) /*!< USART IrDA LowPower mode Mask */ -#define CR3_CLEAR_Mask ((uint16_t)0xFCFF) /*!< USART CR3 Mask */ - -#define CR3_IREN_Set ((uint16_t)0x0002) /*!< USART IrDA Enable Mask */ -#define CR3_IREN_Reset ((uint16_t)0xFFFD) /*!< USART IrDA Disable Mask */ -#define GTPR_LSB_Mask ((uint16_t)0x00FF) /*!< Guard Time Register LSB Mask */ -#define GTPR_MSB_Mask ((uint16_t)0xFF00) /*!< Guard Time Register MSB Mask */ -#define IT_Mask ((uint16_t)0x001F) /*!< USART Interrupt Mask */ - -/* USART OverSampling-8 Mask */ -#define CR1_OVER8_Set ((u16)0x8000) /* USART OVER8 mode Enable Mask */ -#define CR1_OVER8_Reset ((u16)0x7FFF) /* USART OVER8 mode Disable Mask */ - -/* USART One Bit Sampling Mask */ -#define CR3_ONEBITE_Set ((u16)0x0800) /* USART ONEBITE mode Enable Mask */ -#define CR3_ONEBITE_Reset ((u16)0xF7FF) /* USART ONEBITE mode Disable Mask */ - -/** - * @} - */ - -/** @defgroup USART_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USART_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USART_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup USART_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the USARTx peripheral registers to their default reset values. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: USART1, USART2, USART3, UART4 or UART5. - * @retval None - */ -void USART_DeInit(USART_TypeDef* USARTx) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - if (USARTx == USART1) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); - } - else if (USARTx == USART2) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); - } - else if (USARTx == USART3) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); - } - else if (USARTx == UART4) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); - } - else - { - if (USARTx == UART5) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); - } - } -} - -/** - * @brief Initializes the USARTx peripheral according to the specified - * parameters in the USART_InitStruct . - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_InitStruct: pointer to a USART_InitTypeDef structure - * that contains the configuration information for the specified USART peripheral. - * @retval None - */ -void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) -{ - uint32_t tmpreg = 0x00, apbclock = 0x00; - uint32_t integerdivider = 0x00; - uint32_t fractionaldivider = 0x00; - uint32_t usartxbase = 0; - RCC_ClocksTypeDef RCC_ClocksStatus; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate)); - assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength)); - assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits)); - assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity)); - assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode)); - assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl)); - /* The hardware flow control is available only for USART1, USART2 and USART3 */ - if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) - { - assert_param(IS_USART_123_PERIPH(USARTx)); - } - - usartxbase = (uint32_t)USARTx; - -/*---------------------------- USART CR2 Configuration -----------------------*/ - tmpreg = USARTx->CR2; - /* Clear STOP[13:12] bits */ - tmpreg &= CR2_STOP_CLEAR_Mask; - /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit ------------*/ - /* Set STOP[13:12] bits according to USART_StopBits value */ - tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; - - /* Write to USART CR2 */ - USARTx->CR2 = (uint16_t)tmpreg; - -/*---------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = USARTx->CR1; - /* Clear M, PCE, PS, TE and RE bits */ - tmpreg &= CR1_CLEAR_Mask; - /* Configure the USART Word Length, Parity and mode ----------------------- */ - /* Set the M bits according to USART_WordLength value */ - /* Set PCE and PS bits according to USART_Parity value */ - /* Set TE and RE bits according to USART_Mode value */ - tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity | - USART_InitStruct->USART_Mode; - /* Write to USART CR1 */ - USARTx->CR1 = (uint16_t)tmpreg; - -/*---------------------------- USART CR3 Configuration -----------------------*/ - tmpreg = USARTx->CR3; - /* Clear CTSE and RTSE bits */ - tmpreg &= CR3_CLEAR_Mask; - /* Configure the USART HFC -------------------------------------------------*/ - /* Set CTSE and RTSE bits according to USART_HardwareFlowControl value */ - tmpreg |= USART_InitStruct->USART_HardwareFlowControl; - /* Write to USART CR3 */ - USARTx->CR3 = (uint16_t)tmpreg; - -/*---------------------------- USART BRR Configuration -----------------------*/ - /* Configure the USART Baud Rate -------------------------------------------*/ - RCC_GetClocksFreq(&RCC_ClocksStatus); - if (usartxbase == USART1_BASE) - { - apbclock = RCC_ClocksStatus.PCLK2_Frequency; - } - else - { - apbclock = RCC_ClocksStatus.PCLK1_Frequency; - } - - /* Determine the integer part */ - if ((USARTx->CR1 & CR1_OVER8_Set) != 0) - { - /* Integer part computing in case Oversampling mode is 8 Samples */ - integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate))); - } - else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ - { - /* Integer part computing in case Oversampling mode is 16 Samples */ - integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); - } - tmpreg = (integerdivider / 100) << 4; - - /* Determine the fractional part */ - fractionaldivider = integerdivider - (100 * (tmpreg >> 4)); - - /* Implement the fractional part in the register */ - if ((USARTx->CR1 & CR1_OVER8_Set) != 0) - { - tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07); - } - else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ - { - tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); - } - - /* Write to USART BRR */ - USARTx->BRR = (uint16_t)tmpreg; -} - -/** - * @brief Fills each USART_InitStruct member with its default value. - * @param USART_InitStruct: pointer to a USART_InitTypeDef structure - * which will be initialized. - * @retval None - */ -void USART_StructInit(USART_InitTypeDef* USART_InitStruct) -{ - /* USART_InitStruct members default value */ - USART_InitStruct->USART_BaudRate = 9600; - USART_InitStruct->USART_WordLength = USART_WordLength_8b; - USART_InitStruct->USART_StopBits = USART_StopBits_1; - USART_InitStruct->USART_Parity = USART_Parity_No ; - USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; -} - -/** - * @brief Initializes the USARTx peripheral Clock according to the - * specified parameters in the USART_ClockInitStruct . - * @param USARTx: where x can be 1, 2, 3 to select the USART peripheral. - * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef - * structure that contains the configuration information for the specified - * USART peripheral. - * @note The Smart Card mode is not available for UART4 and UART5. - * @retval None - */ -void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct) -{ - uint32_t tmpreg = 0x00; - /* Check the parameters */ - assert_param(IS_USART_123_PERIPH(USARTx)); - assert_param(IS_USART_CLOCK(USART_ClockInitStruct->USART_Clock)); - assert_param(IS_USART_CPOL(USART_ClockInitStruct->USART_CPOL)); - assert_param(IS_USART_CPHA(USART_ClockInitStruct->USART_CPHA)); - assert_param(IS_USART_LASTBIT(USART_ClockInitStruct->USART_LastBit)); - -/*---------------------------- USART CR2 Configuration -----------------------*/ - tmpreg = USARTx->CR2; - /* Clear CLKEN, CPOL, CPHA and LBCL bits */ - tmpreg &= CR2_CLOCK_CLEAR_Mask; - /* Configure the USART Clock, CPOL, CPHA and LastBit ------------*/ - /* Set CLKEN bit according to USART_Clock value */ - /* Set CPOL bit according to USART_CPOL value */ - /* Set CPHA bit according to USART_CPHA value */ - /* Set LBCL bit according to USART_LastBit value */ - tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL | - USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit; - /* Write to USART CR2 */ - USARTx->CR2 = (uint16_t)tmpreg; -} - -/** - * @brief Fills each USART_ClockInitStruct member with its default value. - * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef - * structure which will be initialized. - * @retval None - */ -void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct) -{ - /* USART_ClockInitStruct members default value */ - USART_ClockInitStruct->USART_Clock = USART_Clock_Disable; - USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low; - USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge; - USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable; -} - -/** - * @brief Enables or disables the specified USART peripheral. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param NewState: new state of the USARTx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected USART by setting the UE bit in the CR1 register */ - USARTx->CR1 |= CR1_UE_Set; - } - else - { - /* Disable the selected USART by clearing the UE bit in the CR1 register */ - USARTx->CR1 &= CR1_UE_Reset; - } -} - -/** - * @brief Enables or disables the specified USART interrupts. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled. - * This parameter can be one of the following values: - * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) - * @arg USART_IT_LBD: LIN Break detection interrupt - * @arg USART_IT_TXE: Tansmit Data Register empty interrupt - * @arg USART_IT_TC: Transmission complete interrupt - * @arg USART_IT_RXNE: Receive Data register not empty interrupt - * @arg USART_IT_IDLE: Idle line detection interrupt - * @arg USART_IT_PE: Parity Error interrupt - * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) - * @param NewState: new state of the specified USARTx interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) -{ - uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; - uint32_t usartxbase = 0x00; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CONFIG_IT(USART_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - /* The CTS interrupt is not available for UART4 and UART5 */ - if (USART_IT == USART_IT_CTS) - { - assert_param(IS_USART_123_PERIPH(USARTx)); - } - - usartxbase = (uint32_t)USARTx; - - /* Get the USART register index */ - usartreg = (((uint8_t)USART_IT) >> 0x05); - - /* Get the interrupt position */ - itpos = USART_IT & IT_Mask; - itmask = (((uint32_t)0x01) << itpos); - - if (usartreg == 0x01) /* The IT is in CR1 register */ - { - usartxbase += 0x0C; - } - else if (usartreg == 0x02) /* The IT is in CR2 register */ - { - usartxbase += 0x10; - } - else /* The IT is in CR3 register */ - { - usartxbase += 0x14; - } - if (NewState != DISABLE) - { - *(__IO uint32_t*)usartxbase |= itmask; - } - else - { - *(__IO uint32_t*)usartxbase &= ~itmask; - } -} - -/** - * @brief Enables or disables the USART’s DMA interface. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3 or UART4. - * @param USART_DMAReq: specifies the DMA request. - * This parameter can be any combination of the following values: - * @arg USART_DMAReq_Tx: USART DMA transmit request - * @arg USART_DMAReq_Rx: USART DMA receive request - * @param NewState: new state of the DMA Request sources. - * This parameter can be: ENABLE or DISABLE. - * @note The DMA mode is not available for UART5. - * @retval None - */ -void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_1234_PERIPH(USARTx)); - assert_param(IS_USART_DMAREQ(USART_DMAReq)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the DMA transfer for selected requests by setting the DMAT and/or - DMAR bits in the USART CR3 register */ - USARTx->CR3 |= USART_DMAReq; - } - else - { - /* Disable the DMA transfer for selected requests by clearing the DMAT and/or - DMAR bits in the USART CR3 register */ - USARTx->CR3 &= (uint16_t)~USART_DMAReq; - } -} - -/** - * @brief Sets the address of the USART node. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_Address: Indicates the address of the USART node. - * @retval None - */ -void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_ADDRESS(USART_Address)); - - /* Clear the USART address */ - USARTx->CR2 &= CR2_Address_Mask; - /* Set the USART address node */ - USARTx->CR2 |= USART_Address; -} - -/** - * @brief Selects the USART WakeUp method. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_WakeUp: specifies the USART wakeup method. - * This parameter can be one of the following values: - * @arg USART_WakeUp_IdleLine: WakeUp by an idle line detection - * @arg USART_WakeUp_AddressMark: WakeUp by an address mark - * @retval None - */ -void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_WAKEUP(USART_WakeUp)); - - USARTx->CR1 &= CR1_WAKE_Mask; - USARTx->CR1 |= USART_WakeUp; -} - -/** - * @brief Determines if the USART is in mute mode or not. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param NewState: new state of the USART mute mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the USART mute mode by setting the RWU bit in the CR1 register */ - USARTx->CR1 |= CR1_RWU_Set; - } - else - { - /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ - USARTx->CR1 &= CR1_RWU_Reset; - } -} - -/** - * @brief Sets the USART LIN Break detection length. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_LINBreakDetectLength: specifies the LIN break detection length. - * This parameter can be one of the following values: - * @arg USART_LINBreakDetectLength_10b: 10-bit break detection - * @arg USART_LINBreakDetectLength_11b: 11-bit break detection - * @retval None - */ -void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_LIN_BREAK_DETECT_LENGTH(USART_LINBreakDetectLength)); - - USARTx->CR2 &= CR2_LBDL_Mask; - USARTx->CR2 |= USART_LINBreakDetectLength; -} - -/** - * @brief Enables or disables the USART’s LIN mode. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param NewState: new state of the USART LIN mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ - USARTx->CR2 |= CR2_LINEN_Set; - } - else - { - /* Disable the LIN mode by clearing the LINEN bit in the CR2 register */ - USARTx->CR2 &= CR2_LINEN_Reset; - } -} - -/** - * @brief Transmits single data through the USARTx peripheral. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param Data: the data to transmit. - * @retval None - */ -void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_DATA(Data)); - - /* Transmit Data */ - USARTx->DR = (Data & (uint16_t)0x01FF); -} - -/** - * @brief Returns the most recent received data by the USARTx peripheral. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @retval The received data. - */ -uint16_t USART_ReceiveData(USART_TypeDef* USARTx) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - /* Receive Data */ - return (uint16_t)(USARTx->DR & (uint16_t)0x01FF); -} - -/** - * @brief Transmits break characters. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @retval None - */ -void USART_SendBreak(USART_TypeDef* USARTx) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - /* Send break characters */ - USARTx->CR1 |= CR1_SBK_Set; -} - -/** - * @brief Sets the specified USART guard time. - * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. - * @param USART_GuardTime: specifies the guard time. - * @note The guard time bits are not available for UART4 and UART5. - * @retval None - */ -void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime) -{ - /* Check the parameters */ - assert_param(IS_USART_123_PERIPH(USARTx)); - - /* Clear the USART Guard time */ - USARTx->GTPR &= GTPR_LSB_Mask; - /* Set the USART guard time */ - USARTx->GTPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); -} - -/** - * @brief Sets the system clock prescaler. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_Prescaler: specifies the prescaler clock. - * @note The function is used for IrDA mode with UART4 and UART5. - * @retval None - */ -void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - /* Clear the USART prescaler */ - USARTx->GTPR &= GTPR_MSB_Mask; - /* Set the USART prescaler */ - USARTx->GTPR |= USART_Prescaler; -} - -/** - * @brief Enables or disables the USART’s Smart Card mode. - * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. - * @param NewState: new state of the Smart Card mode. - * This parameter can be: ENABLE or DISABLE. - * @note The Smart Card mode is not available for UART4 and UART5. - * @retval None - */ -void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_123_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the SC mode by setting the SCEN bit in the CR3 register */ - USARTx->CR3 |= CR3_SCEN_Set; - } - else - { - /* Disable the SC mode by clearing the SCEN bit in the CR3 register */ - USARTx->CR3 &= CR3_SCEN_Reset; - } -} - -/** - * @brief Enables or disables NACK transmission. - * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral. - * @param NewState: new state of the NACK transmission. - * This parameter can be: ENABLE or DISABLE. - * @note The Smart Card mode is not available for UART4 and UART5. - * @retval None - */ -void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_123_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the NACK transmission by setting the NACK bit in the CR3 register */ - USARTx->CR3 |= CR3_NACK_Set; - } - else - { - /* Disable the NACK transmission by clearing the NACK bit in the CR3 register */ - USARTx->CR3 &= CR3_NACK_Reset; - } -} - -/** - * @brief Enables or disables the USART’s Half Duplex communication. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param NewState: new state of the USART Communication. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ - USARTx->CR3 |= CR3_HDSEL_Set; - } - else - { - /* Disable the Half-Duplex mode by clearing the HDSEL bit in the CR3 register */ - USARTx->CR3 &= CR3_HDSEL_Reset; - } -} - - -/** - * @brief Enables or disables the USART's 8x oversampling mode. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param NewState: new state of the USART one bit sampling methode. - * This parameter can be: ENABLE or DISABLE. - * @note - * This function has to be called before calling USART_Init() - * function in order to have correct baudrate Divider value. - * @retval None - */ -void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the 8x Oversampling mode by setting the OVER8 bit in the CR1 register */ - USARTx->CR1 |= CR1_OVER8_Set; - } - else - { - /* Disable the 8x Oversampling mode by clearing the OVER8 bit in the CR1 register */ - USARTx->CR1 &= CR1_OVER8_Reset; - } -} - -/** - * @brief Enables or disables the USART's one bit sampling methode. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param NewState: new state of the USART one bit sampling methode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the one bit method by setting the ONEBITE bit in the CR3 register */ - USARTx->CR3 |= CR3_ONEBITE_Set; - } - else - { - /* Disable tthe one bit method by clearing the ONEBITE bit in the CR3 register */ - USARTx->CR3 &= CR3_ONEBITE_Reset; - } -} - -/** - * @brief Configures the USART’s IrDA interface. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_IrDAMode: specifies the IrDA mode. - * This parameter can be one of the following values: - * @arg USART_IrDAMode_LowPower - * @arg USART_IrDAMode_Normal - * @retval None - */ -void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_IRDA_MODE(USART_IrDAMode)); - - USARTx->CR3 &= CR3_IRLP_Mask; - USARTx->CR3 |= USART_IrDAMode; -} - -/** - * @brief Enables or disables the USART’s IrDA interface. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param NewState: new state of the IrDA mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ - USARTx->CR3 |= CR3_IREN_Set; - } - else - { - /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ - USARTx->CR3 &= CR3_IREN_Reset; - } -} - -/** - * @brief Checks whether the specified USART flag is set or not. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) - * @arg USART_FLAG_LBD: LIN Break detection flag - * @arg USART_FLAG_TXE: Transmit data register empty flag - * @arg USART_FLAG_TC: Transmission Complete flag - * @arg USART_FLAG_RXNE: Receive data register not empty flag - * @arg USART_FLAG_IDLE: Idle Line detection flag - * @arg USART_FLAG_ORE: OverRun Error flag - * @arg USART_FLAG_NE: Noise Error flag - * @arg USART_FLAG_FE: Framing Error flag - * @arg USART_FLAG_PE: Parity Error flag - * @retval The new state of USART_FLAG (SET or RESET). - */ -FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_FLAG(USART_FLAG)); - /* The CTS flag is not available for UART4 and UART5 */ - if (USART_FLAG == USART_FLAG_CTS) - { - assert_param(IS_USART_123_PERIPH(USARTx)); - } - - if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the USARTx's pending flags. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). - * @arg USART_FLAG_LBD: LIN Break detection flag. - * @arg USART_FLAG_TC: Transmission Complete flag. - * @arg USART_FLAG_RXNE: Receive data register not empty flag. - * - * @note - * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun - * error) and IDLE (Idle line detected) flags are cleared by software - * sequence: a read operation to USART_SR register (USART_GetFlagStatus()) - * followed by a read operation to USART_DR register (USART_ReceiveData()). - * - RXNE flag can be also cleared by a read to the USART_DR register - * (USART_ReceiveData()). - * - TC flag can be also cleared by software sequence: a read operation to - * USART_SR register (USART_GetFlagStatus()) followed by a write operation - * to USART_DR register (USART_SendData()). - * - TXE flag is cleared only by a write to the USART_DR register - * (USART_SendData()). - * @retval None - */ -void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CLEAR_FLAG(USART_FLAG)); - /* The CTS flag is not available for UART4 and UART5 */ - if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS) - { - assert_param(IS_USART_123_PERIPH(USARTx)); - } - - USARTx->SR = (uint16_t)~USART_FLAG; -} - -/** - * @brief Checks whether the specified USART interrupt has occurred or not. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_IT: specifies the USART interrupt source to check. - * This parameter can be one of the following values: - * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) - * @arg USART_IT_LBD: LIN Break detection interrupt - * @arg USART_IT_TXE: Tansmit Data Register empty interrupt - * @arg USART_IT_TC: Transmission complete interrupt - * @arg USART_IT_RXNE: Receive Data register not empty interrupt - * @arg USART_IT_IDLE: Idle line detection interrupt - * @arg USART_IT_ORE: OverRun Error interrupt - * @arg USART_IT_NE: Noise Error interrupt - * @arg USART_IT_FE: Framing Error interrupt - * @arg USART_IT_PE: Parity Error interrupt - * @retval The new state of USART_IT (SET or RESET). - */ -ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) -{ - uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00; - ITStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_GET_IT(USART_IT)); - /* The CTS interrupt is not available for UART4 and UART5 */ - if (USART_IT == USART_IT_CTS) - { - assert_param(IS_USART_123_PERIPH(USARTx)); - } - - /* Get the USART register index */ - usartreg = (((uint8_t)USART_IT) >> 0x05); - /* Get the interrupt position */ - itmask = USART_IT & IT_Mask; - itmask = (uint32_t)0x01 << itmask; - - if (usartreg == 0x01) /* The IT is in CR1 register */ - { - itmask &= USARTx->CR1; - } - else if (usartreg == 0x02) /* The IT is in CR2 register */ - { - itmask &= USARTx->CR2; - } - else /* The IT is in CR3 register */ - { - itmask &= USARTx->CR3; - } - - bitpos = USART_IT >> 0x08; - bitpos = (uint32_t)0x01 << bitpos; - bitpos &= USARTx->SR; - if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - - return bitstatus; -} - -/** - * @brief Clears the USARTx’s interrupt pending bits. - * @param USARTx: Select the USART or the UART peripheral. - * This parameter can be one of the following values: - * USART1, USART2, USART3, UART4 or UART5. - * @param USART_IT: specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) - * @arg USART_IT_LBD: LIN Break detection interrupt - * @arg USART_IT_TC: Transmission complete interrupt. - * @arg USART_IT_RXNE: Receive Data register not empty interrupt. - * - * @note - * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun - * error) and IDLE (Idle line detected) pending bits are cleared by - * software sequence: a read operation to USART_SR register - * (USART_GetITStatus()) followed by a read operation to USART_DR register - * (USART_ReceiveData()). - * - RXNE pending bit can be also cleared by a read to the USART_DR register - * (USART_ReceiveData()). - * - TC pending bit can be also cleared by software sequence: a read - * operation to USART_SR register (USART_GetITStatus()) followed by a write - * operation to USART_DR register (USART_SendData()). - * - TXE pending bit is cleared only by a write to the USART_DR register - * (USART_SendData()). - * @retval None - */ -void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT) -{ - uint16_t bitpos = 0x00, itmask = 0x00; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CLEAR_IT(USART_IT)); - /* The CTS interrupt is not available for UART4 and UART5 */ - if (USART_IT == USART_IT_CTS) - { - assert_param(IS_USART_123_PERIPH(USARTx)); - } - - bitpos = USART_IT >> 0x08; - itmask = ((uint16_t)0x01 << (uint16_t)bitpos); - USARTx->SR = (uint16_t)~itmask; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c b/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c deleted file mode 100644 index 7805d3c050..0000000000 --- a/bsp/stm32_radio/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c +++ /dev/null @@ -1,223 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f10x_wwdg.c - * @author MCD Application Team - * @version V3.2.0 - * @date 03/01/2010 - * @brief This file provides all the WWDG firmware functions. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2010 STMicroelectronics

- */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_wwdg.h" -#include "stm32f10x_rcc.h" - -/** @addtogroup STM32F10x_StdPeriph_Driver - * @{ - */ - -/** @defgroup WWDG - * @brief WWDG driver modules - * @{ - */ - -/** @defgroup WWDG_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup WWDG_Private_Defines - * @{ - */ - -/* ----------- WWDG registers bit address in the alias region ----------- */ -#define WWDG_OFFSET (WWDG_BASE - PERIPH_BASE) - -/* Alias word address of EWI bit */ -#define CFR_OFFSET (WWDG_OFFSET + 0x04) -#define EWI_BitNumber 0x09 -#define CFR_EWI_BB (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4)) - -/* --------------------- WWDG registers bit mask ------------------------ */ - -/* CR register bit mask */ -#define CR_WDGA_Set ((uint32_t)0x00000080) - -/* CFR register bit mask */ -#define CFR_WDGTB_Mask ((uint32_t)0xFFFFFE7F) -#define CFR_W_Mask ((uint32_t)0xFFFFFF80) -#define BIT_Mask ((uint8_t)0x7F) - -/** - * @} - */ - -/** @defgroup WWDG_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup WWDG_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup WWDG_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup WWDG_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the WWDG peripheral registers to their default reset values. - * @param None - * @retval None - */ -void WWDG_DeInit(void) -{ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE); -} - -/** - * @brief Sets the WWDG Prescaler. - * @param WWDG_Prescaler: specifies the WWDG Prescaler. - * This parameter can be one of the following values: - * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1 - * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2 - * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4 - * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8 - * @retval None - */ -void WWDG_SetPrescaler(uint32_t WWDG_Prescaler) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_WWDG_PRESCALER(WWDG_Prescaler)); - /* Clear WDGTB[1:0] bits */ - tmpreg = WWDG->CFR & CFR_WDGTB_Mask; - /* Set WDGTB[1:0] bits according to WWDG_Prescaler value */ - tmpreg |= WWDG_Prescaler; - /* Store the new value */ - WWDG->CFR = tmpreg; -} - -/** - * @brief Sets the WWDG window value. - * @param WindowValue: specifies the window value to be compared to the downcounter. - * This parameter value must be lower than 0x80. - * @retval None - */ -void WWDG_SetWindowValue(uint8_t WindowValue) -{ - __IO uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_WWDG_WINDOW_VALUE(WindowValue)); - /* Clear W[6:0] bits */ - - tmpreg = WWDG->CFR & CFR_W_Mask; - - /* Set W[6:0] bits according to WindowValue value */ - tmpreg |= WindowValue & (uint32_t) BIT_Mask; - - /* Store the new value */ - WWDG->CFR = tmpreg; -} - -/** - * @brief Enables the WWDG Early Wakeup interrupt(EWI). - * @param None - * @retval None - */ -void WWDG_EnableIT(void) -{ - *(__IO uint32_t *) CFR_EWI_BB = (uint32_t)ENABLE; -} - -/** - * @brief Sets the WWDG counter value. - * @param Counter: specifies the watchdog counter value. - * This parameter must be a number between 0x40 and 0x7F. - * @retval None - */ -void WWDG_SetCounter(uint8_t Counter) -{ - /* Check the parameters */ - assert_param(IS_WWDG_COUNTER(Counter)); - /* Write to T[6:0] bits to configure the counter value, no need to do - a read-modify-write; writing a 0 to WDGA bit does nothing */ - WWDG->CR = Counter & BIT_Mask; -} - -/** - * @brief Enables WWDG and load the counter value. - * @param Counter: specifies the watchdog counter value. - * This parameter must be a number between 0x40 and 0x7F. - * @retval None - */ -void WWDG_Enable(uint8_t Counter) -{ - /* Check the parameters */ - assert_param(IS_WWDG_COUNTER(Counter)); - WWDG->CR = CR_WDGA_Set | Counter; -} - -/** - * @brief Checks whether the Early Wakeup interrupt flag is set or not. - * @param None - * @retval The new state of the Early Wakeup interrupt flag (SET or RESET) - */ -FlagStatus WWDG_GetFlagStatus(void) -{ - return (FlagStatus)(WWDG->SR); -} - -/** - * @brief Clears Early Wakeup interrupt flag. - * @param None - * @retval None - */ -void WWDG_ClearFlag(void) -{ - WWDG->SR = (uint32_t)RESET; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_cal.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_cal.h deleted file mode 100644 index 3c87394b60..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_cal.h +++ /dev/null @@ -1,259 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : otgd_fs_cal.h -* Author : STMicroelectronics -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Header of OTG FS Device Core Access Layer interface. -******************************************************************************** -* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -#ifndef __OTG_CORE_H__ -#define __OTG_CORE_H__ - -#ifdef STM32F10X_CL - -#include "stm32f10x.h" -#include "usb_type.h" - -#if defined ( __CC_ARM ) - #define __packed __packed /*!< packing keyword for ARM Compiler */ - -#elif defined ( __ICCARM__ ) - #define __packed __packed /*!< packing keyword for IAR Compiler */ - -#elif defined ( __GNUC__ ) - #define __packed __attribute__ ((__packed__)) /*!< packing keyword for GNU Compiler */ - -#endif /* __CC_ARM */ - -/******************************************************************************* - define and types -*******************************************************************************/ - -#define DEVICE_MODE_ENABLED - -#ifndef NULL -#define NULL ((void *)0) -#endif - - -#define DEV_EP_TX_DIS 0x0000 -#define DEV_EP_TX_STALL 0x0010 -#define DEV_EP_TX_NAK 0x0020 -#define DEV_EP_TX_VALID 0x0030 - -#define DEV_EP_RX_DIS 0x0000 -#define DEV_EP_RX_STALL 0x1000 -#define DEV_EP_RX_NAK 0x2000 -#define DEV_EP_RX_VALID 0x3000 - -/***************** GLOBAL DEFINES ***************************/ - -#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 -#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 - -#define GAHBCFG_GLBINT_ENABLE 1 -#define GAHBCFG_INT_DMA_BURST_SINGLE 0 -#define GAHBCFG_INT_DMA_BURST_INCR 1 -#define GAHBCFG_INT_DMA_BURST_INCR4 3 -#define GAHBCFG_INT_DMA_BURST_INCR8 5 -#define GAHBCFG_INT_DMA_BURST_INCR16 7 -#define GAHBCFG_DMAENABLE 1 -#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 -#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 - -#define GRXSTS_PKTSTS_IN 2 -#define GRXSTS_PKTSTS_IN_XFER_COMP 3 -#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 -#define GRXSTS_PKTSTS_CH_HALTED 7 - -#define DEVICE_MODE 0 -#define HOST_MODE 1 - -/***************** DEVICE DEFINES ***************************/ - -#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 -#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 -#define DSTS_ENUMSPD_LS_PHY_6MHZ 2 -#define DSTS_ENUMSPD_FS_PHY_48MHZ 3 - -#define DCFG_FRAME_INTERVAL_80 0 -#define DCFG_FRAME_INTERVAL_85 1 -#define DCFG_FRAME_INTERVAL_90 2 -#define DCFG_FRAME_INTERVAL_95 3 - -#define DEP0CTL_MPS_64 0 -#define DEP0CTL_MPS_32 1 -#define DEP0CTL_MPS_16 2 -#define DEP0CTL_MPS_8 3 - -#define EP_SPEED_LOW 0 -#define EP_SPEED_FULL 1 -#define EP_SPEED_HIGH 2 - -#define EP_TYPE_CTRL 0 -#define EP_TYPE_ISOC 1 -#define EP_TYPE_BULK 2 -#define EP_TYPE_INTR 3 - -#define STS_GOUT_NAK 1 -#define STS_DATA_UPDT 2 -#define STS_XFER_COMP 3 -#define STS_SETUP_COMP 4 -#define STS_SETUP_UPDT 6 - - - - -typedef enum { - - USB_OTG_OK, - USB_OTG_FAIL - -}USB_OTG_Status; - -typedef struct USB_OTG_hc -{ - uint8_t hc_num; - uint8_t dev_addr ; - uint8_t ep_num; - uint8_t ep_is_in; - uint8_t speed; - uint8_t ep_type; - uint16_t max_packet; - uint8_t data_pid; - uint16_t multi_count; - uint8_t *xfer_buff; - uint32_t xfer_len; -} -USB_OTG_HC , *PUSB_OTG_HC; - -typedef struct USB_OTG_ep -{ - uint8_t num; - uint8_t is_in; - uint32_t tx_fifo_num; - uint32_t type; - uint8_t data_pid_start; - uint8_t even_odd_frame; - uint32_t maxpacket; - uint8_t *xfer_buff; - uint32_t xfer_len; - uint32_t xfer_count; -} - -USB_OTG_EP , *PUSB_OTG_EP; - -/******************************************************************************** - MACRO'S -********************************************************************************/ - -#define CLEAR_IN_EP_INTR(epnum,intr) \ - diepint.d32=0; \ - diepint.b.intr = 1; \ - WRITE_REG32(&core_regs.inep_regs[epnum]->dev_in_ep_int,diepint.d32); - -#define CLEAR_OUT_EP_INTR(epnum,intr) \ - doepint.d32=0; \ - doepint.b.intr = 1; \ - WRITE_REG32(&core_regs.outep_regs[epnum]->dev_out_ep_int,doepint.d32); - - -#define READ_REG32(reg) (*(__IO uint32_t *)reg) - -#define WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value) - -#define MODIFY_REG32(reg,clear_mask,set_mask) \ - WRITE_REG32(reg, (((READ_REG32(reg)) & ~clear_mask) | set_mask ) ) - - -#define uDELAY(usec) udelay(usec) -#define mDELAY(msec) uDELAY(msec * 1000) - -#define _OTGD_FS_GATE_PHYCLK *(__IO uint32_t*)(0x50000E00) = 0x03 -#define _OTGD_FS_UNGATE_PHYCLK *(__IO uint32_t*)(0x50000E00) = 0x00 - -/******************************************************************************* - this can be changed for real time base -*******************************************************************************/ -static void udelay (const uint32_t usec) -{ - uint32_t count = 0; - const uint32_t utime = usec * 10; - do - { - if ( ++count > utime ) - { - return ; - } - } - while (1); -} -/******************************************************************************** - EXPORTED FUNCTIONS FROM THE OTGD_FS_CAL LAYER -********************************************************************************/ -USB_OTG_Status OTGD_FS_CoreInit(void); -USB_OTG_Status OTGD_FS_SetAddress(uint32_t BaseAddress); -USB_OTG_Status OTGD_FS_EnableGlobalInt(void); -USB_OTG_Status OTGD_FS_DisableGlobalInt(void); - -USB_OTG_Status USB_OTG_CoreInitHost(void); -USB_OTG_Status USB_OTG_EnableHostInt(void); -USB_OTG_Status USB_OTG_DisableHostInt(void); - -void* OTGD_FS_ReadPacket(uint8_t *dest, uint16_t bytes); -USB_OTG_Status OTGD_FS_WritePacket(uint8_t *src, uint8_t ch_ep_num, uint16_t bytes); - -USB_OTG_Status USB_OTG_HcInit(USB_OTG_HC *hc); -USB_OTG_Status USB_OTG_StartXfer(USB_OTG_HC *hc); - -uint32_t USB_OTG_ResetPort( void); - -uint32_t USB_OTG_ReadHPRT0(void); -uint32_t OTGD_FS_ReadDevAllInEPItr(void); -uint32_t OTGD_FS_ReadCoreItr(void); -uint32_t OTGD_FS_ReadOtgItr (void); -uint32_t USB_OTG_ReadHostAllChannels_intr (void); -uint8_t IsHostMode(void); -uint8_t IsDeviceMode(void); -USB_OTG_Status USB_OTG_HcInit(USB_OTG_HC *hc); -USB_OTG_Status USB_OTG_HcHalt(uint8_t hc_num); - -USB_OTG_Status OTGD_FS_FlushTxFifo (uint32_t num); -USB_OTG_Status OTGD_FS_FlushRxFifo (void); -USB_OTG_Status OTGD_FS_SetHostMode (void); - -USB_OTG_Status OTGD_FS_PhyInit(void); -USB_OTG_Status USB_OTG_HcStartXfer(USB_OTG_HC *hc); - -USB_OTG_Status OTGD_FS_CoreInitDev (void); -USB_OTG_Status OTGD_FS_EnableDevInt(void); -USB_OTG_Status OTGD_FS_EP0Activate(void); -USB_OTG_Status OTGD_FS_EPActivate(USB_OTG_EP *ep); -USB_OTG_Status OTGD_FS_EPDeactivate(USB_OTG_EP *ep); - -USB_OTG_Status OTGD_FS_EPStartXfer(USB_OTG_EP *ep); -USB_OTG_Status OTGD_FS_EP0StartXfer(USB_OTG_EP *ep); - -USB_OTG_Status OTGD_FS_EPSetStall(USB_OTG_EP *ep); -USB_OTG_Status OTGD_FS_EPClearStall(USB_OTG_EP *ep); -uint32_t OTGD_FS_ReadDevAllOutEp_itr(void); -uint32_t OTGD_FS_ReadDevOutEP_itr(USB_OTG_EP *ep); -uint32_t OTGD_FS_ReadDevAllInEPItr(void); - - -uint32_t OTGD_FS_Dev_GetEPStatus(USB_OTG_EP *ep); -void OTGD_FS_Dev_SetEPStatus(USB_OTG_EP *ep, uint32_t Status); -void OTGD_FS_Dev_SetRemoteWakeup(void); -void OTGD_FS_Dev_ResetRemoteWakeup(void); - -#endif /* STM32F10X_CL */ - -#endif -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_dev.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_dev.h deleted file mode 100644 index e3f2a52a10..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_dev.h +++ /dev/null @@ -1,121 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : otg_dev.h -* Author : STMicroelectronics -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : linking defines -******************************************************************************** -* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __OTG_DEV_H__ -#define __OTG_DEV_H__ - -#ifdef STM32F10X_CL - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -#include "usb_type.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* Endpoint types */ -#define OTG_DEV_EP_TYPE_CONTROL 0 -#define OTG_DEV_EP_TYPE_ISOC 1 -#define OTG_DEV_EP_TYPE_BULK 2 -#define OTG_DEV_EP_TYPE_INT 3 - -/* Endpoint Addresses (w/direction) */ -#define EP0_OUT 0x00 -#define EP0_IN 0x80 -#define EP1_OUT 0x01 -#define EP1_IN 0x81 -#define EP2_OUT 0x02 -#define EP2_IN 0x82 -#define EP3_OUT 0x03 -#define EP3_IN 0x83 - - -/*-*-*-*-*-*-*-*-*-* Replace the usb_regs.h defines -*-*-*-*-*-*-*-*-*-*-*-*-*/ -/* endpoints enumeration */ -#define ENDP0 ((uint8_t)0) -#define ENDP1 ((uint8_t)1) -#define ENDP2 ((uint8_t)2) -#define ENDP3 ((uint8_t)3) -#define ENDP4 ((uint8_t)4) -#define ENDP5 ((uint8_t)5) -#define ENDP6 ((uint8_t)6) -#define ENDP7 ((uint8_t)7) - -/* EP Transmit status defines */ -#define EP_TX_DIS DEV_EP_TX_DIS) /* EndPoint TX DISabled */ -#define EP_TX_STALL DEV_EP_TX_STALL /* EndPoint TX STALLed */ -#define EP_TX_NAK DEV_EP_TX_NAK /* EndPoint TX NAKed */ -#define EP_TX_VALID DEV_EP_TX_VALID /* EndPoint TX VALID */ - -/* EP Transmit status defines */ -#define EP_RX_DIS DEV_EP_RX_DIS /* EndPoint RX DISabled */ -#define EP_RX_STALL DEV_EP_RX_STALL /* EndPoint RX STALLed */ -#define EP_RX_NAK DEV_EP_RX_NAK /* EndPoint RX NAKed */ -#define EP_RX_VALID DEV_EP_RX_VALID /* EndPoint RX VALID */ -/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ - -/* Exported macro ------------------------------------------------------------*/ -#define _GetEPTxStatus(bEpNum) ((uint16_t)OTG_DEV_GetEPTxStatus(bEpNum)) -#define _GetEPRxStatus(bEpNum) ((uint16_t)OTG_DEV_GetEPRxStatus(bEpNum)) - -#define _SetEPTxStatus(bEpNum,wState) (OTG_DEV_SetEPTxStatus(bEpNum, wState)) -#define _SetEPRxStatus(bEpNum,wState) (OTG_DEV_SetEPRxStatus(bEpNum, wState)) - -#define _SetEPTxValid(bEpNum) (OTG_DEV_SetEPTxStatus(bEpNum, EP_TX_VALID)) -#define _SetEPRxValid(bEpNum) (OTG_DEV_SetEPRxStatus(bEpNum, EP_RX_VALID)) - -#define _GetTxStallStatus(bEpNum) (OTG_DEV_GetEPTxStatus(bEpNum) == EP_TX_STALL) -#define _GetRxStallStatus(bEpNum) (OTG_DEV_GetEPRxStatus(bEpNum) == EP_RX_STALL) - -/* Define the callbacks for updating the USB state machine */ -#define OTGD_FS_DEVICE_RESET Device_Property.Reset() - -/* Exported define -----------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -void OTG_DEV_Init(void); -void OTG_DEV_EP_Init(uint8_t bEpAdd, uint8_t bEpType, uint16_t wEpMaxPackSize); - -void OTG_DEV_SetEPRxStatus(uint8_t bEpnum, uint32_t status); -void OTG_DEV_SetEPTxStatus(uint8_t bEpnum, uint32_t status); -uint32_t OTG_DEV_GetEPRxStatus(uint8_t bEpnum); -uint32_t OTG_DEV_GetEPTxStatus(uint8_t bEpnum); - -void USB_DevDisconnect(void); -void USB_DevConnect(void); - - -/*-*-*-*-*-*-*-*-*-* Replace the usb_regs.h prototypes *-*-*-*-*-*-*-*-*-*-*-*/ -void SetEPTxStatus(uint8_t bEpNum, uint16_t wState); -void SetEPRxStatus(uint8_t bEpNum, uint16_t wState); -uint16_t GetEPTxStatus(uint8_t bEpNum); -uint16_t GetEPRxStatus(uint8_t bEpNum); -void SetEPTxValid(uint8_t bEpNum); -void SetEPRxValid(uint8_t bEpNum); -uint16_t GetTxStallStatus(uint8_t bEpNum); -uint16_t GetRxStallStatus(uint8_t bEpNum); -void SetEPTxCount(uint8_t bEpNum, uint16_t wCount); -void SetEPRxCount(uint8_t bEpNum, uint16_t wCount); - -uint16_t ToWord(uint8_t, uint8_t); -uint16_t ByteSwap(uint16_t); -/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/ - -#endif /* STM32F10X_CL */ - -#endif /* __OTG_DEV_H__ */ -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_int.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_int.h deleted file mode 100644 index fab816412a..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_int.h +++ /dev/null @@ -1,54 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : otgd_fs_int.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Endpoint interrupt's service routines prototypes. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_INT_H -#define __USB_INT_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#ifdef STM32F10X_CL - -/* Interrupt Handlers functions */ -uint32_t OTGD_FS_Handle_ModeMismatch_ISR(void); -uint32_t OTGD_FS_Handle_Sof_ISR(void); -uint32_t OTGD_FS_Handle_RxStatusQueueLevel_ISR(void); -uint32_t OTGD_FS_Handle_NPTxFE_ISR(void); -uint32_t OTGD_FS_Handle_GInNakEff_ISR(void); -uint32_t OTGD_FS_Handle_GOutNakEff_ISR(void); -uint32_t OTGD_FS_Handle_EarlySuspend_ISR(void); -uint32_t OTGD_FS_Handle_USBSuspend_ISR(void); -uint32_t OTGD_FS_Handle_UsbReset_ISR(void); -uint32_t OTGD_FS_Handle_EnumDone_ISR(void); -uint32_t OTGD_FS_Handle_IsoOutDrop_ISR(void); -uint32_t OTGD_FS_Handle_EOPF_ISR(void); -uint32_t OTGD_FS_Handle_EPMismatch_ISR(void); -uint32_t OTGD_FS_Handle_InEP_ISR(void); -uint32_t OTGD_FS_Handle_OutEP_ISR(void); -uint32_t OTGD_FS_Handle_IncomplIsoIn_ISR(void); -uint32_t OTGD_FS_Handle_IncomplIsoOut_ISR(void); -uint32_t OTGD_FS_Handle_Wakeup_ISR(void); - -#endif /* STM32F10X_CL */ - -/* External variables --------------------------------------------------------*/ - -#endif /* __USB_INT_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_pcd.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_pcd.h deleted file mode 100644 index 1ae359b6db..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_pcd.h +++ /dev/null @@ -1,87 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : otgd_fs_pcd.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Header file of the High Layer device mode interface and -* wrapping layer -******************************************************************************** -* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -#ifndef __USB_OTG_PCD_H__ -#define __USB_OTG_PCD_H__ - -#include "otgd_fs_regs.h" - -#define MAX_EP0_SIZE 0x40 -#define MAX_PACKET_SIZE 0x400 - - -#define USB_ENDPOINT_XFER_CONTROL 0 -#define USB_ENDPOINT_XFER_ISOC 1 -#define USB_ENDPOINT_XFER_BULK 2 -#define USB_ENDPOINT_XFER_INT 3 -#define USB_ENDPOINT_XFERTYPE_MASK 3 - - -/******************************************************************************** - ENUMERATION TYPE -********************************************************************************/ -enum usb_device_speed { - USB_SPEED_UNKNOWN = 0, - USB_SPEED_LOW, USB_SPEED_FULL, - USB_SPEED_HIGH -}; -/******************************************************************************** - Data structure type -********************************************************************************/ -typedef struct usb_ep_descriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; -} -EP_DESCRIPTOR , *PEP_DESCRIPTOR; -/******************************************************************************** - USBF LAYER UNION AND STRUCTURES -********************************************************************************/ -typedef struct USB_OTG_USBF -{ - - USB_OTG_EP ep0; - uint8_t ep0state; - USB_OTG_EP in_ep[ MAX_TX_FIFOS - 1]; - USB_OTG_EP out_ep[ MAX_TX_FIFOS - 1]; -} -USB_OTG_PCD_DEV , *USB_OTG_PCD_PDEV; -/******************************************************************************** - EXPORTED FUNCTION FROM THE USB_OTG LAYER -********************************************************************************/ -void OTGD_FS_PCD_Init(void); -void OTGD_FS_PCD_DevConnect (void); -void OTGD_FS_PCD_DevDisconnect (void); -void OTGD_FS_PCD_EP_SetAddress (uint8_t address); -uint32_t OTGD_FS_PCD_EP_Open(EP_DESCRIPTOR *epdesc); -uint32_t OTGD_FS_PCD_EP_Close ( uint8_t ep_addr); -uint32_t OTGD_FS_PCD_EP_Read ( uint8_t ep_addr, uint8_t *pbuf, uint32_t buf_len); -uint32_t OTGD_FS_PCD_EP_Write ( uint8_t ep_addr, uint8_t *pbuf, uint32_t buf_len); -uint32_t OTGD_FS_PCD_EP_Stall (uint8_t epnum); -uint32_t OTGD_FS_PCD_EP_ClrStall (uint8_t epnum); -uint32_t OTGD_FS_PCD_EP_Flush (uint8_t epnum); -uint32_t OTGD_FS_PCD_Handle_ISR(void); - -USB_OTG_EP* OTGD_FS_PCD_GetOutEP(uint32_t ep_num) ; -USB_OTG_EP* OTGD_FS_PCD_GetInEP(uint32_t ep_num); -void OTGD_FS_PCD_EP0_OutStart(void); - -#endif -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_regs.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_regs.h deleted file mode 100644 index b46c9d76d7..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/otgd_fs_regs.h +++ /dev/null @@ -1,1597 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : otgd_fs_regs.h -* Author : STMicroelectronics -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : USB OTG IP hardware registers. -******************************************************************************** -* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -#ifndef __USB_OTG_REGS_H__ -#define __USB_OTG_REGS_H__ - -#ifdef STM32F10X_CL - -#include "stm32f10x.h" -#include "usb_type.h" - -#define USB_OTG_FS1_BASE_ADDR 0x50000000 - -#define USB_OTG_CORE_GLOBAL_REGS_OFFSET 0x000 -#define USB_OTG_DEV_GLOBAL_REG_OFFSET 0x800 -#define USB_OTG_DEV_IN_EP_REG_OFFSET 0x900 -#define USB_OTG_EP_REG_OFFSET 0x20 -#define USB_OTG_DEV_OUT_EP_REG_OFFSET 0xB00 -#define USB_OTG_HOST_GLOBAL_REG_OFFSET 0x400 -#define USB_OTG_HOST_PORT_REGS_OFFSET 0x440 -#define USB_OTG_HOST_CHAN_REGS_OFFSET 0x500 -#define USB_OTG_CHAN_REGS_OFFSET 0x20 -#define USB_OTG_PCGCCTL_OFFSET 0xE00 -#define USB_OTG_DATA_FIFO_OFFSET 0x1000 -#define USB_OTG_DATA_FIFO_SIZE 0x1000 - -#define MAX_PERIO_FIFOS 8 -#define MAX_TX_FIFOS 4 -#define MAX_EPS_CHANNELS 8 - -#define DEV_NP_TX_FIFO_SIZE 160 -#define RX_FIFO_SIZE 160 -#define TX_FIFO_SIZE 160 - -/******************************************************************************* - * USB_OTG Core registers . - * The USB_OTG_core_regs structure defines the size - * and relative field offsets for the Core Global registers. - ******************************************************************************/ -typedef struct _USB_OTG_common_regs //000h -{ - - __IO uint32_t otg_ctl; /* USB_OTG Control and Status Register 000h*/ - __IO uint32_t otg_int; /* USB_OTG Interrupt Register 004h*/ - __IO uint32_t ahb_cfg; /* Core AHB Configuration Register 008h*/ - __IO uint32_t usb_cfg; /* Core USB Configuration Register 00Ch*/ - __IO uint32_t rst_ctl; /* Core Reset Register 010h*/ - __IO uint32_t int_sts; /* Core Interrupt Register 014h*/ - __IO uint32_t int_msk; /* Core Interrupt Mask Register 018h*/ - __IO uint32_t rx_stsr; /* Receive Sts Q Read Register 01Ch*/ - __IO uint32_t rx_stsp; /* Receive Sts Q Read & POP Register 020h*/ - __IO uint32_t rx_fifo_siz; /* Receive FIFO Size Register 024h*/ - __IO uint32_t np_tx_fifo_siz; /* Non Periodic Tx FIFO Size Register 028h*/ - __IO uint32_t np_tx_sts; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ - __IO uint32_t i2c_ctl; /* I2C Access Register 030h*/ - __IO uint32_t phy_vnd_ctl; /* PHY Vendor Control Register 034h*/ - __IO uint32_t gpio; /* General Purpose IO Register 038h*/ - __IO uint32_t usr_id; /* User ID Register 03Ch*/ - __IO uint32_t snps_id; /* Synopsys ID Register 040h*/ - __IO uint32_t hw_cfg1; /* User HW Config1 Register (RO) 044h*/ - __IO uint32_t hw_cfg2; /* User HW Config2 Register (RO) 048h*/ - __IO uint32_t hw_cfg3; /* User HW Config3 Register (RO) 04Ch*/ - __IO uint32_t hw_cfg4; /* User HW Config4 Register (RO) 050h*/ - uint32_t reserved[43]; /* Reserved 054h-0FFh*/ - __IO uint32_t host_p_tx_fifo_siz; /* Host Periodic Tx FIFO Size Reg 100h*/ - __IO uint32_t dev_p_tx_fsiz_dieptxf[15];/* dev Periodic Transmit FIFO */ - -} -USB_OTG_common_regs; - -/******************************************************************************* - * dev Registers - * dev Global Registers : Offsets 800h-BFFh - * The following structures define the size and relative field offsets - * for the dev Mode Registers. - * These registers are visible only in dev mode and must not be - * accessed in Host mode, as the results are unknown - ******************************************************************************/ -typedef struct _USB_OTG_dev_regs // 800h -{ - - __IO uint32_t dev_cfg; /* dev Configuration Register 800h*/ - __IO uint32_t dev_ctl; /* dev Control Register 804h*/ - __IO uint32_t dev_sts; /* dev Status Register (RO) 808h*/ - uint32_t reserved3; /* Reserved 80Ch*/ - __IO uint32_t dev_in_ep_msk; /* dev IN Endpoint Mask 810h*/ - __IO uint32_t dev_out_ep_msk; /* dev OUT Endpoint Mask 814h*/ - __IO uint32_t dev_all_int; /* dev All Endpoints Itr Reg 818h*/ - __IO uint32_t dev_all_int_msk; /* dev All Endpoints Itr Mask 81Ch*/ - uint32_t Reserved8; /* Reserved 820h*/ - __IO uint32_t Reserved9; /* Reserved 824h*/ - __IO uint32_t dev_vbus_dis; /* dev VBUS discharge Register 828h*/ - __IO uint32_t dev_vbus_pulse; /* dev VBUS Pulse Register 82Ch*/ - __IO uint32_t dev_thr_ctl; /* dev thr 830h*/ - __IO uint32_t dev_fifo_empty_msk; /* dev empty msk 834h*/ - -} -USB_OTG_dev_regs; -/******************************************************************************* - * dev Logical IN Endpoint-Specific Registers: Offsets 900h-AFCh - * There will be one set of endpoint registers per logical endpointimplemented. - * These registers are visible only in dev mode and must not be - * accessed in Host mode, as the results are unknown -*******************************************************************************/ -typedef struct _USB_OTG_dev_in_ep_regs -{ - __IO uint32_t dev_in_ep_ctl; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ - uint32_t reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ - __IO uint32_t dev_in_ep_int; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ - uint32_t reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t dev_in_ep_txfer_siz; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ - __IO uint32_t dev_in_ep_dma; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ - __IO uint32_t dev_tx_fifo_sts;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ - uint32_t reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ - -} -USB_OTG_dev_in_ep_regs; - -/******************************************************************************* - * dev Logical OUT Endpoint-Specific Registers Offsets: B00h-CFCh - * There will be one set of endpoint registers per logical endpoint - * implemented. - * These registers are visible only in dev mode and must not be - * accessed in Host mode, as the results are unknown -******************************************************************************/ -typedef struct _USB_OTG_dev_out_ep_regs -{ - __IO uint32_t dev_out_ep_ctl; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ - __IO uint32_t dev_out_ep_frm_nbr; /* dev OUT Endpoint Frame number B00h + (ep_num * 20h) + 04h*/ - __IO uint32_t dev_out_ep_int; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ - uint32_t reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t dev_out_ep_txfer_siz; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ - __IO uint32_t dev_out_ep_dma; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ - uint32_t reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ - -} -USB_OTG_dev_out_ep_regs; -/******************************************************************************* - * Host Mode Register Structures - * The Host Global Registers structure defines the size and relative - * field offsets for the Host Mode Global Registers. - * Host Global Registers offsets 400h-7FFh. -*******************************************************************************/ -typedef struct _USB_OTG_host_regs -{ - __IO uint32_t host_cfg; /* Host Configuration Register 400h*/ - __IO uint32_t host_frm_intrvl; /* Host Frame Interval Register 404h*/ - __IO uint32_t host_frm_nbr; /* Host Frame Nbr/Frame Remaining 408h*/ - uint32_t reserved40C; /* Reserved 40Ch*/ - __IO uint32_t host_p_tx_sts; /* Host Periodic Tx FIFO/ Queue Status 410h*/ - __IO uint32_t host_all_int; /* Host All Channels Interrupt Register 414h*/ - __IO uint32_t host_all_int_msk; /* Host All Channels Interrupt Mask 418h*/ - -} -USB_OTG_host_regs; - -/******************************************************************************* -* Host Channel Specific Registers 500h-5FCh -*******************************************************************************/ -typedef struct _USB_OTG_hc_regs -{ - - __IO uint32_t hc_char; - __IO uint32_t hc_split; - __IO uint32_t hc_int; - __IO uint32_t hc_int_msk; - __IO uint32_t hc_txfer_siz; - __IO uint32_t hc_dma; - uint32_t reserved[2]; - -} -USB_OTG_hc_regs; -/******************************************************************************* - * otg Core registers . - * The USB_OTG_core_regs structure defines the size - * and relative field offsets for the Core Global registers. - ******************************************************************************/ -typedef struct USB_OTG_core_regs //000h -{ - USB_OTG_common_regs *common_regs; - USB_OTG_dev_regs *dev_regs; - USB_OTG_host_regs *host_regs; - USB_OTG_dev_in_ep_regs *inep_regs[MAX_EPS_CHANNELS]; - USB_OTG_dev_out_ep_regs *outep_regs[MAX_EPS_CHANNELS]; - USB_OTG_hc_regs *hc_regs[MAX_EPS_CHANNELS]; - __IO uint32_t *hprt0; - __IO uint32_t *data_fifo[MAX_EPS_CHANNELS]; - __IO uint32_t *pcgcctl; - -} -USB_OTG_CORE_REGS , *pUSB_OTG_CORE_REGS; -/******************************************************************************/ - -typedef union _USB_OTG_OTG_ctl_data -{ - uint32_t d32; - struct - { -uint32_t sesreqscs : - 1; -uint32_t sesreq : - 1; -uint32_t reserved2_7 : - 6; -uint32_t hstnegscs : - 1; -uint32_t hnpreq : - 1; -uint32_t hstsethnpen : - 1; -uint32_t devhnpen : - 1; -uint32_t reserved12_15 : - 4; -uint32_t conidsts : - 1; -uint32_t reserved17 : - 1; -uint32_t asesvld : - 1; -uint32_t bsesvld : - 1; -uint32_t currmod : - 1; -uint32_t reserved21_31 : - 11; - } - b; -} USB_OTG_OTG_ctl_data; - -/******************************************************************************/ - -typedef union _USB_OTG_OTG_int_data -{ - uint32_t d32; - struct - { -uint32_t reserved0_1 : - 2; -uint32_t sesenddet : - 1; -uint32_t reserved3_7 : - 5; -uint32_t sesreqsucstschng : - 1; -uint32_t hstnegsucstschng : - 1; -uint32_t reserver10_16 : - 7; -uint32_t hstnegdet : - 1; -uint32_t adevtoutchng : - 1; -uint32_t debdone : - 1; -uint32_t reserved31_20 : - 12; - } - b; -} USB_OTG_OTG_int_data; - - -/******************************************************************************/ - - -typedef union _USB_OTG_ahb_cfg_data -{ - uint32_t d32; - struct - { -uint32_t glblintrmsk : - 1; -uint32_t hburstlen : - 4; -uint32_t dmaenable : - 1; -uint32_t reserved : - 1; -uint32_t nptxfemplvl_txfemplvl : - 1; -uint32_t ptxfemplvl : - 1; -uint32_t reserved9_31 : - 23; - } - b; -} USB_OTG_ahb_cfg_data; - -/******************************************************************************/ - -typedef union _USB_OTG_usb_cfg_data -{ - uint32_t d32; - struct - { -uint32_t toutcal : - 3; -uint32_t phyif : - 1; -uint32_t ulpi_utmi_sel : - 1; -uint32_t fsintf : - 1; -uint32_t physel : - 1; -uint32_t ddrsel : - 1; -uint32_t srpcap : - 1; -uint32_t hnpcap : - 1; -uint32_t usbtrdtim : - 4; -uint32_t nptxfrwnden : - 1; -uint32_t phylpwrclksel : - 1; -uint32_t otgutmifssel : - 1; -uint32_t ulpi_fsls : - 1; -uint32_t ulpi_auto_res : - 1; -uint32_t ulpi_clk_sus_m : - 1; -uint32_t ulpi_ext_vbus_drv : - 1; -uint32_t ulpi_int_vbus_indicator : - 1; -uint32_t term_sel_dl_pulse : - 1; -uint32_t reserved : - 6; -uint32_t force_host : - 1; -uint32_t force_dev : - 1; -uint32_t corrupt_tx : - 1; - } - b; -} USB_OTG_usb_cfg_data; -/******************************************************************************/ - -typedef union _USB_OTG_rst_ctl_data -{ - uint32_t d32; - struct - { -uint32_t csftrst : - 1; -uint32_t hsftrst : - 1; -uint32_t hstfrm : - 1; -uint32_t intknqflsh : - 1; -uint32_t rxfflsh : - 1; -uint32_t txfflsh : - 1; -uint32_t txfnum : - 5; -uint32_t reserved11_29 : - 19; -uint32_t dmareq : - 1; -uint32_t ahbidle : - 1; - } - b; -} USB_OTG_rst_ctl_data; - -/******************************************************************************/ - -typedef union _USB_OTG_int_msk_data -{ - uint32_t d32; - struct - { -uint32_t reserved0 : - 1; -uint32_t modemismatch : - 1; -uint32_t otgintr : - 1; -uint32_t sofintr : - 1; -uint32_t rxstsqlvl : - 1; -uint32_t nptxfempty : - 1; -uint32_t ginnakeff : - 1; -uint32_t goutnakeff : - 1; -uint32_t reserved8 : - 1; -uint32_t i2cintr : - 1; -uint32_t erlysuspend : - 1; -uint32_t usbsuspend : - 1; -uint32_t usbreset : - 1; -uint32_t enumdone : - 1; -uint32_t isooutdrop : - 1; -uint32_t eopframe : - 1; -uint32_t reserved16 : - 1; -uint32_t epmismatch : - 1; -uint32_t inepintr : - 1; -uint32_t outepintr : - 1; -uint32_t incomplisoin : - 1; -uint32_t incomplisoout : - 1; -uint32_t reserved22_23 : - 2; -uint32_t portintr : - 1; -uint32_t hcintr : - 1; -uint32_t ptxfempty : - 1; -uint32_t reserved27 : - 1; -uint32_t conidstschng : - 1; -uint32_t disconnect : - 1; -uint32_t sessreqintr : - 1; -uint32_t wkupintr : - 1; - } - b; -} USB_OTG_int_msk_data; - -/******************************************************************************/ - - -typedef union _USB_OTG_int_sts_data -{ - uint32_t d32; - struct - { -uint32_t curmode : - 1; -uint32_t modemismatch : - 1; -uint32_t otgintr : - 1; -uint32_t sofintr : - 1; -uint32_t rxstsqlvl : - 1; -uint32_t nptxfempty : - 1; -uint32_t ginnakeff : - 1; -uint32_t goutnakeff : - 1; -uint32_t reserved8 : - 1; -uint32_t i2cintr : - 1; -uint32_t erlysuspend : - 1; -uint32_t usbsuspend : - 1; -uint32_t usbreset : - 1; -uint32_t enumdone : - 1; -uint32_t isooutdrop : - 1; -uint32_t eopframe : - 1; -uint32_t intokenrx : - 1; -uint32_t epmismatch : - 1; -uint32_t inepint: - 1; -uint32_t outepintr : - 1; -uint32_t incomplisoin : - 1; -uint32_t incomplisoout : - 1; -uint32_t reserved22_23 : - 2; -uint32_t portintr : - 1; -uint32_t hcintr : - 1; -uint32_t ptxfempty : - 1; -uint32_t reserved27 : - 1; -uint32_t conidstschng : - 1; -uint32_t disconnect : - 1; -uint32_t sessreqintr : - 1; -uint32_t wkupintr : - 1; - } - b; -} USB_OTG_int_sts_data; - -/******************************************************************************/ -typedef union _USB_OTG_dev_rx_sts_data -{ - - uint32_t d32; - struct - { -uint32_t epnum : - 4; -uint32_t bcnt : - 11; -uint32_t dpid : - 2; -uint32_t pktsts : - 4; -uint32_t fn : - 4; -uint32_t reserved : - 7; - } - b; -} USB_OTG_dev_rx_sts_data; - -/******************************************************************************/ -typedef union _USB_OTG_host_rx_sts_data -{ - - uint32_t d32; - struct - { -uint32_t chnum : - 4; -uint32_t bcnt : - 11; -uint32_t dpid : - 2; -uint32_t pktsts : - 4; -uint32_t reserved : - 11; - } - b; -} USB_OTG_host_rx_sts_data; - -/******************************************************************************/ - -typedef union _USB_OTG_fifo_size_data -{ - uint32_t d32; - struct - { -uint32_t startaddr : - 16; -uint32_t depth : - 16; - } - b; -} USB_OTG_fifo_size_data; - -/******************************************************************************/ - -typedef union _USB_OTG_np_tx_sts_data -{ - uint32_t d32; - struct - { -uint32_t nptxfspcavail : - 16; -uint32_t nptxqspcavail : - 8; -uint32_t nptxqtop_terminate : - 1; -uint32_t nptxqtop_token : - 2; -uint32_t nptxqtop_chnep : - 4; -uint32_t reserved : - 1; - } - b; -} USB_OTG_np_tx_sts_data; - -/******************************************************************************/ - -typedef union _USB_OTG_dev_tx_fifo_sts_data -{ - uint32_t d32; - struct - { -uint32_t txfspcavail : - 16; -uint32_t reserved : - 16; - } - b; -} USB_OTG_dev_tx_fifo_sts_data; - -/******************************************************************************/ -typedef union _USB_OTG_i2c_ctl_data -{ - - uint32_t d32; - struct - { -uint32_t rwdata : - 8; -uint32_t regaddr : - 8; -uint32_t addr : - 7; -uint32_t i2cen : - 1; -uint32_t ack : - 1; -uint32_t i2csuspctl : - 1; -uint32_t i2cdevaddr : - 2; -uint32_t dat_se0: - 1; -uint32_t reserved : - 1; -uint32_t rw : - 1; -uint32_t bsydne : - 1; - } - b; -} USB_OTG_i2c_ctl_data; - -/******************************************************************************/ - -typedef union _USB_OTG_gpio_data -{ - - uint32_t d32; - struct - { - /* input */ -uint32_t ovrcur : - 1; -uint32_t otgid : - 1; -uint32_t reserved_in : - 14; - /* Output */ -uint32_t pwdn : - 1; -uint32_t i2cifen : - 1; -uint32_t vbussensingA : - 1; -uint32_t vbussensingB : - 1; -uint32_t SOFouten : - 1; -uint32_t reserved_out : - 11; - } - b; -} USB_OTG_gpio_data; - - -/******************************************************************************/ - -typedef union _USB_OTG_hw_cfg1_data -{ - - uint32_t d32; - struct - { -uint32_t ep_dir0 : - 2; -uint32_t ep_dir1 : - 2; -uint32_t ep_dir2 : - 2; -uint32_t ep_dir3 : - 2; -uint32_t ep_dir4 : - 2; -uint32_t ep_dir5 : - 2; -uint32_t ep_dir6 : - 2; -uint32_t ep_dir7 : - 2; -uint32_t ep_dir8 : - 2; -uint32_t ep_dir9 : - 2; -uint32_t ep_dir10 : - 2; -uint32_t ep_dir11 : - 2; -uint32_t ep_dir12 : - 2; -uint32_t ep_dir13 : - 2; -uint32_t ep_dir14 : - 2; -uint32_t ep_dir15 : - 2; - } - b; -} USB_OTG_hw_cfg1_data; - -/******************************************************************************/ -typedef union _USB_OTG_hw_cfg2_data -{ - uint32_t d32; - struct - { -uint32_t op_mode : - 3; -uint32_t architecture : - 2; -uint32_t point2point : - 1; -uint32_t hs_phy_type : - 2; -uint32_t fs_phy_type : - 2; -uint32_t num_dev_ep : - 4; -uint32_t num_host_chan : - 4; -uint32_t perio_ep_supported : - 1; -uint32_t dynamic_fifo : - 1; -uint32_t rx_status_q_depth : - 2; -uint32_t nonperio_tx_q_depth : - 2; -uint32_t host_perio_tx_q_depth : - 2; -uint32_t dev_token_q_depth : - 5; -uint32_t reserved31 : - 1; - } - b; -} USB_OTG_hw_cfg2_data; - -/******************************************************************************/ - -typedef union _USB_OTG_hw_cfg3_data -{ - - uint32_t d32; - struct - { -uint32_t xfer_size_cntr_width : - 4; -uint32_t packet_size_cntr_width : - 3; -uint32_t otg_func : - 1; -uint32_t i2c : - 1; -uint32_t vendor_ctrl_if : - 1; -uint32_t optional_features : - 1; -uint32_t synch_reset_type : - 1; -uint32_t ahb_phy_clock_synch : - 1; -uint32_t reserved15_13 : - 3; -uint32_t dfifo_depth : - 16; - } - b; -} USB_OTG_hw_cfg3_data; - -/******************************************************************************/ - -typedef union _USB_OTG_hw_cfg4_data -{ - uint32_t d32; - struct - { -uint32_t num_dev_perio_in_ep : - 4; -uint32_t power_optimiz : - 1; -uint32_t min_ahb_freq : - 9; -uint32_t utmi_phy_data_width : - 2; -uint32_t num_dev_mode_ctrl_ep : - 4; -uint32_t iddig_filt_en : - 1; -uint32_t vbus_valid_filt_en : - 1; -uint32_t a_valid_filt_en : - 1; -uint32_t b_valid_filt_en : - 1; -uint32_t session_end_filt_en : - 1; -uint32_t ded_fifo_en : - 1; -uint32_t num_in_eps : - 4; -uint32_t reserved31_30 : - 2; - } - b; -} USB_OTG_hw_cfg4_data; - -/******************************************************************************/ -typedef union _USB_OTG_dev_cfg_data -{ - - uint32_t d32; - struct - { -uint32_t devspd : - 2; -uint32_t nzstsouthshk : - 1; -uint32_t reserved3 : - 1; -uint32_t devaddr : - 7; -uint32_t perfrint : - 2; -uint32_t reserved13_17 : - 5; -uint32_t epmscnt : - 4; - } - b; -} USB_OTG_dev_cfg_data; - -/******************************************************************************/ - -typedef union _USB_OTG_dev_ctl_data -{ - - uint32_t d32; - struct - { -uint32_t rmtwkupsig : - 1; -uint32_t sftdiscon : - 1; -uint32_t gnpinnaksts : - 1; -uint32_t goutnaksts : - 1; -uint32_t tstctl : - 3; -uint32_t sgnpinnak : - 1; -uint32_t cgnpinnak : - 1; -uint32_t sgoutnak : - 1; -uint32_t cgoutnak : - 1; -uint32_t reserved : - 21; - } - b; -} USB_OTG_dev_ctl_data; - -/******************************************************************************/ -typedef union _USB_OTG_dev_sts_data -{ - - uint32_t d32; - struct - { -uint32_t suspsts : - 1; -uint32_t enumspd : - 2; -uint32_t errticerr : - 1; -uint32_t reserved4_7: - 4; -uint32_t soffn : - 14; -uint32_t reserved22_31 : - 10; - } - b; -} USB_OTG_dev_sts_data; - -/******************************************************************************/ - -typedef union _USB_OTG_dev_in_ep_int_data -{ - - uint32_t d32; - struct - { -uint32_t xfercompl : - 1; -uint32_t epdisabled : - 1; -uint32_t ahberr : - 1; -uint32_t timeout : - 1; -uint32_t intktxfemp : - 1; -uint32_t intknepmis : - 1; -uint32_t inepnakeff : - 1; -uint32_t emptyintr : - 1; -uint32_t txfifoundrn : - 1; -uint32_t reserved08_31 : - 23; - } - b; -} USB_OTG_dev_in_ep_int_data; - -/******************************************************************************/ - -typedef union _USB_OTG_dev_in_ep_int_data USB_OTG_dev_in_ep_msk_data; -/******************************************************************************/ - -typedef union _USB_OTG_dev_out_ep_int_data -{ - - uint32_t d32; - struct - { -uint32_t xfercompl : - 1; -uint32_t epdisabled : - 1; -uint32_t ahberr : - 1; -uint32_t setup : - 1; -uint32_t reserved04_31 : - 28; - } - b; -} USB_OTG_dev_out_ep_int_data; - -/******************************************************************************/ - -typedef union _USB_OTG_dev_out_ep_int_data USB_OTG_dev_out_ep_msk_data; - -/******************************************************************************/ -typedef union _USB_OTG_dev_all_int_data -{ - - uint32_t d32; - struct - { -uint32_t in : - 16; -uint32_t out : - 16; - } - ep; - struct - { - /** IN Endpoint bits */ -uint32_t inep0 : - 1; -uint32_t inep1 : - 1; -uint32_t inep2 : - 1; -uint32_t inep3 : - 1; -uint32_t inep4 : - 1; -uint32_t inep5 : - 1; -uint32_t inep6 : - 1; -uint32_t inep7 : - 1; -uint32_t inep8 : - 1; -uint32_t inep9 : - 1; -uint32_t inep10 : - 1; -uint32_t inep11 : - 1; -uint32_t inep12 : - 1; -uint32_t inep13 : - 1; -uint32_t inep14 : - 1; -uint32_t inep15 : - 1; - /** OUT Endpoint bits */ -uint32_t outep0 : - 1; -uint32_t outep1 : - 1; -uint32_t outep2 : - 1; -uint32_t outep3 : - 1; -uint32_t outep4 : - 1; -uint32_t outep5 : - 1; -uint32_t outep6 : - 1; -uint32_t outep7 : - 1; -uint32_t outep8 : - 1; -uint32_t outep9 : - 1; -uint32_t outep10 : - 1; -uint32_t outep11 : - 1; -uint32_t outep12 : - 1; -uint32_t outep13 : - 1; -uint32_t outep14 : - 1; -uint32_t outep15 : - 1; - } - b; -} USB_OTG_dev_all_int_data; - -/******************************************************************************/ -typedef union _USB_OTG_token_qr1_data -{ - - uint32_t d32; - struct - { -uint32_t intknwptr : - 5; -uint32_t reserved05_06 : - 2; -uint32_t wrap_bit : - 1; -uint32_t epnums0_5 : - 24; - } - b; -} USB_OTG_token_qr1_data; - -/******************************************************************************/ - -typedef union _USB_OTG_dev_thr_ctl_data -{ - - uint32_t d32; - struct - { -uint32_t non_iso_thr_en : - 1; -uint32_t iso_thr_en : - 1; -uint32_t tx_thr_len : - 9; -uint32_t reserved11_15 : - 5; -uint32_t rx_thr_en : - 1; -uint32_t rx_thr_len : - 9; -uint32_t reserved26_31 : - 6; - } - b; -} USB_OTG_dev_thr_ctl_data; - -/******************************************************************************/ -typedef union _USB_OTG_dev_ep_ctl_data -{ - - uint32_t d32; - struct - { -uint32_t mps : - 11; -uint32_t nextep : - 4; -uint32_t usbactep : - 1; -uint32_t dpid : - 1; -uint32_t naksts : - 1; -uint32_t eptype : - 2; -uint32_t snp : - 1; -uint32_t stall : - 1; -uint32_t txfnum : - 4; -uint32_t cnak : - 1; -uint32_t snak : - 1; -uint32_t setd0pid : - 1; -uint32_t setd1pid : - 1; -uint32_t epdis : - 1; -uint32_t epena : - 1; - } - b; -} USB_OTG_dev_ep_ctl_data; - -/******************************************************************************/ - -typedef union _USB_OTG_dev_ep_txfer_siz_data -{ - - uint32_t d32; - struct - { -uint32_t xfersize : - 19; -uint32_t pktcnt : - 10; -uint32_t mc : - 2; -uint32_t reserved : - 1; - } - b; -} USB_OTG_dev_ep_txfer_siz_data; - -/******************************************************************************/ - -typedef union _USB_OTG_dev_ep_txfer_size0_data -{ - - uint32_t d32; - struct - { -uint32_t xfersize : - 7; -uint32_t reserved7_18 : - 12; -uint32_t pktcnt : - 1; -uint32_t reserved20_28 : - 9; -uint32_t supcnt : - 2; - uint32_t reserved31; - } - b; -} USB_OTG_dev_ep_txfer_size0_data; - -/******************************************************************************/ -typedef union _USB_OTG_host_cfg_data -{ - - uint32_t d32; - struct - { -uint32_t fslspclksel : - 2; -uint32_t fslssupp : - 1; - } - b; -} USB_OTG_host_cfg_data; - -/******************************************************************************/ - -typedef union _USB_OTG_Host_frm_intrvl_data -{ - uint32_t d32; - struct - { -uint32_t frint : - 16; -uint32_t reserved : - 16; - } - b; -} USB_OTG_Host_frm_intrvl_data; - -/******************************************************************************/ -#define HFNUM_MAX_FRNUM 0x3FFF -typedef union _USB_OTG_host_frm_nbr_data -{ - - uint32_t d32; - struct - { -uint32_t frnum : - 16; -uint32_t frrem : - 16; - } - b; -} USB_OTG_host_frm_nbr_data; - -/******************************************************************************/ - -typedef union _USB_OTG_host_perio_tx_sts_data -{ - - uint32_t d32; - struct - { -uint32_t ptxfspcavail : - 16; -uint32_t ptxqspcavail : - 8; -uint32_t ptxqtop_terminate : - 1; -uint32_t ptxqtop_token : - 2; -uint32_t ptxqtop_chnum : - 4; -uint32_t ptxqtop_odd : - 1; - } - b; -} USB_OTG_host_perio_tx_sts_data; - -/******************************************************************************/ -typedef union _USB_OTG_hprt0_data -{ - uint32_t d32; - struct - { -uint32_t prtconnsts : - 1; -uint32_t prtconndet : - 1; -uint32_t prtena : - 1; -uint32_t prtenchng : - 1; -uint32_t prtovrcurract : - 1; -uint32_t prtovrcurrchng : - 1; -uint32_t prtres : - 1; -uint32_t prtsusp : - 1; -uint32_t prtrst : - 1; -uint32_t reserved9 : - 1; -uint32_t prtlnsts : - 2; -uint32_t prtpwr : - 1; -uint32_t prttstctl : - 4; -uint32_t prtspd : - 2; -uint32_t reserved19_31 : - 13; - } - b; -} USB_OTG_hprt0_data; - -/******************************************************************************/ - -typedef union _USB_OTG_host_all_int_data -{ - uint32_t d32; - struct - { -uint32_t ch0 : - 1; -uint32_t ch1 : - 1; -uint32_t ch2 : - 1; -uint32_t ch3 : - 1; -uint32_t ch4 : - 1; -uint32_t ch5 : - 1; -uint32_t ch6 : - 1; -uint32_t ch7 : - 1; -uint32_t ch8 : - 1; -uint32_t ch9 : - 1; -uint32_t ch10 : - 1; -uint32_t ch11 : - 1; -uint32_t ch12 : - 1; -uint32_t ch13 : - 1; -uint32_t ch14 : - 1; -uint32_t ch15 : - 1; -uint32_t reserved : - 16; - } - b; - - struct - { -uint32_t chint : - 16; -uint32_t reserved : - 16; - } - b2; -} USB_OTG_host_all_int_data; - - -/******************************************************************************/ - -typedef union _USB_OTG_host_all_int_msk_data -{ - uint32_t d32; - struct - { -uint32_t ch0 : - 1; -uint32_t ch1 : - 1; -uint32_t ch2 : - 1; -uint32_t ch3 : - 1; -uint32_t ch4 : - 1; -uint32_t ch5 : - 1; -uint32_t ch6 : - 1; -uint32_t ch7 : - 1; -uint32_t ch8 : - 1; -uint32_t ch9 : - 1; -uint32_t ch10 : - 1; -uint32_t ch11 : - 1; -uint32_t ch12 : - 1; -uint32_t ch13 : - 1; -uint32_t ch14 : - 1; -uint32_t ch15 : - 1; -uint32_t reserved : - 16; - } - b; - - struct - { -uint32_t chint : - 16; -uint32_t reserved : - 16; - } - b2; -} USB_OTG_host_all_int_msk_data; - -/******************************************************************************/ - -typedef union _USB_OTG_hc_char_data -{ - - uint32_t d32; - struct - { -uint32_t mps : - 11; -uint32_t epnum : - 4; -uint32_t epdir : - 1; -uint32_t reserved : - 1; -uint32_t lspddev : - 1; -uint32_t eptype : - 2; -uint32_t multicnt : - 2; -uint32_t devaddr : - 7; -uint32_t oddfrm : - 1; -uint32_t chdis : - 1; -uint32_t chen : - 1; - } - b; -} USB_OTG_hc_char_data; - -/******************************************************************************/ -typedef union _USB_OTG_hc_splt_data -{ - - uint32_t d32; - struct - { -uint32_t prtaddr : - 7; -uint32_t hubaddr : - 7; -uint32_t xactpos : - 2; -uint32_t compsplt : - 1; -uint32_t reserved : - 14; -uint32_t spltena : - 1; - } - b; -} USB_OTG_hc_splt_data; - -/******************************************************************************/ - -typedef union _USB_OTG_hc_int_data -{ - uint32_t d32; - struct - { -uint32_t xfercomp : - 1; -uint32_t chhltd : - 1; -uint32_t ahberr : - 1; -uint32_t stall : - 1; -uint32_t nak : - 1; -uint32_t ack : - 1; -uint32_t nyet : - 1; -uint32_t xacterr : - 1; -uint32_t bblerr : - 1; -uint32_t frmovrun : - 1; -uint32_t datatglerr : - 1; -uint32_t reserved : - 21; - } - b; -} USB_OTG_hc_int_data; - -/******************************************************************************/ - - -typedef union _USB_OTG_hc_txfer_siz_data -{ - - uint32_t d32; - struct - { -uint32_t xfersize : - 19; -uint32_t pktcnt : - 10; -uint32_t pid : - 2; -uint32_t dopng : - 1; - } - b; -} USB_OTG_hc_txfer_siz_data; - -/******************************************************************************/ - -typedef union _USB_OTG_hc_int_msk_data -{ - - uint32_t d32; - struct - { -uint32_t xfercompl : - 1; -uint32_t chhltd : - 1; -uint32_t ahberr : - 1; -uint32_t stall : - 1; -uint32_t nak : - 1; -uint32_t ack : - 1; -uint32_t nyet : - 1; -uint32_t xacterr : - 1; -uint32_t bblerr : - 1; -uint32_t frmovrun : - 1; -uint32_t datatglerr : - 1; -uint32_t reserved : - 21; - } - b; -} USB_OTG_hc_int_msk_data; - -/******************************************************************************/ - -typedef union _USB_OTG_host_pcgcctl_data -{ - uint32_t d32; - struct - { -uint32_t stoppclk : - 1; -uint32_t gatehclk : - 1; -uint32_t pwrclmp : - 1; -uint32_t rstpdwnmodule : - 1; -uint32_t physuspended : - 1; -uint32_t reserved : - 27; - } - b; -} USB_OTG_host_pcgcctl_data; - -#endif /* STM32F10X_CL */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - -#endif diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h deleted file mode 100644 index 4fa53c2c53..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h +++ /dev/null @@ -1,243 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_core.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Standard protocol processing functions prototypes -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CORE_H -#define __USB_CORE_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -typedef enum _CONTROL_STATE -{ - WAIT_SETUP, /* 0 */ - SETTING_UP, /* 1 */ - IN_DATA, /* 2 */ - OUT_DATA, /* 3 */ - LAST_IN_DATA, /* 4 */ - LAST_OUT_DATA, /* 5 */ - WAIT_STATUS_IN, /* 7 */ - WAIT_STATUS_OUT, /* 8 */ - STALLED, /* 9 */ - PAUSE /* 10 */ -} CONTROL_STATE; /* The state machine states of a control pipe */ - -typedef struct OneDescriptor -{ - uint8_t *Descriptor; - uint16_t Descriptor_Size; -} -ONE_DESCRIPTOR, *PONE_DESCRIPTOR; -/* All the request process routines return a value of this type - If the return value is not SUCCESS or NOT_READY, - the software will STALL the correspond endpoint */ -typedef enum _RESULT -{ - USB_SUCCESS = 0, /* Process sucessfully */ - USB_ERROR, - USB_UNSUPPORT, - USB_NOT_READY /* The process has not been finished, endpoint will be - NAK to further rquest */ -} RESULT; - - -/*-*-*-*-*-*-*-*-*-*-* Definitions for endpoint level -*-*-*-*-*-*-*-*-*-*-*-*/ -typedef struct _ENDPOINT_INFO -{ - /* When send data out of the device, - CopyData() is used to get data buffer 'Length' bytes data - if Length is 0, - CopyData() returns the total length of the data - if the request is not supported, returns 0 - (NEW Feature ) - if CopyData() returns -1, the calling routine should not proceed - further and will resume the SETUP process by the class device - if Length is not 0, - CopyData() returns a pointer to indicate the data location - Usb_wLength is the data remain to be sent, - Usb_wOffset is the Offset of original data - When receive data from the host, - CopyData() is used to get user data buffer which is capable - of Length bytes data to copy data from the endpoint buffer. - if Length is 0, - CopyData() returns the available data length, - if Length is not 0, - CopyData() returns user buffer address - Usb_rLength is the data remain to be received, - Usb_rPointer is the Offset of data buffer - */ - uint16_t Usb_wLength; - uint16_t Usb_wOffset; - uint16_t PacketSize; - uint8_t *(*CopyData)(uint16_t Length); -}ENDPOINT_INFO; - -/*-*-*-*-*-*-*-*-*-*-*-* Definitions for device level -*-*-*-*-*-*-*-*-*-*-*-*/ - -typedef struct _DEVICE -{ - uint8_t Total_Endpoint; /* Number of endpoints that are used */ - uint8_t Total_Configuration;/* Number of configuration available */ -} -DEVICE; - -typedef union -{ - uint16_t w; - struct BW - { - uint8_t bb1; - uint8_t bb0; - } - bw; -} uint16_t_uint8_t; - -typedef struct _DEVICE_INFO -{ - uint8_t USBbmRequestType; /* bmRequestType */ - uint8_t USBbRequest; /* bRequest */ - uint16_t_uint8_t USBwValues; /* wValue */ - uint16_t_uint8_t USBwIndexs; /* wIndex */ - uint16_t_uint8_t USBwLengths; /* wLength */ - - uint8_t ControlState; /* of type CONTROL_STATE */ - uint8_t Current_Feature; - uint8_t Current_Configuration; /* Selected configuration */ - uint8_t Current_Interface; /* Selected interface of current configuration */ - uint8_t Current_AlternateSetting;/* Selected Alternate Setting of current - interface*/ - - ENDPOINT_INFO Ctrl_Info; -}DEVICE_INFO; - -typedef struct _DEVICE_PROP -{ - void (*Init)(void); /* Initialize the device */ - void (*Reset)(void); /* Reset routine of this device */ - - /* Device dependent process after the status stage */ - void (*Process_Status_IN)(void); - void (*Process_Status_OUT)(void); - - /* Procedure of process on setup stage of a class specified request with data stage */ - /* All class specified requests with data stage are processed in Class_Data_Setup - Class_Data_Setup() - responses to check all special requests and fills ENDPOINT_INFO - according to the request - If IN tokens are expected, then wLength & wOffset will be filled - with the total transferring bytes and the starting position - If OUT tokens are expected, then rLength & rOffset will be filled - with the total expected bytes and the starting position in the buffer - - If the request is valid, Class_Data_Setup returns SUCCESS, else UNSUPPORT - - CAUTION: - Since GET_CONFIGURATION & GET_INTERFACE are highly related to - the individual classes, they will be checked and processed here. - */ - RESULT (*Class_Data_Setup)(uint8_t RequestNo); - - /* Procedure of process on setup stage of a class specified request without data stage */ - /* All class specified requests without data stage are processed in Class_NoData_Setup - Class_NoData_Setup - responses to check all special requests and perform the request - - CAUTION: - Since SET_CONFIGURATION & SET_INTERFACE are highly related to - the individual classes, they will be checked and processed here. - */ - RESULT (*Class_NoData_Setup)(uint8_t RequestNo); - - /*Class_Get_Interface_Setting - This function is used by the file usb_core.c to test if the selected Interface - and Alternate Setting (uint8_t Interface, uint8_t AlternateSetting) are supported by - the application. - This function is writing by user. It should return "SUCCESS" if the Interface - and Alternate Setting are supported by the application or "UNSUPPORT" if they - are not supported. */ - - RESULT (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting); - - uint8_t* (*GetDeviceDescriptor)(uint16_t Length); - uint8_t* (*GetConfigDescriptor)(uint16_t Length); - uint8_t* (*GetStringDescriptor)(uint16_t Length); - - uint8_t* RxEP_buffer; - uint8_t MaxPacketSize; - -}DEVICE_PROP; - -typedef struct _USER_STANDARD_REQUESTS -{ - void (*User_GetConfiguration)(void); /* Get Configuration */ - void (*User_SetConfiguration)(void); /* Set Configuration */ - void (*User_GetInterface)(void); /* Get Interface */ - void (*User_SetInterface)(void); /* Set Interface */ - void (*User_GetStatus)(void); /* Get Status */ - void (*User_ClearFeature)(void); /* Clear Feature */ - void (*User_SetEndPointFeature)(void); /* Set Endpoint Feature */ - void (*User_SetDeviceFeature)(void); /* Set Device Feature */ - void (*User_SetDeviceAddress)(void); /* Set Device Address */ -} -USER_STANDARD_REQUESTS; - -/* Exported constants --------------------------------------------------------*/ -#define Type_Recipient (pInformation->USBbmRequestType & (REQUEST_TYPE | RECIPIENT)) - -#define Usb_rLength Usb_wLength -#define Usb_rOffset Usb_wOffset - -#define USBwValue USBwValues.w -#define USBwValue0 USBwValues.bw.bb0 -#define USBwValue1 USBwValues.bw.bb1 -#define USBwIndex USBwIndexs.w -#define USBwIndex0 USBwIndexs.bw.bb0 -#define USBwIndex1 USBwIndexs.bw.bb1 -#define USBwLength USBwLengths.w -#define USBwLength0 USBwLengths.bw.bb0 -#define USBwLength1 USBwLengths.bw.bb1 - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -uint8_t Setup0_Process(void); -uint8_t Post0_Process(void); -uint8_t Out0_Process(void); -uint8_t In0_Process(void); - -RESULT Standard_SetEndPointFeature(void); -RESULT Standard_SetDeviceFeature(void); - -uint8_t *Standard_GetConfiguration(uint16_t Length); -RESULT Standard_SetConfiguration(void); -uint8_t *Standard_GetInterface(uint16_t Length); -RESULT Standard_SetInterface(void); -uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc); - -uint8_t *Standard_GetStatus(uint16_t Length); -RESULT Standard_ClearFeature(void); -void SetDeviceAddress(uint8_t); -void NOP_Process(void); - -extern DEVICE_PROP Device_Property; -extern USER_STANDARD_REQUESTS User_Standard_Requests; -extern DEVICE Device_Table; -extern DEVICE_INFO Device_Info; - -/* cells saving status during interrupt servicing */ -extern __IO uint16_t SaveRState; -extern __IO uint16_t SaveTState; - -#endif /* __USB_CORE_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_def.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_def.h deleted file mode 100644 index 9817fb8f48..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_def.h +++ /dev/null @@ -1,80 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_def.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Definitions related to USB Core -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DEF_H -#define __USB_DEF_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -typedef enum _RECIPIENT_TYPE -{ - DEVICE_RECIPIENT, /* Recipient device */ - INTERFACE_RECIPIENT, /* Recipient interface */ - ENDPOINT_RECIPIENT, /* Recipient endpoint */ - OTHER_RECIPIENT -} RECIPIENT_TYPE; - - -typedef enum _STANDARD_REQUESTS -{ - GET_STATUS = 0, - CLEAR_FEATURE, - RESERVED1, - SET_FEATURE, - RESERVED2, - SET_ADDRESS, - GET_DESCRIPTOR, - SET_DESCRIPTOR, - GET_CONFIGURATION, - SET_CONFIGURATION, - GET_INTERFACE, - SET_INTERFACE, - TOTAL_sREQUEST, /* Total number of Standard request */ - SYNCH_FRAME = 12 -} STANDARD_REQUESTS; - -/* Definition of "USBwValue" */ -typedef enum _DESCRIPTOR_TYPE -{ - DEVICE_DESCRIPTOR = 1, - CONFIG_DESCRIPTOR, - STRING_DESCRIPTOR, - INTERFACE_DESCRIPTOR, - ENDPOINT_DESCRIPTOR -} DESCRIPTOR_TYPE; - -/* Feature selector of a SET_FEATURE or CLEAR_FEATURE */ -typedef enum _FEATURE_SELECTOR -{ - ENDPOINT_STALL, - DEVICE_REMOTE_WAKEUP -} FEATURE_SELECTOR; - -/* Exported constants --------------------------------------------------------*/ -/* Definition of "USBbmRequestType" */ -#define REQUEST_TYPE 0x60 /* Mask to get request type */ -#define STANDARD_REQUEST 0x00 /* Standard request */ -#define CLASS_REQUEST 0x20 /* Class request */ -#define VENDOR_REQUEST 0x40 /* Vendor request */ - -#define RECIPIENT 0x1F /* Mask to get recipient */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USB_DEF_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_init.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_init.h deleted file mode 100644 index b0a2dd19ff..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_init.h +++ /dev/null @@ -1,49 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_init.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Initialization routines & global variables -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_INIT_H -#define __USB_INIT_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void USB_Init(void); - -/* External variables --------------------------------------------------------*/ -/* The number of current endpoint, it will be used to specify an endpoint */ -extern uint8_t EPindex; -/* The number of current device, it is an index to the Device_Table */ -/*extern uint8_t Device_no; */ -/* Points to the DEVICE_INFO structure of current device */ -/* The purpose of this register is to speed up the execution */ -extern DEVICE_INFO* pInformation; -/* Points to the DEVICE_PROP structure of current device */ -/* The purpose of this register is to speed up the execution */ -extern DEVICE_PROP* pProperty; -/* Temporary save the state of Rx & Tx status. */ -/* Whenever the Rx or Tx state is changed, its value is saved */ -/* in this variable first and will be set to the EPRB or EPRA */ -/* at the end of interrupt process */ -extern USER_STANDARD_REQUESTS *pUser_Standard_Requests; - -extern uint16_t SaveState ; -extern uint16_t wInterrupt_Mask; - -#endif /* __USB_INIT_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_int.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_int.h deleted file mode 100644 index 07e981116e..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_int.h +++ /dev/null @@ -1,33 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_int.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Endpoint CTR (Low and High) interrupt's service routines -* prototypes -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_INT_H -#define __USB_INT_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void CTR_LP(void); -void CTR_HP(void); - -/* External variables --------------------------------------------------------*/ - -#endif /* __USB_INT_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_lib.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_lib.h deleted file mode 100644 index dbbd82106b..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_lib.h +++ /dev/null @@ -1,50 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_lib.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : USB library include files -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_LIB_H -#define __USB_LIB_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -#include "usb_type.h" -#include "usb_regs.h" -#include "usb_def.h" -#include "usb_core.h" -#include "usb_init.h" -#ifndef STM32F10X_CL - #include "usb_mem.h" - #include "usb_int.h" -#endif /* STM32F10X_CL */ - -#include "usb_sil.h" - -#ifdef STM32F10X_CL - #include "otgd_fs_cal.h" - #include "otgd_fs_pcd.h" - #include "otgd_fs_dev.h" - #include "otgd_fs_int.h" -#endif /* STM32F10X_CL */ - - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* External variables --------------------------------------------------------*/ - -#endif /* __USB_LIB_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h deleted file mode 100644 index 176374e3da..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h +++ /dev/null @@ -1,32 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_mem.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Utility prototypes functions for memory/PMA transfers -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_MEM_H -#define __USB_MEM_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); -void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); - -/* External variables --------------------------------------------------------*/ - -#endif /*__USB_MEM_H*/ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_regs.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_regs.h deleted file mode 100644 index 1f8f4b63af..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_regs.h +++ /dev/null @@ -1,671 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_regs.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Interface prototype functions to USB cell registers -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_REGS_H -#define __USB_REGS_H - -#ifndef STM32F10X_CL - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -typedef enum _EP_DBUF_DIR -{ - /* double buffered endpoint direction */ - EP_DBUF_ERR, - EP_DBUF_OUT, - EP_DBUF_IN -}EP_DBUF_DIR; - -/* endpoint buffer number */ -enum EP_BUF_NUM -{ - EP_NOBUF, - EP_BUF0, - EP_BUF1 -}; - -/* Exported constants --------------------------------------------------------*/ -#define RegBase (0x40005C00L) /* USB_IP Peripheral Registers base address */ -#define PMAAddr (0x40006000L) /* USB_IP Packet Memory Area base address */ - -/******************************************************************************/ -/* General registers */ -/******************************************************************************/ - -/* Control register */ -#define CNTR ((__IO unsigned *)(RegBase + 0x40)) -/* Interrupt status register */ -#define ISTR ((__IO unsigned *)(RegBase + 0x44)) -/* Frame number register */ -#define FNR ((__IO unsigned *)(RegBase + 0x48)) -/* Device address register */ -#define DADDR ((__IO unsigned *)(RegBase + 0x4C)) -/* Buffer Table address register */ -#define BTABLE ((__IO unsigned *)(RegBase + 0x50)) -/******************************************************************************/ -/* Endpoint registers */ -/******************************************************************************/ -#define EP0REG ((__IO unsigned *)(RegBase)) /* endpoint 0 register address */ - -/* Endpoint Addresses (w/direction) */ -#define EP0_OUT ((uint8_t)0x00) -#define EP0_IN ((uint8_t)0x80) -#define EP1_OUT ((uint8_t)0x01) -#define EP1_IN ((uint8_t)0x81) -#define EP2_OUT ((uint8_t)0x02) -#define EP2_IN ((uint8_t)0x82) -#define EP3_OUT ((uint8_t)0x03) -#define EP3_IN ((uint8_t)0x83) -#define EP4_OUT ((uint8_t)0x04) -#define EP4_IN ((uint8_t)0x84) -#define EP5_OUT ((uint8_t)0x05) -#define EP5_IN ((uint8_t)0x85) -#define EP6_OUT ((uint8_t)0x06) -#define EP6_IN ((uint8_t)0x86) -#define EP7_OUT ((uint8_t)0x07) -#define EP7_IN ((uint8_t)0x87) - -/* endpoints enumeration */ -#define ENDP0 ((uint8_t)0) -#define ENDP1 ((uint8_t)1) -#define ENDP2 ((uint8_t)2) -#define ENDP3 ((uint8_t)3) -#define ENDP4 ((uint8_t)4) -#define ENDP5 ((uint8_t)5) -#define ENDP6 ((uint8_t)6) -#define ENDP7 ((uint8_t)7) - -/******************************************************************************/ -/* ISTR interrupt events */ -/******************************************************************************/ -#define ISTR_CTR (0x8000) /* Correct TRansfer (clear-only bit) */ -#define ISTR_DOVR (0x4000) /* DMA OVeR/underrun (clear-only bit) */ -#define ISTR_ERR (0x2000) /* ERRor (clear-only bit) */ -#define ISTR_WKUP (0x1000) /* WaKe UP (clear-only bit) */ -#define ISTR_SUSP (0x0800) /* SUSPend (clear-only bit) */ -#define ISTR_RESET (0x0400) /* RESET (clear-only bit) */ -#define ISTR_SOF (0x0200) /* Start Of Frame (clear-only bit) */ -#define ISTR_ESOF (0x0100) /* Expected Start Of Frame (clear-only bit) */ - - -#define ISTR_DIR (0x0010) /* DIRection of transaction (read-only bit) */ -#define ISTR_EP_ID (0x000F) /* EndPoint IDentifier (read-only bit) */ - -#define CLR_CTR (~ISTR_CTR) /* clear Correct TRansfer bit */ -#define CLR_DOVR (~ISTR_DOVR) /* clear DMA OVeR/underrun bit*/ -#define CLR_ERR (~ISTR_ERR) /* clear ERRor bit */ -#define CLR_WKUP (~ISTR_WKUP) /* clear WaKe UP bit */ -#define CLR_SUSP (~ISTR_SUSP) /* clear SUSPend bit */ -#define CLR_RESET (~ISTR_RESET) /* clear RESET bit */ -#define CLR_SOF (~ISTR_SOF) /* clear Start Of Frame bit */ -#define CLR_ESOF (~ISTR_ESOF) /* clear Expected Start Of Frame bit */ - -/******************************************************************************/ -/* CNTR control register bits definitions */ -/******************************************************************************/ -#define CNTR_CTRM (0x8000) /* Correct TRansfer Mask */ -#define CNTR_DOVRM (0x4000) /* DMA OVeR/underrun Mask */ -#define CNTR_ERRM (0x2000) /* ERRor Mask */ -#define CNTR_WKUPM (0x1000) /* WaKe UP Mask */ -#define CNTR_SUSPM (0x0800) /* SUSPend Mask */ -#define CNTR_RESETM (0x0400) /* RESET Mask */ -#define CNTR_SOFM (0x0200) /* Start Of Frame Mask */ -#define CNTR_ESOFM (0x0100) /* Expected Start Of Frame Mask */ - - -#define CNTR_RESUME (0x0010) /* RESUME request */ -#define CNTR_FSUSP (0x0008) /* Force SUSPend */ -#define CNTR_LPMODE (0x0004) /* Low-power MODE */ -#define CNTR_PDWN (0x0002) /* Power DoWN */ -#define CNTR_FRES (0x0001) /* Force USB RESet */ - -/******************************************************************************/ -/* FNR Frame Number Register bit definitions */ -/******************************************************************************/ -#define FNR_RXDP (0x8000) /* status of D+ data line */ -#define FNR_RXDM (0x4000) /* status of D- data line */ -#define FNR_LCK (0x2000) /* LoCKed */ -#define FNR_LSOF (0x1800) /* Lost SOF */ -#define FNR_FN (0x07FF) /* Frame Number */ -/******************************************************************************/ -/* DADDR Device ADDRess bit definitions */ -/******************************************************************************/ -#define DADDR_EF (0x80) -#define DADDR_ADD (0x7F) -/******************************************************************************/ -/* Endpoint register */ -/******************************************************************************/ -/* bit positions */ -#define EP_CTR_RX (0x8000) /* EndPoint Correct TRansfer RX */ -#define EP_DTOG_RX (0x4000) /* EndPoint Data TOGGLE RX */ -#define EPRX_STAT (0x3000) /* EndPoint RX STATus bit field */ -#define EP_SETUP (0x0800) /* EndPoint SETUP */ -#define EP_T_FIELD (0x0600) /* EndPoint TYPE */ -#define EP_KIND (0x0100) /* EndPoint KIND */ -#define EP_CTR_TX (0x0080) /* EndPoint Correct TRansfer TX */ -#define EP_DTOG_TX (0x0040) /* EndPoint Data TOGGLE TX */ -#define EPTX_STAT (0x0030) /* EndPoint TX STATus bit field */ -#define EPADDR_FIELD (0x000F) /* EndPoint ADDRess FIELD */ - -/* EndPoint REGister MASK (no toggle fields) */ -#define EPREG_MASK (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD) - -/* EP_TYPE[1:0] EndPoint TYPE */ -#define EP_TYPE_MASK (0x0600) /* EndPoint TYPE Mask */ -#define EP_BULK (0x0000) /* EndPoint BULK */ -#define EP_CONTROL (0x0200) /* EndPoint CONTROL */ -#define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */ -#define EP_INTERRUPT (0x0600) /* EndPoint INTERRUPT */ -#define EP_T_MASK (~EP_T_FIELD & EPREG_MASK) - - -/* EP_KIND EndPoint KIND */ -#define EPKIND_MASK (~EP_KIND & EPREG_MASK) - -/* STAT_TX[1:0] STATus for TX transfer */ -#define EP_TX_DIS (0x0000) /* EndPoint TX DISabled */ -#define EP_TX_STALL (0x0010) /* EndPoint TX STALLed */ -#define EP_TX_NAK (0x0020) /* EndPoint TX NAKed */ -#define EP_TX_VALID (0x0030) /* EndPoint TX VALID */ -#define EPTX_DTOG1 (0x0010) /* EndPoint TX Data TOGgle bit1 */ -#define EPTX_DTOG2 (0x0020) /* EndPoint TX Data TOGgle bit2 */ -#define EPTX_DTOGMASK (EPTX_STAT|EPREG_MASK) - -/* STAT_RX[1:0] STATus for RX transfer */ -#define EP_RX_DIS (0x0000) /* EndPoint RX DISabled */ -#define EP_RX_STALL (0x1000) /* EndPoint RX STALLed */ -#define EP_RX_NAK (0x2000) /* EndPoint RX NAKed */ -#define EP_RX_VALID (0x3000) /* EndPoint RX VALID */ -#define EPRX_DTOG1 (0x1000) /* EndPoint RX Data TOGgle bit1 */ -#define EPRX_DTOG2 (0x2000) /* EndPoint RX Data TOGgle bit1 */ -#define EPRX_DTOGMASK (EPRX_STAT|EPREG_MASK) -/* Exported macro ------------------------------------------------------------*/ -/* SetCNTR */ -#define _SetCNTR(wRegValue) (*CNTR = (uint16_t)wRegValue) - -/* SetISTR */ -#define _SetISTR(wRegValue) (*ISTR = (uint16_t)wRegValue) - -/* SetDADDR */ -#define _SetDADDR(wRegValue) (*DADDR = (uint16_t)wRegValue) - -/* SetBTABLE */ -#define _SetBTABLE(wRegValue)(*BTABLE = (uint16_t)(wRegValue & 0xFFF8)) - -/* GetCNTR */ -#define _GetCNTR() ((uint16_t) *CNTR) - -/* GetISTR */ -#define _GetISTR() ((uint16_t) *ISTR) - -/* GetFNR */ -#define _GetFNR() ((uint16_t) *FNR) - -/* GetDADDR */ -#define _GetDADDR() ((uint16_t) *DADDR) - -/* GetBTABLE */ -#define _GetBTABLE() ((uint16_t) *BTABLE) - -/* SetENDPOINT */ -#define _SetENDPOINT(bEpNum,wRegValue) (*(EP0REG + bEpNum)= \ - (uint16_t)wRegValue) - -/* GetENDPOINT */ -#define _GetENDPOINT(bEpNum) ((uint16_t)(*(EP0REG + bEpNum))) - -/******************************************************************************* -* Macro Name : SetEPType -* Description : sets the type in the endpoint register(bits EP_TYPE[1:0]) -* Input : bEpNum: Endpoint Number. -* wType -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPType(bEpNum,wType) (_SetENDPOINT(bEpNum,\ - ((_GetENDPOINT(bEpNum) & EP_T_MASK) | wType ))) - -/******************************************************************************* -* Macro Name : GetEPType -* Description : gets the type in the endpoint register(bits EP_TYPE[1:0]) -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint Type -*******************************************************************************/ -#define _GetEPType(bEpNum) (_GetENDPOINT(bEpNum) & EP_T_FIELD) - -/******************************************************************************* -* Macro Name : SetEPTxStatus -* Description : sets the status for tx transfer (bits STAT_TX[1:0]). -* Input : bEpNum: Endpoint Number. -* wState: new state -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPTxStatus(bEpNum,wState) {\ - register uint16_t _wRegVal; \ - _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\ - /* toggle first bit ? */ \ - if((EPTX_DTOG1 & wState)!= 0) \ - _wRegVal ^= EPTX_DTOG1; \ - /* toggle second bit ? */ \ - if((EPTX_DTOG2 & wState)!= 0) \ - _wRegVal ^= EPTX_DTOG2; \ - _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ - } /* _SetEPTxStatus */ - -/******************************************************************************* -* Macro Name : SetEPRxStatus -* Description : sets the status for rx transfer (bits STAT_TX[1:0]) -* Input : bEpNum: Endpoint Number. -* wState: new state. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPRxStatus(bEpNum,wState) {\ - register uint16_t _wRegVal; \ - \ - _wRegVal = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK;\ - /* toggle first bit ? */ \ - if((EPRX_DTOG1 & wState)!= 0) \ - _wRegVal ^= EPRX_DTOG1; \ - /* toggle second bit ? */ \ - if((EPRX_DTOG2 & wState)!= 0) \ - _wRegVal ^= EPRX_DTOG2; \ - _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ - } /* _SetEPRxStatus */ - -/******************************************************************************* -* Macro Name : SetEPRxTxStatus -* Description : sets the status for rx & tx (bits STAT_TX[1:0] & STAT_RX[1:0]) -* Input : bEpNum: Endpoint Number. -* wStaterx: new state. -* wStatetx: new state. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPRxTxStatus(bEpNum,wStaterx,wStatetx) {\ - register uint32_t _wRegVal; \ - \ - _wRegVal = _GetENDPOINT(bEpNum) & (EPRX_DTOGMASK |EPTX_STAT) ;\ - /* toggle first bit ? */ \ - if((EPRX_DTOG1 & wStaterx)!= 0) \ - _wRegVal ^= EPRX_DTOG1; \ - /* toggle second bit ? */ \ - if((EPRX_DTOG2 & wStaterx)!= 0) \ - _wRegVal ^= EPRX_DTOG2; \ - /* toggle first bit ? */ \ - if((EPTX_DTOG1 & wStatetx)!= 0) \ - _wRegVal ^= EPTX_DTOG1; \ - /* toggle second bit ? */ \ - if((EPTX_DTOG2 & wStatetx)!= 0) \ - _wRegVal ^= EPTX_DTOG2; \ - _SetENDPOINT(bEpNum, _wRegVal | EP_CTR_RX|EP_CTR_TX); \ - } /* _SetEPRxTxStatus */ -/******************************************************************************* -* Macro Name : GetEPTxStatus / GetEPRxStatus -* Description : gets the status for tx/rx transfer (bits STAT_TX[1:0] -* /STAT_RX[1:0]) -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : status . -*******************************************************************************/ -#define _GetEPTxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPTX_STAT) - -#define _GetEPRxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPRX_STAT) - -/******************************************************************************* -* Macro Name : SetEPTxValid / SetEPRxValid -* Description : sets directly the VALID tx/rx-status into the enpoint register -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPTxValid(bEpNum) (_SetEPTxStatus(bEpNum, EP_TX_VALID)) - -#define _SetEPRxValid(bEpNum) (_SetEPRxStatus(bEpNum, EP_RX_VALID)) - -/******************************************************************************* -* Macro Name : GetTxStallStatus / GetRxStallStatus. -* Description : checks stall condition in an endpoint. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : TRUE = endpoint in stall condition. -*******************************************************************************/ -#define _GetTxStallStatus(bEpNum) (_GetEPTxStatus(bEpNum) \ - == EP_TX_STALL) -#define _GetRxStallStatus(bEpNum) (_GetEPRxStatus(bEpNum) \ - == EP_RX_STALL) - -/******************************************************************************* -* Macro Name : SetEP_KIND / ClearEP_KIND. -* Description : set & clear EP_KIND bit. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ - (EP_CTR_RX|EP_CTR_TX|((_GetENDPOINT(bEpNum) | EP_KIND) & EPREG_MASK)))) -#define _ClearEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ - (EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPKIND_MASK)))) - -/******************************************************************************* -* Macro Name : Set_Status_Out / Clear_Status_Out. -* Description : Sets/clears directly STATUS_OUT bit in the endpoint register. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _Set_Status_Out(bEpNum) _SetEP_KIND(bEpNum) -#define _Clear_Status_Out(bEpNum) _ClearEP_KIND(bEpNum) - -/******************************************************************************* -* Macro Name : SetEPDoubleBuff / ClearEPDoubleBuff. -* Description : Sets/clears directly EP_KIND bit in the endpoint register. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPDoubleBuff(bEpNum) _SetEP_KIND(bEpNum) -#define _ClearEPDoubleBuff(bEpNum) _ClearEP_KIND(bEpNum) - -/******************************************************************************* -* Macro Name : ClearEP_CTR_RX / ClearEP_CTR_TX. -* Description : Clears bit CTR_RX / CTR_TX in the endpoint register. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _ClearEP_CTR_RX(bEpNum) (_SetENDPOINT(bEpNum,\ - _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK)) -#define _ClearEP_CTR_TX(bEpNum) (_SetENDPOINT(bEpNum,\ - _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK)) - -/******************************************************************************* -* Macro Name : ToggleDTOG_RX / ToggleDTOG_TX . -* Description : Toggles DTOG_RX / DTOG_TX bit in the endpoint register. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _ToggleDTOG_RX(bEpNum) (_SetENDPOINT(bEpNum, \ - EP_CTR_RX|EP_CTR_TX|EP_DTOG_RX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) -#define _ToggleDTOG_TX(bEpNum) (_SetENDPOINT(bEpNum, \ - EP_CTR_RX|EP_CTR_TX|EP_DTOG_TX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) - -/******************************************************************************* -* Macro Name : ClearDTOG_RX / ClearDTOG_TX. -* Description : Clears DTOG_RX / DTOG_TX bit in the endpoint register. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _ClearDTOG_RX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_RX) != 0)\ - _ToggleDTOG_RX(bEpNum) -#define _ClearDTOG_TX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_TX) != 0)\ - _ToggleDTOG_TX(bEpNum) -/******************************************************************************* -* Macro Name : SetEPAddress. -* Description : Sets address in an endpoint register. -* Input : bEpNum: Endpoint Number. -* bAddr: Address. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPAddress(bEpNum,bAddr) _SetENDPOINT(bEpNum,\ - EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPREG_MASK) | bAddr) - -/******************************************************************************* -* Macro Name : GetEPAddress. -* Description : Gets address in an endpoint register. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _GetEPAddress(bEpNum) ((uint8_t)(_GetENDPOINT(bEpNum) & EPADDR_FIELD)) - -#define _pEPTxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8 )*2 + PMAAddr)) -#define _pEPTxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+2)*2 + PMAAddr)) -#define _pEPRxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+4)*2 + PMAAddr)) -#define _pEPRxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+6)*2 + PMAAddr)) - -/******************************************************************************* -* Macro Name : SetEPTxAddr / SetEPRxAddr. -* Description : sets address of the tx/rx buffer. -* Input : bEpNum: Endpoint Number. -* wAddr: address to be set (must be word aligned). -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1)) -#define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1)) - -/******************************************************************************* -* Macro Name : GetEPTxAddr / GetEPRxAddr. -* Description : Gets address of the tx/rx buffer. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : address of the buffer. -*******************************************************************************/ -#define _GetEPTxAddr(bEpNum) ((uint16_t)*_pEPTxAddr(bEpNum)) -#define _GetEPRxAddr(bEpNum) ((uint16_t)*_pEPRxAddr(bEpNum)) - -/******************************************************************************* -* Macro Name : SetEPCountRxReg. -* Description : Sets counter of rx buffer with no. of blocks. -* Input : pdwReg: pointer to counter. -* wCount: Counter. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _BlocksOf32(dwReg,wCount,wNBlocks) {\ - wNBlocks = wCount >> 5;\ - if((wCount & 0x1f) == 0)\ - wNBlocks--;\ - *pdwReg = (uint32_t)((wNBlocks << 10) | 0x8000);\ - }/* _BlocksOf32 */ - -#define _BlocksOf2(dwReg,wCount,wNBlocks) {\ - wNBlocks = wCount >> 1;\ - if((wCount & 0x1) != 0)\ - wNBlocks++;\ - *pdwReg = (uint32_t)(wNBlocks << 10);\ - }/* _BlocksOf2 */ - -#define _SetEPCountRxReg(dwReg,wCount) {\ - uint16_t wNBlocks;\ - if(wCount > 62){_BlocksOf32(dwReg,wCount,wNBlocks);}\ - else {_BlocksOf2(dwReg,wCount,wNBlocks);}\ - }/* _SetEPCountRxReg */ - - - -#define _SetEPRxDblBuf0Count(bEpNum,wCount) {\ - uint32_t *pdwReg = _pEPTxCount(bEpNum); \ - _SetEPCountRxReg(pdwReg, wCount);\ - } -/******************************************************************************* -* Macro Name : SetEPTxCount / SetEPRxCount. -* Description : sets counter for the tx/rx buffer. -* Input : bEpNum: endpoint number. -* wCount: Counter value. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPTxCount(bEpNum,wCount) (*_pEPTxCount(bEpNum) = wCount) -#define _SetEPRxCount(bEpNum,wCount) {\ - uint32_t *pdwReg = _pEPRxCount(bEpNum); \ - _SetEPCountRxReg(pdwReg, wCount);\ - } -/******************************************************************************* -* Macro Name : GetEPTxCount / GetEPRxCount. -* Description : gets counter of the tx buffer. -* Input : bEpNum: endpoint number. -* Output : None. -* Return : Counter value. -*******************************************************************************/ -#define _GetEPTxCount(bEpNum)((uint16_t)(*_pEPTxCount(bEpNum)) & 0x3ff) -#define _GetEPRxCount(bEpNum)((uint16_t)(*_pEPRxCount(bEpNum)) & 0x3ff) - -/******************************************************************************* -* Macro Name : SetEPDblBuf0Addr / SetEPDblBuf1Addr. -* Description : Sets buffer 0/1 address in a double buffer endpoint. -* Input : bEpNum: endpoint number. -* : wBuf0Addr: buffer 0 address. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPDblBuf0Addr(bEpNum,wBuf0Addr) {_SetEPTxAddr(bEpNum, wBuf0Addr);} -#define _SetEPDblBuf1Addr(bEpNum,wBuf1Addr) {_SetEPRxAddr(bEpNum, wBuf1Addr);} - -/******************************************************************************* -* Macro Name : SetEPDblBuffAddr. -* Description : Sets addresses in a double buffer endpoint. -* Input : bEpNum: endpoint number. -* : wBuf0Addr: buffer 0 address. -* : wBuf1Addr = buffer 1 address. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPDblBuffAddr(bEpNum,wBuf0Addr,wBuf1Addr) { \ - _SetEPDblBuf0Addr(bEpNum, wBuf0Addr);\ - _SetEPDblBuf1Addr(bEpNum, wBuf1Addr);\ - } /* _SetEPDblBuffAddr */ - -/******************************************************************************* -* Macro Name : GetEPDblBuf0Addr / GetEPDblBuf1Addr. -* Description : Gets buffer 0/1 address of a double buffer endpoint. -* Input : bEpNum: endpoint number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _GetEPDblBuf0Addr(bEpNum) (_GetEPTxAddr(bEpNum)) -#define _GetEPDblBuf1Addr(bEpNum) (_GetEPRxAddr(bEpNum)) - -/******************************************************************************* -* Macro Name : SetEPDblBuffCount / SetEPDblBuf0Count / SetEPDblBuf1Count. -* Description : Gets buffer 0/1 address of a double buffer endpoint. -* Input : bEpNum: endpoint number. -* : bDir: endpoint dir EP_DBUF_OUT = OUT -* EP_DBUF_IN = IN -* : wCount: Counter value -* Output : None. -* Return : None. -*******************************************************************************/ -#define _SetEPDblBuf0Count(bEpNum, bDir, wCount) { \ - if(bDir == EP_DBUF_OUT)\ - /* OUT endpoint */ \ - {_SetEPRxDblBuf0Count(bEpNum,wCount);} \ - else if(bDir == EP_DBUF_IN)\ - /* IN endpoint */ \ - *_pEPTxCount(bEpNum) = (uint32_t)wCount; \ - } /* SetEPDblBuf0Count*/ - -#define _SetEPDblBuf1Count(bEpNum, bDir, wCount) { \ - if(bDir == EP_DBUF_OUT)\ - /* OUT endpoint */ \ - {_SetEPRxCount(bEpNum,wCount);}\ - else if(bDir == EP_DBUF_IN)\ - /* IN endpoint */\ - *_pEPRxCount(bEpNum) = (uint32_t)wCount; \ - } /* SetEPDblBuf1Count */ - -#define _SetEPDblBuffCount(bEpNum, bDir, wCount) {\ - _SetEPDblBuf0Count(bEpNum, bDir, wCount); \ - _SetEPDblBuf1Count(bEpNum, bDir, wCount); \ - } /* _SetEPDblBuffCount */ - -/******************************************************************************* -* Macro Name : GetEPDblBuf0Count / GetEPDblBuf1Count. -* Description : Gets buffer 0/1 rx/tx counter for double buffering. -* Input : bEpNum: endpoint number. -* Output : None. -* Return : None. -*******************************************************************************/ -#define _GetEPDblBuf0Count(bEpNum) (_GetEPTxCount(bEpNum)) -#define _GetEPDblBuf1Count(bEpNum) (_GetEPRxCount(bEpNum)) - - -/* External variables --------------------------------------------------------*/ -extern __IO uint16_t wIstr; /* ISTR register last read value */ - -/* Exported functions ------------------------------------------------------- */ -void SetCNTR(uint16_t /*wRegValue*/); -void SetISTR(uint16_t /*wRegValue*/); -void SetDADDR(uint16_t /*wRegValue*/); -void SetBTABLE(uint16_t /*wRegValue*/); -void SetBTABLE(uint16_t /*wRegValue*/); -uint16_t GetCNTR(void); -uint16_t GetISTR(void); -uint16_t GetFNR(void); -uint16_t GetDADDR(void); -uint16_t GetBTABLE(void); -void SetENDPOINT(uint8_t /*bEpNum*/, uint16_t /*wRegValue*/); -uint16_t GetENDPOINT(uint8_t /*bEpNum*/); -void SetEPType(uint8_t /*bEpNum*/, uint16_t /*wType*/); -uint16_t GetEPType(uint8_t /*bEpNum*/); -void SetEPTxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); -void SetEPRxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); -void SetDouBleBuffEPStall(uint8_t /*bEpNum*/, uint8_t bDir); -uint16_t GetEPTxStatus(uint8_t /*bEpNum*/); -uint16_t GetEPRxStatus(uint8_t /*bEpNum*/); -void SetEPTxValid(uint8_t /*bEpNum*/); -void SetEPRxValid(uint8_t /*bEpNum*/); -uint16_t GetTxStallStatus(uint8_t /*bEpNum*/); -uint16_t GetRxStallStatus(uint8_t /*bEpNum*/); -void SetEP_KIND(uint8_t /*bEpNum*/); -void ClearEP_KIND(uint8_t /*bEpNum*/); -void Set_Status_Out(uint8_t /*bEpNum*/); -void Clear_Status_Out(uint8_t /*bEpNum*/); -void SetEPDoubleBuff(uint8_t /*bEpNum*/); -void ClearEPDoubleBuff(uint8_t /*bEpNum*/); -void ClearEP_CTR_RX(uint8_t /*bEpNum*/); -void ClearEP_CTR_TX(uint8_t /*bEpNum*/); -void ToggleDTOG_RX(uint8_t /*bEpNum*/); -void ToggleDTOG_TX(uint8_t /*bEpNum*/); -void ClearDTOG_RX(uint8_t /*bEpNum*/); -void ClearDTOG_TX(uint8_t /*bEpNum*/); -void SetEPAddress(uint8_t /*bEpNum*/, uint8_t /*bAddr*/); -uint8_t GetEPAddress(uint8_t /*bEpNum*/); -void SetEPTxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); -void SetEPRxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); -uint16_t GetEPTxAddr(uint8_t /*bEpNum*/); -uint16_t GetEPRxAddr(uint8_t /*bEpNum*/); -void SetEPCountRxReg(uint32_t * /*pdwReg*/, uint16_t /*wCount*/); -void SetEPTxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); -void SetEPRxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); -uint16_t GetEPTxCount(uint8_t /*bEpNum*/); -uint16_t GetEPRxCount(uint8_t /*bEpNum*/); -void SetEPDblBuf0Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/); -void SetEPDblBuf1Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf1Addr*/); -void SetEPDblBuffAddr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/, uint16_t /*wBuf1Addr*/); -uint16_t GetEPDblBuf0Addr(uint8_t /*bEpNum*/); -uint16_t GetEPDblBuf1Addr(uint8_t /*bEpNum*/); -void SetEPDblBuffCount(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); -void SetEPDblBuf0Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); -void SetEPDblBuf1Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); -uint16_t GetEPDblBuf0Count(uint8_t /*bEpNum*/); -uint16_t GetEPDblBuf1Count(uint8_t /*bEpNum*/); -EP_DBUF_DIR GetEPDblBufDir(uint8_t /*bEpNum*/); -void FreeUserBuffer(uint8_t bEpNum/*bEpNum*/, uint8_t bDir); -uint16_t ToWord(uint8_t, uint8_t); -uint16_t ByteSwap(uint16_t); - -#endif /* STM32F10X_CL */ - -#endif /* __USB_REGS_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_sil.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_sil.h deleted file mode 100644 index 974a9a217d..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_sil.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_sil.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Simplified Interface Layer function prototypes. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_SIL_H -#define __USB_SIL_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -uint32_t USB_SIL_Init(void); -uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize); -uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer); - -/* External variables --------------------------------------------------------*/ - -#endif /* __USB_SIL_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h deleted file mode 100644 index 6972ea318d..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/inc/usb_type.h +++ /dev/null @@ -1,74 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_type.h -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Type definitions used by the USB Library -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_TYPE_H -#define __USB_TYPE_H - -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -#ifndef NULL -#define NULL ((void *)0) -#endif - -#ifndef __STM32F10x_H - -typedef signed long s32; -typedef signed short s16; -typedef signed char s8; - -typedef volatile signed long vs32; -typedef volatile signed short vs16; -typedef volatile signed char vs8; - -typedef unsigned long u32; -typedef unsigned short u16; -typedef unsigned char u8; - -typedef unsigned long const uc32; /* Read Only */ -typedef unsigned short const uc16; /* Read Only */ -typedef unsigned char const uc8; /* Read Only */ - -typedef volatile unsigned long vu32; -typedef volatile unsigned short vu16; -typedef volatile unsigned char vu8; - -typedef volatile unsigned long const vuc32; /* Read Only */ -typedef volatile unsigned short const vuc16; /* Read Only */ -typedef volatile unsigned char const vuc8; /* Read Only */ - - -typedef enum -{ - FALSE = 0, TRUE = !FALSE -} -bool; - -typedef enum { RESET = 0, SET = !RESET } FlagStatus, ITStatus; - -typedef enum { DISABLE = 0, ENABLE = !DISABLE} FunctionalState; - -typedef enum { ERROR = 0, SUCCESS = !ERROR} ErrorStatus; -#endif -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* External variables --------------------------------------------------------*/ - -#endif /* __USB_TYPE_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_cal.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_cal.c deleted file mode 100644 index bf96829fd1..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_cal.c +++ /dev/null @@ -1,1273 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : otgd_fs_cal.c -* Author : STMicroelectronics -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : OTG FS Device Core Access Layer interface. -******************************************************************************** -* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -#ifdef STM32F10X_CL - -/* Includes ------------------------------------------------------------------*/ -#include "otgd_fs_cal.h" -#include "usb_conf.h" -#include "otgd_fs_regs.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -USB_OTG_CORE_REGS core_regs; - -/* Private function prototypes -----------------------------------------------*/ -static uint32_t GetMode(void); -static void EnableCommonInt(void); -static USB_OTG_Status SetID(void); -static USB_OTG_Status OTGD_FS_CoreReset(void); - -extern uint32_t STM32_USBH_OTG_ISR_Handler (void); -extern uint32_t STM32_PCD_OTG_ISR_Handler (void); -extern uint32_t STM32_USBO_OTG_ISR_Handler (void); - -#ifdef HOST_MODE_ENABLED -static void InitFSLSPClkSel(void); -#endif - - -/******************************************************************************/ -/* Common Core Layer */ -/******************************************************************************/ - -/******************************************************************************* -* Function Name : OTGD_FS_PhyInit -* Description : Initialize the phy -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_PhyInit(void) -{ - USB_OTG_gpio_data gpioctl; - USB_OTG_usb_cfg_data usbcfg; - USB_OTG_Status status = USB_OTG_OK; - - /* Enable the I2C interface and deactivate the power down*/ - gpioctl.d32 = 0; - gpioctl.b.vbussensingB = 1; - gpioctl.b.pwdn = 1; - gpioctl.b.i2cifen = 0; - WRITE_REG32 (&core_regs.common_regs->gpio, gpioctl.d32); - mDELAY(200); - - /* Program GUSBCFG.OtgUtmifsSel to I2C*/ - usbcfg.d32 = READ_REG32(&core_regs.common_regs->usb_cfg); - usbcfg.b.otgutmifssel = 0; - WRITE_REG32 (&core_regs.common_regs->usb_cfg, usbcfg.d32); - - return status; -} -/******************************************************************************* -* Function Name : OTGD_FS_WritePacket -* Description : Writes a packet into the Tx FIFO associated with the EP -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_WritePacket(uint8_t *src, uint8_t ch_ep_num, uint16_t bytes) -{ - USB_OTG_Status status = USB_OTG_OK; - uint32_t dword_count , i; - __IO uint32_t *fifo; - - /* Find the DWORD length, padded by extra bytes as neccessary if MPS - * is not a multiple of DWORD */ - dword_count = (bytes + 3) / 4; - - fifo = core_regs.data_fifo[ch_ep_num]; - - for (i = 0; i < dword_count; i++, src += 4) - { - WRITE_REG32( fifo, *((__packed uint32_t *)src) ); - } - - return status; -} -/******************************************************************************* -* Function Name : OTGD_FS_ReadPacket -* Description : Reads a packet from the Rx FIFO -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -void* OTGD_FS_ReadPacket(uint8_t *dest, uint16_t bytes) -{ - uint32_t i; - uint32_t word_count = (bytes + 3) / 4; - - __IO uint32_t *fifo = core_regs.data_fifo[0]; - uint32_t *data_buff = (uint32_t *)dest; - - for (i = 0; i < word_count; i++, data_buff++) - { - *data_buff = READ_REG32(fifo); - } - - /* Return the buffer pointer because if the transfer is composed of several packets, - the data of the next packet must be stored following the previous packet's data */ - return ((void *)data_buff); -} -/******************************************************************************* -* Function Name : EnableCommonInt -* Description : initializes the commmon interrupts, used in both device and - host modes -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -static void EnableCommonInt(void) -{ - - USB_OTG_int_msk_data int_mask; - int_mask.d32 = 0; - - /* Clear any pending USB_OTG Interrupts */ - WRITE_REG32( &core_regs.common_regs->otg_int, 0xFFFFFFFF); - - /* Clear any pending common interrupts */ - WRITE_REG32( &core_regs.common_regs->int_sts, 0xFFFFFFFF); - - WRITE_REG32( &core_regs.common_regs->int_msk, int_mask.d32); -} -/******************************************************************************* -* Function Name : OTGD_FS_SetAddress -* Description : Initialize core registers addresses. -* Input : BaseAddress -* Output : None -* Return : status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_SetAddress(uint32_t BaseAddress) -{ - uint32_t i = 0; - USB_OTG_Status status = USB_OTG_OK; - core_regs.common_regs = (USB_OTG_common_regs *)(BaseAddress + USB_OTG_CORE_GLOBAL_REGS_OFFSET); - core_regs.dev_regs = (USB_OTG_dev_regs *) (BaseAddress + USB_OTG_DEV_GLOBAL_REG_OFFSET); - - for (i = 0; i < MAX_EPS_CHANNELS; i++) - { - core_regs.inep_regs[i] = (USB_OTG_dev_in_ep_regs *) (BaseAddress + USB_OTG_DEV_IN_EP_REG_OFFSET + (i * USB_OTG_EP_REG_OFFSET)); - core_regs.outep_regs[i] = (USB_OTG_dev_out_ep_regs *) (BaseAddress + USB_OTG_DEV_OUT_EP_REG_OFFSET + (i * USB_OTG_EP_REG_OFFSET)); - } - - core_regs.host_regs = (USB_OTG_host_regs *)(BaseAddress + USB_OTG_HOST_GLOBAL_REG_OFFSET); - core_regs.hprt0 = (uint32_t *)(BaseAddress + USB_OTG_HOST_PORT_REGS_OFFSET); - - for (i = 0; i < MAX_EPS_CHANNELS; i++) - { - core_regs.hc_regs[i] = (USB_OTG_hc_regs *)(BaseAddress + USB_OTG_HOST_CHAN_REGS_OFFSET + (i * USB_OTG_CHAN_REGS_OFFSET)); - } - - - for (i = 0; i < MAX_EPS_CHANNELS; i++) - { - core_regs.data_fifo[i] = (uint32_t *)(BaseAddress + USB_OTG_DATA_FIFO_OFFSET + (i * USB_OTG_DATA_FIFO_SIZE)); - } - - core_regs.pcgcctl = (uint32_t *)(BaseAddress + USB_OTG_PCGCCTL_OFFSET); - - return status; -} -/******************************************************************************* -* Function Name : OTGD_FS_CoreInit -* Description : Initialize the USB_OTG controller registers and prepares the core - for device mode or host mode operation. -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_CoreInit(void) -{ - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_usb_cfg_data usbcfg; - - usbcfg.d32 = 0; - - /* Reset the Controller */ - OTGD_FS_CoreReset(); - - usbcfg.d32 = READ_REG32(&core_regs.common_regs->usb_cfg); - usbcfg.b.physel = 1; - WRITE_REG32 (&core_regs.common_regs->usb_cfg, usbcfg.d32); - - /* init and configure the phy */ - OTGD_FS_PhyInit(); - - /* Reset after a PHY select and set Host mode */ - OTGD_FS_CoreReset(); - - /* Set Host or Device Mode */ - SetID(); - - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_CoreReset -* Description : Soft reset of the core -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -static USB_OTG_Status OTGD_FS_CoreReset(void) -{ - USB_OTG_Status status = USB_OTG_OK; - __IO USB_OTG_rst_ctl_data greset; - uint32_t count = 0; - greset.d32 = 0; - - /* Wait for AHB master IDLE state. */ - do - { - uDELAY(3); - greset.d32 = READ_REG32(&core_regs.common_regs->rst_ctl); - if (++count > 200000) - { - return USB_OTG_OK; - } - } - while (greset.b.ahbidle == 0); - - /* Core Soft Reset */ - count = 0; - greset.b.csftrst = 1; - WRITE_REG32(&core_regs.common_regs->rst_ctl, greset.d32 ); - do - { - greset.d32 = READ_REG32(&core_regs.common_regs->rst_ctl); - if (++count > 200000) - { - break; - } - } - while (greset.b.csftrst == 1); - - /* Wait for 3 PHY Clocks*/ - uDELAY(10); - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_EnableGlobalInt -* Description : Enables the controller's Global Int in the AHB Config reg -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_EnableGlobalInt(void) -{ - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_ahb_cfg_data ahb_cfg; - - ahb_cfg.d32 = 0; - ahb_cfg.b.glblintrmsk = 1; /* Enable interrupts */ - MODIFY_REG32(&core_regs.common_regs->ahb_cfg, 0, ahb_cfg.d32); - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_DisableGlobalInt -* Description : Disables the controller's Global Int in the AHB Config reg -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_DisableGlobalInt(void) -{ - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_ahb_cfg_data ahbcfg; - - ahbcfg.d32 = 0; - ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ - MODIFY_REG32(&core_regs.common_regs->ahb_cfg, ahbcfg.d32, 0); - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_FlushTxFifo -* Description : Flush a Tx FIFO -* Input : FIFO num -* Output : None -* Return : status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_FlushTxFifo (uint32_t num ) -{ - - USB_OTG_Status status = USB_OTG_OK; - __IO USB_OTG_rst_ctl_data greset; - int count = 0; - - greset.d32 = 0; - greset.b.txfflsh = 1; - greset.b.txfnum = num; - WRITE_REG32( &core_regs.common_regs->rst_ctl, greset.d32 ); - - do - { - greset.d32 = READ_REG32( &core_regs.common_regs->rst_ctl); - if (++count > 200000) - { - break; - } - } - while (greset.b.txfflsh == 1); - - /* Wait for 3 PHY Clocks*/ - uDELAY(3); - - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_FlushRxFifo -* Description : Flush a Rx FIFO -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_FlushRxFifo( void ) -{ - USB_OTG_Status status = USB_OTG_OK; - __IO USB_OTG_rst_ctl_data greset; - int count = 0; - - greset.d32 = 0; - greset.b.rxfflsh = 1; - WRITE_REG32( &core_regs.common_regs->rst_ctl, greset.d32 ); - - do - { - greset.d32 = READ_REG32( &core_regs.common_regs->rst_ctl); - if (++count > 200000) - { - break; - } - } - while (greset.b.rxfflsh == 1); - - /* Wait for 3 PHY Clocks*/ - uDELAY(3); - - return status; -} - -/******************************************************************************* -* Function Name : SetID -* Description : Set ID line -* Input : None -* Output : None -* Return : num_in_ep -*******************************************************************************/ -USB_OTG_Status SetID(void) -{ - - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_usb_cfg_data usbcfg; - - usbcfg.d32 = READ_REG32(&core_regs.common_regs->usb_cfg); - - usbcfg.b.force_dev = 1; - - WRITE_REG32(&core_regs.common_regs->usb_cfg, usbcfg.d32); - - mDELAY(50); - - return status; -} - -/******************************************************************************* -* Function Name : GetMode -* Description : Get current mode -* Input : None -* Output : None -* Return : current mode -*******************************************************************************/ -static uint32_t GetMode(void) -{ - return (READ_REG32(&core_regs.common_regs->int_sts ) & 0x1); -} - -/******************************************************************************* -* Function Name : IsDeviceMode -* Description : Check if it is device mode -* Input : None -* Output : None -* Return : num_in_ep -*******************************************************************************/ -uint8_t IsDeviceMode(void) -{ - return (GetMode() != HOST_MODE); -} - -/******************************************************************************* -* Function Name : IsHostMode -* Description : Check if it is host mode -* Input : None -* Output : None -* Return : num_in_ep -*******************************************************************************/ -uint8_t IsHostMode(void) -{ - return (GetMode() == HOST_MODE); -} - -/******************************************************************************* -* Function Name : OTGD_FS_ReadCoreItr -* Description : returns the Core Interrupt register -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -uint32_t OTGD_FS_ReadCoreItr(void) -{ - uint32_t v; - - v = READ_REG32(&core_regs.common_regs->int_sts); - v &= READ_REG32(&core_regs.common_regs->int_msk); - - return v; -} - -/******************************************************************************* -* Function Name : OTGD_FS_ReadOtgItr -* Description : returns the USB_OTG Interrupt register -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -uint32_t OTGD_FS_ReadOtgItr (void) -{ - return (READ_REG32 (&core_regs.common_regs->otg_int)); -} - -/******************************************************************************/ -/* PCD Core Layer */ -/******************************************************************************/ - -/******************************************************************************* -* Function Name : InitDevSpeed -* Description : Initializes the DevSpd field of the DCFG register depending - on the PHY type and the enumeration speed of the device. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -static void InitDevSpeed(void) -{ - USB_OTG_dev_cfg_data dcfg; - - dcfg.d32 = READ_REG32(&core_regs.dev_regs->dev_cfg); - dcfg.b.devspd = 0x3; /* Full speed PHY */ - WRITE_REG32(&core_regs.dev_regs->dev_cfg, dcfg.d32); -} -/******************************************************************************* -* Function Name : OTGD_FS_CoreInitDev -* Description : Initialize the USB_OTG controller registers for device mode -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_CoreInitDev (void) -{ - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_dev_ep_ctl_data depctl; - uint32_t i; - - USB_OTG_dev_cfg_data dcfg; - USB_OTG_fifo_size_data nptxfifosize; - USB_OTG_fifo_size_data txfifosize; - USB_OTG_dev_in_ep_msk_data msk; - - dcfg.d32 = 0; - - /* Set device speed */ - InitDevSpeed (); - - /* Restart the Phy Clock */ - WRITE_REG32(core_regs.pcgcctl, 0); - - /* Device configuration register */ - dcfg.d32 = READ_REG32( &core_regs.dev_regs->dev_cfg); - dcfg.b.perfrint = DCFG_FRAME_INTERVAL_80; - WRITE_REG32( &core_regs.dev_regs->dev_cfg, dcfg.d32 ); - - /* set Rx FIFO size */ - WRITE_REG32( &core_regs.common_regs->rx_fifo_siz, RX_FIFO_SIZE); - - /* Non-periodic Tx FIFO */ - nptxfifosize.b.depth = DEV_NP_TX_FIFO_SIZE; - nptxfifosize.b.startaddr = RX_FIFO_SIZE; - - WRITE_REG32( &core_regs.common_regs->np_tx_fifo_siz, nptxfifosize.d32 ); - - txfifosize.b.depth = DEV_NP_TX_FIFO_SIZE; - WRITE_REG32( &core_regs.common_regs->dev_p_tx_fsiz_dieptxf[0], txfifosize.d32 ); - txfifosize.b.startaddr += txfifosize.b.depth; - txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; - - /* Flush the FIFOs */ - OTGD_FS_FlushTxFifo(0x10); /* all Tx FIFOs */ - OTGD_FS_FlushRxFifo(); - - /* Clear all pending Device Interrupts */ - WRITE_REG32( &core_regs.dev_regs->dev_in_ep_msk, 0 ); - WRITE_REG32( &core_regs.dev_regs->dev_out_ep_msk, 0 ); - WRITE_REG32( &core_regs.dev_regs->dev_all_int, 0xFFFFFFFF ); - WRITE_REG32( &core_regs.dev_regs->dev_all_int_msk, 0 ); - - for (i = 0; i <= MAX_TX_FIFOS; i++) - { - depctl.d32 = READ_REG32(&core_regs.inep_regs[i]->dev_in_ep_ctl); - if (depctl.b.epena) - { - depctl.d32 = 0; - depctl.b.epdis = 1; - depctl.b.snak = 1; - } - else - { - depctl.d32 = 0; - } - - WRITE_REG32( &core_regs.inep_regs[i]->dev_in_ep_ctl, depctl.d32); - - - WRITE_REG32( &core_regs.inep_regs[i]->dev_in_ep_txfer_siz, 0); - WRITE_REG32( &core_regs.inep_regs[i]->dev_in_ep_int, 0xFF); - } - - for (i = 0; i < 1/* NUM_OUT_EPS*/; i++) - { - depctl.d32 = READ_REG32(&core_regs.outep_regs[i]->dev_out_ep_ctl); - if (depctl.b.epena) - { - depctl.d32 = 0; - depctl.b.epdis = 1; - depctl.b.snak = 1; - } - else - { - depctl.d32 = 0; - } - - WRITE_REG32( &core_regs.outep_regs[i]->dev_out_ep_ctl, depctl.d32); - - WRITE_REG32( &core_regs.outep_regs[i]->dev_out_ep_txfer_siz, 0); - WRITE_REG32( &core_regs.outep_regs[i]->dev_out_ep_int, 0xFF); - } - - msk.d32 = 0; - msk.b.txfifoundrn = 1; - MODIFY_REG32(&core_regs.dev_regs->dev_in_ep_msk, msk.d32, msk.d32); - - OTGD_FS_EnableDevInt(); - - return status; -} -/******************************************************************************* -* Function Name : OTGD_FS_EnableDevInt -* Description : Enables the Device mode interrupts -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_EnableDevInt(void) -{ - - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_int_msk_data intr_mask; - - intr_mask.d32 = 0; - - /* Disable all interrupts. */ - WRITE_REG32( &core_regs.common_regs->int_msk, 0); - - /* Clear any pending interrupts */ - WRITE_REG32( &core_regs.common_regs->int_sts, 0xFFFFFFFF); - - /* Enable the common interrupts */ - EnableCommonInt(); - - /* Enable the defined interrupts*/ -#ifdef INTR_MODEMISMATCH - intr_mask.b.modemismatch = 1; -#endif /* INTR_MODEMISMATCH */ -#ifdef INTR_SOFINTR - intr_mask.b.sofintr = 1; -#endif /* INTR_SOFINTR */ -#ifdef INTR_RXSTSQLVL - intr_mask.b.rxstsqlvl = 1; -#endif /* INTR_RXSTSQLVL */ -#ifdef INTR_NPTXFEMPTY - intr_mask.b.nptxfempty = 1; -#endif /* INTR_NPTXFEMPTY */ -#ifdef INTR_GINNAKEFF - intr_mask.b.ginnakeff = 1; -#endif /* INTR_GINNAKEFF */ -#ifdef INTR_GOUTNAKEFF - intr_mask.b.goutnakeff = 1; -#endif /* INTR_GOUTNAKEFF */ -#ifdef INTR_ERLYSUSPEND - intr_mask.b.erlysuspend = 1; -#endif /* INTR_ERLYSUSPEND */ -#ifdef INTR_USBSUSPEND - intr_mask.b.usbsuspend = 1; -#endif /* INTR_USBSUSPEND */ -#ifdef INTR_USBRESET - intr_mask.b.usbreset = 1; -#endif /* INTR_USBRESET */ -#ifdef INTR_ENUMDONE - intr_mask.b.enumdone = 1; -#endif /* INTR_ENUMDONE */ -#ifdef INTR_ISOOUTDROP - intr_mask.b.isooutdrop = 1; -#endif /* INTR_ISOOUTDROP */ -#ifdef INTR_EOPFRAME - intr_mask.b.eopframe = 1; -#endif /* INTR_EOPFRAME */ -#ifdef INTR_EPMISMATCH - intr_mask.b.epmismatch = 1; -#endif /* INTR_EPMISMATCH */ -#ifdef INTR_INEPINTR - intr_mask.b.inepintr = 1; -#endif /* INTR_INEPINTR */ -#ifdef INTR_OUTEPINTR - intr_mask.b.outepintr = 1; -#endif /* INTR_OUTEPINTR */ -#ifdef INTR_INCOMPLISOIN - intr_mask.b.incomplisoin = 1; -#endif /* INTR_INCOMPLISOIN */ -#ifdef INTR_INCOMPLISOOUT - intr_mask.b.incomplisoout = 1; -#endif /* INTR_INCOMPLISOOUT */ -#ifdef INTR_DISCONNECT - intr_mask.b.disconnect = 1; -#endif /* INTR_DISCONNECT */ -#ifdef INTR_WKUPINTR - intr_mask.b.wkupintr = 1; -#endif /* INTR_WKUPINTR */ - - MODIFY_REG32( &core_regs.common_regs->int_msk, intr_mask.d32, intr_mask.d32); - return status; - -} -/******************************************************************************* -* Function Name : OTGD_FS_EP0Activate -* Description : enables EP0 OUT to receive SETUP packets and configures EP0 - IN for transmitting packets -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_EP0Activate(void) -{ - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_dev_sts_data dsts; - USB_OTG_dev_ep_ctl_data diepctl; - USB_OTG_dev_ctl_data dctl; - - dctl.d32 = 0; - /* Read the Device Status and Endpoint 0 Control registers */ - dsts.d32 = READ_REG32(&core_regs.dev_regs->dev_sts); - diepctl.d32 = READ_REG32(&core_regs.inep_regs[0]->dev_in_ep_ctl); - - /* Set the MPS of the IN EP based on the enumeration speed */ - switch (dsts.b.enumspd) - { - case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: - case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: - case DSTS_ENUMSPD_FS_PHY_48MHZ: - diepctl.b.mps = DEP0CTL_MPS_64; - break; - case DSTS_ENUMSPD_LS_PHY_6MHZ: - diepctl.b.mps = DEP0CTL_MPS_8; - break; - } - - WRITE_REG32(&core_regs.inep_regs[0]->dev_in_ep_ctl, diepctl.d32); - dctl.b.cgnpinnak = 1; - MODIFY_REG32(&core_regs.dev_regs->dev_ctl, dctl.d32, dctl.d32); - return status; -} -/******************************************************************************* -* Function Name : OTGD_FS_EPActivate -* Description : Activates an EP -* Input : ep -* Output : None -* Return : num_in_ep -*******************************************************************************/ -USB_OTG_Status OTGD_FS_EPActivate(USB_OTG_EP *ep) -{ - - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_dev_ep_ctl_data depctl; - __IO uint32_t *addr; - USB_OTG_dev_all_int_data daintmsk; - daintmsk.d32 = 0; - - /* Read DEPCTLn register */ - if (ep->is_in == 1) - { - addr = &core_regs.inep_regs[ep->num]->dev_in_ep_ctl; - daintmsk.ep.in = 1 << ep->num; - } - else - { - addr = &core_regs.outep_regs[ep->num]->dev_out_ep_ctl; - daintmsk.ep.out = 1 << ep->num; - } - - /* If the EP is already active don't change the EP Control - * register. */ - depctl.d32 = READ_REG32(addr); - if (!depctl.b.usbactep) - { - depctl.b.mps = ep->maxpacket; - depctl.b.eptype = ep->type; - depctl.b.txfnum = ep->tx_fifo_num; - depctl.b.setd0pid = 1; - depctl.b.usbactep = 1; - WRITE_REG32(addr, depctl.d32); - } - - /* Enable the Interrupt for this EP */ - MODIFY_REG32(&core_regs.dev_regs->dev_all_int_msk, 0, daintmsk.d32); - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_EPDeactivate -* Description : Deactivates an EP -* Input : ep -* Output : None -* Return : num_in_ep -*******************************************************************************/ -USB_OTG_Status OTGD_FS_EPDeactivate(USB_OTG_EP *ep) -{ - - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_dev_ep_ctl_data depctl; - __IO uint32_t *addr; - USB_OTG_dev_all_int_data daintmsk; - depctl.d32 = 0; - daintmsk.d32 = 0; - - /* Read DEPCTLn register */ - if (ep->is_in == 1) - { - addr = &core_regs.inep_regs[ep->num]->dev_in_ep_ctl; - daintmsk.ep.in = 1 << ep->num; - } - else - { - addr = &core_regs.outep_regs[ep->num]->dev_out_ep_ctl; - daintmsk.ep.out = 1 << ep->num; - } - - depctl.b.usbactep = 0; - WRITE_REG32(addr, depctl.d32); - - /* Disable the Interrupt for this EP */ - MODIFY_REG32(&core_regs.dev_regs->dev_all_int_msk, daintmsk.d32, 0); - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_EPStartXfer -* Description : Handle the setup for data xfer for an EP and starts the xfer -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_EPStartXfer(USB_OTG_EP *ep) -{ - - USB_OTG_Status status = USB_OTG_OK; - __IO USB_OTG_dev_ep_ctl_data depctl; - USB_OTG_dev_ep_txfer_siz_data deptsiz; - - /* IN endpoint */ - if (ep->is_in == 1) - { - - depctl.d32 = READ_REG32(&(core_regs.inep_regs[ep->num]->dev_in_ep_ctl)); - deptsiz.d32 = READ_REG32(&(core_regs.inep_regs[ep->num]->dev_in_ep_txfer_siz)); - - /* Zero Length Packet? */ - if (ep->xfer_len == 0) - { - deptsiz.b.xfersize = 0; - deptsiz.b.pktcnt = 1; - - } - else - { - /* Program the transfer size and packet count - * as follows: xfersize = N * maxpacket + - * short_packet pktcnt = N + (short_packet - * exist ? 1 : 0) - */ - deptsiz.b.xfersize = ep->xfer_len; - deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; - } - WRITE_REG32(&core_regs.inep_regs[ep->num]->dev_in_ep_txfer_siz, deptsiz.d32); - - if (ep->type != EP_TYPE_ISOC) - { - /* Enable the Tx FIFO Empty Interrupt for this EP */ - uint32_t fifoemptymsk = 0; - fifoemptymsk = 1 << ep->num; - MODIFY_REG32(&core_regs.dev_regs->dev_fifo_empty_msk, 0, fifoemptymsk); - } - - /* EP enable, IN data in FIFO */ - depctl.b.cnak = 1; - depctl.b.epena = 1; - WRITE_REG32(&core_regs.inep_regs[ep->num]->dev_in_ep_ctl, depctl.d32); - - depctl.d32 = READ_REG32 (&core_regs.inep_regs[0]->dev_in_ep_ctl); - depctl.b.nextep = ep->num; - WRITE_REG32 (&core_regs.inep_regs[0]->dev_in_ep_ctl, depctl.d32); - } - else - { - /* OUT endpoint */ - depctl.d32 = READ_REG32(&(core_regs.outep_regs[ep->num]->dev_out_ep_ctl)); - deptsiz.d32 = READ_REG32(&(core_regs.outep_regs[ep->num]->dev_out_ep_txfer_siz)); - - /* Program the transfer size and packet count as follows: - * pktcnt = N - * xfersize = N * maxpacket - */ - if (ep->xfer_len == 0) - { - deptsiz.b.xfersize = ep->maxpacket; - deptsiz.b.pktcnt = 1; - } - else - { - deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; - deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; - } - WRITE_REG32(&core_regs.outep_regs[ep->num]->dev_out_ep_txfer_siz, deptsiz.d32); - - if (ep->type == EP_TYPE_ISOC) - { - - if (ep->even_odd_frame) - { - depctl.b.setd1pid = 1; - } - else - { - depctl.b.setd0pid = 1; - } - } - - /* EP enable */ - depctl.b.cnak = 1; - depctl.b.epena = 1; - - WRITE_REG32(&core_regs.outep_regs[ep->num]->dev_out_ep_ctl, depctl.d32); - - } - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_EP0StartXfer -* Description : Handle the setup for a data xfer for EP0 and starts the xfer -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_EP0StartXfer(USB_OTG_EP *ep) -{ - - USB_OTG_Status status = USB_OTG_OK; - uint32_t fifoemptymsk = 0; - USB_OTG_dev_ep_ctl_data depctl; - USB_OTG_dev_ep_txfer_size0_data deptsiz; - USB_OTG_dev_in_ep_regs *in_regs ; - - /* IN endpoint */ - if (ep->is_in == 1) - { - in_regs = core_regs.inep_regs[0]; - depctl.d32 = READ_REG32(&in_regs->dev_in_ep_ctl); - deptsiz.d32 = READ_REG32(&in_regs->dev_in_ep_txfer_siz); - - /* Zero Length Packet? */ - if (ep->xfer_len == 0) - { - deptsiz.b.xfersize = 0; - deptsiz.b.pktcnt = 1; - } - else - { - if (ep->xfer_len > ep->maxpacket) - { - ep->xfer_len = ep->maxpacket; - deptsiz.b.xfersize = ep->maxpacket; - } - else - { - deptsiz.b.xfersize = ep->xfer_len; - } - deptsiz.b.pktcnt = 1; - - } - WRITE_REG32(&in_regs->dev_in_ep_txfer_siz, deptsiz.d32); - - /* EP enable, IN data in FIFO */ - depctl.b.cnak = 1; - depctl.b.epena = 1; - WRITE_REG32(&in_regs->dev_in_ep_ctl, depctl.d32); - - /* Enable the Tx FIFO Empty Interrupt for this EP */ - if (ep->xfer_len > 0) - { - fifoemptymsk |= 1 << ep->num; - MODIFY_REG32(&core_regs.dev_regs->dev_fifo_empty_msk, 0, fifoemptymsk); - } - } - else - { - /* OUT endpoint */ - depctl.d32 = READ_REG32(&core_regs.outep_regs[ep->num]->dev_out_ep_ctl); - deptsiz.d32 = READ_REG32(&core_regs.outep_regs[ep->num]->dev_out_ep_txfer_siz); - - /* Program the transfer size and packet count as follows: - * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) - * pktcnt = N */ - if (ep->xfer_len == 0) - { - deptsiz.b.xfersize = ep->maxpacket; - deptsiz.b.pktcnt = 1; - } - else - { - deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; - deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; - } - - WRITE_REG32(&core_regs.outep_regs[ep->num]->dev_out_ep_txfer_siz, deptsiz.d32); - - /* EP enable */ - depctl.b.cnak = 1; - depctl.b.epena = 1; - WRITE_REG32 (&(core_regs.outep_regs[ep->num]->dev_out_ep_ctl), depctl.d32); - } - return status; -} -/******************************************************************************* -* Function Name : OTGD_FS_EPSetStall -* Description : Set the EP STALL -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_EPSetStall(USB_OTG_EP *ep) -{ - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_dev_ep_ctl_data depctl; - __IO uint32_t *depctl_addr; - - if (ep->is_in == 1) - { - depctl_addr = &(core_regs.inep_regs[ep->num]->dev_in_ep_ctl); - depctl.d32 = READ_REG32(depctl_addr); - - /* set the disable and stall bits */ - if (depctl.b.epena) - { - depctl.b.epdis = 1; - } - depctl.b.stall = 1; - WRITE_REG32(depctl_addr, depctl.d32); - } - else - { - depctl_addr = &(core_regs.outep_regs[ep->num]->dev_out_ep_ctl); - depctl.d32 = READ_REG32(depctl_addr); - - /* set the stall bit */ - depctl.b.stall = 1; - WRITE_REG32(depctl_addr, depctl.d32); - } - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_EPClearStall -* Description : Clear the EP STALL -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -USB_OTG_Status OTGD_FS_EPClearStall(USB_OTG_EP *ep) -{ - USB_OTG_Status status = USB_OTG_OK; - USB_OTG_dev_ep_ctl_data depctl; - __IO uint32_t *depctl_addr; - - if (ep->is_in == 1) - { - depctl_addr = &(core_regs.inep_regs[ep->num]->dev_in_ep_ctl); - } - else - { - depctl_addr = &(core_regs.outep_regs[ep->num]->dev_out_ep_ctl); - } - - - depctl.d32 = READ_REG32(depctl_addr); - - /* clear the stall bits */ - depctl.b.stall = 0; - - if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) - { - depctl.b.setd0pid = 1; /* DATA0 */ - } - - WRITE_REG32(depctl_addr, depctl.d32); - return status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_ReadDevAllOutEp_itr -* Description : returns the OUT endpoint interrupt bits -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -uint32_t OTGD_FS_ReadDevAllOutEp_itr(void) -{ - uint32_t v; - v = READ_REG32(&core_regs.dev_regs->dev_all_int); - v &= READ_REG32(&core_regs.dev_regs->dev_all_int_msk); - return ((v & 0xffff0000) >> 16); -} - -/******************************************************************************* -* Function Name : OTGD_FS_ReadDevOutEP_itr -* Description : returns the Device OUT EP Interrupt register -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -uint32_t OTGD_FS_ReadDevOutEP_itr(USB_OTG_EP *ep) -{ - uint32_t v; - v = READ_REG32(&core_regs.outep_regs[ep->num]->dev_out_ep_int); - v &= READ_REG32(&core_regs.dev_regs->dev_out_ep_msk); - return v; -} -/******************************************************************************* -* Function Name : OTGD_FS_ReadDevAllInEPItr -* Description : Get int status register -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -uint32_t OTGD_FS_ReadDevAllInEPItr(void) -{ - uint32_t v; - v = READ_REG32(&core_regs.dev_regs->dev_all_int); - v &= READ_REG32(&core_regs.dev_regs->dev_all_int_msk); - return (v & 0xffff); -} - -/******************************************************************************* -* Function Name : OTGD_FS_Dev_GetEPStatus -* Description : returns the EP Status -* Input : - ep: pointer to the EP structure -* Output : None -* Return : status: DEV_EP_TX_STALL, DEV_EP_TX_VALID, DEV_EP_TX_NAK, -* DEV_EP_RX_STALL, DEV_EP_RX_VALID or DEV_EP_RX_NAK, -*******************************************************************************/ -uint32_t OTGD_FS_Dev_GetEPStatus(USB_OTG_EP *ep) -{ - USB_OTG_dev_ep_ctl_data depctl; - __IO uint32_t *depctl_addr; - uint32_t Status = 0; - - if (ep->is_in == 1) - { - depctl_addr = &(core_regs.inep_regs[ep->num]->dev_in_ep_ctl); - } - else - { - depctl_addr = &(core_regs.outep_regs[ep->num]->dev_out_ep_ctl); - } - - depctl.d32 = READ_REG32(depctl_addr); - - /* Process for IN endpoint */ - if (ep->is_in == 1) - { - if (depctl.b.stall == 1) - Status = DEV_EP_TX_STALL; - else if (depctl.b.naksts == 1) - Status = DEV_EP_TX_NAK; - else - Status = DEV_EP_TX_VALID; - } - /* Process for OUT endpoint */ - else - { - if (depctl.b.stall == 1) - Status = DEV_EP_RX_STALL; - else if (depctl.b.naksts == 1) - Status = DEV_EP_RX_NAK; - else - Status = DEV_EP_RX_VALID; - } - - /* Return the current status */ - return Status; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Dev_SetEPStatus -* Description : Sets the EP Status -* Input : - ep: pointer to the EP structure -* - Status: new status to be set -* Output : None -* Return : None -*******************************************************************************/ -void OTGD_FS_Dev_SetEPStatus(USB_OTG_EP *ep, uint32_t Status) -{ - USB_OTG_dev_ep_ctl_data depctl; - __IO uint32_t *depctl_addr; - - if (ep->is_in == 1) - { - depctl_addr = &(core_regs.inep_regs[ep->num]->dev_in_ep_ctl); - } - else - { - depctl_addr = &(core_regs.outep_regs[ep->num]->dev_out_ep_ctl); - } - - depctl.d32 = READ_REG32(depctl_addr); - - /* Process for IN endpoint */ - if (ep->is_in == 1) - { - if (Status == DEV_EP_TX_STALL) - { - OTGD_FS_EPSetStall(ep); return; - } - else if (Status == DEV_EP_TX_NAK) - depctl.b.snak = 1; - else if (Status == DEV_EP_TX_VALID) - { - if (depctl.b.stall == 1) - { - ep->even_odd_frame = 0; - OTGD_FS_EPClearStall(ep); - return; - } - depctl.b.cnak = 1; - depctl.b.usbactep = 1; - depctl.b.epena = 1; - } - else if (Status == DEV_EP_TX_DIS) - depctl.b.usbactep = 0; - } - else /* Process for OUT endpoint */ - { - if (Status == DEV_EP_RX_STALL) - depctl.b.stall = 1; - else if (Status == DEV_EP_RX_NAK) - depctl.b.snak = 1; - else if (Status == DEV_EP_RX_VALID) - { - if (depctl.b.stall == 1) - { - ep->even_odd_frame = 0; - OTGD_FS_EPClearStall(ep); - return; - } - depctl.b.cnak = 1; - depctl.b.usbactep = 1; - depctl.b.epena = 1; - } - else if (Status == DEV_EP_RX_DIS) - { - depctl.b.usbactep = 0; - } - } - - if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) - { - depctl.b.setd0pid = 1; /* DATA0 */ - } - - WRITE_REG32(depctl_addr, depctl.d32); -} - -/******************************************************************************* -* Function Name : OTGD_FS_Dev_SetRemoteWakeup -* Description : Enable Remote wakeup signaling -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -void OTGD_FS_Dev_SetRemoteWakeup() -{ - USB_OTG_dev_ctl_data devctl; - __IO uint32_t *dctl_addr; - - dctl_addr = &(core_regs.dev_regs->dev_ctl); - - devctl.d32 = READ_REG32( dctl_addr); - - /* Enable the Remote Wakeup signal */ - devctl.b.rmtwkupsig = 1; - - WRITE_REG32(dctl_addr, devctl.d32); -} - -/******************************************************************************* -* Function Name : OTGD_FS_Dev_ResetRemoteWakeup -* Description : Disable Remote wakeup signaling -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -void OTGD_FS_Dev_ResetRemoteWakeup() -{ - USB_OTG_dev_ctl_data devctl; - __IO uint32_t *dctl_addr; - - dctl_addr = &(core_regs.dev_regs->dev_ctl); - - devctl.d32 = READ_REG32( dctl_addr); - - /* Disable the Remote Wakeup signal */ - devctl.b.rmtwkupsig = 0; - - - WRITE_REG32(dctl_addr, devctl.d32); -} -#endif /* STM32F10X_CL */ -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_dev.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_dev.c deleted file mode 100644 index 0ef31fa5ec..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_dev.c +++ /dev/null @@ -1,385 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : otgd_fs_dev.c -* Author : STMicroelectronics -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : High Layer device mode interface and wrapping layer. -******************************************************************************** -* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -#ifdef STM32F10X_CL - -/* Includes ------------------------------------------------------------------*/ -#include "otgd_fs_dev.h" -#include "usb_regs.h" -#include "otgd_fs_cal.h" -#include "otgd_fs_pcd.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ - -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : OTG_DEV_Init -* Description : Initialize the OTG Device IP and EP0. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void OTG_DEV_Init(void) -{ - EP_DESCRIPTOR ep_descriptor; - USB_OTG_EP *ep; - - /* Set the OTG_USB base registers address */ - OTGD_FS_SetAddress(USB_OTG_FS1_BASE_ADDR); - - /* Disable all global interrupts */ - OTGD_FS_DisableGlobalInt(); - - /*Init the Core (common init.) */ - OTGD_FS_CoreInit(); - - /* Init Device */ - OTGD_FS_CoreInitDev(); - - /* Init internal driver structure */ - OTGD_FS_PCD_Init(); - - /* Configure and open the IN control EP0 */ - ep_descriptor.bEndpointAddress = 0x80; - ep_descriptor.wMaxPacketSize = 64; - ep_descriptor.bmAttributes = USB_ENDPOINT_XFER_CONTROL; - OTGD_FS_PCD_EP_Open(&ep_descriptor); - - /* Configure and open the OUT control EP0 */ - ep_descriptor.bEndpointAddress = 0x00; - OTGD_FS_PCD_EP_Open(&ep_descriptor); - - - ep = OTGD_FS_PCD_GetOutEP(0); - OTGD_FS_EPStartXfer(ep); - - /* Enable EP0 to start receiving setup packets */ - OTGD_FS_PCD_EP0_OutStart(); - - /* Enable USB Global interrupt */ - OTGD_FS_EnableGlobalInt(); -} - - -/******************************************************************************* -* Function Name : OTG_DEV_EP_Init -* Description : Initialize the selected endpoint parameters -* Input : - bEpAdd: address of the endpoint (epnum|epdir) -* expample: EP1 OUT -> 0x01 and EP1 IN 0x81. -* - bEpType: OTG_DEV_EP_TYPE_CONTROL, OTG_DEV_EP_TYPE_ISOC, -* OTG_DEV_EP_TYPE_BULK, OTG_DEV_EP_TYPE_INT -* - wEpMaxPackSize: The EP max packet size. -* Output : None. -* Return : Status: New status to be set for the endpoint: -*******************************************************************************/ -void OTG_DEV_EP_Init(uint8_t bEpAdd, uint8_t bEpType, uint16_t wEpMaxPackSize) -{ - EP_DESCRIPTOR ep_descriptor; - USB_OTG_EP *ep; - - /* Set the EP parameters in a structure */ - ep_descriptor.bEndpointAddress = bEpAdd; - ep_descriptor.bmAttributes = bEpType; - ep_descriptor.wMaxPacketSize = wEpMaxPackSize; - - OTGD_FS_PCD_EP_Flush(bEpAdd); - - /* Open the EP with entered parameters */ - OTGD_FS_PCD_EP_Open(&ep_descriptor); - - /* Activate the EP if it is an OUT EP */ - if ((bEpAdd & 0x80) == 0) - { - ep = OTGD_FS_PCD_GetOutEP(bEpAdd & 0x7F); - OTGD_FS_EPStartXfer(ep); - } - else - { - ep = OTGD_FS_PCD_GetInEP(bEpAdd & 0x7F); - ep->even_odd_frame = 0; - OTG_DEV_SetEPTxStatus(bEpAdd, DEV_EP_TX_NAK); - } - -} - -/******************************************************************************* -* Function Name : OTG_DEV_GetEPTxStatus -* Description : Set the related endpoint status. -* Input : Number of the endpoint. -* Output : None. -* Return : Status: New status to be set for the endpoint: -*******************************************************************************/ -uint32_t OTG_DEV_GetEPTxStatus(uint8_t bEpnum) -{ - USB_OTG_EP *ep; - uint32_t status = 0; - - ep = OTGD_FS_PCD_GetInEP(bEpnum & 0x7F); - - status = OTGD_FS_Dev_GetEPStatus(ep); - - return status; -} - -/******************************************************************************* -* Function Name : OTG_DEV_GetEPRxStatus -* Description : returns the related endpoint status. -* Input : Number of the endpoint. -* Output : None. -* Return : Status: New status to be set for the endpoint: -*******************************************************************************/ -uint32_t OTG_DEV_GetEPRxStatus(uint8_t bEpnum) -{ - USB_OTG_EP *ep; - uint32_t status = 0; - - ep = OTGD_FS_PCD_GetOutEP(bEpnum & 0x7F); - - status = OTGD_FS_Dev_GetEPStatus(ep); - - return status; -} - -/******************************************************************************* -* Function Name : OTG_DEV_SetEPTxStatus -* Description : Sets the related endpoint status. -* Input : - bEpnum: Number of the endpoint. -* - Status: New status to be set for the endpoint. It can be -* DEV_EP_TX_VALID, DEV_EP_TX_STALL, DEV_EP_TX_NAK or -* DEV_EP_TX_DISABLE. -* Output : None. -* Return : None. -*******************************************************************************/ -void OTG_DEV_SetEPTxStatus(uint8_t bEpnum, uint32_t Status) -{ - USB_OTG_EP *ep; - - ep = OTGD_FS_PCD_GetInEP(bEpnum & 0x7F); - - if ((bEpnum == 0x80) && (Status == DEV_EP_TX_STALL)) - { - ep->is_in = 1; - } - - OTGD_FS_Dev_SetEPStatus(ep, Status); -} - -/******************************************************************************* -* Function Name : OTG_DEV_SetEPRxStatus -* Description : Sets the related endpoint status. -* Input : - bEpnum: Number of the endpoint. -* - Status: New status to be set for the endpoint. It can be -* DEV_EP_RX_VALID, DEV_EP_RX_STALL, DEV_EP_RX_NAK or -* DEV_EP_RX_DISABLE. -* Output : None. -* Return : None. -*******************************************************************************/ -void OTG_DEV_SetEPRxStatus(uint8_t bEpnum, uint32_t Status) -{ - USB_OTG_EP *ep; - - ep = OTGD_FS_PCD_GetOutEP(bEpnum & 0x7F); - - OTGD_FS_Dev_SetEPStatus(ep, Status); -} - -/******************************************************************************* -* Function Name : USB_DevDisconnect -* Description : Disconnect the Pullup resist. -* Input : bEpNum: Endpoint Number. -* wState: new state. -* Output : None. -* Return : None. -*******************************************************************************/ -void USB_DevDisconnect(void) -{ - OTGD_FS_PCD_DevDisconnect(); -} - -/******************************************************************************* -* Function Name : USB_DevConnect -* Description : Disconnect the . -* Input : bEpNum: Endpoint Number. -* wState: new state. -* Output : None. -* Return : None. -*******************************************************************************/ -void USB_DevConnect(void) -{ - OTGD_FS_PCD_DevConnect(); -} - -/*-*-*-*-*-*-*-*-*-* Replace the usb_regs.h defines -*-*-*-*-*-*-*-*-*-*-*-*-*/ - -/******************************************************************************* -* Function Name : SetEPTxStatus -* Description : Set the status of Tx endpoint. -* Input : bEpNum: Endpoint Number. -* wState: new state. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPTxStatus(uint8_t bEpNum, uint16_t wState) -{ - _SetEPTxStatus(bEpNum, wState); -} - -/******************************************************************************* -* Function Name : SetEPRxStatus -* Description : Set the status of Rx endpoint. -* Input : bEpNum: Endpoint Number. -* wState: new state. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPRxStatus(uint8_t bEpNum, uint16_t wState) -{ - _SetEPRxStatus(bEpNum, wState); -} - -/******************************************************************************* -* Function Name : GetEPTxStatus -* Description : Returns the endpoint Tx status. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint TX Status -*******************************************************************************/ -uint16_t GetEPTxStatus(uint8_t bEpNum) -{ - return(_GetEPTxStatus(bEpNum)); -} - -/******************************************************************************* -* Function Name : GetEPRxStatus -* Description : Returns the endpoint Rx status. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint RX Status -*******************************************************************************/ -uint16_t GetEPRxStatus(uint8_t bEpNum) -{ - return(_GetEPRxStatus(bEpNum)); -} - -/******************************************************************************* -* Function Name : SetEPTxValid -* Description : Valid the endpoint Tx Status. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPTxValid(uint8_t bEpNum) -{ - _SetEPTxStatus(bEpNum, EP_TX_VALID); -} - -/******************************************************************************* -* Function Name : SetEPRxValid -* Description : Valid the endpoint Rx Status. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPRxValid(uint8_t bEpNum) -{ - _SetEPRxStatus(bEpNum, EP_RX_VALID); -} - -/******************************************************************************* -* Function Name : GetTxStallStatus -* Description : Returns the Stall status of the Tx endpoint. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Tx Stall status. -*******************************************************************************/ -uint16_t GetTxStallStatus(uint8_t bEpNum) -{ - return(_GetTxStallStatus(bEpNum)); -} - -/******************************************************************************* -* Function Name : GetRxStallStatus -* Description : Returns the Stall status of the Rx endpoint. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Rx Stall status. -*******************************************************************************/ -uint16_t GetRxStallStatus(uint8_t bEpNum) -{ - return(_GetRxStallStatus(bEpNum)); -} - -/******************************************************************************* -* Function Name : SetEPTxCount. -* Description : Set the Tx count. -* Input : bEpNum: Endpoint Number. -* wCount: new count value. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPTxCount(uint8_t bEpNum, uint16_t wCount) -{ -} - -/******************************************************************************* -* Function Name : SetEPRxCount -* Description : Set the Rx count. -* Input : bEpNum: Endpoint Number. -* wCount: the new count value. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPRxCount(uint8_t bEpNum, uint16_t wCount) -{ -} - -/******************************************************************************* -* Function Name : ToWord -* Description : merge two byte in a word. -* Input : bh: byte high, bl: bytes low. -* Output : None. -* Return : resulted word. -*******************************************************************************/ -uint16_t ToWord(uint8_t bh, uint8_t bl) -{ - uint16_t wRet; - wRet = (uint16_t)bl | ((uint16_t)bh << 8); - return(wRet); -} - -/******************************************************************************* -* Function Name : ByteSwap -* Description : Swap two byte in a word. -* Input : wSwW: word to Swap. -* Output : None. -* Return : resulted word. -*******************************************************************************/ -uint16_t ByteSwap(uint16_t wSwW) -{ - uint8_t bTemp; - uint16_t wRet; - bTemp = (uint8_t)(wSwW & 0xff); - wRet = (wSwW >> 8) | ((uint16_t)bTemp << 8); - return(wRet); -} - -#endif /* STM32F10X_CL */ -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_int.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_int.c deleted file mode 100644 index 4532bf9519..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_int.c +++ /dev/null @@ -1,876 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : otgd_fs_int.c -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Endpoint interrupt's service routines. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -#ifdef STM32F10X_CL - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -#include "usb_type.h" -#include "otgd_fs_int.h" -#include "usb_lib.h" -#include "usb_istr.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Max size of the received OUT Non periodic packet */ -#define MAX_OUT_PKT_SIZE 160 - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ - -uint8_t USBD_Data_Buffer [MAX_OUT_PKT_SIZE]; -__IO uint8_t IsocBuff [(ISOC_BUFFER_SZE * NUM_SUB_BUFFERS)]; -__IO uint32_t IsocBufferIdx = 0; - -extern USB_OTG_CORE_REGS core_regs; - -__IO uint16_t SaveRState; -__IO uint16_t SaveTState; - -/* Extern variables ----------------------------------------------------------*/ -extern void (*pEpInt_IN[7])(void); /* Handles IN interrupts */ -extern void (*pEpInt_OUT[7])(void); /* Handles OUT interrupts */ - -/* Private function prototypes -----------------------------------------------*/ -static uint32_t OTGD_FS_PCD_ReadDevInEP( USB_OTG_EP *ep); -static enum usb_device_speed OTGD_FS_PCD_GetDeviceSpeed(void); -static uint32_t OTGD_FS_PCD_WriteEmptyTxFifo(uint32_t epnum); - -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_ModeMismatch_ISR -* Description : Handles the Mode Mismatch error interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_ModeMismatch_ISR(void) -{ - USB_OTG_int_sts_data gintsts; - - INTR_MODEMISMATCH_Callback(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.modemismatch = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_Sof_ISR -* Description : Handles the Start Of Frame detected interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_Sof_ISR(void) -{ - USB_OTG_int_sts_data int_sts; - - /* Call user function */ - INTR_SOFINTR_Callback(); - - /* Clear interrupt */ - int_sts.d32 = 0; - int_sts.b.sofintr = 1; - WRITE_REG32 (&core_regs.common_regs->int_sts, int_sts.d32); - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_RxStatusQueueLevel_ISR -* Description : Handles the Rx Status Queue Level Interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_RxStatusQueueLevel_ISR(void) -{ - USB_OTG_int_msk_data int_mask; - USB_OTG_dev_rx_sts_data status; - /* USB_OTG_int_sts_data int_sts; */ - USB_OTG_EP *ep; - - /* Disable the Rx Status Queue Level interrupt */ - int_mask.b.rxstsqlvl = 1; - MODIFY_REG32( &core_regs.common_regs->int_msk, int_mask.d32, 0); - - /* Get the Status from the top of the FIFO */ - status.d32 = READ_REG32( &core_regs.common_regs->rx_stsp ); - - /* Get the related endpoint structure */ - ep = OTGD_FS_PCD_GetOutEP(status.b.epnum); - - switch (status.b.pktsts) - { - case STS_GOUT_NAK: - break; - case STS_DATA_UPDT: - if (status.b.bcnt) - { - if (ep->type == EP_TYPE_ISOC) - { - /* Call user function */ - INTR_RXSTSQLVL_ISODU_Callback(); - - /* Copy the received buffer to the RAM */ - OTGD_FS_ReadPacket((uint8_t*)(IsocBuff + (ISOC_BUFFER_SZE * IsocBufferIdx)), status.b.bcnt); - ep->xfer_buff = (uint8_t*)(IsocBuff + (ISOC_BUFFER_SZE * IsocBufferIdx)); - - /* Check if the end of the global buffer has been reached */ - if (IsocBufferIdx == (NUM_SUB_BUFFERS - 1)) - { - /* Reset the buffer index */ - IsocBufferIdx = 0; - } - else - { - /* Increment the buffer index */ - IsocBufferIdx ++; - } - } - else - { - /* Copy the received buffer to the RAM */ - OTGD_FS_ReadPacket(USBD_Data_Buffer, status.b.bcnt); - ep->xfer_buff = USBD_Data_Buffer; - } - - /* Update the endpoint structure */ - ep->xfer_len = status.b.bcnt; - ep->xfer_count += status.b.bcnt; - } - break; - case STS_XFER_COMP: - break; - case STS_SETUP_COMP: - break; - case STS_SETUP_UPDT: - /* Copy the setup packet received in Fifo into the setup buffer in RAM */ - OTGD_FS_ReadPacket(USBD_Data_Buffer, 8); - ep->xfer_buff = USBD_Data_Buffer; - ep->xfer_count += status.b.bcnt; - ep->xfer_len = status.b.bcnt; - break; - default: - break; - } - - /* Call the user function */ - INTR_RXSTSQLVL_Callback(); - - /* Enable the Rx Status Queue Level interrupt */ - MODIFY_REG32( &core_regs.common_regs->int_msk, 0, int_mask.d32); - - /* Clear interrupt: this is a read only bit, it cannot be cleared by register - access */ - /* int_sts.d32 = 0; - int_sts.b.rxstsqlvl = 1; - WRITE_REG32 (&core_regs.common_regs->int_sts, int_sts.d32); - */ - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_NPTxFE_ISR -* Description : Handles the Non Periodic Tx FIFO Empty interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_NPTxFE_ISR(void ) -{ - /* USB_OTG_int_sts_data gintsts; */ - USB_OTG_int_msk_data gintmsk; - gintmsk.d32 = 0; - - /* Call the user function */ - INTR_NPTXFEMPTY_Callback(); - - gintmsk.b.nptxfempty = 1; - MODIFY_REG32(&core_regs.common_regs->int_msk, gintmsk.d32, 0 ); - - /* Clear interrupt: This bit is a read only bit, cannot be cleared - by register access */ - /* gintsts.d32 = 0; - gintsts.b.nptxfempty = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - */ - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_GInNakEff_ISR -* Description : Handles the Global IN Endpoints NAK Effective interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_GInNakEff_ISR(void) -{ - /* USB_OTG_int_sts_data gintsts; */ - - /* Call user function */ - INTR_GINNAKEFF_Callback(); - - /* Clear interrupt: This is a read only bit, it cannot be cleared by register - access */ - /* gintsts.d32 = 0; - gintsts.b.ginnakeff = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - */ - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_GOutNakEff_ISR -* Description : Handles the Global OUT Endpoints NAK Effective interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_GOutNakEff_ISR(void) -{ - /* USB_OTG_int_sts_data gintsts; */ - - /* Call user function */ - INTR_GOUTNAKEFF_Callback(); - - /* Clear interrupt: This is a read only bit, it cannot be cleared by register - access */ - /* gintsts.d32 = 0; - gintsts.b.goutnakeff = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - */ - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_EarlySuspend_ISR -* Description : Handles the Early Suspend detected interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_EarlySuspend_ISR(void ) -{ - USB_OTG_int_sts_data gintsts; - USB_OTG_int_msk_data gintmsk; - gintmsk.d32 = 0; - - /* Call user function */ - INTR_ERLYSUSPEND_Callback(); - - gintmsk.b.erlysuspend = 1; - MODIFY_REG32(&core_regs.common_regs->int_msk, gintmsk.d32, 0 ); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.erlysuspend = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_USBSuspend_ISR -* Description : Handles the Suspend condition detected interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_USBSuspend_ISR(void) -{ - USB_OTG_int_sts_data gintsts; - - /* Call user function */ - INTR_USBSUSPEND_Callback(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.usbsuspend = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_UsbReset_ISR -* Description : This interrupt occurs when a USB Reset is detected. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_UsbReset_ISR(void) -{ - USB_OTG_dev_all_int_data daintmsk; - USB_OTG_dev_out_ep_msk_data doepmsk; - USB_OTG_dev_in_ep_msk_data diepmsk; - USB_OTG_dev_cfg_data dcfg; - USB_OTG_dev_ctl_data dctl; - USB_OTG_int_sts_data gintsts; - - daintmsk.d32 = 0; - doepmsk.d32 = 0; - diepmsk.d32 = 0; - dcfg.d32 = 0; - dctl.d32 = 0; - - /* Clear the Remote Wakeup Signalling */ - dctl.b.rmtwkupsig = 1; - MODIFY_REG32(&core_regs.dev_regs->dev_ctl, dctl.d32, 0 ); - - /* Flush the NP Tx FIFO */ - OTGD_FS_FlushTxFifo( 0 ); - - daintmsk.b.inep0 = 1; - daintmsk.b.outep0 = 1; - WRITE_REG32( &core_regs.dev_regs->dev_all_int_msk, daintmsk.d32 ); - - doepmsk.b.setup = 1; - doepmsk.b.xfercompl = 1; - doepmsk.b.ahberr = 1; - doepmsk.b.epdisabled = 1; - WRITE_REG32( &core_regs.dev_regs->dev_out_ep_msk, doepmsk.d32 ); - - diepmsk.b.xfercompl = 1; - diepmsk.b.timeout = 1; - diepmsk.b.epdisabled = 1; - diepmsk.b.ahberr = 1; - diepmsk.b.intknepmis = 1; - WRITE_REG32( &core_regs.dev_regs->dev_in_ep_msk, diepmsk.d32 ); - - /* Reset Device Address */ - dcfg.d32 = READ_REG32( &core_regs.dev_regs->dev_cfg); - dcfg.b.devaddr = 0; - WRITE_REG32( &core_regs.dev_regs->dev_cfg, dcfg.d32); - - - /* setup EP0 to receive SETUP packets */ - OTGD_FS_PCD_EP0_OutStart(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.usbreset = 1; - WRITE_REG32 (&core_regs.common_regs->int_sts, gintsts.d32); - - /* Call the user reset function */ - OTGD_FS_DEVICE_RESET; - - /* Call user function */ - INTR_USBRESET_Callback(); - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_EnumDone_ISR -* Description : Reads the device status register and set the device speed -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_EnumDone_ISR(void) -{ - USB_OTG_int_sts_data gintsts; - USB_OTG_usb_cfg_data gusbcfg; - - OTGD_FS_EP0Activate(); - - /* Set USB turnaround time based on device speed and PHY interface. */ - gusbcfg.d32 = READ_REG32(&core_regs.common_regs->usb_cfg); - - /* Full or low speed */ - if ( OTGD_FS_PCD_GetDeviceSpeed() == USB_SPEED_FULL) - { - gusbcfg.b.usbtrdtim = 9; - } - WRITE_REG32(&core_regs.common_regs->usb_cfg, gusbcfg.d32); - - /* Call user function */ - INTR_ENUMDONE_Callback(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.enumdone = 1; - WRITE_REG32( &core_regs.common_regs->int_sts, gintsts.d32 ); - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_IsoOutDrop_ISR -* Description : Handles the Isochrounous Out packet Dropped interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_IsoOutDrop_ISR(void) -{ - USB_OTG_int_sts_data gintsts; - - /* Call user function */ - INTR_ISOOUTDROP_Callback(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.isooutdrop = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_EOPF_ISR -* Description : Handles the Expexted End Of Periodic Frame interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_EOPF_ISR(void ) -{ - USB_OTG_int_sts_data gintsts; - USB_OTG_int_msk_data gintmsk; - gintmsk.d32 = 0; - - gintmsk.b.eopframe = 1; - MODIFY_REG32(&core_regs.common_regs->int_msk, gintmsk.d32, 0 ); - - /* Call user function */ - INTR_EOPFRAME_Callback(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.eopframe = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_EPMismatch_ISR -* Description : Handles the Endpoint Mismatch error interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_EPMismatch_ISR(void) -{ - USB_OTG_int_sts_data gintsts; - - /* Call user function */ - INTR_EPMISMATCH_Callback(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.epmismatch = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_InEP_ISR -* Description : Handles all IN endpoints interrupts. -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_InEP_ISR(void) -{ - USB_OTG_dev_in_ep_int_data diepint; - - uint32_t ep_intr; - uint32_t epnum = 0; - USB_OTG_EP *ep; - uint32_t fifoemptymsk; - - diepint.d32 = 0; - ep_intr = OTGD_FS_ReadDevAllInEPItr(); - while ( ep_intr ) - { - if (ep_intr&0x1) /* In ITR */ - { - ep = OTGD_FS_PCD_GetInEP(epnum); - diepint.d32 = OTGD_FS_PCD_ReadDevInEP(ep); /* Get In ITR status */ - if ( diepint.b.xfercompl ) - { - fifoemptymsk = 0x1 << ep->num; - MODIFY_REG32(&core_regs.dev_regs->dev_fifo_empty_msk, fifoemptymsk, 0); - - /* Clear the Interrupt flag */ - CLEAR_IN_EP_INTR(epnum, xfercompl); - - if (epnum == 0) - { - /* Call the core IN process for EP0 */ - In0_Process(); - - /* before terminate set Tx & Rx status */ - OTG_DEV_SetEPRxStatus(epnum, SaveRState); - OTG_DEV_SetEPTxStatus(epnum, SaveTState); - } - else - { - OTG_DEV_SetEPTxStatus(EP1_IN, DEV_EP_TX_NAK); - - (*pEpInt_IN[epnum -1])(); - - /* Toggle Endpoint frame ID */ - if (ep->even_odd_frame == 0) - ep->even_odd_frame = 1; - else - ep->even_odd_frame = 0; - } - } - if ( diepint.b.ahberr ) - { - CLEAR_IN_EP_INTR(epnum, ahberr); - } - if ( diepint.b.timeout ) - { - CLEAR_IN_EP_INTR(epnum, timeout); - } - if (diepint.b.intktxfemp) - { - CLEAR_IN_EP_INTR(epnum, intktxfemp); - } - if (diepint.b.intknepmis) - { - CLEAR_IN_EP_INTR(epnum, intknepmis); - } - if (diepint.b.inepnakeff) - { - CLEAR_IN_EP_INTR(epnum, inepnakeff); - } - if (diepint.b.emptyintr) - { - if ((epnum == 0) || (OTG_DEV_GetEPTxStatus(epnum) == DEV_EP_TX_VALID)) - { - OTGD_FS_PCD_WriteEmptyTxFifo(epnum); - } - - CLEAR_IN_EP_INTR(epnum, emptyintr); - } - if ( diepint.b.epdisabled ) - { - /* Reset Endpoint Frame ID to 0 */ - ep->even_odd_frame = 0; - - CLEAR_IN_EP_INTR(epnum, epdisabled); - } - } - epnum++; - ep_intr >>= 1; - } - - /* Call user function */ - INTR_INEPINTR_Callback(); - - return 1; -} - - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_OutEP_ISR -* Description : Handles all OUT endpoints interrupts. -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_OutEP_ISR(void) -{ - uint32_t ep_intr; - USB_OTG_dev_out_ep_int_data doepint; - uint32_t epnum = 0; - USB_OTG_EP *ep; - - doepint.d32 = 0; - - /* Read in the device interrupt bits */ - ep_intr = OTGD_FS_ReadDevAllOutEp_itr(); - - while ( ep_intr ) - { - if (ep_intr&0x1) - { - /* Get EP pointer */ - ep = OTGD_FS_PCD_GetOutEP(epnum); - doepint.d32 = OTGD_FS_ReadDevOutEP_itr(ep); - - /* Transfer complete */ - if ( doepint.b.xfercompl ) - { - /* Clear the bit in DOEPINTn for this interrupt */ - CLEAR_OUT_EP_INTR(epnum, xfercompl); - - if (epnum == 0) - { - /* Call the OUT process for the EP0 */ - Out0_Process(); - } - else - { - (*pEpInt_OUT[epnum-1])(); - } - } - /* Endpoint disable */ - if ( doepint.b.epdisabled ) - { - /* Clear the bit in DOEPINTn for this interrupt */ - CLEAR_OUT_EP_INTR(epnum, epdisabled); - } - /* AHB Error */ - if ( doepint.b.ahberr ) - { - CLEAR_OUT_EP_INTR(epnum, ahberr); - } - /* Setup Phase Done (control EPs) */ - if ( doepint.b.setup ) - { - if (epnum == 0) - { - /* Call the SETUP process for the EP0 */ - Setup0_Process(); - - /* Before exit, update the Tx status */ - OTG_DEV_SetEPTxStatus(0x80, SaveTState); - } - else - { - /* Other control endpoints */ - } - - /* Clear the EP Interrupt */ - CLEAR_OUT_EP_INTR(epnum, setup); - } - } - epnum++; - ep_intr >>= 1; - } - - /* Call user function */ - INTR_OUTEPINTR_Callback(); - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_IncomplIsoIn_ISR -* Description : Handles the Incomplete Isochrous IN tranfer error interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_IncomplIsoIn_ISR(void) -{ - USB_OTG_int_sts_data gintsts; - - /* Call user function */ - INTR_INCOMPLISOIN_Callback(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.incomplisoin = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_IncomplIsoOut_ISR -* Description : Handles the Incomplete Isochrous OUT tranfer error interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_IncomplIsoOut_ISR(void) -{ - USB_OTG_int_sts_data gintsts; - - /* Call user function */ - INTR_INCOMPLISOOUT_Callback(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.outepintr = 1; - WRITE_REG32(&core_regs.common_regs->int_sts, gintsts.d32); - - return 1; -} - -/******************************************************************************* -* Function Name : OTGD_FS_Handle_Wakeup_ISR -* Description : Handles the Wakeup or Remote Wakeup detected interrupt. -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_Handle_Wakeup_ISR(void) -{ - USB_OTG_int_sts_data gintsts; - - /* Call user function */ - INTR_WKUPINTR_Callback(); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.wkupintr = 1; - WRITE_REG32 (&core_regs.common_regs->int_sts, gintsts.d32); - - return 1; -} - - - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_GetDeviceSpeed -* Description : Get the device speed from the device status register -* Input : None -* Output : None -* Return : The Device speed value. -*******************************************************************************/ -static enum usb_device_speed OTGD_FS_PCD_GetDeviceSpeed(void) -{ - USB_OTG_dev_sts_data dsts; - enum usb_device_speed speed = USB_SPEED_UNKNOWN; - dsts.d32 = READ_REG32(&core_regs.dev_regs->dev_sts); - - switch (dsts.b.enumspd) - { - case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: - speed = USB_SPEED_HIGH; - break; - case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: - case DSTS_ENUMSPD_FS_PHY_48MHZ: - speed = USB_SPEED_FULL; - break; - - case DSTS_ENUMSPD_LS_PHY_6MHZ: - speed = USB_SPEED_LOW; - break; - } - - return speed; -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_ReadDevInEP -* Description : Reads all the Endpoints flags. -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -static uint32_t OTGD_FS_PCD_ReadDevInEP( USB_OTG_EP *ep) -{ - uint32_t v, msk, emp; - msk = READ_REG32(&core_regs.dev_regs->dev_in_ep_msk); - emp = READ_REG32(&core_regs.dev_regs->dev_fifo_empty_msk); - msk |= ((emp >> ep->num) & 0x1) << 7; - v = READ_REG32(&core_regs.inep_regs[ep->num]->dev_in_ep_int) & msk; - return v; -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_WriteEmptyTxFifo -* Description : Checks Fifo for the next packet to be loaded. -* Input : None -* Output : None -* Return : Status -*******************************************************************************/ -static uint32_t OTGD_FS_PCD_WriteEmptyTxFifo(uint32_t epnum) -{ - USB_OTG_dev_tx_fifo_sts_data txstatus; - USB_OTG_EP *ep; - uint32_t len = 0; - uint32_t dwords; - USB_OTG_dev_ep_ctl_data depctl; - - txstatus.d32 = 0; - - ep = OTGD_FS_PCD_GetInEP(epnum); - - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - - dwords = (len + 3) / 4; - txstatus.d32 = READ_REG32( &core_regs.inep_regs[epnum]->dev_tx_fifo_sts); - - /* Manage the case of 0-length data packets toggling data PID */ - if ((ep->xfer_len == 0) && (ep->xfer_count == 0)) - { - if (ep->num > 0) - { - depctl.d32 = READ_REG32( &core_regs.inep_regs[epnum]->dev_in_ep_ctl); - if (ep->even_odd_frame == 1) - { - depctl.b.setd0pid = 0; - depctl.b.setd1pid = 1; - } - else - { - depctl.b.setd0pid = 1; - depctl.b.setd1pid = 0; - } - WRITE_REG32( &core_regs.inep_regs[epnum]->dev_in_ep_ctl, depctl.d32); - } - } - - - while (txstatus.b.txfspcavail > dwords && - ep->xfer_count < ep->xfer_len && - ep->xfer_len != 0) - { - if (ep->num > 0) - { - depctl.d32 = READ_REG32( &core_regs.inep_regs[epnum]->dev_in_ep_ctl); - if (ep->even_odd_frame == 0) - { - depctl.b.setd0pid = 1; - depctl.b.setd1pid = 0; - } - else - { - depctl.b.setd0pid = 0; - depctl.b.setd1pid = 1; - } - WRITE_REG32( &core_regs.inep_regs[epnum]->dev_in_ep_ctl, depctl.d32); - } - - /* Write the FIFO */ - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - dwords = (len + 3) / 4; - - OTGD_FS_WritePacket(ep->xfer_buff, epnum, len); - - ep->xfer_count += len; - - txstatus.d32 = READ_REG32(&core_regs.inep_regs[epnum]->dev_tx_fifo_sts); - } - - return 1; -} -#endif /* STM32F10X_CL */ -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_pcd.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_pcd.c deleted file mode 100644 index aca8c3547d..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_pcd.c +++ /dev/null @@ -1,445 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : otgd_fs_pcd.c -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Peripheral Device Interface low layer. -******************************************************************************** -* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -#ifdef STM32F10X_CL - -#include "usb_lib.h" -#include "otgd_fs_cal.h" -#include "otgd_fs_pcd.h" - -USB_OTG_PCD_DEV USB_OTG_PCD_dev; - -extern USB_OTG_CORE_REGS core_regs; -/******************************************************************************* -* Function Name : OTGD_FS_PCD_Init -* Description : Initialize the USB Device portion of the driver. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void OTGD_FS_PCD_Init(void) -{ - uint32_t i; - USB_OTG_EP *ep; - - ep = &USB_OTG_PCD_dev.ep0; - USB_OTG_PCD_dev.ep0state = 0; - - /* Init ep structure */ - ep->num = 0; - ep->tx_fifo_num = 0; - - /* Control until ep is actvated */ - ep->type = EP_TYPE_CTRL; - ep->maxpacket = MAX_PACKET_SIZE; - - ep->xfer_buff = 0; - ep->xfer_len = 0; - - for (i = 1; i < MAX_TX_FIFOS ; i++) - { - ep = &USB_OTG_PCD_dev.in_ep[i-1]; - - /* Init ep structure */ - ep->is_in = 1; - ep->num = i; - ep->tx_fifo_num = i; - - /* Control until ep is actvated */ - ep->type = EP_TYPE_CTRL; - ep->maxpacket = MAX_PACKET_SIZE; - ep->xfer_buff = 0; - ep->xfer_len = 0; - } - - for (i = 1; i < MAX_TX_FIFOS; i++) - { - ep = &USB_OTG_PCD_dev.out_ep[i-1]; - - /* Init ep structure */ - ep->is_in = 0; - ep->num = i; - ep->tx_fifo_num = i; - - /* Control until ep is activated */ - ep->type = EP_TYPE_CTRL; - ep->maxpacket = MAX_PACKET_SIZE; - ep->xfer_buff = 0; - ep->xfer_len = 0; - } - - USB_OTG_PCD_dev.ep0.maxpacket = MAX_EP0_SIZE; - USB_OTG_PCD_dev.ep0.type = EP_TYPE_CTRL; - -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_EP_Open -* Description : Configure an Endpoint -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_PCD_EP_Open(EP_DESCRIPTOR *epdesc) -{ - USB_OTG_EP *ep; - - - if ((0x80 & epdesc->bEndpointAddress) != 0) - { - ep = OTGD_FS_PCD_GetInEP(epdesc->bEndpointAddress & 0x7F); - } - else - { - ep = OTGD_FS_PCD_GetOutEP(epdesc->bEndpointAddress & 0x7F); - } - - ep->num = epdesc->bEndpointAddress & 0x7F; - ep->is_in = (0x80 & epdesc->bEndpointAddress) != 0; - ep->maxpacket = epdesc->wMaxPacketSize; - ep->type = epdesc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; - - if (ep->is_in) - { - /* Assign a Tx FIFO */ - ep->tx_fifo_num = ep->num; - } - - /* Set initial data PID. */ - if ((epdesc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK ) - { - ep->data_pid_start = 0; - } - - OTGD_FS_EPActivate(ep ); - - return 0; -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_EP_Close -* Description : Called when an EP is disabled -* Input : Endpoint address. -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_PCD_EP_Close(uint8_t ep_addr) -{ - - USB_OTG_EP *ep; - - if ((0x80 & ep_addr) != 0) - { - ep = OTGD_FS_PCD_GetInEP(ep_addr & 0x7F); - } - else - { - ep = OTGD_FS_PCD_GetOutEP(ep_addr & 0x7F); - } - - ep->num = ep_addr & 0x7F; - ep->is_in = (0x80 & ep_addr) != 0; - - OTGD_FS_EPDeactivate(ep ); - return 0; -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_EP_Read -* Description : Read data from Fifo -* Input : Endpoint address. -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_PCD_EP_Read (uint8_t ep_addr, uint8_t *pbuf, uint32_t buf_len) -{ - USB_OTG_EP *ep; - uint32_t i; - - ep = OTGD_FS_PCD_GetOutEP(ep_addr & 0x7F); - - /* copy received data into application buffer */ - for (i = 0 ; i < buf_len ; i++) - { - pbuf[i] = ep->xfer_buff[i]; - } - - /*setup and start the Xfer */ - ep->xfer_buff = pbuf; - ep->xfer_len = buf_len; - ep->xfer_count = 0; - ep->is_in = 0; - ep->num = ep_addr & 0x7F; - - if ( ep->num == 0 ) - { - OTGD_FS_EP0StartXfer(ep); - } - else if (USB_OTG_PCD_dev.ep0state == 0) - { - OTGD_FS_EPStartXfer( ep ); - } - - return 0; -} - -/******************************************************************************* -* Function Name : USBF_EP_Write -* Description : Read data from Fifo -* Input : ep -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_PCD_EP_Write (uint8_t ep_addr, uint8_t *pbuf, uint32_t buf_len) -{ - USB_OTG_EP *ep; - - ep = OTGD_FS_PCD_GetInEP(ep_addr & 0x7f); - - /* assign data to EP structure buffer */ - ep->xfer_buff = pbuf; - - /* Setup and start the Transfer */ - ep->xfer_count = 0; - ep->xfer_len = buf_len; - ep->is_in = 1; - ep->num = ep_addr & 0x7F; - - if ( ep->num == 0 ) - { - OTGD_FS_EP0StartXfer(ep); - } - else if (USB_OTG_PCD_dev.ep0state == 0) - { - OTGD_FS_EPStartXfer( ep ); - } - - return 0; -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_EP_Stall -* Description : Stall an endpoint. -* Input : Endpoint Address. -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_PCD_EP_Stall (uint8_t ep_addr) -{ - USB_OTG_EP *ep; - - if ((0x80 & ep_addr) != 0) - { - ep = OTGD_FS_PCD_GetInEP(ep_addr & 0x7F); - } - else - { - ep = OTGD_FS_PCD_GetOutEP(ep_addr & 0x7F); - } - - ep->num = ep_addr & 0x7F; - ep->is_in = ((ep_addr & 0x80) == 0x80) ? 1 : 0; - - OTGD_FS_EPSetStall(ep); - return (0); -} -/******************************************************************************* -* Function Name : OTGD_FS_PCD_EP_ClrStall -* Description : Clear stall condition on endpoints. -* Input : Endpoint Address. -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_PCD_EP_ClrStall (uint8_t ep_addr) -{ - - USB_OTG_EP *ep; - - if ((0x80 & ep_addr) != 0) - { - ep = OTGD_FS_PCD_GetInEP(ep_addr & 0x7F); - } - else - { - ep = OTGD_FS_PCD_GetOutEP(ep_addr & 0x7F); - } - - ep->num = ep_addr & 0x7F; - ep->is_in = ((ep_addr & 0x80) == 0x80) ? 1 : 0; - - OTGD_FS_EPClearStall(ep); - - return (0); -} - -/******************************************************************************* -* Function Name : USBF_FCD_EP_Flush() -* Description : This Function flushes the buffer. -* Input : Endpoint Address. -* Output : None -* Return : status -*******************************************************************************/ -uint32_t OTGD_FS_PCD_EP_Flush (uint8_t ep_addr) -{ - - uint8_t is_out; - uint8_t ep_nbr; - - ep_nbr = ep_addr & 0x7F; - is_out = ((ep_addr & 0x80) == 0x80) ? 0 : 1; - - if (is_out == 0) - { - OTGD_FS_FlushTxFifo(ep_nbr); - } - else - { - OTGD_FS_FlushRxFifo(); - } - OTGD_FS_PCD_EP_ClrStall(ep_addr); - return (0); -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_EP_SetAddress -* Description : This Function set USB device address -* Input : The new device Address to be set. -* Output : None -* Return : status -*******************************************************************************/ -void OTGD_FS_PCD_EP_SetAddress (uint8_t address) -{ - - USB_OTG_dev_cfg_data dcfg; - dcfg.d32 = 0; - - dcfg.b.devaddr = address; - MODIFY_REG32( &core_regs.dev_regs->dev_cfg, 0, dcfg.d32); -} - - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_GetInEP -* Description : This function returns pointer to IN EP struct with number ep_num -* Input : Endpoint Number. -* Output : None -* Return : status -*******************************************************************************/ -USB_OTG_EP* OTGD_FS_PCD_GetInEP(uint32_t ep_num) -{ - uint32_t i; - if (ep_num == 0) - { - return &USB_OTG_PCD_dev.ep0; - } - else - { - for (i = 0; i < MAX_TX_FIFOS; ++i) - { - if (USB_OTG_PCD_dev.in_ep[i].num == ep_num) - return &USB_OTG_PCD_dev.in_ep[i]; - } - return 0; - } -} -/******************************************************************************* -* Function Name : USBF_GetOutEP -* Description : returns pointer to OUT EP struct with number ep_num -* Input : Endpoint Number. -* Output : None -* Return : USBF_EP -*******************************************************************************/ -USB_OTG_EP* OTGD_FS_PCD_GetOutEP(uint32_t ep_num) -{ - uint32_t i; - if (ep_num == 0) - { - return &USB_OTG_PCD_dev.ep0; - } - else - { - for (i = 0; i < MAX_TX_FIFOS; ++i) - { - if (USB_OTG_PCD_dev.out_ep[i].num == ep_num) - return &USB_OTG_PCD_dev.out_ep[i]; - } - return 0; - } -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_DevConnect -* Description : Connect device -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -void OTGD_FS_PCD_DevConnect(void) -{ - - USB_OTG_dev_ctl_data dctl; - - dctl.d32 = READ_REG32(&core_regs.dev_regs->dev_ctl); - - /* Connect device */ - dctl.b.sftdiscon = 0; - WRITE_REG32(&core_regs.dev_regs->dev_ctl, dctl.d32); - mDELAY(25); -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_DevDisconnect -* Description : Disconnect device -* Input : None -* Output : None -* Return : status -*******************************************************************************/ -void OTGD_FS_PCD_DevDisconnect (void) -{ - - USB_OTG_dev_ctl_data dctl; - - dctl.d32 = READ_REG32(&core_regs.dev_regs->dev_ctl); - - /* Disconnect device for 20ms */ - dctl.b.sftdiscon = 1; - WRITE_REG32(&core_regs.dev_regs->dev_ctl, dctl.d32); - mDELAY(25); -} - -/******************************************************************************* -* Function Name : OTGD_FS_PCD_EP0_OutStart -* Description : Configures EPO to receive SETUP packets. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void OTGD_FS_PCD_EP0_OutStart(void) -{ - - USB_OTG_dev_ep_txfer_size0_data doeptsize0; - - doeptsize0.d32 = 0; - doeptsize0.b.supcnt = 3; - doeptsize0.b.pktcnt = 1; - doeptsize0.b.xfersize = 8 * 3; - - WRITE_REG32( &core_regs.outep_regs[0]->dev_out_ep_txfer_siz, doeptsize0.d32 ); - -} - -#endif /* STM32F10X_CL */ -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c deleted file mode 100644 index 9657d920be..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c +++ /dev/null @@ -1,1088 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_core.c -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Standard protocol processing (USB v2.0) -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_lib.h" -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define ValBit(VAR,Place) (VAR & (1 << Place)) -#define SetBit(VAR,Place) (VAR |= (1 << Place)) -#define ClrBit(VAR,Place) (VAR &= ((1 << Place) ^ 255)) - -#ifdef STM32F10X_CL - #define Send0LengthData() {OTGD_FS_PCD_EP_Write (0, 0, 0) ; vSetEPTxStatus(EP_TX_VALID);} -#else -#define Send0LengthData() { _SetEPTxCount(ENDP0, 0); \ - vSetEPTxStatus(EP_TX_VALID); \ - } -#endif /* STM32F10X_CL */ - -#define vSetEPRxStatus(st) (SaveRState = st) -#define vSetEPTxStatus(st) (SaveTState = st) - -#define USB_StatusIn() Send0LengthData() -#define USB_StatusOut() vSetEPRxStatus(EP_RX_VALID) - -#define StatusInfo0 StatusInfo.bw.bb1 /* Reverse bb0 & bb1 */ -#define StatusInfo1 StatusInfo.bw.bb0 - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -uint16_t_uint8_t StatusInfo; - -bool Data_Mul_MaxPacketSize = FALSE; -/* Private function prototypes -----------------------------------------------*/ -static void DataStageOut(void); -static void DataStageIn(void); -static void NoData_Setup0(void); -static void Data_Setup0(void); -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : Standard_GetConfiguration. -* Description : Return the current configuration variable address. -* Input : Length - How many bytes are needed. -* Output : None. -* Return : Return 1 , if the request is invalid when "Length" is 0. -* Return "Buffer" if the "Length" is not 0. -*******************************************************************************/ -uint8_t *Standard_GetConfiguration(uint16_t Length) -{ - if (Length == 0) - { - pInformation->Ctrl_Info.Usb_wLength = - sizeof(pInformation->Current_Configuration); - return 0; - } - pUser_Standard_Requests->User_GetConfiguration(); - return (uint8_t *)&pInformation->Current_Configuration; -} - -/******************************************************************************* -* Function Name : Standard_SetConfiguration. -* Description : This routine is called to set the configuration value -* Then each class should configure device themself. -* Input : None. -* Output : None. -* Return : Return USB_SUCCESS, if the request is performed. -* Return USB_UNSUPPORT, if the request is invalid. -*******************************************************************************/ -RESULT Standard_SetConfiguration(void) -{ - - if ((pInformation->USBwValue0 <= - Device_Table.Total_Configuration) && (pInformation->USBwValue1 == 0) - && (pInformation->USBwIndex == 0)) /*call Back usb spec 2.0*/ - { - pInformation->Current_Configuration = pInformation->USBwValue0; - pUser_Standard_Requests->User_SetConfiguration(); - return USB_SUCCESS; - } - else - { - return USB_UNSUPPORT; - } -} - -/******************************************************************************* -* Function Name : Standard_GetInterface. -* Description : Return the Alternate Setting of the current interface. -* Input : Length - How many bytes are needed. -* Output : None. -* Return : Return 0, if the request is invalid when "Length" is 0. -* Return "Buffer" if the "Length" is not 0. -*******************************************************************************/ -uint8_t *Standard_GetInterface(uint16_t Length) -{ - if (Length == 0) - { - pInformation->Ctrl_Info.Usb_wLength = - sizeof(pInformation->Current_AlternateSetting); - return 0; - } - pUser_Standard_Requests->User_GetInterface(); - return (uint8_t *)&pInformation->Current_AlternateSetting; -} - -/******************************************************************************* -* Function Name : Standard_SetInterface. -* Description : This routine is called to set the interface. -* Then each class should configure the interface them self. -* Input : None. -* Output : None. -* Return : - Return USB_SUCCESS, if the request is performed. -* - Return USB_UNSUPPORT, if the request is invalid. -*******************************************************************************/ -RESULT Standard_SetInterface(void) -{ - RESULT Re; - /*Test if the specified Interface and Alternate Setting are supported by - the application Firmware*/ - Re = (*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, pInformation->USBwValue0); - - if (pInformation->Current_Configuration != 0) - { - if ((Re != USB_SUCCESS) || (pInformation->USBwIndex1 != 0) - || (pInformation->USBwValue1 != 0)) - { - return USB_UNSUPPORT; - } - else if (Re == USB_SUCCESS) - { - pUser_Standard_Requests->User_SetInterface(); - pInformation->Current_Interface = pInformation->USBwIndex0; - pInformation->Current_AlternateSetting = pInformation->USBwValue0; - return USB_SUCCESS; - } - - } - - return USB_UNSUPPORT; -} - -/******************************************************************************* -* Function Name : Standard_GetStatus. -* Description : Copy the device request data to "StatusInfo buffer". -* Input : - Length - How many bytes are needed. -* Output : None. -* Return : Return 0, if the request is at end of data block, -* or is invalid when "Length" is 0. -*******************************************************************************/ -uint8_t *Standard_GetStatus(uint16_t Length) -{ - if (Length == 0) - { - pInformation->Ctrl_Info.Usb_wLength = 2; - return 0; - } - - /* Reset Status Information */ - StatusInfo.w = 0; - - if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) - { - /*Get Device Status */ - uint8_t Feature = pInformation->Current_Feature; - - /* Remote Wakeup enabled */ - if (ValBit(Feature, 5)) - { - SetBit(StatusInfo0, 1); - } - else - { - ClrBit(StatusInfo0, 1); - } - - /* Bus-powered */ - if (ValBit(Feature, 6)) - { - SetBit(StatusInfo0, 0); - } - else /* Self-powered */ - { - ClrBit(StatusInfo0, 0); - } - } - /*Interface Status*/ - else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) - { - return (uint8_t *)&StatusInfo; - } - /*Get EndPoint Status*/ - else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) - { - uint8_t Related_Endpoint; - uint8_t wIndex0 = pInformation->USBwIndex0; - - Related_Endpoint = (wIndex0 & 0x0f); - if (ValBit(wIndex0, 7)) - { - /* IN endpoint */ - if (_GetTxStallStatus(Related_Endpoint)) - { - SetBit(StatusInfo0, 0); /* IN Endpoint stalled */ - } - } - else - { - /* OUT endpoint */ - if (_GetRxStallStatus(Related_Endpoint)) - { - SetBit(StatusInfo0, 0); /* OUT Endpoint stalled */ - } - } - - } - else - { - return NULL; - } - pUser_Standard_Requests->User_GetStatus(); - return (uint8_t *)&StatusInfo; -} - -/******************************************************************************* -* Function Name : Standard_ClearFeature. -* Description : Clear or disable a specific feature. -* Input : None. -* Output : None. -* Return : - Return USB_SUCCESS, if the request is performed. -* - Return USB_UNSUPPORT, if the request is invalid. -*******************************************************************************/ -RESULT Standard_ClearFeature(void) -{ - uint32_t Type_Rec = Type_Recipient; - uint32_t Status; - - - if (Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT)) - {/*Device Clear Feature*/ - ClrBit(pInformation->Current_Feature, 5); - return USB_SUCCESS; - } - else if (Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) - {/*EndPoint Clear Feature*/ - DEVICE* pDev; - uint32_t Related_Endpoint; - uint32_t wIndex0; - uint32_t rEP; - - if ((pInformation->USBwValue != ENDPOINT_STALL) - || (pInformation->USBwIndex1 != 0)) - { - return USB_UNSUPPORT; - } - - pDev = &Device_Table; - wIndex0 = pInformation->USBwIndex0; - rEP = wIndex0 & ~0x80; - Related_Endpoint = ENDP0 + rEP; - - if (ValBit(pInformation->USBwIndex0, 7)) - { - /*Get Status of endpoint & stall the request if the related_ENdpoint - is Disabled*/ - Status = _GetEPTxStatus(Related_Endpoint); - } - else - { - Status = _GetEPRxStatus(Related_Endpoint); - } - - if ((rEP >= pDev->Total_Endpoint) || (Status == 0) - || (pInformation->Current_Configuration == 0)) - { - return USB_UNSUPPORT; - } - - - if (wIndex0 & 0x80) - { - /* IN endpoint */ - if (_GetTxStallStatus(Related_Endpoint )) - { - #ifndef STM32F10X_CL - ClearDTOG_TX(Related_Endpoint); - #endif /* STM32F10X_CL */ - SetEPTxStatus(Related_Endpoint, EP_TX_VALID); - } - } - else - { - /* OUT endpoint */ - if (_GetRxStallStatus(Related_Endpoint)) - { - if (Related_Endpoint == ENDP0) - { - /* After clear the STALL, enable the default endpoint receiver */ - SetEPRxCount(Related_Endpoint, Device_Property.MaxPacketSize); - _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); - } - else - { - #ifndef STM32F10X_CL - ClearDTOG_RX(Related_Endpoint); - #endif /* STM32F10X_CL */ - _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); - } - } - } - pUser_Standard_Requests->User_ClearFeature(); - return USB_SUCCESS; - } - - return USB_UNSUPPORT; -} - -/******************************************************************************* -* Function Name : Standard_SetEndPointFeature -* Description : Set or enable a specific feature of EndPoint -* Input : None. -* Output : None. -* Return : - Return USB_SUCCESS, if the request is performed. -* - Return USB_UNSUPPORT, if the request is invalid. -*******************************************************************************/ -RESULT Standard_SetEndPointFeature(void) -{ - uint32_t wIndex0; - uint32_t Related_Endpoint; - uint32_t rEP; - uint32_t Status; - - wIndex0 = pInformation->USBwIndex0; - rEP = wIndex0 & ~0x80; - Related_Endpoint = ENDP0 + rEP; - - if (ValBit(pInformation->USBwIndex0, 7)) - { - /* get Status of endpoint & stall the request if the related_ENdpoint - is Disabled*/ - Status = _GetEPTxStatus(Related_Endpoint); - } - else - { - Status = _GetEPRxStatus(Related_Endpoint); - } - - if (Related_Endpoint >= Device_Table.Total_Endpoint - || pInformation->USBwValue != 0 || Status == 0 - || pInformation->Current_Configuration == 0) - { - return USB_UNSUPPORT; - } - else - { - if (wIndex0 & 0x80) - { - /* IN endpoint */ - _SetEPTxStatus(Related_Endpoint, EP_TX_STALL); - } - - else - { - /* OUT endpoint */ - _SetEPRxStatus(Related_Endpoint, EP_RX_STALL); - } - } - pUser_Standard_Requests->User_SetEndPointFeature(); - return USB_SUCCESS; -} - -/******************************************************************************* -* Function Name : Standard_SetDeviceFeature. -* Description : Set or enable a specific feature of Device. -* Input : None. -* Output : None. -* Return : - Return USB_SUCCESS, if the request is performed. -* - Return USB_UNSUPPORT, if the request is invalid. -*******************************************************************************/ -RESULT Standard_SetDeviceFeature(void) -{ - SetBit(pInformation->Current_Feature, 5); - pUser_Standard_Requests->User_SetDeviceFeature(); - return USB_SUCCESS; -} - -/******************************************************************************* -* Function Name : Standard_GetDescriptorData. -* Description : Standard_GetDescriptorData is used for descriptors transfer. -* : This routine is used for the descriptors resident in Flash -* or RAM -* pDesc can be in either Flash or RAM -* The purpose of this routine is to have a versatile way to -* response descriptors request. It allows user to generate -* certain descriptors with software or read descriptors from -* external storage part by part. -* Input : - Length - Length of the data in this transfer. -* - pDesc - A pointer points to descriptor struct. -* The structure gives the initial address of the descriptor and -* its original size. -* Output : None. -* Return : Address of a part of the descriptor pointed by the Usb_ -* wOffset The buffer pointed by this address contains at least -* Length bytes. -*******************************************************************************/ -uint8_t *Standard_GetDescriptorData(uint16_t Length, ONE_DESCRIPTOR *pDesc) -{ - uint32_t wOffset; - - wOffset = pInformation->Ctrl_Info.Usb_wOffset; - if (Length == 0) - { - pInformation->Ctrl_Info.Usb_wLength = pDesc->Descriptor_Size - wOffset; - return 0; - } - - return pDesc->Descriptor + wOffset; -} - -/******************************************************************************* -* Function Name : DataStageOut. -* Description : Data stage of a Control Write Transfer. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void DataStageOut(void) -{ - ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; - uint32_t save_rLength; - - save_rLength = pEPinfo->Usb_rLength; - - if (pEPinfo->CopyData && save_rLength) - { - uint8_t *Buffer; - uint32_t Length; - - Length = pEPinfo->PacketSize; - if (Length > save_rLength) - { - Length = save_rLength; - } - - Buffer = (*pEPinfo->CopyData)(Length); - pEPinfo->Usb_rLength -= Length; - pEPinfo->Usb_rOffset += Length; - - #ifdef STM32F10X_CL - OTGD_FS_PCD_EP_Read(ENDP0, Buffer, Length); - #else - PMAToUserBufferCopy(Buffer, GetEPRxAddr(ENDP0), Length); - #endif /* STM32F10X_CL */ - } - - if (pEPinfo->Usb_rLength != 0) - { - vSetEPRxStatus(EP_RX_VALID);/* re-enable for next data reception */ - SetEPTxCount(ENDP0, 0); - vSetEPTxStatus(EP_TX_VALID);/* Expect the host to abort the data OUT stage */ - } - /* Set the next State*/ - if (pEPinfo->Usb_rLength >= pEPinfo->PacketSize) - { - pInformation->ControlState = OUT_DATA; - } - else - { - if (pEPinfo->Usb_rLength > 0) - { - pInformation->ControlState = LAST_OUT_DATA; - } - else if (pEPinfo->Usb_rLength == 0) - { - pInformation->ControlState = WAIT_STATUS_IN; - USB_StatusIn(); - } - } -} - -/******************************************************************************* -* Function Name : DataStageIn. -* Description : Data stage of a Control Read Transfer. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void DataStageIn(void) -{ - ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; - uint32_t save_wLength = pEPinfo->Usb_wLength; - uint32_t ControlState = pInformation->ControlState; - - uint8_t *DataBuffer; - uint32_t Length; - - if ((save_wLength == 0) && (ControlState == LAST_IN_DATA)) - { - if(Data_Mul_MaxPacketSize == TRUE) - { - /* No more data to send and empty packet */ - Send0LengthData(); - ControlState = LAST_IN_DATA; - Data_Mul_MaxPacketSize = FALSE; - } - else - { - /* No more data to send so STALL the TX Status*/ - ControlState = WAIT_STATUS_OUT; - - #ifdef STM32F10X_CL - OTGD_FS_PCD_EP_Read (ENDP0, 0, 0); - #endif /* STM32F10X_CL */ - - #ifndef STM32F10X_CL - vSetEPTxStatus(EP_TX_STALL); - #endif /* STM32F10X_CL */ - } - - goto Expect_Status_Out; - } - - Length = pEPinfo->PacketSize; - ControlState = (save_wLength <= Length) ? LAST_IN_DATA : IN_DATA; - - if (Length > save_wLength) - { - Length = save_wLength; - } - - DataBuffer = (*pEPinfo->CopyData)(Length); - -#ifdef STM32F10X_CL - OTGD_FS_PCD_EP_Write (ENDP0, DataBuffer, Length); -#else - UserToPMABufferCopy(DataBuffer, GetEPTxAddr(ENDP0), Length); -#endif /* STM32F10X_CL */ - - SetEPTxCount(ENDP0, Length); - - pEPinfo->Usb_wLength -= Length; - pEPinfo->Usb_wOffset += Length; - vSetEPTxStatus(EP_TX_VALID); - - USB_StatusOut();/* Expect the host to abort the data IN stage */ - -Expect_Status_Out: - pInformation->ControlState = ControlState; -} - -/******************************************************************************* -* Function Name : NoData_Setup0. -* Description : Proceed the processing of setup request without data stage. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void NoData_Setup0(void) -{ - RESULT Result = USB_UNSUPPORT; - uint32_t RequestNo = pInformation->USBbRequest; - uint32_t ControlState; - - if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) - { - /* Device Request*/ - /* SET_CONFIGURATION*/ - if (RequestNo == SET_CONFIGURATION) - { - Result = Standard_SetConfiguration(); - } - - /*SET ADDRESS*/ - else if (RequestNo == SET_ADDRESS) - { - if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0) - || (pInformation->USBwIndex != 0) - || (pInformation->Current_Configuration != 0)) - /* Device Address should be 127 or less*/ - { - ControlState = STALLED; - goto exit_NoData_Setup0; - } - else - { - Result = USB_SUCCESS; - - #ifdef STM32F10X_CL - SetDeviceAddress(pInformation->USBwValue0); - #endif /* STM32F10X_CL */ - } - } - /*SET FEATURE for Device*/ - else if (RequestNo == SET_FEATURE) - { - if ((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP) - && (pInformation->USBwIndex == 0) - && (ValBit(pInformation->Current_Feature, 5))) - { - Result = Standard_SetDeviceFeature(); - } - else - { - Result = USB_UNSUPPORT; - } - } - /*Clear FEATURE for Device */ - else if (RequestNo == CLEAR_FEATURE) - { - if (pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP - && pInformation->USBwIndex == 0 - && ValBit(pInformation->Current_Feature, 5)) - { - Result = Standard_ClearFeature(); - } - else - { - Result = USB_UNSUPPORT; - } - } - - } - - /* Interface Request*/ - else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) - { - /*SET INTERFACE*/ - if (RequestNo == SET_INTERFACE) - { - Result = Standard_SetInterface(); - } - } - - /* EndPoint Request*/ - else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) - { - /*CLEAR FEATURE for EndPoint*/ - if (RequestNo == CLEAR_FEATURE) - { - Result = Standard_ClearFeature(); - } - /* SET FEATURE for EndPoint*/ - else if (RequestNo == SET_FEATURE) - { - Result = Standard_SetEndPointFeature(); - } - } - else - { - Result = USB_UNSUPPORT; - } - - - if (Result != USB_SUCCESS) - { - Result = (*pProperty->Class_NoData_Setup)(RequestNo); - if (Result == USB_NOT_READY) - { - ControlState = PAUSE; - goto exit_NoData_Setup0; - } - } - - if (Result != USB_SUCCESS) - { - ControlState = STALLED; - goto exit_NoData_Setup0; - } - - ControlState = WAIT_STATUS_IN;/* After no data stage SETUP */ - - USB_StatusIn(); - -exit_NoData_Setup0: - pInformation->ControlState = ControlState; - return; -} - -/******************************************************************************* -* Function Name : Data_Setup0. -* Description : Proceed the processing of setup request with data stage. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void Data_Setup0(void) -{ - uint8_t *(*CopyRoutine)(uint16_t); - RESULT Result; - uint32_t Request_No = pInformation->USBbRequest; - - uint32_t Related_Endpoint, Reserved; - uint32_t wOffset, Status; - - - - CopyRoutine = NULL; - wOffset = 0; - - /*GET DESCRIPTOR*/ - if (Request_No == GET_DESCRIPTOR) - { - if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) - { - uint8_t wValue1 = pInformation->USBwValue1; - if (wValue1 == DEVICE_DESCRIPTOR) - { - CopyRoutine = pProperty->GetDeviceDescriptor; - } - else if (wValue1 == CONFIG_DESCRIPTOR) - { - CopyRoutine = pProperty->GetConfigDescriptor; - } - else if (wValue1 == STRING_DESCRIPTOR) - { - CopyRoutine = pProperty->GetStringDescriptor; - } /* End of GET_DESCRIPTOR */ - } - } - - /*GET STATUS*/ - else if ((Request_No == GET_STATUS) && (pInformation->USBwValue == 0) - && (pInformation->USBwLength == 0x0002) - && (pInformation->USBwIndex1 == 0)) - { - /* GET STATUS for Device*/ - if ((Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) - && (pInformation->USBwIndex == 0)) - { - CopyRoutine = Standard_GetStatus; - } - - /* GET STATUS for Interface*/ - else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) - { - if (((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS) - && (pInformation->Current_Configuration != 0)) - { - CopyRoutine = Standard_GetStatus; - } - } - - /* GET STATUS for EndPoint*/ - else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) - { - Related_Endpoint = (pInformation->USBwIndex0 & 0x0f); - Reserved = pInformation->USBwIndex0 & 0x70; - - if (ValBit(pInformation->USBwIndex0, 7)) - { - /*Get Status of endpoint & stall the request if the related_ENdpoint - is Disabled*/ - Status = _GetEPTxStatus(Related_Endpoint); - } - else - { - Status = _GetEPRxStatus(Related_Endpoint); - } - - if ((Related_Endpoint < Device_Table.Total_Endpoint) && (Reserved == 0) - && (Status != 0)) - { - CopyRoutine = Standard_GetStatus; - } - } - - } - - /*GET CONFIGURATION*/ - else if (Request_No == GET_CONFIGURATION) - { - if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) - { - CopyRoutine = Standard_GetConfiguration; - } - } - /*GET INTERFACE*/ - else if (Request_No == GET_INTERFACE) - { - if ((Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) - && (pInformation->Current_Configuration != 0) && (pInformation->USBwValue == 0) - && (pInformation->USBwIndex1 == 0) && (pInformation->USBwLength == 0x0001) - && ((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS)) - { - CopyRoutine = Standard_GetInterface; - } - - } - - if (CopyRoutine) - { - pInformation->Ctrl_Info.Usb_wOffset = wOffset; - pInformation->Ctrl_Info.CopyData = CopyRoutine; - /* sb in the original the cast to word was directly */ - /* now the cast is made step by step */ - (*CopyRoutine)(0); - Result = USB_SUCCESS; - } - else - { - Result = (*pProperty->Class_Data_Setup)(pInformation->USBbRequest); - if (Result == USB_NOT_READY) - { - pInformation->ControlState = PAUSE; - return; - } - } - - if (pInformation->Ctrl_Info.Usb_wLength == 0xFFFF) - { - /* Data is not ready, wait it */ - pInformation->ControlState = PAUSE; - return; - } - if ((Result == USB_UNSUPPORT) || (pInformation->Ctrl_Info.Usb_wLength == 0)) - { - /* Unsupported request */ - pInformation->ControlState = STALLED; - return; - } - - - if (ValBit(pInformation->USBbmRequestType, 7)) - { - /* Device ==> Host */ - __IO uint32_t wLength = pInformation->USBwLength; - - /* Restrict the data length to be the one host asks for */ - if (pInformation->Ctrl_Info.Usb_wLength > wLength) - { - pInformation->Ctrl_Info.Usb_wLength = wLength; - } - - else if (pInformation->Ctrl_Info.Usb_wLength < pInformation->USBwLength) - { - if (pInformation->Ctrl_Info.Usb_wLength < pProperty->MaxPacketSize) - { - Data_Mul_MaxPacketSize = FALSE; - } - else if ((pInformation->Ctrl_Info.Usb_wLength % pProperty->MaxPacketSize) == 0) - { - Data_Mul_MaxPacketSize = TRUE; - } - } - - pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize; - DataStageIn(); - } - else - { - pInformation->ControlState = OUT_DATA; - vSetEPRxStatus(EP_RX_VALID); /* enable for next data reception */ - } - - return; -} - -/******************************************************************************* -* Function Name : Setup0_Process -* Description : Get the device request data and dispatch to individual process. -* Input : None. -* Output : None. -* Return : Post0_Process. -*******************************************************************************/ -uint8_t Setup0_Process(void) -{ - - union - { - uint8_t* b; - uint16_t* w; - } pBuf; - -#ifdef STM32F10X_CL - USB_OTG_EP *ep; - uint16_t offset = 0; - - ep = OTGD_FS_PCD_GetOutEP(ENDP0); - pBuf.b = ep->xfer_buff; - - OTGD_FS_EP0StartXfer(ep); -#else - uint16_t offset = 1; - - pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); /* *2 for 32 bits addr */ -#endif /* STM32F10X_CL */ - - if (pInformation->ControlState != PAUSE) - { - pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */ - pInformation->USBbRequest = *pBuf.b++; /* bRequest */ - pBuf.w += offset; /* word not accessed because of 32 bits addressing */ - pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */ - pBuf.w += offset; /* word not accessed because of 32 bits addressing */ - pInformation->USBwIndex = ByteSwap(*pBuf.w++); /* wIndex */ - pBuf.w += offset; /* word not accessed because of 32 bits addressing */ - pInformation->USBwLength = *pBuf.w; /* wLength */ - } - - pInformation->ControlState = SETTING_UP; - if (pInformation->USBwLength == 0) - { - /* Setup with no data stage */ - NoData_Setup0(); - } - else - { - /* Setup with data stage */ - Data_Setup0(); - } - return Post0_Process(); -} - -/******************************************************************************* -* Function Name : In0_Process -* Description : Process the IN token on all default endpoint. -* Input : None. -* Output : None. -* Return : Post0_Process. -*******************************************************************************/ -uint8_t In0_Process(void) -{ - uint32_t ControlState = pInformation->ControlState; - - if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) - { - DataStageIn(); - /* ControlState may be changed outside the function */ - ControlState = pInformation->ControlState; - } - - else if (ControlState == WAIT_STATUS_IN) - { - if ((pInformation->USBbRequest == SET_ADDRESS) && - (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))) - { - SetDeviceAddress(pInformation->USBwValue0); - pUser_Standard_Requests->User_SetDeviceAddress(); - } - (*pProperty->Process_Status_IN)(); - ControlState = STALLED; - } - - else - { - ControlState = STALLED; - } - - pInformation->ControlState = ControlState; - - return Post0_Process(); -} - -/******************************************************************************* -* Function Name : Out0_Process -* Description : Process the OUT token on all default endpoint. -* Input : None. -* Output : None. -* Return : Post0_Process. -*******************************************************************************/ -uint8_t Out0_Process(void) -{ - uint32_t ControlState = pInformation->ControlState; - - if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) - { - /* host aborts the transfer before finish */ - ControlState = STALLED; - } - else if ((ControlState == OUT_DATA) || (ControlState == LAST_OUT_DATA)) - { - DataStageOut(); - ControlState = pInformation->ControlState; /* may be changed outside the function */ - } - - else if (ControlState == WAIT_STATUS_OUT) - { - (*pProperty->Process_Status_OUT)(); - #ifndef STM32F10X_CL - ControlState = STALLED; - #endif /* STM32F10X_CL */ - } - - - /* Unexpect state, STALL the endpoint */ - else - { - ControlState = STALLED; - } - - pInformation->ControlState = ControlState; - - return Post0_Process(); -} - -/******************************************************************************* -* Function Name : Post0_Process -* Description : Stall the Endpoint 0 in case of error. -* Input : None. -* Output : None. -* Return : - 0 if the control State is in PAUSE -* - 1 if not. -*******************************************************************************/ -uint8_t Post0_Process(void) -{ -#ifdef STM32F10X_CL - USB_OTG_EP *ep; -#endif /* STM32F10X_CL */ - - SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); - - if (pInformation->ControlState == STALLED) - { - vSetEPRxStatus(EP_RX_STALL); - vSetEPTxStatus(EP_TX_STALL); - } - -#ifdef STM32F10X_CL - else if ((pInformation->ControlState == OUT_DATA) || - (pInformation->ControlState == WAIT_STATUS_OUT)) - { - ep = OTGD_FS_PCD_GetInEP(0); - ep->is_in = 0; - OTGD_FS_EP0StartXfer(ep); - - vSetEPTxStatus(EP_TX_VALID); - } - - else if ((pInformation->ControlState == IN_DATA) || - (pInformation->ControlState == WAIT_STATUS_IN)) - { - ep = OTGD_FS_PCD_GetInEP(0); - ep->is_in = 1; - OTGD_FS_EP0StartXfer(ep); - } -#endif /* STM32F10X_CL */ - - return (pInformation->ControlState == PAUSE); -} - -/******************************************************************************* -* Function Name : SetDeviceAddress. -* Description : Set the device and all the used Endpoints addresses. -* Input : - Val: device adress. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetDeviceAddress(uint8_t Val) -{ -#ifdef STM32F10X_CL - OTGD_FS_PCD_EP_SetAddress ((uint8_t)Val); -#else - uint32_t i; - uint32_t nEP = Device_Table.Total_Endpoint; - - /* set address in every used endpoint */ - for (i = 0; i < nEP; i++) - { - _SetEPAddress((uint8_t)i, (uint8_t)i); - } /* for */ - _SetDADDR(Val | DADDR_EF); /* set device address and enable function */ -#endif /* STM32F10X_CL */ -} - -/******************************************************************************* -* Function Name : NOP_Process -* Description : No operation function. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void NOP_Process(void) -{ -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_init.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_init.c deleted file mode 100644 index e7a250978d..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_init.c +++ /dev/null @@ -1,63 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_init.c -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Initialization routines & global variables -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_lib.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* The number of current endpoint, it will be used to specify an endpoint */ - uint8_t EPindex; -/* The number of current device, it is an index to the Device_Table */ -/* uint8_t Device_no; */ -/* Points to the DEVICE_INFO structure of current device */ -/* The purpose of this register is to speed up the execution */ -DEVICE_INFO *pInformation; -/* Points to the DEVICE_PROP structure of current device */ -/* The purpose of this register is to speed up the execution */ -DEVICE_PROP *pProperty; -/* Temporary save the state of Rx & Tx status. */ -/* Whenever the Rx or Tx state is changed, its value is saved */ -/* in this variable first and will be set to the EPRB or EPRA */ -/* at the end of interrupt process */ -uint16_t SaveState ; -uint16_t wInterrupt_Mask; -DEVICE_INFO Device_Info; -USER_STANDARD_REQUESTS *pUser_Standard_Requests; - -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : USB_Init -* Description : USB system initialization -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void USB_Init(void) -{ - pInformation = &Device_Info; - pInformation->ControlState = 2; - pProperty = &Device_Property; - pUser_Standard_Requests = &User_Standard_Requests; - /* Initialize devices one by one */ - pProperty->Init(); -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_int.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_int.c deleted file mode 100644 index 9cf001d975..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_int.c +++ /dev/null @@ -1,188 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_int.c -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Endpoint CTR (Low and High) interrupt's service routines -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -#ifndef STM32F10X_CL - -/* Includes ------------------------------------------------------------------*/ -#include "usb_lib.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -__IO uint16_t SaveRState; -__IO uint16_t SaveTState; - -/* Extern variables ----------------------------------------------------------*/ -extern void (*pEpInt_IN[7])(void); /* Handles IN interrupts */ -extern void (*pEpInt_OUT[7])(void); /* Handles OUT interrupts */ - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : CTR_LP. -* Description : Low priority Endpoint Correct Transfer interrupt's service -* routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void CTR_LP(void) -{ - __IO uint16_t wEPVal = 0; - /* stay in loop while pending ints */ - while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) - { - /* extract highest priority endpoint number */ - EPindex = (uint8_t)(wIstr & ISTR_EP_ID); - if (EPindex == 0) - { - /* Decode and service control endpoint interrupt */ - /* calling related service routine */ - /* (Setup0_Process, In0_Process, Out0_Process) */ - - /* save RX & TX status */ - /* and set both to NAK */ - - - SaveRState = _GetENDPOINT(ENDP0); - SaveTState = SaveRState & EPTX_STAT; - SaveRState &= EPRX_STAT; - - _SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK); - - /* DIR bit = origin of the interrupt */ - - if ((wIstr & ISTR_DIR) == 0) - { - /* DIR = 0 */ - - /* DIR = 0 => IN int */ - /* DIR = 0 implies that (EP_CTR_TX = 1) always */ - - - _ClearEP_CTR_TX(ENDP0); - In0_Process(); - - /* before terminate set Tx & Rx status */ - - _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); - return; - } - else - { - /* DIR = 1 */ - - /* DIR = 1 & CTR_RX => SETUP or OUT int */ - /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */ - - wEPVal = _GetENDPOINT(ENDP0); - - if ((wEPVal &EP_SETUP) != 0) - { - _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */ - Setup0_Process(); - /* before terminate set Tx & Rx status */ - - _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); - return; - } - - else if ((wEPVal & EP_CTR_RX) != 0) - { - _ClearEP_CTR_RX(ENDP0); - Out0_Process(); - /* before terminate set Tx & Rx status */ - - _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); - return; - } - } - }/* if(EPindex == 0) */ - else - { - /* Decode and service non control endpoints interrupt */ - - /* process related endpoint register */ - wEPVal = _GetENDPOINT(EPindex); - if ((wEPVal & EP_CTR_RX) != 0) - { - /* clear int flag */ - _ClearEP_CTR_RX(EPindex); - - /* call OUT service function */ - (*pEpInt_OUT[EPindex-1])(); - - } /* if((wEPVal & EP_CTR_RX) */ - - if ((wEPVal & EP_CTR_TX) != 0) - { - /* clear int flag */ - _ClearEP_CTR_TX(EPindex); - - /* call IN service function */ - (*pEpInt_IN[EPindex-1])(); - } /* if((wEPVal & EP_CTR_TX) != 0) */ - - }/* if(EPindex == 0) else */ - - }/* while(...) */ -} - -/******************************************************************************* -* Function Name : CTR_HP. -* Description : High Priority Endpoint Correct Transfer interrupt's service -* routine. -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -void CTR_HP(void) -{ - uint32_t wEPVal = 0; - - while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) - { - _SetISTR((uint16_t)CLR_CTR); /* clear CTR flag */ - /* extract highest priority endpoint number */ - EPindex = (uint8_t)(wIstr & ISTR_EP_ID); - /* process related endpoint register */ - wEPVal = _GetENDPOINT(EPindex); - if ((wEPVal & EP_CTR_RX) != 0) - { - /* clear int flag */ - _ClearEP_CTR_RX(EPindex); - - /* call OUT service function */ - (*pEpInt_OUT[EPindex-1])(); - - } /* if((wEPVal & EP_CTR_RX) */ - else if ((wEPVal & EP_CTR_TX) != 0) - { - /* clear int flag */ - _ClearEP_CTR_TX(EPindex); - - /* call IN service function */ - (*pEpInt_IN[EPindex-1])(); - - - } /* if((wEPVal & EP_CTR_TX) != 0) */ - - }/* while(...) */ -} - -#endif /* STM32F10X_CL */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c deleted file mode 100644 index 5a03910a07..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c +++ /dev/null @@ -1,75 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_mem.c -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Utility functions for memory transfers to/from PMA -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -#ifndef STM32F10X_CL - -/* Includes ------------------------------------------------------------------*/ -#include "usb_lib.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/******************************************************************************* -* Function Name : UserToPMABufferCopy -* Description : Copy a buffer from user memory area to packet memory area (PMA) -* Input : - pbUsrBuf: pointer to user memory area. -* - wPMABufAddr: address into PMA. -* - wNBytes: no. of bytes to be copied. -* Output : None. -* Return : None . -*******************************************************************************/ -void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) -{ - uint32_t n = (wNBytes + 1) >> 1; /* n = (wNBytes + 1) / 2 */ - uint32_t i, temp1, temp2; - uint16_t *pdwVal; - pdwVal = (uint16_t *)(wPMABufAddr * 2 + PMAAddr); - for (i = n; i != 0; i--) - { - temp1 = (uint16_t) * pbUsrBuf; - pbUsrBuf++; - temp2 = temp1 | (uint16_t) * pbUsrBuf << 8; - *pdwVal++ = temp2; - pdwVal++; - pbUsrBuf++; - } -} -/******************************************************************************* -* Function Name : PMAToUserBufferCopy -* Description : Copy a buffer from user memory area to packet memory area (PMA) -* Input : - pbUsrBuf = pointer to user memory area. -* - wPMABufAddr = address into PMA. -* - wNBytes = no. of bytes to be copied. -* Output : None. -* Return : None. -*******************************************************************************/ -void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) -{ - uint32_t n = (wNBytes + 1) >> 1;/* /2*/ - uint32_t i; - uint32_t *pdwVal; - pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr); - for (i = n; i != 0; i--) - { - *(uint16_t*)pbUsrBuf++ = *pdwVal++; - pbUsrBuf++; - } -} - -#endif /* STM32F10X_CL */ -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_regs.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_regs.c deleted file mode 100644 index 38e8bbb1aa..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_regs.c +++ /dev/null @@ -1,750 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_regs.c -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Interface functions to USB cell registers -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -#ifndef STM32F10X_CL - -/* Includes ------------------------------------------------------------------*/ -#include "usb_lib.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : SetCNTR. -* Description : Set the CNTR register value. -* Input : wRegValue: new register value. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetCNTR(uint16_t wRegValue) -{ - _SetCNTR(wRegValue); -} - -/******************************************************************************* -* Function Name : GetCNTR. -* Description : returns the CNTR register value. -* Input : None. -* Output : None. -* Return : CNTR register Value. -*******************************************************************************/ -uint16_t GetCNTR(void) -{ - return(_GetCNTR()); -} - -/******************************************************************************* -* Function Name : SetISTR. -* Description : Set the ISTR register value. -* Input : wRegValue: new register value. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetISTR(uint16_t wRegValue) -{ - _SetISTR(wRegValue); -} - -/******************************************************************************* -* Function Name : GetISTR -* Description : Returns the ISTR register value. -* Input : None. -* Output : None. -* Return : ISTR register Value -*******************************************************************************/ -uint16_t GetISTR(void) -{ - return(_GetISTR()); -} - -/******************************************************************************* -* Function Name : GetFNR -* Description : Returns the FNR register value. -* Input : None. -* Output : None. -* Return : FNR register Value -*******************************************************************************/ -uint16_t GetFNR(void) -{ - return(_GetFNR()); -} - -/******************************************************************************* -* Function Name : SetDADDR -* Description : Set the DADDR register value. -* Input : wRegValue: new register value. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetDADDR(uint16_t wRegValue) -{ - _SetDADDR(wRegValue); -} - -/******************************************************************************* -* Function Name : GetDADDR -* Description : Returns the DADDR register value. -* Input : None. -* Output : None. -* Return : DADDR register Value -*******************************************************************************/ -uint16_t GetDADDR(void) -{ - return(_GetDADDR()); -} - -/******************************************************************************* -* Function Name : SetBTABLE -* Description : Set the BTABLE. -* Input : wRegValue: New register value. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetBTABLE(uint16_t wRegValue) -{ - _SetBTABLE(wRegValue); -} - -/******************************************************************************* -* Function Name : GetBTABLE. -* Description : Returns the BTABLE register value. -* Input : None. -* Output : None. -* Return : BTABLE address. -*******************************************************************************/ -uint16_t GetBTABLE(void) -{ - return(_GetBTABLE()); -} - -/******************************************************************************* -* Function Name : SetENDPOINT -* Description : Setthe Endpoint register value. -* Input : bEpNum: Endpoint Number. -* wRegValue. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetENDPOINT(uint8_t bEpNum, uint16_t wRegValue) -{ - _SetENDPOINT(bEpNum, wRegValue); -} - -/******************************************************************************* -* Function Name : GetENDPOINT -* Description : Return the Endpoint register value. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint register value. -*******************************************************************************/ -uint16_t GetENDPOINT(uint8_t bEpNum) -{ - return(_GetENDPOINT(bEpNum)); -} - -/******************************************************************************* -* Function Name : SetEPType -* Description : sets the type in the endpoint register. -* Input : bEpNum: Endpoint Number. -* wType: type definition. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPType(uint8_t bEpNum, uint16_t wType) -{ - _SetEPType(bEpNum, wType); -} - -/******************************************************************************* -* Function Name : GetEPType -* Description : Returns the endpoint type. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint Type -*******************************************************************************/ -uint16_t GetEPType(uint8_t bEpNum) -{ - return(_GetEPType(bEpNum)); -} - -/******************************************************************************* -* Function Name : SetEPTxStatus -* Description : Set the status of Tx endpoint. -* Input : bEpNum: Endpoint Number. -* wState: new state. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPTxStatus(uint8_t bEpNum, uint16_t wState) -{ - _SetEPTxStatus(bEpNum, wState); -} - -/******************************************************************************* -* Function Name : SetEPRxStatus -* Description : Set the status of Rx endpoint. -* Input : bEpNum: Endpoint Number. -* wState: new state. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPRxStatus(uint8_t bEpNum, uint16_t wState) -{ - _SetEPRxStatus(bEpNum, wState); -} - -/******************************************************************************* -* Function Name : SetDouBleBuffEPStall -* Description : sets the status for Double Buffer Endpoint to STALL -* Input : bEpNum: Endpoint Number. -* bDir: Endpoint direction. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetDouBleBuffEPStall(uint8_t bEpNum, uint8_t bDir) -{ - uint16_t Endpoint_DTOG_Status; - Endpoint_DTOG_Status = GetENDPOINT(bEpNum); - if (bDir == EP_DBUF_OUT) - { /* OUT double buffered endpoint */ - _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPRX_DTOG1); - } - else if (bDir == EP_DBUF_IN) - { /* IN double buffered endpoint */ - _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPTX_DTOG1); - } -} - -/******************************************************************************* -* Function Name : GetEPTxStatus -* Description : Returns the endpoint Tx status. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint TX Status -*******************************************************************************/ -uint16_t GetEPTxStatus(uint8_t bEpNum) -{ - return(_GetEPTxStatus(bEpNum)); -} - -/******************************************************************************* -* Function Name : GetEPRxStatus -* Description : Returns the endpoint Rx status. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint RX Status -*******************************************************************************/ -uint16_t GetEPRxStatus(uint8_t bEpNum) -{ - return(_GetEPRxStatus(bEpNum)); -} - -/******************************************************************************* -* Function Name : SetEPTxValid -* Description : Valid the endpoint Tx Status. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPTxValid(uint8_t bEpNum) -{ - _SetEPTxStatus(bEpNum, EP_TX_VALID); -} - -/******************************************************************************* -* Function Name : SetEPRxValid -* Description : Valid the endpoint Rx Status. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPRxValid(uint8_t bEpNum) -{ - _SetEPRxStatus(bEpNum, EP_RX_VALID); -} - -/******************************************************************************* -* Function Name : SetEP_KIND -* Description : Clear the EP_KIND bit. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEP_KIND(uint8_t bEpNum) -{ - _SetEP_KIND(bEpNum); -} - -/******************************************************************************* -* Function Name : ClearEP_KIND -* Description : set the EP_KIND bit. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void ClearEP_KIND(uint8_t bEpNum) -{ - _ClearEP_KIND(bEpNum); -} -/******************************************************************************* -* Function Name : Clear_Status_Out -* Description : Clear the Status Out of the related Endpoint -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void Clear_Status_Out(uint8_t bEpNum) -{ - _ClearEP_KIND(bEpNum); -} -/******************************************************************************* -* Function Name : Set_Status_Out -* Description : Set the Status Out of the related Endpoint -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void Set_Status_Out(uint8_t bEpNum) -{ - _SetEP_KIND(bEpNum); -} -/******************************************************************************* -* Function Name : SetEPDoubleBuff -* Description : Enable the double buffer feature for the endpoint. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPDoubleBuff(uint8_t bEpNum) -{ - _SetEP_KIND(bEpNum); -} -/******************************************************************************* -* Function Name : ClearEPDoubleBuff -* Description : Disable the double buffer feature for the endpoint. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void ClearEPDoubleBuff(uint8_t bEpNum) -{ - _ClearEP_KIND(bEpNum); -} -/******************************************************************************* -* Function Name : GetTxStallStatus -* Description : Returns the Stall status of the Tx endpoint. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Tx Stall status. -*******************************************************************************/ -uint16_t GetTxStallStatus(uint8_t bEpNum) -{ - return(_GetTxStallStatus(bEpNum)); -} -/******************************************************************************* -* Function Name : GetRxStallStatus -* Description : Returns the Stall status of the Rx endpoint. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Rx Stall status. -*******************************************************************************/ -uint16_t GetRxStallStatus(uint8_t bEpNum) -{ - return(_GetRxStallStatus(bEpNum)); -} -/******************************************************************************* -* Function Name : ClearEP_CTR_RX -* Description : Clear the CTR_RX bit. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void ClearEP_CTR_RX(uint8_t bEpNum) -{ - _ClearEP_CTR_RX(bEpNum); -} -/******************************************************************************* -* Function Name : ClearEP_CTR_TX -* Description : Clear the CTR_TX bit. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void ClearEP_CTR_TX(uint8_t bEpNum) -{ - _ClearEP_CTR_TX(bEpNum); -} -/******************************************************************************* -* Function Name : ToggleDTOG_RX -* Description : Toggle the DTOG_RX bit. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void ToggleDTOG_RX(uint8_t bEpNum) -{ - _ToggleDTOG_RX(bEpNum); -} -/******************************************************************************* -* Function Name : ToggleDTOG_TX -* Description : Toggle the DTOG_TX bit. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void ToggleDTOG_TX(uint8_t bEpNum) -{ - _ToggleDTOG_TX(bEpNum); -} -/******************************************************************************* -* Function Name : ClearDTOG_RX. -* Description : Clear the DTOG_RX bit. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void ClearDTOG_RX(uint8_t bEpNum) -{ - _ClearDTOG_RX(bEpNum); -} -/******************************************************************************* -* Function Name : ClearDTOG_TX. -* Description : Clear the DTOG_TX bit. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -void ClearDTOG_TX(uint8_t bEpNum) -{ - _ClearDTOG_TX(bEpNum); -} -/******************************************************************************* -* Function Name : SetEPAddress -* Description : Set the endpoint address. -* Input : bEpNum: Endpoint Number. -* bAddr: New endpoint address. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPAddress(uint8_t bEpNum, uint8_t bAddr) -{ - _SetEPAddress(bEpNum, bAddr); -} -/******************************************************************************* -* Function Name : GetEPAddress -* Description : Get the endpoint address. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint address. -*******************************************************************************/ -uint8_t GetEPAddress(uint8_t bEpNum) -{ - return(_GetEPAddress(bEpNum)); -} -/******************************************************************************* -* Function Name : SetEPTxAddr -* Description : Set the endpoint Tx buffer address. -* Input : bEpNum: Endpoint Number. -* wAddr: new address. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPTxAddr(uint8_t bEpNum, uint16_t wAddr) -{ - _SetEPTxAddr(bEpNum, wAddr); -} -/******************************************************************************* -* Function Name : SetEPRxAddr -* Description : Set the endpoint Rx buffer address. -* Input : bEpNum: Endpoint Number. -* wAddr: new address. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPRxAddr(uint8_t bEpNum, uint16_t wAddr) -{ - _SetEPRxAddr(bEpNum, wAddr); -} -/******************************************************************************* -* Function Name : GetEPTxAddr -* Description : Returns the endpoint Tx buffer address. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Rx buffer address. -*******************************************************************************/ -uint16_t GetEPTxAddr(uint8_t bEpNum) -{ - return(_GetEPTxAddr(bEpNum)); -} -/******************************************************************************* -* Function Name : GetEPRxAddr. -* Description : Returns the endpoint Rx buffer address. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Rx buffer address. -*******************************************************************************/ -uint16_t GetEPRxAddr(uint8_t bEpNum) -{ - return(_GetEPRxAddr(bEpNum)); -} -/******************************************************************************* -* Function Name : SetEPTxCount. -* Description : Set the Tx count. -* Input : bEpNum: Endpoint Number. -* wCount: new count value. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPTxCount(uint8_t bEpNum, uint16_t wCount) -{ - _SetEPTxCount(bEpNum, wCount); -} -/******************************************************************************* -* Function Name : SetEPCountRxReg. -* Description : Set the Count Rx Register value. -* Input : *pdwReg: point to the register. -* wCount: the new register value. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPCountRxReg(uint32_t *pdwReg, uint16_t wCount) -{ - _SetEPCountRxReg(dwReg, wCount); -} -/******************************************************************************* -* Function Name : SetEPRxCount -* Description : Set the Rx count. -* Input : bEpNum: Endpoint Number. -* wCount: the new count value. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPRxCount(uint8_t bEpNum, uint16_t wCount) -{ - _SetEPRxCount(bEpNum, wCount); -} -/******************************************************************************* -* Function Name : GetEPTxCount -* Description : Get the Tx count. -* Input : bEpNum: Endpoint Number. -* Output : None -* Return : Tx count value. -*******************************************************************************/ -uint16_t GetEPTxCount(uint8_t bEpNum) -{ - return(_GetEPTxCount(bEpNum)); -} -/******************************************************************************* -* Function Name : GetEPRxCount -* Description : Get the Rx count. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Rx count value. -*******************************************************************************/ -uint16_t GetEPRxCount(uint8_t bEpNum) -{ - return(_GetEPRxCount(bEpNum)); -} -/******************************************************************************* -* Function Name : SetEPDblBuffAddr -* Description : Set the addresses of the buffer 0 and 1. -* Input : bEpNum: Endpoint Number. -* wBuf0Addr: new address of buffer 0. -* wBuf1Addr: new address of buffer 1. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPDblBuffAddr(uint8_t bEpNum, uint16_t wBuf0Addr, uint16_t wBuf1Addr) -{ - _SetEPDblBuffAddr(bEpNum, wBuf0Addr, wBuf1Addr); -} -/******************************************************************************* -* Function Name : SetEPDblBuf0Addr -* Description : Set the Buffer 1 address. -* Input : bEpNum: Endpoint Number -* wBuf0Addr: new address. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPDblBuf0Addr(uint8_t bEpNum, uint16_t wBuf0Addr) -{ - _SetEPDblBuf0Addr(bEpNum, wBuf0Addr); -} -/******************************************************************************* -* Function Name : SetEPDblBuf1Addr -* Description : Set the Buffer 1 address. -* Input : bEpNum: Endpoint Number -* wBuf1Addr: new address. -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPDblBuf1Addr(uint8_t bEpNum, uint16_t wBuf1Addr) -{ - _SetEPDblBuf1Addr(bEpNum, wBuf1Addr); -} -/******************************************************************************* -* Function Name : GetEPDblBuf0Addr -* Description : Returns the address of the Buffer 0. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : None. -*******************************************************************************/ -uint16_t GetEPDblBuf0Addr(uint8_t bEpNum) -{ - return(_GetEPDblBuf0Addr(bEpNum)); -} -/******************************************************************************* -* Function Name : GetEPDblBuf1Addr -* Description : Returns the address of the Buffer 1. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Address of the Buffer 1. -*******************************************************************************/ -uint16_t GetEPDblBuf1Addr(uint8_t bEpNum) -{ - return(_GetEPDblBuf1Addr(bEpNum)); -} -/******************************************************************************* -* Function Name : SetEPDblBuffCount -* Description : Set the number of bytes for a double Buffer -* endpoint. -* Input : bEpNum,bDir, wCount -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPDblBuffCount(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) -{ - _SetEPDblBuffCount(bEpNum, bDir, wCount); -} -/******************************************************************************* -* Function Name : SetEPDblBuf0Count -* Description : Set the number of bytes in the buffer 0 of a double Buffer -* endpoint. -* Input : bEpNum, bDir, wCount -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPDblBuf0Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) -{ - _SetEPDblBuf0Count(bEpNum, bDir, wCount); -} -/******************************************************************************* -* Function Name : SetEPDblBuf1Count -* Description : Set the number of bytes in the buffer 0 of a double Buffer -* endpoint. -* Input : bEpNum, bDir, wCount -* Output : None. -* Return : None. -*******************************************************************************/ -void SetEPDblBuf1Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) -{ - _SetEPDblBuf1Count(bEpNum, bDir, wCount); -} -/******************************************************************************* -* Function Name : GetEPDblBuf0Count -* Description : Returns the number of byte received in the buffer 0 of a double -* Buffer endpoint. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint Buffer 0 count -*******************************************************************************/ -uint16_t GetEPDblBuf0Count(uint8_t bEpNum) -{ - return(_GetEPDblBuf0Count(bEpNum)); -} -/******************************************************************************* -* Function Name : GetEPDblBuf1Count -* Description : Returns the number of data received in the buffer 1 of a double -* Buffer endpoint. -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : Endpoint Buffer 1 count. -*******************************************************************************/ -uint16_t GetEPDblBuf1Count(uint8_t bEpNum) -{ - return(_GetEPDblBuf1Count(bEpNum)); -} -/******************************************************************************* -* Function Name : GetEPDblBufDir -* Description : gets direction of the double buffered endpoint -* Input : bEpNum: Endpoint Number. -* Output : None. -* Return : EP_DBUF_OUT, EP_DBUF_IN, -* EP_DBUF_ERR if the endpoint counter not yet programmed. -*******************************************************************************/ -EP_DBUF_DIR GetEPDblBufDir(uint8_t bEpNum) -{ - if ((uint16_t)(*_pEPRxCount(bEpNum) & 0xFC00) != 0) - return(EP_DBUF_OUT); - else if (((uint16_t)(*_pEPTxCount(bEpNum)) & 0x03FF) != 0) - return(EP_DBUF_IN); - else - return(EP_DBUF_ERR); -} -/******************************************************************************* -* Function Name : FreeUserBuffer -* Description : free buffer used from the application realizing it to the line - toggles bit SW_BUF in the double buffered endpoint register -* Input : bEpNum, bDir -* Output : None. -* Return : None. -*******************************************************************************/ -void FreeUserBuffer(uint8_t bEpNum, uint8_t bDir) -{ - if (bDir == EP_DBUF_OUT) - { /* OUT double buffered endpoint */ - _ToggleDTOG_TX(bEpNum); - } - else if (bDir == EP_DBUF_IN) - { /* IN double buffered endpoint */ - _ToggleDTOG_RX(bEpNum); - } -} - -/******************************************************************************* -* Function Name : ToWord -* Description : merge two byte in a word. -* Input : bh: byte high, bl: bytes low. -* Output : None. -* Return : resulted word. -*******************************************************************************/ -uint16_t ToWord(uint8_t bh, uint8_t bl) -{ - uint16_t wRet; - wRet = (uint16_t)bl | ((uint16_t)bh << 8); - return(wRet); -} -/******************************************************************************* -* Function Name : ByteSwap -* Description : Swap two byte in a word. -* Input : wSwW: word to Swap. -* Output : None. -* Return : resulted word. -*******************************************************************************/ -uint16_t ByteSwap(uint16_t wSwW) -{ - uint8_t bTemp; - uint16_t wRet; - bTemp = (uint8_t)(wSwW & 0xff); - wRet = (wSwW >> 8) | ((uint16_t)bTemp << 8); - return(wRet); -} - -#endif /* STM32F10X_CL */ -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_sil.c b/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_sil.c deleted file mode 100644 index 6e7d76fdd0..0000000000 --- a/bsp/stm32_radio/Libraries/STM32_USB-FS-Device_Driver/src/usb_sil.c +++ /dev/null @@ -1,126 +0,0 @@ -/******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** -* File Name : usb_sil.c -* Author : MCD Application Team -* Version : V3.1.0 -* Date : 10/30/2009 -* Description : Simplified Interface Layer for Global Initialization and -* Endpoint Rea/Write operations. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_lib.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : USB_SIL_Init -* Description : Initialize the USB Device IP and the Endpoint 0. -* Input : None. -* Output : None. -* Return : Status. -*******************************************************************************/ -uint32_t USB_SIL_Init(void) -{ -#ifndef STM32F10X_CL - - /* USB interrupts initialization */ - /* clear pending interrupts */ - _SetISTR(0); - wInterrupt_Mask = IMR_MSK; - /* set interrupts mask */ - _SetCNTR(wInterrupt_Mask); - -#else - - /* Perform OTG Device initialization procedure (including EP0 init) */ - OTG_DEV_Init(); - -#endif /* STM32F10X_CL */ - - return 0; -} - -/******************************************************************************* -* Function Name : USB_SIL_Write -* Description : Write a buffer of data to a selected endpoint. -* Input : - bEpAddr: The address of the non control endpoint. -* - pBufferPointer: The pointer to the buffer of data to be written -* to the endpoint. -* - wBufferSize: Number of data to be written (in bytes). -* Output : None. -* Return : Status. -*******************************************************************************/ -uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize) -{ -#ifndef STM32F10X_CL - - /* Use the memory interface function to write to the selected endpoint */ - UserToPMABufferCopy(pBufferPointer, GetEPTxAddr(bEpAddr & 0x7F), wBufferSize); - - /* Update the data length in the control register */ - SetEPTxCount((bEpAddr & 0x7F), wBufferSize); - -#else - - /* Use the PCD interface layer function to write to the selected endpoint */ - OTGD_FS_PCD_EP_Write (bEpAddr, pBufferPointer, wBufferSize); - -#endif /* STM32F10X_CL */ - - return 0; -} - -/******************************************************************************* -* Function Name : USB_SIL_Read -* Description : Write a buffer of data to a selected endpoint. -* Input : - bEpAddr: The address of the non control endpoint. -* - pBufferPointer: The pointer to which will be saved the -* received data buffer. -* Output : None. -* Return : Number of received data (in Bytes). -*******************************************************************************/ -uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer) -{ - uint32_t DataLength = 0; - -#ifndef STM32F10X_CL - - /* Get the number of received data on the selected Endpoint */ - DataLength = GetEPRxCount(bEpAddr & 0x7F); - - /* Use the memory interface function to write to the selected endpoint */ - PMAToUserBufferCopy(pBufferPointer, GetEPRxAddr(bEpAddr & 0x7F), DataLength); - -#else - - USB_OTG_EP *ep; - - /* Get the structure pointer of the selected Endpoint */ - ep = OTGD_FS_PCD_GetOutEP(bEpAddr); - - /* Get the number of received data */ - DataLength = ep->xfer_len; - - /* Use the PCD interface layer function to read the selected endpoint */ - OTGD_FS_PCD_EP_Read (bEpAddr, pBufferPointer, DataLength); - -#endif /* STM32F10X_CL */ - - /* Return the number of received data */ - return DataLength; -} - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/application.c b/bsp/stm32_radio/application.c deleted file mode 100644 index 65d9cb7445..0000000000 --- a/bsp/stm32_radio/application.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * File : application.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-01-05 Bernard the first version - */ - -/** - * @addtogroup STM32 - */ -/*@{*/ - -#include -#include - -#include -#include "board.h" -#include "netbuffer.h" -#include "lcd.h" -#include "rtc.h" - -#ifdef RT_USING_DFS -/* dfs init */ -#include -/* dfs filesystem:ELM FatFs filesystem init */ -#include -/* dfs Filesystem APIs */ -#include -#endif - -#ifdef RT_USING_LWIP -#include -#include -#include -#endif - -#ifdef RT_USING_RTGUI -extern void radio_rtgui_init(void); -#endif - -/* thread phase init */ -void rt_init_thread_entry(void *parameter) -{ - /* Filesystem Initialization */ -#ifdef RT_USING_DFS - { - /* init the device filesystem */ - dfs_init(); - - /* init the elm FAT filesystam*/ - elm_init(); - - /* mount spi flash fat as root directory */ - if (dfs_mount("spi0", "/", "elm", 0, 0) == 0) - rt_kprintf("SPI File System initialized!\n"); - else - rt_kprintf("SPI File System init failed!\n"); - - /* mount sd card fat partition 1 as SD directory */ - if (dfs_mount("sd0", "/SD", "elm", 0, 0) == 0) - rt_kprintf("File System initialized!\n"); - else - rt_kprintf("File System init failed!\n"); - } -#endif - - /* RTGUI Initialization */ -#ifdef RT_USING_RTGUI - { - extern void rt_hw_key_init(void); - - radio_rtgui_init(); - rt_hw_key_init(); - } -#endif - - /* LwIP Initialization */ -#ifdef RT_USING_LWIP - { - extern void lwip_sys_init(void); - extern void rt_hw_dm9000_init(void); - - eth_system_device_init(); - - /* register ethernetif device */ - rt_hw_dm9000_init(); - /* init all device */ - rt_device_init_all(); - - /* init lwip system */ - lwip_sys_init(); - rt_kprintf("TCP/IP initialized!\n"); - } -#endif - -#if STM32_EXT_SRAM - /* init netbuf worker */ - net_buf_init(320 * 1024); -#endif - - /* start RTC */ - rt_hw_rtc_init(); -} - -int rt_application_init() -{ - rt_thread_t init_thread; - -#if (RT_THREAD_PRIORITY_MAX == 32) - init_thread = rt_thread_create("init", - rt_init_thread_entry, RT_NULL, - 2048, 8, 20); -#else - init_thread = rt_thread_create("init", - rt_init_thread_entry, RT_NULL, - 2048, 80, 20); -#endif - if (init_thread != RT_NULL) rt_thread_startup(init_thread); - - return 0; -} - -/*@}*/ diff --git a/bsp/stm32_radio/board.c b/bsp/stm32_radio/board.c deleted file mode 100644 index 5f50ac70ff..0000000000 --- a/bsp/stm32_radio/board.c +++ /dev/null @@ -1,293 +0,0 @@ -/* - * File : board.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2009 RT-Thread Develop Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2006-08-23 Bernard first implementation - */ - -#include -#include - -#include "stm32f10x.h" -#include "board.h" - -struct rt_semaphore spi1_lock; - -/** - * @addtogroup STM32 - */ - -/*@{*/ - -/******************************************************************************* -* Function Name : NVIC_Configuration -* Description : Configures Vector Table base location. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void NVIC_Configuration(void) -{ -#ifdef VECT_TAB_RAM - /* Set the Vector Table base location at 0x20000000 */ - NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); -#else /* VECT_TAB_FLASH */ - /* Set the Vector Table base location at 0x08000000 */ - NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); -#endif - - /* - * set priority group: - * 2 bits for pre-emption priority - * 2 bits for subpriority - */ - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); -} - -extern void rt_hw_interrupt_thread_switch(void); -/** - * This is the timer interrupt service routine. - * - */ -void rt_hw_timer_handler(void) -{ - /* enter interrupt */ - rt_interrupt_enter(); - - rt_tick_increase(); - - /* leave interrupt */ - rt_interrupt_leave(); -} - -/* NAND Flash */ -#include "fsmc_nand.h" - -static void all_device_reset(void) -{ - /* RESET */ - /* DM9000A PE5 */ - /* LCD PF10 */ - /* SPI-FLASH PA3 */ - - /* CS */ - /* DM9000A FSMC_NE4 PG12 */ - /* LCD FSMC_NE2 PG9 */ - /* SPI_FLASH PA4 */ - /* CODEC PC5 */ - /* TOUCH PC4 */ - - GPIO_InitTypeDef GPIO_InitStructure; - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE - | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG,ENABLE); - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - - /* SDIO POWER */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; - GPIO_Init(GPIOC,&GPIO_InitStructure); - GPIO_SetBits(GPIOC,GPIO_Pin_6); /* SD card power down */ - - /* SPI_FLASH CS */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; - GPIO_Init(GPIOA,&GPIO_InitStructure); - GPIO_SetBits(GPIOA,GPIO_Pin_4); - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - - /* CODEC && TOUCH CS */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; - GPIO_Init(GPIOC,&GPIO_InitStructure); - GPIO_SetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5); - - /* DM9000A RESET */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; - GPIO_Init(GPIOE,&GPIO_InitStructure); - GPIO_ResetBits(GPIOE,GPIO_Pin_5); - - /* LCD RESET */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; - GPIO_Init(GPIOF,&GPIO_InitStructure); - GPIO_ResetBits(GPIOF,GPIO_Pin_10); - - /* SPI_FLASH RESET */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; - GPIO_Init(GPIOA,&GPIO_InitStructure); - GPIO_ResetBits(GPIOA,GPIO_Pin_3); - - /* FSMC GPIO configure */ - { - GPIO_InitTypeDef GPIO_InitStructure; - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF - | RCC_APB2Periph_GPIOG, ENABLE); - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - - /* - FSMC_D0 ~ FSMC_D3 - PD14 FSMC_D0 PD15 FSMC_D1 PD0 FSMC_D2 PD1 FSMC_D3 - */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_14 | GPIO_Pin_15; - GPIO_Init(GPIOD,&GPIO_InitStructure); - - /* - FSMC_D4 ~ FSMC_D12 - PE7 ~ PE15 FSMC_D4 ~ FSMC_D12 - */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 - | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; - GPIO_Init(GPIOE,&GPIO_InitStructure); - - /* FSMC_D13 ~ FSMC_D15 PD8 ~ PD10 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; - GPIO_Init(GPIOD,&GPIO_InitStructure); - - /* - FSMC_A0 ~ FSMC_A5 FSMC_A6 ~ FSMC_A9 - PF0 ~ PF5 PF12 ~ PF15 - */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 - | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; - GPIO_Init(GPIOF,&GPIO_InitStructure); - - /* FSMC_A10 ~ FSMC_A15 PG0 ~ PG5 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; - GPIO_Init(GPIOG,&GPIO_InitStructure); - - /* FSMC_A16 ~ FSMC_A18 PD11 ~ PD13 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; - GPIO_Init(GPIOD,&GPIO_InitStructure); - - /* RD-PD4 WR-PD5 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; - GPIO_Init(GPIOD,&GPIO_InitStructure); - - /* NBL0-PE0 NBL1-PE1 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; - GPIO_Init(GPIOE,&GPIO_InitStructure); - - /* NE1/NCE2 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; - GPIO_Init(GPIOD,&GPIO_InitStructure); - /* NE2 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; - GPIO_Init(GPIOG,&GPIO_InitStructure); - /* NE3 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; - GPIO_Init(GPIOG,&GPIO_InitStructure); - /* NE4 */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; - GPIO_Init(GPIOG,&GPIO_InitStructure); - } - /* FSMC GPIO configure */ - - GPIO_SetBits(GPIOE,GPIO_Pin_5); /* DM9000A */ - GPIO_SetBits(GPIOF,GPIO_Pin_10); /* LCD */ - GPIO_SetBits(GPIOA,GPIO_Pin_3); /* SPI_FLASH */ -} - -/** - * This function will initial STM32 Radio board. - */ -extern void FSMC_SRAM_Init(void); -void rt_hw_board_init() -{ - //NAND_IDTypeDef NAND_ID; - - /* Configure the system clocks */ - SystemInit(); - - all_device_reset(); - - /* NVIC Configuration */ - NVIC_Configuration(); - - /* Configure the SysTick */ - SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND ); - - /* Console Initialization*/ - rt_hw_usart_init(); - rt_console_set_device("uart1"); - - rt_kprintf("\r\n\r\nSystemInit......\r\n"); - - /* SRAM init */ - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); - FSMC_SRAM_Init(); - - /* memtest */ - { - unsigned char * p_extram = (unsigned char *)STM32_EXT_SRAM_BEGIN; - unsigned int temp; - - rt_kprintf("\r\nmem testing...."); - for(temp=0; temp<(STM32_EXT_SRAM_END-STM32_EXT_SRAM_BEGIN); temp++) - { - *p_extram++ = (unsigned char)temp; - } - - p_extram = (unsigned char *)STM32_EXT_SRAM_BEGIN; - for(temp=0; temp<(STM32_EXT_SRAM_END-STM32_EXT_SRAM_BEGIN); temp++) - { - if( *p_extram++ != (unsigned char)temp ) - { - rt_kprintf("\rmemtest fail @ %08X\r\nsystem halt!!!!!",(unsigned int)p_extram); - while(1); - } - } - rt_kprintf("\rmem test pass!!\r\n"); - }/* memtest */ - - /* SPI1 config */ - { - GPIO_InitTypeDef GPIO_InitStructure; - SPI_InitTypeDef SPI_InitStructure; - - /* Enable SPI1 Periph clock */ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA - | RCC_APB2Periph_AFIO | RCC_APB2Periph_SPI1, - ENABLE); - - /* Configure SPI1 pins: PA5-SCK, PA6-MISO and PA7-MOSI */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - /*------------------------ SPI1 configuration ------------------------*/ - SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI_Direction_1Line_Tx; - SPI_InitStructure.SPI_Mode = SPI_Mode_Master; - SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; - SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; - SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;/* 72M/64=1.125M */ - SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; - SPI_InitStructure.SPI_CRCPolynomial = 7; - - SPI_I2S_DeInit(SPI1); - SPI_Init(SPI1, &SPI_InitStructure); - - /* Enable SPI_MASTER */ - SPI_Cmd(SPI1, ENABLE); - SPI_CalculateCRC(SPI1, DISABLE); - - if (rt_sem_init(&spi1_lock, "spi1lock", 1, RT_IPC_FLAG_FIFO) != RT_EOK) - { - rt_kprintf("init spi1 lock semaphore failed\n"); - } - } - -}/* rt_hw_board_init */ - -/*@}*/ diff --git a/bsp/stm32_radio/board.h b/bsp/stm32_radio/board.h deleted file mode 100644 index bc40a0486d..0000000000 --- a/bsp/stm32_radio/board.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * File : board.h - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006, RT-Thread Develop Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-09-22 Bernard add board.h to this bsp - */ - -// <<< Use Configuration Wizard in Context Menu >>> -#ifndef __BOARD_H__ -#define __BOARD_H__ - -/* board configuration */ -// SDCard Driver <1=>SDIO sdcard <0=>SPI MMC card -// Default: 1 -#define STM32_USE_SDIO 1 - -/* whether use board external SRAM memory */ -// Use external SRAM memory on the board -// Enable External SRAM memory -#define STM32_EXT_SRAM 1 -// Begin Address of External SRAM -// Default: 0x68000000 -#define STM32_EXT_SRAM_BEGIN 0x68000000 /* the begining address of external SRAM */ -// End Address of External SRAM -// Default: 0x68080000 -#define STM32_EXT_SRAM_END 0x68080000 /* the end address of external SRAM */ -// - -// Internal SRAM memory size[Kbytes] <8-64> -// Default: 64 -#define STM32_SRAM_SIZE 64 -#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) - -// Console on USART: <0=> no console <1=>USART 1 <2=>USART 2 <3=> USART 3 -// Default: 1 -#define STM32_CONSOLE_USART 1 - -// LCD Module Version -// <1=>Version 1:fmt0371 -// <2=>Version 2:ili9320/9325 -// Default: 1 -#define LCD_VERSION 1 - -/* - * IMPORTANT NOTICE: - * CODEC_MASTER_MODE = 1 with CODEC_USE_SPI3 = 0 is unusable due to a hardware bug of STM32's SPI2. - */ -// CODEC Mode -// <0=>I2S Slave -// <1=>I2S Master -#define CODEC_MASTER_MODE 0 - -// CODEC SPI Port -// <0=>SPI2 -// <1=>SPI3 -#define CODEC_USE_SPI3 0 - -void rt_hw_board_led_on(int n); -void rt_hw_board_led_off(int n); -void rt_hw_board_init(void); - -void rt_hw_usart_init(void); -void rt_hw_sdcard_init(void); - -extern struct rt_semaphore spi1_lock; - -#endif - -// <<< Use Configuration Wizard in Context Menu >>> diff --git a/bsp/stm32_radio/codec.c b/bsp/stm32_radio/codec.c deleted file mode 100644 index 74cc419842..0000000000 --- a/bsp/stm32_radio/codec.c +++ /dev/null @@ -1,657 +0,0 @@ -#include -#include -#include "stm32f10x.h" -#include "board.h" -#include "codec.h" - -#if CODEC_USE_SPI3 - -#define CODEC_I2S_PORT SPI3 -#define CODEC_I2S_IRQ SPI3_IRQn -#define CODEC_I2S_DMA DMA2_Channel2 -#define CODEC_I2S_DMA_IRQ DMA2_Channel2_IRQn -#define CODEC_I2S_RCC_APB1 RCC_APB1Periph_SPI3 -#define CODEC_I2S_RCC_AHB RCC_AHBPeriph_DMA2 - -// I2S3_WS -> PA15 -#define CODEC_I2S_WS_PIN GPIO_Pin_15 -#define CODEC_I2S_WS_PORT GPIOA -// I2S3_CK -> PB3 -#define CODEC_I2S_CK_PIN GPIO_Pin_3 -#define CODEC_I2S_CK_PORT GPIOB -// I2S3_SD -> PB5 -#define CODEC_I2S_SD_PIN GPIO_Pin_5 -#define CODEC_I2S_SD_PORT GPIOB - -#else - -#define CODEC_I2S_PORT SPI2 -#define CODEC_I2S_IRQ SPI2_IRQn -#define CODEC_I2S_DMA DMA1_Channel5 -#define CODEC_I2S_DMA_IRQ DMA1_Channel5_IRQn -#define CODEC_I2S_RCC_APB1 RCC_APB1Periph_SPI2 -#define CODEC_I2S_RCC_AHB RCC_AHBPeriph_DMA1 - -// I2S2_WS -> PB12 -#define CODEC_I2S_WS_PIN GPIO_Pin_12 -#define CODEC_I2S_WS_PORT GPIOB -// I2S2_CK -> PB13 -#define CODEC_I2S_CK_PIN GPIO_Pin_13 -#define CODEC_I2S_CK_PORT GPIOB -// I2S2_SD -> PB15 -#define CODEC_I2S_SD_PIN GPIO_Pin_15 -#define CODEC_I2S_SD_PORT GPIOB - -#endif // #if CODEC_USE_SPI3 - -/* -SCLK PA5 SPI1_SCK -SDIN PA7 SPI1_MOSI -CSB PC5 -*/ -#define CODEC_CSB_PORT GPIOC -#define CODEC_CSB_PIN GPIO_Pin_5 -#define codec_set_csb() do { CODEC_CSB_PORT->BSRR = CODEC_CSB_PIN; } while (0) -#define codec_reset_csb() do { CODEC_CSB_PORT->BRR = CODEC_CSB_PIN; } while (0) - -void vol(uint16_t v); -static void codec_send(rt_uint16_t s_data); - -#define DATA_NODE_MAX 5 -/* data node for Tx Mode */ -struct codec_data_node -{ - rt_uint16_t *data_ptr; - rt_size_t data_size; -}; - -struct codec_device -{ - /* inherit from rt_device */ - struct rt_device parent; - - /* pcm data list */ - struct codec_data_node data_list[DATA_NODE_MAX]; - rt_uint16_t read_index, put_index; - - /* transmitted offset of current data node */ - rt_size_t offset; -}; -struct codec_device codec; - -static uint16_t r06 = REG_CLOCK_GEN | CLKSEL_PLL | MCLK_DIV2 | BCLK_DIV8; - -#if !CODEC_MASTER_MODE -static int codec_sr_new = 0; -#endif - -static void NVIC_Configuration(void) -{ - NVIC_InitTypeDef NVIC_InitStructure; - - /* DMA IRQ Channel configuration */ - NVIC_InitStructure.NVIC_IRQChannel = CODEC_I2S_DMA_IRQ; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -} - -static void GPIO_Configuration(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - /* Disable the JTAG interface and enable the SWJ interface */ - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); - - /* PC5 CODEC CS */ - GPIO_InitStructure.GPIO_Pin = CODEC_CSB_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(CODEC_CSB_PORT, &GPIO_InitStructure); - - // WS - GPIO_InitStructure.GPIO_Pin = CODEC_I2S_WS_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; -#if CODEC_MASTER_MODE - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; -#else - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; -#endif - GPIO_Init(CODEC_I2S_WS_PORT, &GPIO_InitStructure); - - // CK - GPIO_InitStructure.GPIO_Pin = CODEC_I2S_CK_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; -#if CODEC_MASTER_MODE - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; -#else - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; -#endif - GPIO_Init(CODEC_I2S_CK_PORT, &GPIO_InitStructure); - - // SD - GPIO_InitStructure.GPIO_Pin = CODEC_I2S_SD_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_Init(CODEC_I2S_SD_PORT, &GPIO_InitStructure); - -#ifdef CODEC_USE_MCO - /* MCO configure */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOA,&GPIO_InitStructure); - - RCC_MCOConfig(RCC_MCO_HSE); -#endif -} - -static void DMA_Configuration(rt_uint32_t addr, rt_size_t size) -{ - DMA_InitTypeDef DMA_InitStructure; - - /* DMA Channel configuration ----------------------------------------------*/ - DMA_Cmd(CODEC_I2S_DMA, DISABLE); - DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(CODEC_I2S_PORT->DR)); - DMA_InitStructure.DMA_MemoryBaseAddr = (u32) addr; - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; - DMA_InitStructure.DMA_BufferSize = size; - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; - DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; - DMA_Init(CODEC_I2S_DMA, &DMA_InitStructure); - - /* Enable SPI DMA Tx request */ - SPI_I2S_DMACmd(CODEC_I2S_PORT, SPI_I2S_DMAReq_Tx, ENABLE); - - DMA_ITConfig(CODEC_I2S_DMA, DMA_IT_TC, ENABLE); - DMA_Cmd(CODEC_I2S_DMA, ENABLE); -} - -static void I2S_Configuration(uint32_t I2S_AudioFreq) -{ - I2S_InitTypeDef I2S_InitStructure; - - /* I2S peripheral configuration */ - I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips; - I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b; - I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable; - I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq; - I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; - - /* I2S2 configuration */ -#if CODEC_MASTER_MODE - I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveTx; -#else - I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx; -#endif - I2S_Init(CODEC_I2S_PORT, &I2S_InitStructure); -} - -uint8_t SPI_WriteByte(unsigned char data) -{ - //Wait until the transmit buffer is empty - while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); - // Send the byte - SPI_I2S_SendData(SPI1, data); - - //Wait until a data is received - while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); - // Get the received data - data = SPI_I2S_ReceiveData(SPI1); - - // Return the shifted data - return data; -} - -static void codec_send(rt_uint16_t s_data) -{ - rt_sem_take(&spi1_lock, RT_WAITING_FOREVER); - - codec_reset_csb(); - SPI_WriteByte((s_data >> 8) & 0xFF); - SPI_WriteByte(s_data & 0xFF); - codec_set_csb(); - - rt_sem_release(&spi1_lock); -} - -static rt_err_t codec_init(rt_device_t dev) -{ - codec_send(REG_SOFTWARE_RESET); - - // 1.5x boost power up sequence. - // Mute all outputs. - codec_send(REG_LOUT1_VOL | LOUT1MUTE); - codec_send(REG_ROUT1_VOL | ROUT1MUTE); - codec_send(REG_LOUT2_VOL | LOUT2MUTE); - codec_send(REG_ROUT2_VOL | ROUT2MUTE); - // Enable unused output chosen from L/ROUT2, OUT3 or OUT4. - codec_send(REG_POWER_MANAGEMENT3 | OUT4EN); - // Set BUFDCOPEN=1 and BUFIOEN=1 in register R1 - codec_send(REG_POWER_MANAGEMENT1 | BUFDCOPEN | BUFIOEN); - // Set SPKBOOST=1 in register R49. - codec_send(REG_OUTPUT | SPKBOOST); - // Set VMIDSEL[1:0] to required value in register R1. - codec_send(REG_POWER_MANAGEMENT1 | BUFDCOPEN | BUFIOEN | VMIDSEL_75K); - // Set L/RMIXEN=1 and DACENL/R=1 in register R3. - codec_send(REG_POWER_MANAGEMENT3 | LMIXEN | RMIXEN | DACENL | DACENR); - // Set BIASEN=1 in register R1. - codec_send(REG_POWER_MANAGEMENT1 | BUFDCOPEN | BUFIOEN | VMIDSEL_75K | BIASEN); - // Set L/ROUT2EN=1 in register R3. - codec_send(REG_POWER_MANAGEMENT3 | LMIXEN | RMIXEN | DACENL | DACENR | LOUT2EN | ROUT2EN); - // Enable other mixers as required. - // Enable other outputs as required. - codec_send(REG_POWER_MANAGEMENT2 | LOUT1EN | ROUT1EN | BOOSTENL | BOOSTENR | INPPGAENL | INPPGAENR); - - // Digital inferface setup. - codec_send(REG_AUDIO_INTERFACE | BCP_NORMAL | LRP_NORMAL | WL_16BITS | FMT_I2S); - - // PLL setup. - // fs = 44.1KHz * 256fs = 11.2896MHz - // F_PLL = 11.2896MHz * 4 * 2 = 90.3168MHz - // R = 90.3168MHz / 12.288MHz = 7.35 - // PLL_N = 7 - // PLL_K = 0x59999A (0x5A5A5A for STM32's 44.117KHz fs generated from 72MHz clock) - codec_send(REG_PLL_N | 7); -#if CODEC_MASTER_MODE - codec_send(REG_PLL_K1 | 0x16); - codec_send(REG_PLL_K2 | 0xCC); - codec_send(REG_PLL_K3 | 0x19A); -#else - codec_send(REG_PLL_K1 | 0x16); - codec_send(REG_PLL_K2 | 0x12D); - codec_send(REG_PLL_K3 | 0x5A); -#endif - codec_send(REG_POWER_MANAGEMENT1 | BUFDCOPEN | BUFIOEN | VMIDSEL_75K | BIASEN | PLLEN); - codec_send(r06); - - // Enable DAC 128x oversampling. - codec_send(REG_DAC | DACOSR128); - - // Set LOUT2/ROUT2 in BTL operation. - codec_send(REG_BEEP | INVROUT2); - - // Set output volume. - vol(25); - - return RT_EOK; -} - -// Exported functions -#include - -void vol(uint16_t v) -{ - v = (v & VOL_MASK) << VOL_POS; - codec_send(REG_LOUT1_VOL | v); - codec_send(REG_ROUT1_VOL | HPVU | v); - codec_send(REG_LOUT2_VOL | v); - codec_send(REG_ROUT2_VOL | SPKVU | v); -} - -void eq(codec_eq_args_t args) -{ - switch (args->channel) - { - case 1: - codec_send(REG_EQ1 | ((args->frequency & EQC_MASK) << EQC_POS) | ((args->gain & EQG_MASK) << EQG_POS) | (args->mode_bandwidth ? EQ3DMODE_DAC : EQ3DMODE_ADC)); - break; - - case 2: - codec_send(REG_EQ2 | ((args->frequency & EQC_MASK) << EQC_POS) | ((args->gain & EQG_MASK) << EQG_POS) | (args->mode_bandwidth ? EQ2BW_WIDE : EQ2BW_NARROW)); - break; - - case 3: - codec_send(REG_EQ3 | ((args->frequency & EQC_MASK) << EQC_POS) | ((args->gain & EQG_MASK) << EQG_POS) | (args->mode_bandwidth ? EQ3BW_WIDE : EQ3BW_NARROW)); - break; - - case 4: - codec_send(REG_EQ4 | ((args->frequency & EQC_MASK) << EQC_POS) | ((args->gain & EQG_MASK) << EQG_POS) | (args->mode_bandwidth ? EQ4BW_WIDE : EQ4BW_NARROW)); - break; - - case 5: - codec_send(REG_EQ5 | ((args->frequency & EQC_MASK) << EQC_POS) | ((args->gain & EQG_MASK) << EQG_POS)); - break; - } -} - -// TODO eq1() ~ eq5() are just for testing. To be removed. -void eq1(uint8_t freq, uint8_t gain, uint8_t mode) -{ - codec_send(REG_EQ1 | ((freq & EQC_MASK) << EQC_POS) | ((gain & EQG_MASK) << EQG_POS) | (mode ? EQ3DMODE_DAC : EQ3DMODE_ADC)); -} - -void eq2(uint8_t freq, uint8_t gain, uint8_t bw) -{ - codec_send(REG_EQ2 | ((freq & EQC_MASK) << EQC_POS) | ((gain & EQG_MASK) << EQG_POS) | (bw ? EQ2BW_WIDE : EQ2BW_NARROW)); -} - -void eq3(uint8_t freq, uint8_t gain, uint8_t bw) -{ - codec_send(REG_EQ3 | ((freq & EQC_MASK) << EQC_POS) | ((gain & EQG_MASK) << EQG_POS) | (bw ? EQ3BW_WIDE : EQ3BW_NARROW)); -} - -void eq4(uint8_t freq, uint8_t gain, uint8_t bw) -{ - codec_send(REG_EQ4 | ((freq & EQC_MASK) << EQC_POS) | ((gain & EQG_MASK) << EQG_POS) | (bw ? EQ4BW_WIDE : EQ4BW_NARROW)); -} - -void eq5(uint8_t freq, uint8_t gain) -{ - codec_send(REG_EQ2 | ((freq & EQC_MASK) << EQC_POS) | ((gain & EQG_MASK) << EQG_POS)); -} - -void eq3d(uint8_t depth) -{ - codec_send(REG_3D | ((depth & DEPTH3D_MASK) << DEPTH3D_POS)); -} - -rt_err_t sample_rate(int sr) -{ - uint16_t r07 = REG_ADDITIONAL; - - switch (sr) - { - case 8000: - r06 = REG_CLOCK_GEN | CLKSEL_MCLK | MCLK_DIV6 | BCLK_DIV8 | (r06 & MS); - r07 |= SR_8KHZ; - break; - - case 11025: - r06 = REG_CLOCK_GEN | CLKSEL_PLL | MCLK_DIV8 | BCLK_DIV8 | (r06 & MS); - r07 |= SR_12KHZ; - break; - -#if CODEC_MASTER_MODE - case 12000: - r06 = REG_CLOCK_GEN | CLKSEL_MCLK | MCLK_DIV4 | BCLK_DIV8 | (r06 & MS); - r07 |= SR_12KHZ; - break; -#endif - - case 16000: - r06 = REG_CLOCK_GEN | CLKSEL_MCLK | MCLK_DIV3 | BCLK_DIV8 | (r06 & MS); - r07 |= SR_16KHZ; - break; - - case 22050: - r06 = REG_CLOCK_GEN | CLKSEL_PLL | MCLK_DIV4 | BCLK_DIV8 | (r06 & MS); - r07 |= SR_24KHZ; - break; - -#if CODEC_MASTER_MODE - case 24000: - r06 = REG_CLOCK_GEN | CLKSEL_MCLK | MCLK_DIV2 | BCLK_DIV8 | (r06 & MS); - r07 |= SR_24KHZ; - break; -#endif - - case 32000: - r06 = REG_CLOCK_GEN | CLKSEL_MCLK | MCLK_DIV1_5 | BCLK_DIV8 | (r06 & MS); - r07 |= SR_32KHZ; - break; - - case 44100: - r06 = REG_CLOCK_GEN | CLKSEL_PLL | MCLK_DIV2 | BCLK_DIV8 | (r06 & MS); - r07 |= SR_48KHZ; - break; - - case 48000: - r06 = REG_CLOCK_GEN | CLKSEL_MCLK | MCLK_DIV1 | BCLK_DIV8 | (r06 & MS); - r07 |= SR_48KHZ; - break; - - default: - return RT_ERROR; - } - codec_send(r06); - codec_send(r07); - -#if !CODEC_MASTER_MODE - codec_sr_new = sr; -#endif - - return RT_EOK; -} - -FINSH_FUNCTION_EXPORT(vol, Set volume); -FINSH_FUNCTION_EXPORT(eq1, Set EQ1(Cut-off, Gain, Mode)); -FINSH_FUNCTION_EXPORT(eq2, Set EQ2(Center, Gain, Bandwidth)); -FINSH_FUNCTION_EXPORT(eq3, Set EQ3(Center, Gain, Bandwidth)); -FINSH_FUNCTION_EXPORT(eq4, Set EQ4(Center, Gain, Bandwidth)); -FINSH_FUNCTION_EXPORT(eq5, Set EQ5(Cut-off, Gain)); -FINSH_FUNCTION_EXPORT(eq3d, Set 3D(Depth)); -FINSH_FUNCTION_EXPORT(sample_rate, Set sample rate); - -static rt_err_t codec_open(rt_device_t dev, rt_uint16_t oflag) -{ -#if !CODEC_MASTER_MODE - /* enable I2S */ - I2S_Cmd(CODEC_I2S_PORT, ENABLE); -#endif - - return RT_EOK; -} - -static rt_err_t codec_close(rt_device_t dev) -{ -#if CODEC_MASTER_MODE - if (r06 & MS) - { - CODEC_I2S_DMA->CCR &= ~DMA_CCR1_EN; - while ((CODEC_I2S_PORT->SR & SPI_I2S_FLAG_TXE) == 0); - while ((CODEC_I2S_PORT->SR & SPI_I2S_FLAG_BSY) != 0); - CODEC_I2S_PORT->I2SCFGR &= ~SPI_I2SCFGR_I2SE; - - r06 &= ~MS; - codec_send(r06); - - /* remove all data node */ - if (codec.parent.tx_complete != RT_NULL) - { - rt_base_t level = rt_hw_interrupt_disable(); - - do - { - codec.parent.tx_complete(&codec.parent, codec.data_list[codec.read_index].data_ptr); - codec.read_index++; - if (codec.read_index >= DATA_NODE_MAX) - { - codec.read_index = 0; - } - } - while (codec.read_index != codec.put_index); - - rt_hw_interrupt_enable(level); - } - } -#endif - - return RT_EOK; -} - -static rt_err_t codec_control(rt_device_t dev, rt_uint8_t cmd, void *args) -{ - switch (cmd) - { - case CODEC_CMD_RESET: - codec_init(dev); - break; - - case CODEC_CMD_VOLUME: - vol(*((uint16_t*) args)); - break; - - case CODEC_CMD_SAMPLERATE: - sample_rate(*((int*) args)); - break; - - case CODEC_CMD_EQ: - eq((codec_eq_args_t) args); - break; - - case CODEC_CMD_3D: - eq3d(*((uint8_t*) args)); - break; - - default: - return RT_ERROR; - } - return RT_EOK; -} - -static rt_size_t codec_write(rt_device_t dev, rt_off_t pos, - const void* buffer, rt_size_t size) -{ - struct codec_device* device; - struct codec_data_node* node; - rt_uint32_t level; - rt_uint16_t next_index; - - device = (struct codec_device*) dev; - RT_ASSERT(device != RT_NULL); - - next_index = device->put_index + 1; - if (next_index >= DATA_NODE_MAX) - next_index = 0; - - /* check data_list full */ - if (next_index == device->read_index) - { - rt_set_errno(-RT_EFULL); - return 0; - } - - level = rt_hw_interrupt_disable(); - node = &device->data_list[device->put_index]; - device->put_index = next_index; - - /* set node attribute */ - node->data_ptr = (rt_uint16_t*) buffer; - node->data_size = size >> 1; /* size is byte unit, convert to half word unit */ - - next_index = device->read_index + 1; - if (next_index >= DATA_NODE_MAX) - next_index = 0; - - /* check data list whether is empty */ - if (next_index == device->put_index) - { - DMA_Configuration((rt_uint32_t) node->data_ptr, node->data_size); - -#if CODEC_MASTER_MODE - if ((r06 & MS) == 0) - { - CODEC_I2S_PORT->I2SCFGR |= SPI_I2SCFGR_I2SE; - r06 |= MS; - codec_send(r06); - } -#endif - } - rt_hw_interrupt_enable(level); - - return size; -} - -rt_err_t codec_hw_init(void) -{ - rt_device_t dev; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); - RCC_APB1PeriphClockCmd(CODEC_I2S_RCC_APB1, ENABLE); - RCC_AHBPeriphClockCmd(CODEC_I2S_RCC_AHB, ENABLE); - - NVIC_Configuration(); - GPIO_Configuration(); - I2S_Configuration(I2S_AudioFreq_44k); - - dev = (rt_device_t) &codec; - dev->type = RT_Device_Class_Sound; - dev->rx_indicate = RT_NULL; - dev->tx_complete = RT_NULL; - dev->init = codec_init; - dev->open = codec_open; - dev->close = codec_close; - dev->read = RT_NULL; - dev->write = codec_write; - dev->control = codec_control; - dev->private = RT_NULL; - - /* set read_index and put index to 0 */ - codec.read_index = 0; - codec.put_index = 0; - - /* unselect */ - codec_set_csb(); - - /* register the device */ - return rt_device_register(&codec.parent, "snd", RT_DEVICE_FLAG_WRONLY | RT_DEVICE_FLAG_DMA_TX); -} - -void codec_dma_isr(void) -{ - /* switch to next buffer */ - rt_uint16_t next_index; - void* data_ptr; - - next_index = codec.read_index + 1; - if (next_index >= DATA_NODE_MAX) - next_index = 0; - - /* save current data pointer */ - data_ptr = codec.data_list[codec.read_index].data_ptr; - -#if !CODEC_MASTER_MODE - if (codec_sr_new) - { - I2S_Configuration(codec_sr_new); - I2S_Cmd(CODEC_I2S_PORT, ENABLE); - codec_sr_new = 0; - } -#endif - - codec.read_index = next_index; - if (next_index != codec.put_index) - { - /* enable next dma request */ - DMA_Configuration((rt_uint32_t) codec.data_list[codec.read_index].data_ptr, codec.data_list[codec.read_index].data_size); - -#if CODEC_MASTER_MODE - if ((r06 & MS) == 0) - { - CODEC_I2S_PORT->I2SCFGR |= SPI_I2SCFGR_I2SE; - r06 |= MS; - codec_send(r06); - } -#endif - } - else - { -#if CODEC_MASTER_MODE - if (r06 & MS) - { - CODEC_I2S_DMA->CCR &= ~DMA_CCR1_EN; - while ((CODEC_I2S_PORT->SR & SPI_I2S_FLAG_TXE) == 0); - while ((CODEC_I2S_PORT->SR & SPI_I2S_FLAG_BSY) != 0); - CODEC_I2S_PORT->I2SCFGR &= ~SPI_I2SCFGR_I2SE; - - r06 &= ~MS; - codec_send(r06); - } -#endif - - rt_kprintf("*\n"); - } - - /* notify transmitted complete. */ - if (codec.parent.tx_complete != RT_NULL) - { - codec.parent.tx_complete(&codec.parent, data_ptr); - } -} diff --git a/bsp/stm32_radio/codec.h b/bsp/stm32_radio/codec.h deleted file mode 100644 index f0ba49028a..0000000000 --- a/bsp/stm32_radio/codec.h +++ /dev/null @@ -1,645 +0,0 @@ -#ifndef __CODEC_H__ -#define __CODEC_H__ - -#include - -/* Register Definitions */ -#define REG_SOFTWARE_RESET ((uint16_t)0) -#define REG_POWER_MANAGEMENT1 ((uint16_t)(1 << 9)) -#define REG_POWER_MANAGEMENT2 ((uint16_t)(2 << 9)) -#define REG_POWER_MANAGEMENT3 ((uint16_t)(3 << 9)) -#define REG_AUDIO_INTERFACE ((uint16_t)(4 << 9)) -#define REG_COMPANDING ((uint16_t)(5 << 9)) -#define REG_CLOCK_GEN ((uint16_t)(6 << 9)) -#define REG_ADDITIONAL ((uint16_t)(7 << 9)) -#define REG_GPIO ((uint16_t)(8 << 9)) -#define REG_JACK_DETECT1 ((uint16_t)(9 << 9)) -#define REG_DAC ((uint16_t)(10 << 9)) -#define REG_LEFT_DAC_VOL ((uint16_t)(11 << 9)) -#define REG_RIGHT_DAC_VOL ((uint16_t)(12 << 9)) -#define REG_JACK_DETECT2 ((uint16_t)(13 << 9)) -#define REG_ADC ((uint16_t)(14 << 9)) -#define REG_LEFT_ADC_VOL ((uint16_t)(15 << 9)) -#define REG_RIGHT_ADC_VOL ((uint16_t)(16 << 9)) -#define REG_EQ1 ((uint16_t)(18 << 9)) -#define REG_EQ2 ((uint16_t)(19 << 9)) -#define REG_EQ3 ((uint16_t)(20 << 9)) -#define REG_EQ4 ((uint16_t)(21 << 9)) -#define REG_EQ5 ((uint16_t)(22 << 9)) -#define REG_DAC_LIMITER1 ((uint16_t)(24 << 9)) -#define REG_DAC_LIMITER2 ((uint16_t)(25 << 9)) -#define REG_NOTCH_FILTER1 ((uint16_t)(27 << 9)) -#define REG_NOTCH_FILTER2 ((uint16_t)(28 << 9)) -#define REG_NOTCH_FILTER3 ((uint16_t)(29 << 9)) -#define REG_NOTCH_FILTER4 ((uint16_t)(30 << 9)) -#define REG_ALC1 ((uint16_t)(32 << 9)) -#define REG_ALC2 ((uint16_t)(33 << 9)) -#define REG_ALC3 ((uint16_t)(34 << 9)) -#define REG_NOISE_GATE ((uint16_t)(35 << 9)) -#define REG_PLL_N ((uint16_t)(36 << 9)) -#define REG_PLL_K1 ((uint16_t)(37 << 9)) -#define REG_PLL_K2 ((uint16_t)(38 << 9)) -#define REG_PLL_K3 ((uint16_t)(39 << 9)) -#define REG_3D ((uint16_t)(41 << 9)) -#define REG_BEEP ((uint16_t)(43 << 9)) -#define REG_INPUT ((uint16_t)(44 << 9)) -#define REG_LEFT_PGA_GAIN ((uint16_t)(45 << 9)) -#define REG_RIGHT_PGA_GAIN ((uint16_t)(46 << 9)) -#define REG_LEFT_ADC_BOOST ((uint16_t)(47 << 9)) -#define REG_RIGHT_ADC_BOOST ((uint16_t)(48 << 9)) -#define REG_OUTPUT ((uint16_t)(49 << 9)) -#define REG_LEFT_MIXER ((uint16_t)(50 << 9)) -#define REG_RIGHT_MIXER ((uint16_t)(51 << 9)) -#define REG_LOUT1_VOL ((uint16_t)(52 << 9)) -#define REG_ROUT1_VOL ((uint16_t)(53 << 9)) -#define REG_LOUT2_VOL ((uint16_t)(54 << 9)) -#define REG_ROUT2_VOL ((uint16_t)(55 << 9)) -#define REG_OUT3_MIXER ((uint16_t)(56 << 9)) -#define REG_OUT4_MIXER ((uint16_t)(57 << 9)) - -// R01 REG_POWER_MANAGEMENT1 -#define BUFDCOPEN (1 << 8) -#define OUT4MIXEN (1 << 7) -#define OUT3MIXEN (1 << 6) -#define PLLEN (1 << 5) -#define MICBEN (1 << 4) -#define BIASEN (1 << 3) -#define BUFIOEN (1 << 2) -#define VMIDSEL_OFF (0) -#define VMIDSEL_75K (1) -#define VMIDSEL_300K (2) -#define VMIDSEL_5K (3) - -// R02 REG_POWER_MANAGEMENT2 -#define ROUT1EN (1 << 8) -#define LOUT1EN (1 << 7) -#define SLEEP (1 << 6) -#define BOOSTENR (1 << 5) -#define BOOSTENL (1 << 4) -#define INPPGAENR (1 << 3) -#define INPPGAENL (1 << 2) -#define ADCENR (1 << 1) -#define ADCENL (1) - -// R03 REG_POWER_MANAGEMENT3 -#define OUT4EN (1 << 8) -#define OUT3EN (1 << 7) -#define LOUT2EN (1 << 6) -#define ROUT2EN (1 << 5) -#define RMIXEN (1 << 3) -#define LMIXEN (1 << 2) -#define DACENR (1 << 1) -#define DACENL (1) - -// R04 REG_AUDIO_INTERFACE -#define BCP_NORMAL (0) -#define BCP_INVERTED (1 << 8) -#define LRP_NORMAL (0) -#define LRP_INVERTED (1 << 7) -#define WL_16BITS (0) -#define WL_20BITS (1 << 5) -#define WL_24BITS (2 << 5) // Default value -#define WL_32BITS (3 << 5) -#define FMT_RIGHT_JUSTIFIED (0) -#define FMT_LEFT_JUSTIFIED (1 << 3) -#define FMT_I2S (2 << 3) // Default value -#define FMT_PCM (3 << 3) -#define DACLRSWAP (1 << 2) -#define ADCLRSWAP (1 << 1) -#define MONO (1) - -// R05 REG_COMPANDING -#define WL8 (1 << 5) -#define DAC_COMP_OFF (0) // Default value -#define DAC_COMP_ULAW (2 << 3) -#define DAC_COMP_ALAW (3 << 3) -#define ADC_COMP_OFF (0) // Default value -#define ADC_COMP_ULAW (2 << 1) -#define ADC_COMP_ALAW (3 << 1) -#define LOOPBACK (1) - -// R06 REG_CLOCK_GEN -#define CLKSEL_MCLK (0) -#define CLKSEL_PLL (1 << 8) // Default value -#define MCLK_DIV1 (0) -#define MCLK_DIV1_5 (1 << 5) -#define MCLK_DIV2 (2 << 5) // Default value -#define MCLK_DIV3 (3 << 5) -#define MCLK_DIV4 (4 << 5) -#define MCLK_DIV6 (5 << 5) -#define MCLK_DIV8 (6 << 5) -#define MCLK_DIV12 (7 << 5) -#define BCLK_DIV1 (0) // Default value -#define BCLK_DIV2 (1 << 2) -#define BCLK_DIV4 (2 << 2) -#define BCLK_DIV8 (3 << 2) -#define BCLK_DIV16 (4 << 2) -#define BCLK_DIV32 (5 << 2) -#define MS (1) - -// R07 REG_ADDITIONAL -#define SR_48KHZ (0) // Default value -#define SR_32KHZ (1 << 1) -#define SR_24KHZ (2 << 1) -#define SR_16KHZ (3 << 1) -#define SR_12KHZ (4 << 1) -#define SR_8KHZ (5 << 1) -#define SLOWCLKEN (1) - -// R08 REG_GPIO -#define OPCLK_DIV1 (0) // Default value -#define OPCLK_DIV2 (1 << 4) -#define OPCLK_DIV3 (2 << 4) -#define OPCLK_DIV4 (3 << 4) -#define GPIO1POL_NONINVERTED (0) // Default value -#define GPIO1POL_INVERTED (1 << 3) -#define GPIO1SEL_INPUT (0) // Default value -#define GPIO1SEL_TEMP_OK (2) -#define GPIO1SEL_AMUTE_ACTIVE (3) -#define GPIO1SEL_PLL_CLK_OP (4) -#define GPIO1SEL_PLL_LOCK (5) -#define GPIO1SEL_LOGIC1 (6) -#define GPIO1SEL_LOGIC0 (7) - -// R09 REG_JACK_DETECT1 -#define JD_VMID_EN1 (1 << 8) -#define JD_VMID_EN0 (1 << 7) -#define JD_EN (1 << 6) -#define JD_SEL_GPIO1 (0 << 4) // Default value -#define JD_SEL_GPIO2 (1 << 4) -#define JD_SEL_GPIO3 (2 << 4) - -// R10 REG_DAC -#define SOFTMUTE (1 << 6) -#define DACOSR128 (1 << 3) -#define AMUTE (1 << 2) -#define DACPOLR (1 << 1) -#define DACPOLL (1) - -// R11 & R12 REG_LEFT_DAC_VOL & REG_RIGHT_DAC_VOL -#define DACVU (1 << 8) -#define DACVOL_POS (0) -#define DACVOL_MASK (0xFF) - -// R13 REG_JACK_DETECT2 -#define JD_OUT4_EN1 (1 << 7) -#define JD_OUT3_EN1 (1 << 6) -#define JD_OUT2_EN1 (1 << 5) -#define JD_OUT1_EN1 (1 << 4) -#define JD_OUT4_EN0 (1 << 3) -#define JD_OUT3_EN0 (1 << 2) -#define JD_OUT2_EN0 (1 << 1) -#define JD_OUT1_EN0 (1) - -// R14 REG_ADC -#define HPFEN (1 << 8) -#define HPFAPP (1 << 7) -#define HPFCUT_POS (4) -#define HPFCUT_MASK (7) -#define HPFCUT_0 (0) -#define HPFCUT_1 (1 << 4) -#define HPFCUT_2 (2 << 4) -#define HPFCUT_3 (3 << 4) -#define HPFCUT_4 (4 << 4) -#define HPFCUT_5 (5 << 4) -#define HPFCUT_6 (6 << 4) -#define HPFCUT_7 (7 << 4) -#define ADCOSR128 (1 << 3) -#define ADCRPOL (1 << 1) -#define ADCLPOL (1) - -// R15 & R16 REG_LEFT_ADC_VOL & REG_RIGHT_ADC_VOL -#define ADCVU (1 << 8) -#define ADCVOL_POS (0) -#define ADCVOL_MASK (0xFF) - -// R18 REG_EQ1 -#define EQ3DMODE_ADC (0) -#define EQ3DMODE_DAC (1 << 8) // Default value -#define EQ1C_80HZ (0) -#define EQ1C_105HZ (1 << 5) // Default value -#define EQ1C_135HZ (2 << 5) -#define EQ1C_175HZ (3 << 5) - -// R19 REG_EQ2 -#define EQ2BW_NARROW (0) // Default value -#define EQ2BW_WIDE (1 << 8) -#define EQ2C_230HZ (0) -#define EQ2C_300HZ (1 << 5) // Default value -#define EQ2C_385HZ (2 << 5) -#define EQ2C_500HZ (3 << 5) - -// R20 REG_EQ3 -#define EQ3BW_NARROW (0) // Default value -#define EQ3BW_WIDE (1 << 8) -#define EQ3C_650HZ (0) -#define EQ3C_850HZ (1 << 5) // Default value -#define EQ3C_1_1KHZ (2 << 5) -#define EQ3C_1_4KHZ (3 << 5) - -// R21 REG_EQ4 -#define EQ4BW_NARROW (0) // Default value -#define EQ4BW_WIDE (1 << 8) -#define EQ4C_1_8KHZ (0) -#define EQ4C_2_4KHZ (1 << 5) // Default value -#define EQ4C_3_2KHZ (2 << 5) -#define EQ4C_4_1KHZ (3 << 5) - -// R22 REG_EQ5 -#define EQ5C_5_3KHZ (0) -#define EQ5C_6_9KHZ (1 << 5) // Default value -#define EQ5C_9KHZ (2 << 5) -#define EQ5C_11_7KHZ (3 << 5) - -// R18 - R22 -#define EQC_POS (5) -#define EQC_MASK (3) -#define EQG_POS (0) -#define EQG_MASK (31) - -// R24 REG_DAC_LIMITER1 -#define LIMEN (1 << 8) -#define LIMDCY_POS (4) -#define LIMDCY_MASK (15) -#define LIMDCY_750US (0) -#define LIMDCY_1_5MS (1 << 4) -#define LIMDCY_3MS (2 << 4) -#define LIMDCY_6MS (3 << 4) // Default value -#define LIMDCY_12MS (4 << 4) -#define LIMDCY_24MS (5 << 4) -#define LIMDCY_48MS (6 << 4) -#define LIMDCY_96MS (7 << 4) -#define LIMDCY_192MS (8 << 4) -#define LIMDCY_384MS (9 << 4) -#define LIMDCY_768MS (10 << 4) -#define LIMATK_POS (0) -#define LIMATK_MASK (15) -#define LIMATK_94US (0) -#define LIMATK_188US (1) -#define LIMATK_375US (2) // Default value -#define LIMATK_750US (3) -#define LIMATK_1_5MS (4) -#define LIMATK_3MS (5) -#define LIMATK_6MS (6) -#define LIMATK_12MS (7) -#define LIMATK_24MS (8) -#define LIMATK_48MS (9) -#define LIMATK_96MS (10) -#define LIMATK_192MS (11) - -// R25 REG_DAC_LIMITER2 -#define LIMLVL_POS (4) -#define LIMLVL_MASK (7) -#define LIMLVL_N1DB (0) // Default value -#define LIMLVL_N2DB (1 << 4) -#define LIMLVL_N3DB (2 << 4) -#define LIMLVL_N4DB (3 << 4) -#define LIMLVL_N5DB (4 << 4) -#define LIMLVL_N6DB (5 << 4) -#define LIMBOOST_POS (0) -#define LIMBOOST_MASK (15) -#define LIMBOOST_0DB (0) -#define LIMBOOST_1DB (1) -#define LIMBOOST_2DB (2) -#define LIMBOOST_3DB (3) -#define LIMBOOST_4DB (4) -#define LIMBOOST_5DB (5) -#define LIMBOOST_6DB (6) -#define LIMBOOST_7DB (7) -#define LIMBOOST_8DB (8) -#define LIMBOOST_9DB (9) -#define LIMBOOST_10DB (10) -#define LIMBOOST_11DB (11) -#define LIMBOOST_12DB (12) - -// R27 - R30 REG_NOTCH_FILTER1 - REG_NOTCH_FILTER4 -#define NFU (1 << 8) -#define NFEN (1 << 7) -#define NFA_POS (0) -#define NFA_MASK (127) - -// R32 REG_ALC1 -#define ALCSEL_OFF (0) // Default value -#define ALCSEL_RIGHT_ONLY (1 << 7) -#define ALCSEL_LEFT_ONLY (2 << 7) -#define ALCSEL_BOTH_ON (3 << 7) -#define ALCMAXGAIN_POS (3) -#define ALCMAXGAIN_MASK (7) -#define ALCMAXGAIN_N6_75DB (0) -#define ALCMAXGAIN_N0_75DB (1 << 3) -#define ALCMAXGAIN_5_25DB (2 << 3) -#define ALCMAXGAIN_11_25DB (3 << 3) -#define ALCMAXGAIN_17_25DB (4 << 3) -#define ALCMAXGAIN_23_25DB (5 << 3) -#define ALCMAXGAIN_29_25DB (6 << 3) -#define ALCMAXGAIN_35_25DB (7 << 3) // Default value -#define ALCMINGAIN_POS (0) -#define ALCMINGAIN_MASK (7) -#define ALCMINGAIN_N12DB (0) // Default value -#define ALCMINGAIN_N6DB (1) -#define ALCMINGAIN_0DB (2) -#define ALCMINGAIN_6DB (3) -#define ALCMINGAIN_12DB (4) -#define ALCMINGAIN_18DB (5) -#define ALCMINGAIN_24DB (6) -#define ALCMINGAIN_30DB (7) - -// R33 REG_ALC2 -#define ALCHLD_POS (4) -#define ALCHLD_MASK (15) -#define ALCHLD_0MS (0) // Default value -#define ALCHLD_2_67MS (1 << 4) -#define ALCHLD_5_33MS (2 << 4) -#define ALCHLD_10_67MS (3 << 4) -#define ALCHLD_21_33MS (4 << 4) -#define ALCHLD_42_67MS (5 << 4) -#define ALCHLD_85_33MS (6 << 4) -#define ALCHLD_170_67MS (7 << 4) -#define ALCHLD_341_33MS (8 << 4) -#define ALCHLD_682_67MS (9 << 4) -#define ALCHLD_1_36S (10 << 4) -#define ALCLVL_POS (0) -#define ALCLVL_MASK (15) -#define ALCLVL_N22_5DBFS (0) -#define ALCLVL_N21DBFS (1) -#define ALCLVL_N19_5DBFS (2) -#define ALCLVL_N18DBFS (3) -#define ALCLVL_N16_5DBFS (4) -#define ALCLVL_N15DBFS (5) -#define ALCLVL_N13_5DBFS (6) -#define ALCLVL_N12DBFS (7) -#define ALCLVL_N10_5DBFS (8) -#define ALCLVL_N9DBFS (9) -#define ALCLVL_N7_5DBFS (10) -#define ALCLVL_N6DBFS (11) // Default value -#define ALCLVL_N4_5DBFS (12) -#define ALCLVL_N3DBFS (13) -#define ALCLVL_N1_5DBFS (14) - -// R34 REG_ALC3 -#define ALCMODE_ALC (0) // Default value -#define ALCMODE_LIMITER (1 << 8) -#define ALCDCY_POS (4) -#define ALCDCY_MASK (15) -#define ALCDCY_0 (0) -#define ALCDCY_1 (1 << 4) -#define ALCDCY_2 (2 << 4) -#define ALCDCY_3 (3 << 4) // Default value -#define ALCDCY_4 (4 << 4) -#define ALCDCY_5 (5 << 4) -#define ALCDCY_6 (6 << 4) -#define ALCDCY_7 (7 << 4) -#define ALCDCY_8 (8 << 4) -#define ALCDCY_9 (9 << 4) -#define ALCDCY_10 (10 << 4) -#define ALCATK_POS (0) -#define ALCATK_MASK (15) -#define ALCATK_0 (0) -#define ALCATK_1 (1) -#define ALCATK_2 (2) // Default value -#define ALCATK_3 (3) -#define ALCATK_4 (4) -#define ALCATK_5 (5) -#define ALCATK_6 (6) -#define ALCATK_7 (7) -#define ALCATK_8 (8) -#define ALCATK_9 (9) -#define ALCATK_10 (10) - -// R35 REG_NOISE_GATE -#define NGEN (1 << 3) -#define NGTH_POS (0) -#define NGTH_MASK (7) -#define NGTH_N39DB (0) // Default value -#define NGTH_N45DB (1) -#define NGTH_N51DB (2) -#define NGTH_N57DB (3) -#define NGTH_N63DB (4) -#define NGTH_N69DB (5) -#define NGTH_N75DB (6) -#define NGTH_N81DB (7) - -// R36 REG_PLL_N -#define PLLPRESCALE (1 << 4) -#define PLLN_POS (0) -#define PLLN_MASK (15) - -// R37 - R39 REG_PLL_K1 - REG_PLL_K3 -#define PLLK1_POS (0) -#define PLLK1_MASK (63) -#define PLLK2_POS (0) -#define PLLK2_MASK (511) -#define PLLK3_POS (0) -#define PLLK3_MASK (511) - -// R41 REG_3D -#define DEPTH3D_POS (0) -#define DEPTH3D_MASK (15) -#define DEPTH3D_0 (0) // Default value -#define DEPTH3D_6_67 (1) -#define DEPTH3D_13_33 (2) -#define DEPTH3D_20 (3) -#define DEPTH3D_26_67 (4) -#define DEPTH3D_33_33 (5) -#define DEPTH3D_40 (6) -#define DEPTH3D_46_67 (7) -#define DEPTH3D_53_33 (8) -#define DEPTH3D_60 (9) -#define DEPTH3D_66_67 (10) -#define DEPTH3D_73_33 (11) -#define DEPTH3D_80 (12) -#define DEPTH3D_86_67 (13) -#define DEPTH3D_93_33 (14) -#define DEPTH3D_100 (15) - -// R43 REG_BEEP -#define MUTERPGA2INV (1 << 5) -#define INVROUT2 (1 << 4) -#define BEEPVOL_POS (1) -#define BEEPVOL_MASK (7) -#define BEEPVOL_N15DB (0) -#define BEEPVOL_N12DB (1 << 1) -#define BEEPVOL_N9DB (2 << 1) -#define BEEPVOL_N6DB (3 << 1) -#define BEEPVOL_N3DB (4 << 1) -#define BEEPVOL_0DB (5 << 1) -#define BEEPVOL_3DB (6 << 1) -#define BEEPVOL_6DB (7 << 1) -#define BEEPEN (1) - -// R44 REG_INPUT -#define MBVSEL_0_9AVDD (0) // Default value -#define MBVSEL_0_65AVDD (1 << 8) -#define R2_2INPVGA (1 << 6) -#define RIN2INPVGA (1 << 5) // Default value -#define RIP2INPVGA (1 << 4) // Default value -#define L2_2INPVGA (1 << 2) -#define LIN2INPVGA (1 << 1) // Default value -#define LIP2INPVGA (1) // Default value - -// R45 REG_LEFT_PGA_GAIN -#define INPPGAUPDATE (1 << 8) -#define INPPGAZCL (1 << 7) -#define INPPGAMUTEL (1 << 6) - -// R46 REG_RIGHT_PGA_GAIN -#define INPPGAZCR (1 << 7) -#define INPPGAMUTER (1 << 6) - -// R45 - R46 -#define INPPGAVOL_POS (0) -#define INPPGAVOL_MASK (63) - -// R47 REG_LEFT_ADC_BOOST -#define PGABOOSTL (1 << 8) // Default value -#define L2_2BOOSTVOL_POS (4) -#define L2_2BOOSTVOL_MASK (7) -#define L2_2BOOSTVOL_DISABLED (0) // Default value -#define L2_2BOOSTVOL_N12DB (1 << 4) -#define L2_2BOOSTVOL_N9DB (2 << 4) -#define L2_2BOOSTVOL_N6DB (3 << 4) -#define L2_2BOOSTVOL_N3DB (4 << 4) -#define L2_2BOOSTVOL_0DB (5 << 4) -#define L2_2BOOSTVOL_3DB (6 << 4) -#define L2_2BOOSTVOL_6DB (7 << 4) -#define AUXL2BOOSTVOL_POS (0) -#define AUXL2BOOSTVOL_MASK (7) -#define AUXL2BOOSTVOL_DISABLED (0) // Default value -#define AUXL2BOOSTVOL_N12DB (1) -#define AUXL2BOOSTVOL_N9DB (2) -#define AUXL2BOOSTVOL_N6DB (3) -#define AUXL2BOOSTVOL_N3DB (4) -#define AUXL2BOOSTVOL_0DB (5) -#define AUXL2BOOSTVOL_3DB (6) -#define AUXL2BOOSTVOL_6DB (7) - -// R48 REG_RIGHT_ADC_BOOST -#define PGABOOSTR (1 << 8) // Default value -#define R2_2BOOSTVOL_POS (4) -#define R2_2BOOSTVOL_MASK (7) -#define R2_2BOOSTVOL_DISABLED (0) // Default value -#define R2_2BOOSTVOL_N12DB (1 << 4) -#define R2_2BOOSTVOL_N9DB (2 << 4) -#define R2_2BOOSTVOL_N6DB (3 << 4) -#define R2_2BOOSTVOL_N3DB (4 << 4) -#define R2_2BOOSTVOL_0DB (5 << 4) -#define R2_2BOOSTVOL_3DB (6 << 4) -#define R2_2BOOSTVOL_6DB (7 << 4) -#define AUXR2BOOSTVOL_POS (0) -#define AUXR2BOOSTVOL_MASK (7) -#define AUXR2BOOSTVOL_DISABLED (0) // Default value -#define AUXR2BOOSTVOL_N12DB (1) -#define AUXR2BOOSTVOL_N9DB (2) -#define AUXR2BOOSTVOL_N6DB (3) -#define AUXR2BOOSTVOL_N3DB (4) -#define AUXR2BOOSTVOL_0DB (5) -#define AUXR2BOOSTVOL_3DB (6) -#define AUXR2BOOSTVOL_6DB (7) - -// R49 REG_OUTPUT -#define DACL2RMIX (1 << 6) -#define DACR2LMIX (1 << 5) -#define OUT4BOOST (1 << 4) -#define OUT3BOOST (1 << 3) -#define SPKBOOST (1 << 2) -#define TSDEN (1 << 1) -#define VROI (1) - -// R50 REG_LEFT_MIXER -#define AUXLMIXVOL_POS (6) -#define AUXLMIXVOL_MASK (7) -#define AUXLMIXVOL_N15DB (0) // Default value -#define AUXLMIXVOL_N12DB (1 << 6) -#define AUXLMIXVOL_N9DB (2 << 6) -#define AUXLMIXVOL_N6DB (3 << 6) -#define AUXLMIXVOL_N3DB (4 << 6) -#define AUXLMIXVOL_0DB (5 << 6) -#define AUXLMIXVOL_3DB (6 << 6) -#define AUXLMIXVOL_6DB (7 << 6) -#define AUXL2LMIX (1 << 5) -#define BYPLMIXVOL_POS (2) -#define BYPLMIXVOL_MASK (7) -#define BYPLMIXVOL_N15DB (0) // Default value -#define BYPLMIXVOL_N12DB (1 << 2) -#define BYPLMIXVOL_N9DB (2 << 2) -#define BYPLMIXVOL_N6DB (3 << 2) -#define BYPLMIXVOL_N3DB (4 << 2) -#define BYPLMIXVOL_0DB (5 << 2) -#define BYPLMIXVOL_3DB (6 << 2) -#define BYPLMIXVOL_6DB (7 << 2) -#define BYPL2LMIX (1 << 1) -#define DACL2LMIX (1) - -// R51 REG_RIGHT_MIXER -#define AUXRMIXVOL_POS (6) -#define AUXRMIXVOL_MASK (7) -#define AUXRMIXVOL_N15DB (0) // Default value -#define AUXRMIXVOL_N12DB (1 << 6) -#define AUXRMIXVOL_N9DB (2 << 6) -#define AUXRMIXVOL_N6DB (3 << 6) -#define AUXRMIXVOL_N3DB (4 << 6) -#define AUXRMIXVOL_0DB (5 << 6) -#define AUXRMIXVOL_3DB (6 << 6) -#define AUXRMIXVOL_6DB (7 << 6) -#define AUXR2RMIX (1 << 5) -#define BYPRMIXVOL_POS (2) -#define BYPRMIXVOL_MASK (7) -#define BYPRMIXVOL_N15DB (0) // Default value -#define BYPRMIXVOL_N12DB (1 << 2) -#define BYPRMIXVOL_N9DB (2 << 2) -#define BYPRMIXVOL_N6DB (3 << 2) -#define BYPRMIXVOL_N3DB (4 << 2) -#define BYPRMIXVOL_0DB (5 << 2) -#define BYPRMIXVOL_3DB (6 << 2) -#define BYPRMIXVOL_6DB (7 << 2) -#define BYPR2RMIX (1 << 1) -#define DACR2RMIX (1) - -// R52 - R55 REG_LOUT1_VOL - REG_ROUT2_VOL -#define HPVU (1 << 8) -#define SPKVU (1 << 8) -#define LOUT1ZC (1 << 7) -#define LOUT1MUTE (1 << 6) -#define ROUT1ZC (1 << 7) -#define ROUT1MUTE (1 << 6) -#define LOUT2ZC (1 << 7) -#define LOUT2MUTE (1 << 6) -#define ROUT2ZC (1 << 7) -#define ROUT2MUTE (1 << 6) -#define VOL_POS (0) -#define VOL_MASK (63) - -// R56 REG_OUT3_MIXER -#define OUT3MUTE (1 << 6) -#define OUT4_2OUT3 (1 << 3) -#define BYPL2OUT3 (1 << 2) -#define LMIX2OUT3 (1 << 1) -#define LDAC2OUT3 (1) - -// R57 REG_OUT4_MIXER -#define OUT4MUTE (1 << 6) -#define HALFSIG (1 << 5) -#define LMIX2OUT4 (1 << 4) -#define LDAC2OUT4 (1 << 3) -#define BYPR2OUT4 (1 << 2) -#define RMIX2OUT4 (1 << 1) -#define RDAC2OUT4 (1) - - -/* Device Control Commands */ -#define CODEC_CMD_RESET 0 -#define CODEC_CMD_VOLUME 1 -#define CODEC_CMD_SAMPLERATE 2 -#define CODEC_CMD_EQ 3 -#define CODEC_CMD_3D 4 - -struct codec_eq_args -{ - uint8_t channel; - uint8_t frequency; - uint8_t gain; - uint8_t mode_bandwidth; -}; -typedef struct codec_eq_args* codec_eq_args_t; - -#endif // #ifndef __CODEC_H__ diff --git a/bsp/stm32_radio/device_info.c b/bsp/stm32_radio/device_info.c deleted file mode 100644 index 495df65bbd..0000000000 --- a/bsp/stm32_radio/device_info.c +++ /dev/null @@ -1,239 +0,0 @@ -#include -#include -#include -#include - -#include -#include - -#include - -#ifdef RT_USING_LWIP -#include -#include -#include -#endif - -static struct rtgui_view* device_view = RT_NULL; - -int get_thread_cnt() -{ - int cnt = 0; - struct rt_list_node *list, *node; - extern struct rt_object_information rt_object_container[]; - - list = &rt_object_container[RT_Object_Class_Thread].object_list; - - for (node = list->next; node != list; node = node->next) - { - cnt ++; - } - - return cnt; -} - -const static char *stm32_devname[] = -{ - "STM32 MD", /* 0x410 */ - "STM32 LD", /* 0x412 */ - "STM32 HD", /* 0x414 */ - "Unknown" , /* 0x416 */ - "STM32 CL", /* 0x418 */ -}; - -const static char *stm32_revname[] = -{ - "Rev A", - "Rev B", - "Rev Z", - "Rev Y", - "Rev Unknown" -}; - -/* - * Device Information View - * Device: Win32 or Cortex-M3 etc - * Memory: - * Thread: - * IP Address: - * Gateway: - * DNS: - */ -static rt_bool_t view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) -{ - switch (event->type) - { - case RTGUI_EVENT_PAINT: - { - struct rtgui_dc* dc; - struct rtgui_rect rect; - char* line; - rt_uint32_t total, used, max_used; - - line = rtgui_malloc(256); - if (line == RT_NULL) return RT_FALSE; - - dc = rtgui_dc_begin_drawing(widget); - if (dc == RT_NULL) - { - rtgui_free(line); - return RT_FALSE; - } - rtgui_widget_get_rect(widget, &rect); - - /* fill background */ - rtgui_dc_fill_rect(dc, &rect); - - rect.y2 = rect.y1 + 18; - - { - rt_uint32_t dev_index, rev_index; - - dev_index = DBGMCU_GetDEVID(); - dev_index = (dev_index - 0x410)/2; - rev_index = DBGMCU_GetREVID(); - switch (rev_index) - { - case 0x1000: - case 0x0000: - rev_index = 0; /* Revision A */ - break; - - case 0x1001: - case 0x2001: - rev_index = 3; /* Revision Z */ - break; - - case 0x2000: - rev_index = 1; /* Revision B */ - break; - case 0x2002: - rev_index = 2; /* Revision Y */ - break; - - default: - rev_index = 4; /* Unknown */ - break; - }; - - /* check device index */ - if (dev_index > 4) dev_index = 3; - - /* draw each information */ - sprintf(line, "É豸: %s %s", - stm32_devname[dev_index], - stm32_revname[rev_index]); - rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; - } - - rt_memory_info(&total, &used, &max_used); - sprintf(line, "ÄÚ´æ: µ±Ç°Ê¹Óà %d ×Ö½Ú", used); - rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; - { - rt_uint16_t rect_width; - rtgui_color_t saved; - - rtgui_rect_t mem_rect = rect; - rtgui_rect_inflate(&mem_rect, -2); - rtgui_dc_draw_rect(dc, &mem_rect); - - rtgui_rect_inflate(&mem_rect, -1); - rect_width = rtgui_rect_width(mem_rect); - - saved = RTGUI_WIDGET_BACKGROUND(widget); - - RTGUI_WIDGET_BACKGROUND(widget) = light_grey; - mem_rect.x2 = mem_rect.x1 + (max_used * rect_width / total); - rtgui_dc_fill_rect(dc, &mem_rect); - - RTGUI_WIDGET_BACKGROUND(widget) = blue; - mem_rect.x2 = mem_rect.x1 + (used * rect_width / total); - rtgui_dc_fill_rect(dc, &mem_rect); - - /* restore color */ - RTGUI_WIDGET_BACKGROUND(widget) = saved; - } - rect.y1 += 18; rect.y2 += 18; - - sprintf(line, "Ïß³ÌÊý: %d", get_thread_cnt()); - rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; - -#ifdef RT_USING_LWIP - { - struct ip_addr ip_addr; - struct _ip_addr - { - rt_uint8_t addr0, addr1, addr2, addr3; - } *addr; - - addr = (struct _ip_addr*)&netif_default->ip_addr.addr; - - sprintf(line, "IPµØÖ· : %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); - rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; - - addr = (struct _ip_addr*)&netif_default->gw.addr; - sprintf(line, "Íø¹ØµØÖ·: %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); - rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; - - addr = (struct _ip_addr*)&netif_default->netmask.addr; - sprintf(line, "ÍøÂçÑÚÂë: %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); - rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; - -#if LWIP_DNS - ip_addr = dns_getserver(0); - addr = (struct _ip_addr*)&ip_addr; - sprintf(line, "DNSµØÖ· : %d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3); - rtgui_dc_draw_text(dc, line, &rect); rect.y1 += 16; rect.y2 += 16; -#endif - } -#endif - - rtgui_dc_end_drawing(dc); - rtgui_free(line); - return RT_FALSE; - } - - case RTGUI_EVENT_KBD: - { - struct rtgui_event_kbd* ekbd; - - ekbd = (struct rtgui_event_kbd*)event; - if (ekbd->type == RTGUI_KEYDOWN && ekbd->key == RTGUIK_RETURN) - { - rtgui_workbench_t* workbench; - - workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(device_view)->parent); - rtgui_workbench_remove_view(workbench, device_view); - - rtgui_view_destroy(device_view); - device_view = RT_NULL; - } - } - return RT_FALSE; - } - - /* use parent event handler */ - return rtgui_view_event_handler(widget, event); -} - -rtgui_view_t *device_view_create(rtgui_workbench_t* workbench) -{ - if (device_view != RT_NULL) - { - rtgui_view_show(device_view, RT_FALSE); - } - else - { - /* create a view */ - device_view = rtgui_view_create("Device Info"); - /* set view event handler */ - rtgui_widget_set_event_handler(RTGUI_WIDGET(device_view), view_event_handler); - /* this view can be focused */ - RTGUI_WIDGET(device_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; - - /* add view to workbench */ - rtgui_workbench_add_view(workbench, device_view); - } - - return device_view; -} diff --git a/bsp/stm32_radio/dm9000.c b/bsp/stm32_radio/dm9000.c deleted file mode 100644 index 7d577d1543..0000000000 --- a/bsp/stm32_radio/dm9000.c +++ /dev/null @@ -1,677 +0,0 @@ -#include -#include "dm9000.h" - -#include -#include "lwipopts.h" -#include "stm32f10x.h" - -// #define DM9000_DEBUG 1 -#if ( DM9000_DEBUG == 1 ) -#define DM9000_TRACE rt_kprintf -#else -#define DM9000_TRACE(...) -#endif - -/* - * DM9000 interrupt line is connected to PF7 - */ -//-------------------------------------------------------- - -#define DM9000_PHY 0x40 /* PHY address 0x01 */ -#define RST_1() GPIO_SetBits(GPIOE,GPIO_Pin_5) -#define RST_0() GPIO_ResetBits(GPIOE,GPIO_Pin_5) - -#define MAX_ADDR_LEN 6 -enum DM9000_PHY_mode -{ - DM9000_10MHD = 0, DM9000_100MHD = 1, - DM9000_10MFD = 4, DM9000_100MFD = 5, - DM9000_AUTO = 8, DM9000_1M_HPNA = 0x10 -}; - -enum DM9000_TYPE -{ - TYPE_DM9000E, - TYPE_DM9000A, - TYPE_DM9000B -}; - -struct rt_dm9000_eth -{ - /* inherit from ethernet device */ - struct eth_device parent; - - enum DM9000_TYPE type; - enum DM9000_PHY_mode mode; - - rt_uint8_t imr_all; - - rt_uint8_t packet_cnt; /* packet I or II */ - rt_uint16_t queue_packet_len; /* queued packet (packet II) */ - - /* interface address info. */ - rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */ -}; -static struct rt_dm9000_eth dm9000_device; -static struct rt_semaphore sem_ack, sem_lock; - -void rt_dm9000_isr(void); - -static void delay_ms(rt_uint32_t ms) -{ - rt_uint32_t len; - for (; ms > 0; ms --) - for (len = 0; len < 100; len++ ); -} - -/* Read a byte from I/O port */ -rt_inline rt_uint8_t dm9000_io_read(rt_uint16_t reg) -{ - DM9000_IO = reg; - return (rt_uint8_t) DM9000_DATA; -} - -/* Write a byte to I/O port */ -rt_inline void dm9000_io_write(rt_uint16_t reg, rt_uint16_t value) -{ - DM9000_IO = reg; - DM9000_DATA = value; -} - -/* Read a word from phyxcer */ -rt_inline rt_uint16_t phy_read(rt_uint16_t reg) -{ - rt_uint16_t val; - - /* Fill the phyxcer register into REG_0C */ - dm9000_io_write(DM9000_EPAR, DM9000_PHY | reg); - dm9000_io_write(DM9000_EPCR, 0xc); /* Issue phyxcer read command */ - - delay_ms(100); /* Wait read complete */ - - dm9000_io_write(DM9000_EPCR, 0x0); /* Clear phyxcer read command */ - val = (dm9000_io_read(DM9000_EPDRH) << 8) | dm9000_io_read(DM9000_EPDRL); - - return val; -} - -/* Write a word to phyxcer */ -rt_inline void phy_write(rt_uint16_t reg, rt_uint16_t value) -{ - /* Fill the phyxcer register into REG_0C */ - dm9000_io_write(DM9000_EPAR, DM9000_PHY | reg); - - /* Fill the written data into REG_0D & REG_0E */ - dm9000_io_write(DM9000_EPDRL, (value & 0xff)); - dm9000_io_write(DM9000_EPDRH, ((value >> 8) & 0xff)); - dm9000_io_write(DM9000_EPCR, 0xa); /* Issue phyxcer write command */ - - delay_ms(500); /* Wait write complete */ - - dm9000_io_write(DM9000_EPCR, 0x0); /* Clear phyxcer write command */ -} - -/* Set PHY operationg mode */ -rt_inline void phy_mode_set(rt_uint32_t media_mode) -{ - rt_uint16_t phy_reg4 = 0x01e1, phy_reg0 = 0x1000; - if (!(media_mode & DM9000_AUTO)) - { - switch (media_mode) - { - case DM9000_10MHD: - phy_reg4 = 0x21; - phy_reg0 = 0x0000; - break; - case DM9000_10MFD: - phy_reg4 = 0x41; - phy_reg0 = 0x1100; - break; - case DM9000_100MHD: - phy_reg4 = 0x81; - phy_reg0 = 0x2000; - break; - case DM9000_100MFD: - phy_reg4 = 0x101; - phy_reg0 = 0x3100; - break; - } - phy_write(4, phy_reg4); /* Set PHY media mode */ - phy_write(0, phy_reg0); /* Tmp */ - } - - dm9000_io_write(DM9000_GPCR, 0x01); /* Let GPIO0 output */ - dm9000_io_write(DM9000_GPR, 0x00); /* Enable PHY */ -} - -/* interrupt service routine */ -void rt_dm9000_isr() -{ - rt_uint16_t int_status; - rt_uint16_t last_io; - - last_io = DM9000_IO; - - /* Disable all interrupts */ - dm9000_io_write(DM9000_IMR, IMR_PAR); - - /* Got DM9000 interrupt status */ - int_status = dm9000_io_read(DM9000_ISR); /* Got ISR */ - dm9000_io_write(DM9000_ISR, int_status); /* Clear ISR status */ - - DM9000_TRACE("dm9000 isr: int status %04x\n", int_status); - - /* receive overflow */ - if (int_status & ISR_ROS) - { - rt_kprintf("overflow\n"); - } - - if (int_status & ISR_ROOS) - { - rt_kprintf("overflow counter overflow\n"); - } - - /* Received the coming packet */ - if (int_status & ISR_PRS) - { - /* disable receive interrupt */ - dm9000_device.imr_all = IMR_PAR | IMR_PTM; - - /* a frame has been received */ - eth_device_ready(&(dm9000_device.parent)); - } - - /* Transmit Interrupt check */ - if (int_status & ISR_PTS) - { - /* transmit done */ - int tx_status = dm9000_io_read(DM9000_NSR); /* Got TX status */ - - if (tx_status & (NSR_TX2END | NSR_TX1END)) - { - dm9000_device.packet_cnt --; - if (dm9000_device.packet_cnt > 0) - { - DM9000_TRACE("dm9000 isr: tx second packet\n"); - - /* transmit packet II */ - /* Set TX length to DM9000 */ - dm9000_io_write(DM9000_TXPLL, dm9000_device.queue_packet_len & 0xff); - dm9000_io_write(DM9000_TXPLH, (dm9000_device.queue_packet_len >> 8) & 0xff); - - /* Issue TX polling command */ - dm9000_io_write(DM9000_TCR, TCR_TXREQ); /* Cleared after TX complete */ - } - - /* One packet sent complete */ - rt_sem_release(&sem_ack); - } - } - - /* Re-enable interrupt mask */ - dm9000_io_write(DM9000_IMR, dm9000_device.imr_all); - - DM9000_IO = last_io; -} - -/* RT-Thread Device Interface */ -/* initialize the interface */ -static rt_err_t rt_dm9000_init(rt_device_t dev) -{ - int i, oft, lnk; - rt_uint32_t value; - - /* RESET device */ - dm9000_io_write(DM9000_NCR, NCR_RST); - delay_ms(1000); /* delay 1ms */ - - /* identfy DM9000 */ - value = dm9000_io_read(DM9000_VIDL); - value |= dm9000_io_read(DM9000_VIDH) << 8; - value |= dm9000_io_read(DM9000_PIDL) << 16; - value |= dm9000_io_read(DM9000_PIDH) << 24; - if (value == DM9000_ID) - { - rt_kprintf("dm9000 id: 0x%x\n", value); - } - else - { - return -RT_ERROR; - } - - /* GPIO0 on pre-activate PHY */ - dm9000_io_write(DM9000_GPR, 0x00); /* REG_1F bit0 activate phyxcer */ - dm9000_io_write(DM9000_GPCR, GPCR_GEP_CNTL); /* Let GPIO0 output */ - dm9000_io_write(DM9000_GPR, 0x00); /* Enable PHY */ - - /* Set PHY */ - phy_mode_set(dm9000_device.mode); - - /* Program operating register */ - dm9000_io_write(DM9000_NCR, 0x0); /* only intern phy supported by now */ - dm9000_io_write(DM9000_TCR, 0); /* TX Polling clear */ - dm9000_io_write(DM9000_BPTR, 0x3f); /* Less 3Kb, 200us */ - dm9000_io_write(DM9000_FCTR, FCTR_HWOT(3) | FCTR_LWOT(8)); /* Flow Control : High/Low Water */ - dm9000_io_write(DM9000_FCR, 0x0); /* SH FIXME: This looks strange! Flow Control */ - dm9000_io_write(DM9000_SMCR, 0); /* Special Mode */ - dm9000_io_write(DM9000_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END); /* clear TX status */ - dm9000_io_write(DM9000_ISR, 0x0f); /* Clear interrupt status */ - dm9000_io_write(DM9000_TCR2, 0x80); /* Switch LED to mode 1 */ - - /* set mac address */ - for (i = 0, oft = 0x10; i < 6; i++, oft++) - dm9000_io_write(oft, dm9000_device.dev_addr[i]); - /* set multicast address */ - for (i = 0, oft = 0x16; i < 8; i++, oft++) - dm9000_io_write(oft, 0xff); - - /* Activate DM9000 */ - dm9000_io_write(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN); /* RX enable */ - dm9000_io_write(DM9000_IMR, IMR_PAR); - - if (dm9000_device.mode == DM9000_AUTO) - { - while (!(phy_read(1) & 0x20)) - { - /* autonegation complete bit */ - rt_thread_delay(10); - i++; - if (i == 10000) - { - rt_kprintf("could not establish link\n"); - return 0; - } - } - } - - /* see what we've got */ - lnk = phy_read(17) >> 12; - rt_kprintf("operating at "); - switch (lnk) - { - case 1: - rt_kprintf("10M half duplex "); - break; - case 2: - rt_kprintf("10M full duplex "); - break; - case 4: - rt_kprintf("100M half duplex "); - break; - case 8: - rt_kprintf("100M full duplex "); - break; - default: - rt_kprintf("unknown: %d ", lnk); - break; - } - rt_kprintf("mode\n"); - - dm9000_io_write(DM9000_IMR, dm9000_device.imr_all); /* Enable TX/RX interrupt mask */ - - return RT_EOK; -} - -static rt_err_t rt_dm9000_open(rt_device_t dev, rt_uint16_t oflag) -{ - return RT_EOK; -} - -static rt_err_t rt_dm9000_close(rt_device_t dev) -{ - /* RESET devie */ - phy_write(0, 0x8000); /* PHY RESET */ - dm9000_io_write(DM9000_GPR, 0x01); /* Power-Down PHY */ - dm9000_io_write(DM9000_IMR, 0x80); /* Disable all interrupt */ - dm9000_io_write(DM9000_RCR, 0x00); /* Disable RX */ - - return RT_EOK; -} - -static rt_size_t rt_dm9000_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) -{ - rt_set_errno(-RT_ENOSYS); - return 0; -} - -static rt_size_t rt_dm9000_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) -{ - rt_set_errno(-RT_ENOSYS); - return 0; -} - -static rt_err_t rt_dm9000_control(rt_device_t dev, rt_uint8_t cmd, void *args) -{ - switch (cmd) - { - case NIOCTL_GADDR: - /* get mac address */ - if (args) rt_memcpy(args, dm9000_device.dev_addr, 6); - else return -RT_ERROR; - break; - - default : - break; - } - - return RT_EOK; -} - -/* ethernet device interface */ -/* transmit packet. */ -rt_err_t rt_dm9000_tx( rt_device_t dev, struct pbuf* p) -{ - DM9000_TRACE("dm9000 tx: %d\n", p->tot_len); - - /* lock DM9000 device */ - rt_sem_take(&sem_lock, RT_WAITING_FOREVER); - - /* disable dm9000a interrupt */ - dm9000_io_write(DM9000_IMR, IMR_PAR); - - /* Move data to DM9000 TX RAM */ - DM9000_outb(DM9000_IO_BASE, DM9000_MWCMD); - - { - /* q traverses through linked list of pbuf's - * This list MUST consist of a single packet ONLY */ - struct pbuf *q; - rt_uint16_t pbuf_index = 0; - rt_uint8_t word[2], word_index = 0; - - q = p; - /* Write data into dm9000a, two bytes at a time - * Handling pbuf's with odd number of bytes correctly - * No attempt to optimize for speed has been made */ - while (q) - { - if (pbuf_index < q->len) - { - word[word_index++] = ((u8_t*)q->payload)[pbuf_index++]; - if (word_index == 2) - { - DM9000_outw(DM9000_DATA_BASE, (word[1] << 8) | word[0]); - word_index = 0; - } - } - else - { - q = q->next; - pbuf_index = 0; - } - } - /* One byte could still be unsent */ - if (word_index == 1) - { - DM9000_outw(DM9000_DATA_BASE, word[0]); - } - } - - if (dm9000_device.packet_cnt == 0) - { - DM9000_TRACE("dm9000 tx: first packet\n"); - - dm9000_device.packet_cnt ++; - /* Set TX length to DM9000 */ - dm9000_io_write(DM9000_TXPLL, p->tot_len & 0xff); - dm9000_io_write(DM9000_TXPLH, (p->tot_len >> 8) & 0xff); - - /* Issue TX polling command */ - dm9000_io_write(DM9000_TCR, TCR_TXREQ); /* Cleared after TX complete */ - } - else - { - DM9000_TRACE("dm9000 tx: second packet\n"); - - dm9000_device.packet_cnt ++; - dm9000_device.queue_packet_len = p->tot_len; - } - - /* enable dm9000a interrupt */ - dm9000_io_write(DM9000_IMR, dm9000_device.imr_all); - - /* unlock DM9000 device */ - rt_sem_release(&sem_lock); - - /* wait ack */ - rt_sem_take(&sem_ack, RT_WAITING_FOREVER); - - DM9000_TRACE("dm9000 tx done\n"); - - return RT_EOK; -} - -/* reception packet. */ -struct pbuf *rt_dm9000_rx(rt_device_t dev) -{ - struct pbuf* p; - rt_uint32_t rxbyte; - - /* init p pointer */ - p = RT_NULL; - - /* lock DM9000 device */ - rt_sem_take(&sem_lock, RT_WAITING_FOREVER); - - /* Check packet ready or not */ - dm9000_io_read(DM9000_MRCMDX); /* Dummy read */ - rxbyte = DM9000_inb(DM9000_DATA_BASE); /* Got most updated data */ - if (rxbyte) - { - rt_uint16_t rx_status, rx_len; - rt_uint16_t* data; - - if (rxbyte > 1) - { - DM9000_TRACE("dm9000 rx: rx error, stop device\n"); - - dm9000_io_write(DM9000_RCR, 0x00); /* Stop Device */ - dm9000_io_write(DM9000_ISR, 0x80); /* Stop INT request */ - } - - /* A packet ready now & Get status/length */ - DM9000_outb(DM9000_IO_BASE, DM9000_MRCMD); - - rx_status = DM9000_inw(DM9000_DATA_BASE); - rx_len = DM9000_inw(DM9000_DATA_BASE); - - DM9000_TRACE("dm9000 rx: status %04x len %d\n", rx_status, rx_len); - - /* allocate buffer */ - p = pbuf_alloc(PBUF_LINK, rx_len, PBUF_RAM); - if (p != RT_NULL) - { - struct pbuf* q; - rt_int32_t len; - - for (q = p; q != RT_NULL; q= q->next) - { - data = (rt_uint16_t*)q->payload; - len = q->len; - - while (len > 0) - { - *data = DM9000_inw(DM9000_DATA_BASE); - data ++; - len -= 2; - } - } - DM9000_TRACE("\n"); - } - else - { - rt_uint16_t dummy; - - rt_kprintf("dm9000 rx: no pbuf\n"); - - /* no pbuf, discard data from DM9000 */ - data = &dummy; - while (rx_len) - { - *data = DM9000_inw(DM9000_DATA_BASE); - rx_len -= 2; - } - } - - if ((rx_status & 0xbf00) || (rx_len < 0x40) - || (rx_len > DM9000_PKT_MAX)) - { - rt_kprintf("rx error: status %04x\n", rx_status); - - if (rx_status & 0x100) - { - rt_kprintf("rx fifo error\n"); - } - if (rx_status & 0x200) - { - rt_kprintf("rx crc error\n"); - } - if (rx_status & 0x8000) - { - rt_kprintf("rx length error\n"); - } - if (rx_len > DM9000_PKT_MAX) - { - rt_kprintf("rx length too big\n"); - - /* RESET device */ - dm9000_io_write(DM9000_NCR, NCR_RST); - rt_thread_delay(1); /* delay 5ms */ - } - - /* it issues an error, release pbuf */ - if (p != RT_NULL) pbuf_free(p); - p = RT_NULL; - } - } - else - { - /* restore receive interrupt */ - dm9000_device.imr_all = IMR_PAR | IMR_PTM | IMR_PRM; - dm9000_io_write(DM9000_IMR, dm9000_device.imr_all); - } - - /* unlock DM9000 device */ - rt_sem_release(&sem_lock); - - return p; -} - -static void RCC_Configuration(void) -{ - /* enable gpiob port clock */ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); -} - -static void NVIC_Configuration(void) -{ - NVIC_InitTypeDef NVIC_InitStructure; - - /* Enable the EXTI0 Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -} - -static void GPIO_Configuration() -{ - GPIO_InitTypeDef GPIO_InitStructure; - EXTI_InitTypeDef EXTI_InitStructure; - - /* configure PE5 as eth RST */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOE,&GPIO_InitStructure); - GPIO_SetBits(GPIOE,GPIO_Pin_5); - //RST_1(); - - /* configure PE4 as external interrupt */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; - GPIO_Init(GPIOE, &GPIO_InitStructure); - - /* Connect DM9000 EXTI Line to GPIOE Pin 4 */ - GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); - - /* Configure DM9000 EXTI Line to generate an interrupt on falling edge */ - EXTI_InitStructure.EXTI_Line = EXTI_Line4; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); - - /* Clear DM9000A EXTI line pending bit */ - EXTI_ClearITPendingBit(EXTI_Line4); -} - -void rt_hw_dm9000_init(void) -{ - RCC_Configuration(); - NVIC_Configuration(); - GPIO_Configuration(); - - rt_sem_init(&sem_ack, "tx_ack", 1, RT_IPC_FLAG_FIFO); - rt_sem_init(&sem_lock, "eth_lock", 1, RT_IPC_FLAG_FIFO); - - dm9000_device.type = TYPE_DM9000A; - dm9000_device.mode = DM9000_AUTO; - dm9000_device.packet_cnt = 0; - dm9000_device.queue_packet_len = 0; - - /* - * SRAM Tx/Rx pointer automatically return to start address, - * Packet Transmitted, Packet Received - */ - dm9000_device.imr_all = IMR_PAR | IMR_PTM | IMR_PRM; - - /* set mac address: (only for test) */ - /* oui 00-60-6E DAVICOM SEMICONDUCTOR, INC.*/ - dm9000_device.dev_addr[0] = 0x00; - dm9000_device.dev_addr[1] = 0x60; - dm9000_device.dev_addr[2] = 0x6E; - dm9000_device.dev_addr[3] = 0x11; - dm9000_device.dev_addr[4] = 0x22; - dm9000_device.dev_addr[5] = 0x33; - - dm9000_device.parent.parent.init = rt_dm9000_init; - dm9000_device.parent.parent.open = rt_dm9000_open; - dm9000_device.parent.parent.close = rt_dm9000_close; - dm9000_device.parent.parent.read = rt_dm9000_read; - dm9000_device.parent.parent.write = rt_dm9000_write; - dm9000_device.parent.parent.control = rt_dm9000_control; - dm9000_device.parent.parent.private = RT_NULL; - - dm9000_device.parent.eth_rx = rt_dm9000_rx; - dm9000_device.parent.eth_tx = rt_dm9000_tx; - - eth_device_init(&(dm9000_device.parent), "e0"); -} - -void dm9000(void) -{ - rt_kprintf("\n"); - rt_kprintf("NCR (0x00): %02x\n", dm9000_io_read(DM9000_NCR)); - rt_kprintf("NSR (0x01): %02x\n", dm9000_io_read(DM9000_NSR)); - rt_kprintf("TCR (0x02): %02x\n", dm9000_io_read(DM9000_TCR)); - rt_kprintf("TSRI (0x03): %02x\n", dm9000_io_read(DM9000_TSR1)); - rt_kprintf("TSRII (0x04): %02x\n", dm9000_io_read(DM9000_TSR2)); - rt_kprintf("RCR (0x05): %02x\n", dm9000_io_read(DM9000_RCR)); - rt_kprintf("RSR (0x06): %02x\n", dm9000_io_read(DM9000_RSR)); - rt_kprintf("ORCR (0x07): %02x\n", dm9000_io_read(DM9000_ROCR)); - rt_kprintf("CRR (0x2C): %02x\n", dm9000_io_read(DM9000_CHIPR)); - rt_kprintf("CSCR (0x31): %02x\n", dm9000_io_read(DM9000_CSCR)); - rt_kprintf("RCSSR (0x32): %02x\n", dm9000_io_read(DM9000_RCSSR)); - rt_kprintf("ISR (0xFE): %02x\n", dm9000_io_read(DM9000_ISR)); - rt_kprintf("IMR (0xFF): %02x\n", dm9000_io_read(DM9000_IMR)); - rt_kprintf("\n"); -} - -#ifdef RT_USING_FINSH -#include -FINSH_FUNCTION_EXPORT(dm9000, dm9000 register dump); -#endif diff --git a/bsp/stm32_radio/dm9000.h b/bsp/stm32_radio/dm9000.h deleted file mode 100644 index c99e6b120e..0000000000 --- a/bsp/stm32_radio/dm9000.h +++ /dev/null @@ -1,151 +0,0 @@ -#ifndef __DM9000_H__ -#define __DM9000_H__ - -#define DM9000_IO_BASE 0x6C000000 -#define DM9000_DATA_BASE 0x6C000008 - -#define DM9000_IO (*((volatile rt_uint16_t *) 0x6C000000)) // CMD = 0 -#define DM9000_DATA (*((volatile rt_uint16_t *) 0x6C000008)) // CMD = 1 - -#define DM9000_inb(r) (*(volatile rt_uint8_t *)r) -#define DM9000_outb(r, d) (*(volatile rt_uint8_t *)r = d) -#define DM9000_inw(r) (*(volatile rt_uint16_t *)r) -#define DM9000_outw(r, d) (*(volatile rt_uint16_t *)r = d) - -#define RST_1() GPIO_SetBits(GPIOE,GPIO_Pin_5) -#define RST_0() GPIO_ResetBits(GPIOE,GPIO_Pin_5) - -#define DM9000_ID 0x90000A46 /* DM9000 ID */ -#define DM9000_PKT_MAX 1536 /* Received packet max size */ -#define DM9000_PKT_RDY 0x01 /* Packet ready to receive */ - -#define DM9000_NCR 0x00 -#define DM9000_NSR 0x01 -#define DM9000_TCR 0x02 -#define DM9000_TSR1 0x03 -#define DM9000_TSR2 0x04 -#define DM9000_RCR 0x05 -#define DM9000_RSR 0x06 -#define DM9000_ROCR 0x07 -#define DM9000_BPTR 0x08 -#define DM9000_FCTR 0x09 -#define DM9000_FCR 0x0A -#define DM9000_EPCR 0x0B -#define DM9000_EPAR 0x0C -#define DM9000_EPDRL 0x0D -#define DM9000_EPDRH 0x0E -#define DM9000_WCR 0x0F - -#define DM9000_PAR 0x10 -#define DM9000_MAR 0x16 - -#define DM9000_GPCR 0x1e -#define DM9000_GPR 0x1f -#define DM9000_TRPAL 0x22 -#define DM9000_TRPAH 0x23 -#define DM9000_RWPAL 0x24 -#define DM9000_RWPAH 0x25 - -#define DM9000_VIDL 0x28 -#define DM9000_VIDH 0x29 -#define DM9000_PIDL 0x2A -#define DM9000_PIDH 0x2B - -#define DM9000_CHIPR 0x2C -#define DM9000_TCR2 0x2D -#define DM9000_OTCR 0x2E -#define DM9000_SMCR 0x2F - -#define DM9000_ETCR 0x30 /* early transmit control/status register */ -#define DM9000_CSCR 0x31 /* check sum control register */ -#define DM9000_RCSSR 0x32 /* receive check sum status register */ - -#define DM9000_MRCMDX 0xF0 -#define DM9000_MRCMD 0xF2 -#define DM9000_MRRL 0xF4 -#define DM9000_MRRH 0xF5 -#define DM9000_MWCMDX 0xF6 -#define DM9000_MWCMD 0xF8 -#define DM9000_MWRL 0xFA -#define DM9000_MWRH 0xFB -#define DM9000_TXPLL 0xFC -#define DM9000_TXPLH 0xFD -#define DM9000_ISR 0xFE -#define DM9000_IMR 0xFF - -#define CHIPR_DM9000A 0x19 -#define CHIPR_DM9000B 0x1B - -#define NCR_EXT_PHY (1<<7) -#define NCR_WAKEEN (1<<6) -#define NCR_FCOL (1<<4) -#define NCR_FDX (1<<3) -#define NCR_LBK (3<<1) -#define NCR_RST (1<<0) - -#define NSR_SPEED (1<<7) -#define NSR_LINKST (1<<6) -#define NSR_WAKEST (1<<5) -#define NSR_TX2END (1<<3) -#define NSR_TX1END (1<<2) -#define NSR_RXOV (1<<1) - -#define TCR_TJDIS (1<<6) -#define TCR_EXCECM (1<<5) -#define TCR_PAD_DIS2 (1<<4) -#define TCR_CRC_DIS2 (1<<3) -#define TCR_PAD_DIS1 (1<<2) -#define TCR_CRC_DIS1 (1<<1) -#define TCR_TXREQ (1<<0) - -#define TSR_TJTO (1<<7) -#define TSR_LC (1<<6) -#define TSR_NC (1<<5) -#define TSR_LCOL (1<<4) -#define TSR_COL (1<<3) -#define TSR_EC (1<<2) - -#define RCR_WTDIS (1<<6) -#define RCR_DIS_LONG (1<<5) -#define RCR_DIS_CRC (1<<4) -#define RCR_ALL (1<<3) -#define RCR_RUNT (1<<2) -#define RCR_PRMSC (1<<1) -#define RCR_RXEN (1<<0) - -#define RSR_RF (1<<7) -#define RSR_MF (1<<6) -#define RSR_LCS (1<<5) -#define RSR_RWTO (1<<4) -#define RSR_PLE (1<<3) -#define RSR_AE (1<<2) -#define RSR_CE (1<<1) -#define RSR_FOE (1<<0) - -#define FCTR_HWOT(ot) (( ot & 0xf ) << 4 ) -#define FCTR_LWOT(ot) ( ot & 0xf ) - -#define IMR_PAR (1<<7) -#define IMR_ROOM (1<<3) -#define IMR_ROM (1<<2) -#define IMR_PTM (1<<1) -#define IMR_PRM (1<<0) - -#define ISR_ROOS (1<<3) -#define ISR_ROS (1<<2) -#define ISR_PTS (1<<1) -#define ISR_PRS (1<<0) -#define ISR_CLR_STATUS (ISR_ROOS | ISR_ROS | ISR_PTS | ISR_PRS) - -#define EPCR_REEP (1<<5) -#define EPCR_WEP (1<<4) -#define EPCR_EPOS (1<<3) -#define EPCR_ERPRR (1<<2) -#define EPCR_ERPRW (1<<1) -#define EPCR_ERRE (1<<0) - -#define GPCR_GEP_CNTL (1<<0) - -void rt_hw_dm9000_init(void); - -#endif diff --git a/bsp/stm32_radio/fmt0371/fmt0371.c b/bsp/stm32_radio/fmt0371/fmt0371.c deleted file mode 100644 index dea9e26614..0000000000 --- a/bsp/stm32_radio/fmt0371/fmt0371.c +++ /dev/null @@ -1,209 +0,0 @@ -#include "fmt0371.h" -#include "stm32f10x.h" - -#define FSMC_GPIO_CONFIG - -//static void delay_ms(unsigned int dt) -//{ -// volatile unsigned int u; -// for (u=0;u>8; - LCD_DATA = data; -} - -rt_inline rt_uint16_t LCD_DATA16_READ(void) -{ - rt_uint16_t temp; - temp = (LCD_DATA << 8); - temp |= LCD_DATA; - return temp; -} -#define LCD_WR_CMD(a,b,c) LCD_ADDR = b;LCD_DATA16(c) -#define LCD_WR_REG(a) LCD_ADDR = a -#define LCD_WR_DATA8(a) LCD_DATA = a - -extern void ftm0371_port_init(void); -extern void ftm0371_init(void); - -/* -16λ(R5G6B5) -Äڴ淶Χ -0x02 D7:D0 XÆðʼµØÖ· -0x03 D8:D0 YÆðʼµØÖ· -0x04 D7:D0 X½áÊøµØÖ· -0x05 D8:D0 Y½áÊøµØÖ· -*/ - -#endif // FMT0371_H_INCLUDED diff --git a/bsp/stm32_radio/fsmc_nand.c b/bsp/stm32_radio/fsmc_nand.c deleted file mode 100644 index 2df5d50613..0000000000 --- a/bsp/stm32_radio/fsmc_nand.c +++ /dev/null @@ -1,467 +0,0 @@ -/******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** -* File Name : fsmc_nand.c -* Author : MCD Application Team -* Version : V2.0.3 -* Date : 09/22/2008 -* Description : This file provides a set of functions needed to drive the -* NAND512W3A2 memory mounted on STM3210E-EVAL board. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -/* Includes ------------------------------------------------------------------*/ -#include "fsmc_nand.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -#define FSMC_Bank_NAND FSMC_Bank2_NAND -#define Bank_NAND_ADDR Bank2_NAND_ADDR -#define Bank2_NAND_ADDR ((u32)0x70000000) - -/* Private macro -------------------------------------------------------------*/ -#define ROW_ADDRESS (Address.Page + (Address.Block + (Address.Zone * NAND_ZONE_SIZE)) * NAND_BLOCK_SIZE) - -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/******************************************************************************* -* Function Name : FSMC_NAND_Init -* Description : Configures the FSMC and GPIOs to interface with the NAND memory. -* This function must be called before any write/read operation -* on the NAND. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void FSMC_NAND_Init(void) -{ - FSMC_NANDInitTypeDef FSMC_NANDInitStructure; - FSMC_NAND_PCCARDTimingInitTypeDef p; - - /*-- FSMC Configuration ------------------------------------------------------*/ - p.FSMC_SetupTime = 0x1; - p.FSMC_WaitSetupTime = 0x3; - p.FSMC_HoldSetupTime = 0x2; - p.FSMC_HiZSetupTime = 0x1; - - FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND; - FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable; - FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; - FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable; - FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_512Bytes; -// FSMC_NANDInitStructure.FSMC_AddressLowMapping = FSMC_AddressLowMapping_Direct; - FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00; - FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00; - FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p; - FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p; - - FSMC_NANDInit(&FSMC_NANDInitStructure); - - /* FSMC NAND Bank Cmd Test */ - FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_ReadID -* Description : Reads NAND memory's ID. -* Input : - NAND_ID: pointer to a NAND_IDTypeDef structure which will hold -* the Manufacturer and Device ID. -* Output : None -* Return : None -*******************************************************************************/ -void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID) -{ - u32 data = 0; - - /* Send Command to the command area */ - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = 0x90; - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00; - - /* Sequence to read ID from NAND flash */ - data = *(vu32 *)(Bank_NAND_ADDR | DATA_AREA); - - NAND_ID->Maker_ID = ADDR_1st_CYCLE (data); - NAND_ID->Device_ID = ADDR_2nd_CYCLE (data); - NAND_ID->Third_ID = ADDR_3rd_CYCLE (data); - NAND_ID->Fourth_ID = ADDR_4th_CYCLE (data); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_WriteSmallPage -* Description : This routine is for writing one or several 512 Bytes Page size. -* Input : - pBuffer: pointer on the Buffer containing data to be written -* - Address: First page address -* - NumPageToWrite: Number of page to write -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -* And the new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -u32 FSMC_NAND_WriteSmallPage(u8 *pBuffer, NAND_ADDRESS Address, u32 NumPageToWrite) -{ - u32 index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS; - u32 status = NAND_READY, size = 2048; - - while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY)) - { - /* Page write command and address */ - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_A; - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0; - - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_5fh_CYCLE(ROW_ADDRESS); - - /* Calculate the size */ - size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten); - - - /* Write data */ - for(; index < size; index++) - { - *(vu8 *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index]; - } - - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1; - - /* Check status for successful operation */ - status = FSMC_NAND_GetStatus(); - - if(status == NAND_READY) - { - numpagewritten++; - - NumPageToWrite--; - - /* Calculate Next small page Address */ - addressstatus = FSMC_NAND_AddressIncrement(&Address); - } - } - - return (status | addressstatus); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_ReadSmallPage -* Description : This routine is for sequential read from one or several -* 512 Bytes Page size. -* Input : - pBuffer: pointer on the Buffer to fill -* - Address: First page address -* - NumPageToRead: Number of page to read -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -* And the new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -u32 FSMC_NAND_ReadSmallPage(u8 *pBuffer, NAND_ADDRESS Address, u32 NumPageToRead) -{ - u32 index = 0x00, numpageread = 0x00, addressstatus = NAND_VALID_ADDRESS; - u32 status = NAND_READY, size = 2048, i = 0; - - /* Calculate the size */ - size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpageread); - - while((NumPageToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS)) - { - /* Page Read command and page address */ - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_A; - - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_5fh_CYCLE(ROW_ADDRESS); - - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_TRUE1; - for(i = 0; i <= 10000; i++); - - /* Get Data into Buffer */ - for(; index < size; index++) - { - pBuffer[index]= *(vu8 *)(Bank_NAND_ADDR | DATA_AREA); - } - - numpageread++; - - NumPageToRead--; - - /* Calculate page address */ - addressstatus = FSMC_NAND_AddressIncrement(&Address); - } - - status = FSMC_NAND_GetStatus(); - - return (status | addressstatus); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_WriteSpareArea -* Description : This routine write the spare area information for the specified -* pages addresses. -* Input : - pBuffer: pointer on the Buffer containing data to be written -* - Address: First page address -* - NumSpareAreaTowrite: Number of Spare Area to write -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -* And the new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -u32 FSMC_NAND_WriteSpareArea(u8 *pBuffer, NAND_ADDRESS Address, u32 NumSpareAreaTowrite) -{ - u32 index = 0x00, numsparesreawritten = 0x00, addressstatus = NAND_VALID_ADDRESS; - u32 status = NAND_READY, size = 0x00; - - while((NumSpareAreaTowrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY)) - { - /* Page write Spare area command and address */ - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_C; - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0; - - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_5fh_CYCLE(ROW_ADDRESS); - /* Calculate the size */ - size = NAND_SPARE_AREA_SIZE + (NAND_SPARE_AREA_SIZE * numsparesreawritten); - - /* Write the data */ - for(; index < size; index++) - { - *(vu8 *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index]; - } - - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1; - - /* Check status for successful operation */ - status = FSMC_NAND_GetStatus(); - - if(status == NAND_READY) - { - numsparesreawritten++; - - NumSpareAreaTowrite--; - - /* Calculate Next page Address */ - addressstatus = FSMC_NAND_AddressIncrement(&Address); - } - } - - return (status | addressstatus); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_ReadSpareArea -* Description : This routine read the spare area information from the specified -* pages addresses. -* Input : - pBuffer: pointer on the Buffer to fill -* - Address: First page address -* - NumSpareAreaToRead: Number of Spare Area to read -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -* And the new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -u32 FSMC_NAND_ReadSpareArea(u8 *pBuffer, NAND_ADDRESS Address, u32 NumSpareAreaToRead) -{ - u32 numsparearearead = 0x00, index = 0x00, addressstatus = NAND_VALID_ADDRESS; - u32 status = NAND_READY, size = 0x00; - - while((NumSpareAreaToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS)) - { - /* Page Read command and page address */ - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_C; - - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_5fh_CYCLE(ROW_ADDRESS); - - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_TRUE1; - - /* Data Read */ - size = NAND_SPARE_AREA_SIZE + (NAND_SPARE_AREA_SIZE * numsparearearead); - - /* Get Data into Buffer */ - for ( ; index < size; index++) - { - pBuffer[index] = *(vu8 *)(Bank_NAND_ADDR | DATA_AREA); - } - - numsparearearead++; - - NumSpareAreaToRead--; - - /* Calculate page address */ - addressstatus = FSMC_NAND_AddressIncrement(&Address); - } - - status = FSMC_NAND_GetStatus(); - - return (status | addressstatus); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_EraseBlock -* Description : This routine erase complete block from NAND FLASH -* Input : - Address: Any address into block to be erased -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -*******************************************************************************/ -u32 FSMC_NAND_EraseBlock(NAND_ADDRESS Address) -{ - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_ERASE0; - - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(ROW_ADDRESS); - *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_5fh_CYCLE(ROW_ADDRESS); - - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_ERASE1; - - return (FSMC_NAND_GetStatus()); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_Reset -* Description : This routine reset the NAND FLASH -* Input : None -* Output : None -* Return : NAND_READY -*******************************************************************************/ -u32 FSMC_NAND_Reset(void) -{ - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_RESET; - - return (NAND_READY); -} - -/****************************************************************************** -* Function Name : FSMC_NAND_GetStatus -* Description : Get the NAND operation status -* Input : None -* Output : None -* Return : New status of the NAND operation. This parameter can be: -* - NAND_TIMEOUT_ERROR: when the previous operation generate -* a Timeout error -* - NAND_READY: when memory is ready for the next operation -*******************************************************************************/ -u32 FSMC_NAND_GetStatus(void) -{ - u32 timeout = 0x1000000, status = NAND_READY; - - status = FSMC_NAND_ReadStatus(); - - /* Wait for a NAND operation to complete or a TIMEOUT to occur */ - while ((status != NAND_READY) &&( timeout != 0x00)) - { - status = FSMC_NAND_ReadStatus(); - timeout --; - } - - if(timeout == 0x00) - { - status = NAND_TIMEOUT_ERROR; - } - - /* Return the operation status */ - return (status); -} -/****************************************************************************** -* Function Name : FSMC_NAND_ReadStatus -* Description : Reads the NAND memory status using the Read status command -* Input : None -* Output : None -* Return : The status of the NAND memory. This parameter can be: -* - NAND_BUSY: when memory is busy -* - NAND_READY: when memory is ready for the next operation -* - NAND_ERROR: when the previous operation gererates error -*******************************************************************************/ -u32 FSMC_NAND_ReadStatus(void) -{ - u32 data = 0x00, status = NAND_BUSY; - - /* Read status operation ------------------------------------ */ - *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_STATUS; - data = *(vu8 *)(Bank_NAND_ADDR); - - if((data & NAND_ERROR) == NAND_ERROR) - { - status = NAND_ERROR; - } - else if((data & NAND_READY) == NAND_READY) - { - status = NAND_READY; - } - else - { - status = NAND_BUSY; - } - - return (status); -} - -/****************************************************************************** -* Function Name : NAND_AddressIncrement -* Description : Increment the NAND memory address -* Input : - Address: address to be incremented. -* Output : None -* Return : The new status of the increment address operation. It can be: -* - NAND_VALID_ADDRESS: When the new address is valid address -* - NAND_INVALID_ADDRESS: When the new address is invalid address -*******************************************************************************/ -u32 FSMC_NAND_AddressIncrement(NAND_ADDRESS* Address) -{ - u32 status = NAND_VALID_ADDRESS; - - Address->Page++; - - if(Address->Page == NAND_BLOCK_SIZE) - { - Address->Page = 0; - Address->Block++; - - if(Address->Block == NAND_ZONE_SIZE) - { - Address->Block = 0; - Address->Zone++; - - if(Address->Zone == NAND_MAX_ZONE) - { - status = NAND_INVALID_ADDRESS; - } - } - } - - return (status); -} - -/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/fsmc_nand.h b/bsp/stm32_radio/fsmc_nand.h deleted file mode 100644 index 9fa06239ed..0000000000 --- a/bsp/stm32_radio/fsmc_nand.h +++ /dev/null @@ -1,106 +0,0 @@ -/******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** -* File Name : fsmc_nand.h -* Author : MCD Application Team -* Version : V2.0.3 -* Date : 09/22/2008 -* Description : Header for fsmc_nand.c file. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FSMC_NAND_H -#define __FSMC_NAND_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/* Exported types ------------------------------------------------------------*/ -typedef struct -{ - u8 Maker_ID; - u8 Device_ID; - u8 Third_ID; - u8 Fourth_ID; -}NAND_IDTypeDef; - -typedef struct -{ - u16 Zone; - u16 Block; - u16 Page; -} NAND_ADDRESS; - -/* Exported constants --------------------------------------------------------*/ -/* NAND Area definition for STM3210E-EVAL Board RevD */ -#define CMD_AREA (u32)(1<<16) /* A16 = CLE high */ -#define ADDR_AREA (u32)(1<<17) /* A17 = ALE high */ - -#define DATA_AREA ((u32)0x00000000) - -/* FSMC NAND memory command */ -#define NAND_CMD_AREA_A ((u8)0x00) -#define NAND_CMD_AREA_B ((u8)0x01) -#define NAND_CMD_AREA_C ((u8)0x50) -#define NAND_CMD_AREA_TRUE1 ((u8)0x30) - -#define NAND_CMD_WRITE0 ((u8)0x80) -#define NAND_CMD_WRITE_TRUE1 ((u8)0x10) - -#define NAND_CMD_ERASE0 ((u8)0x60) -#define NAND_CMD_ERASE1 ((u8)0xD0) - -#define NAND_CMD_READID ((u8)0x90) -#define NAND_CMD_STATUS ((u8)0x70) -#define NAND_CMD_LOCK_STATUS ((u8)0x7A) -#define NAND_CMD_RESET ((u8)0xFF) - -/* NAND memory status */ -#define NAND_VALID_ADDRESS ((u32)0x00000100) -#define NAND_INVALID_ADDRESS ((u32)0x00000200) -#define NAND_TIMEOUT_ERROR ((u32)0x00000400) -#define NAND_BUSY ((u32)0x00000000) -#define NAND_ERROR ((u32)0x00000001) -#define NAND_READY ((u32)0x00000040) - -/* FSMC NAND memory parameters */ -//#define NAND_PAGE_SIZE ((u16)0x0200) /* 512 bytes per page w/o Spare Area */ -//#define NAND_BLOCK_SIZE ((u16)0x0020) /* 32x512 bytes pages per block */ -//#define NAND_ZONE_SIZE ((u16)0x0400) /* 1024 Block per zone */ -//#define NAND_SPARE_AREA_SIZE ((u16)0x0010) /* last 16 bytes as spare area */ -//#define NAND_MAX_ZONE ((u16)0x0004) /* 4 zones of 1024 block */ - -/* FSMC NAND memory parameters */ -#define NAND_PAGE_SIZE ((u16)0x0800) /* 2K bytes per page w/o Spare Area */ -#define NAND_BLOCK_SIZE ((u16)0x0040) /* 64x2K bytes pages per block */ -#define NAND_ZONE_SIZE ((u16)0x0400) /* 1024 Block per zone */ -#define NAND_SPARE_AREA_SIZE ((u16)0x0040) /* last 64 bytes as spare area */ -#define NAND_MAX_ZONE ((u16)0x0002) /* 1 zones of 2048 block */ - -/* FSMC NAND memory address computation */ -#define ADDR_1st_CYCLE(ADDR) (u8)((ADDR)& 0xFF) /* 1st addressing cycle */ -#define ADDR_2nd_CYCLE(ADDR) (u8)(((ADDR)& 0xFF00) >> 8) /* 2nd addressing cycle */ -#define ADDR_3rd_CYCLE(ADDR) (u8)(((ADDR)& 0xFF0000) >> 16) /* 3rd addressing cycle */ -#define ADDR_4th_CYCLE(ADDR) (u8)(((ADDR)& 0xFF000000) >> 24) /* 4th addressing cycle */ -#define ADDR_5fh_CYCLE(ADDR) (u8)(((ADDR)& 0xFF00000000) >> 32) /* 4th addressing cycle */ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void FSMC_NAND_Init(void); -void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID); -u32 FSMC_NAND_WriteSmallPage(u8 *pBuffer, NAND_ADDRESS Address, u32 NumPageToWrite); -u32 FSMC_NAND_ReadSmallPage (u8 *pBuffer, NAND_ADDRESS Address, u32 NumPageToRead); -u32 FSMC_NAND_WriteSpareArea(u8 *pBuffer, NAND_ADDRESS Address, u32 NumSpareAreaTowrite); -u32 FSMC_NAND_ReadSpareArea(u8 *pBuffer, NAND_ADDRESS Address, u32 NumSpareAreaToRead); -u32 FSMC_NAND_EraseBlock(NAND_ADDRESS Address); -u32 FSMC_NAND_Reset(void); -u32 FSMC_NAND_GetStatus(void); -u32 FSMC_NAND_ReadStatus(void); -u32 FSMC_NAND_AddressIncrement(NAND_ADDRESS* Address); - -#endif /* __FSMC_NAND_H */ - -/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/fsmc_sram.c b/bsp/stm32_radio/fsmc_sram.c deleted file mode 100644 index 538308d1bd..0000000000 --- a/bsp/stm32_radio/fsmc_sram.c +++ /dev/null @@ -1,74 +0,0 @@ -/******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** -* File Name : fsmc_sram.c -* Author : MCD Application Team -* Version : V2.0.3 -* Date : 09/22/2008 -* Description : This file provides a set of functions needed to drive the -* IS61WV51216BLL SRAM memory mounted on STM3210E-EVAL board. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ -#include "stm32f10x.h" -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define Bank1_SRAM3_ADDR ((u32)0x68000000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************* -* Function Name : FSMC_SRAM_Init -* Description : Configures the FSMC and GPIOs to interface with the SRAM memory. -* This function must be called before any write/read operation -* on the SRAM. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void FSMC_SRAM_Init(void) -{ - FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; - FSMC_NORSRAMTimingInitTypeDef p; - - /*-- FSMC Configuration ------------------------------------------------------*/ - p.FSMC_AddressSetupTime = 0; - p.FSMC_AddressHoldTime = 0; - p.FSMC_DataSetupTime = 2; - p.FSMC_BusTurnAroundDuration = 0; - p.FSMC_CLKDivision = 0; - p.FSMC_DataLatency = 0; - p.FSMC_AccessMode = FSMC_AccessMode_A; - - FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3; - FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; - FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; - FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; - FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; - FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; - FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; - FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; - FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; - FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; - - FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); - - FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4; - FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); - - /* Enable FSMC Bank1_SRAM Bank */ - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); -} - -/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/http.c b/bsp/stm32_radio/http.c deleted file mode 100644 index 7afb1b7d42..0000000000 --- a/bsp/stm32_radio/http.c +++ /dev/null @@ -1,671 +0,0 @@ -/* - * http client for RT-Thread - */ -#include "http.h" - -#include - -#include -#include - -const char _http_get[] = "GET %s HTTP/1.0\r\nHost: %s:%d\r\nUser-Agent: RT-Thread HTTP Agent\r\n\r\n"; -const char _shoutcast_get[] = "GET %s HTTP/1.0\r\nHost: %s:%d\r\nUser-Agent: RT-Thread HTTP Agent\r\nIcy-MetaData: 1\r\nConnection: close\r\n\r\n"; - -extern long int strtol(const char *nptr, char **endptr, int base); - -// -// This function will parse the Content-Length header line and return the file size -// -int http_parse_content_length(char *mime_buf) -{ - char *line; - - line = strstr(mime_buf, "CONTENT-LENGTH:"); - line += strlen("CONTENT-LENGTH:"); - - // Advance past any whitepace characters - while((*line == ' ') || (*line == '\t')) line++; - - return (int)strtol(line, RT_NULL, 10); -} - -// -// This function will parse the initial response header line and return 0 for a "200 OK", -// or return the error code in the event of an error (such as 404 - not found) -// -int http_is_error_header(char *mime_buf) -{ - char *line; - int i; - int code; - - line = strstr(mime_buf, "HTTP/1."); - line += strlen("HTTP/1."); - - // Advance past minor protocol version number - line++; - - // Advance past any whitespace characters - while((*line == ' ') || (*line == '\t')) line++; - - // Terminate string after status code - for(i = 0; ((line[i] != ' ') && (line[i] != '\t')); i++); - line[i] = '\0'; - - code = (int)strtol(line, RT_NULL, 10); - if( code == 200 ) - return 0; - else - return code; -} - -int shoutcast_is_error_header(char *mime_buf) -{ - char *line; - int i; - int code; - - line = strstr(mime_buf, "ICY"); - line += strlen("ICY"); - - // Advance past minor protocol version number - line++; - - // Advance past any whitespace characters - while((*line == ' ') || (*line == '\t')) line++; - - // Terminate string after status code - for(i = 0; ((line[i] != ' ') && (line[i] != '\t')); i++); - line[i] = '\0'; - - code = (int)strtol(line, RT_NULL, 10); - if( code == 200 ) - return 0; - else - return code; -} - -// -// When a request has been sent, we can expect mime headers to be -// before the data. We need to read exactly to the end of the headers -// and no more data. This readline reads a single char at a time. -// -int http_read_line( int socket, char * buffer, int size ) -{ - char * ptr = buffer; - int count = 0; - int rc; - - // Keep reading until we fill the buffer. - while ( count < size ) - { - rc = recv( socket, ptr, 1, 0 ); - if ( rc <= 0 ) return rc; - - if ((*ptr == '\n')) - { - ptr ++; - count++; - break; - } - - // increment after check for cr. Don't want to count the cr. - count++; - ptr++; - } - - // Terminate string - *ptr = '\0'; - - // return how many bytes read. - return count; -} - -/* - * resolve server address - * @param server the server sockaddress - * @param url the input URL address, for example, http://www.rt-thread.org/index.html - * @param host_addr the buffer pointer to save server host address - * @param request the pointer to point the request url, for example, /index.html - * - * @return 0 on resolve server address OK, others failed - */ -int http_resolve_address(struct sockaddr_in *server, const char * url, char *host_addr, char** request) -{ - char *ptr; - char port[6] = "80"; /* default port of 80(HTTP) */ - int i = 0, is_domain; - struct hostent *hptr; - - /* strip http: */ - ptr = strchr(url, ':'); - if (ptr != NULL) - { - url = ptr + 1; - } - - /* URL must start with double forward slashes. */ - if((url[0] != '/') || (url[1] != '/' )) return -1; - - url += 2; is_domain = 0; - i = 0; - /* allow specification of port in URL like http://www.server.net:8080/ */ - while (*url) - { - if (*url == '/') break; - if (*url == ':') - { - unsigned char w; - for (w = 0; w < 5 && url[w + 1] != '/' && url[w + 1] != '\0'; w ++) - port[w] = url[w + 1]; - - /* get port ok */ - port[w] = '\0'; - url += w + 1; - break; - } - - if ((*url < '0' || *url > '9') && *url != '.') - is_domain = 1; - host_addr[i++] = *url; - url ++; - } - *request = (char*)url; - - /* get host addr ok. */ - host_addr[i] = '\0'; - - if (is_domain) - { - /* resolve the host name. */ - hptr = gethostbyname(host_addr); - if(hptr == 0) - { - rt_kprintf("HTTP: failed to resolve domain '%s'\n", host_addr); - return -1; - } - memcpy(&server->sin_addr, *hptr->h_addr_list, sizeof(server->sin_addr)); - } - else - { - inet_aton(host_addr, (struct in_addr*)&(server->sin_addr)); - } - /* set the port */ - server->sin_port = htons((int) strtol(port, NULL, 10)); - server->sin_family = AF_INET; - - return 0; -} - -// -// This is the main HTTP client connect work. Makes the connection -// and handles the protocol and reads the return headers. Needs -// to leave the stream at the start of the real data. -// -static int http_connect(struct http_session* session, - struct sockaddr_in * server, char *host_addr, const char *url) -{ - int socket_handle; - int peer_handle; - int rc; - char mimeBuffer[100]; - - if((socket_handle = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP )) < 0) - { - rt_kprintf( "HTTP: SOCKET FAILED\n" ); - return -1; - } - - peer_handle = connect( socket_handle, (struct sockaddr *) server, sizeof(*server)); - if ( peer_handle < 0 ) - { - rt_kprintf( "HTTP: CONNECT FAILED %i\n", peer_handle ); - return -1; - } - - { - char *buf; - rt_uint32_t length; - - buf = rt_malloc (512); - if (*url) - length = rt_snprintf(buf, 512, _http_get, url, host_addr, server->sin_port); - else - length = rt_snprintf(buf, 512, _http_get, "/", host_addr, server->sin_port); - - rc = send(peer_handle, buf, length, 0); - rt_kprintf("HTTP request:\n%s", buf); - - /* release buffer */ - rt_free(buf); - } - - // We now need to read the header information - while ( 1 ) - { - int i; - - // read a line from the header information. - rc = http_read_line( peer_handle, mimeBuffer, 100 ); - rt_kprintf(">> %s\n", mimeBuffer); - - if ( rc < 0 ) return rc; - - // End of headers is a blank line. exit. - if (rc == 0) break; - if ((rc == 2) && (mimeBuffer[0] == '\r')) break; - - // Convert mimeBuffer to upper case, so we can do string comps - for(i = 0; i < strlen(mimeBuffer); i++) - mimeBuffer[i] = toupper(mimeBuffer[i]); - - if(strstr(mimeBuffer, "HTTP/1.")) // First line of header, contains status code. Check for an error code - { - rc = http_is_error_header(mimeBuffer); - if(rc) - { - rt_kprintf("HTTP: status code = %d!\n", rc); - return -rc; - } - } - - if(strstr(mimeBuffer, "CONTENT-LENGTH:")) - { - session->size = http_parse_content_length(mimeBuffer); - rt_kprintf("size = %d\n", session->size); - } - } - - // We've sent the request, and read the headers. SockHandle is - // now at the start of the main data read for a file io read. - return peer_handle; -} - -struct http_session* http_session_open(char* url) -{ - int peer_handle = 0; - struct sockaddr_in server; - char *request, host_addr[32]; - struct http_session* session; - - session = (struct http_session*) rt_malloc(sizeof(struct http_session)); - if(session == RT_NULL) return RT_NULL; - - session->size = 0; - session->position = 0; - - /* Check valid IP address and URL */ - if(http_resolve_address(&server, url, &host_addr[0], &request) != 0) - { - rt_free(session); - return RT_NULL; - } - - // Now we connect and initiate the transfer by sending a - // request header to the server, and receiving the response header - if((peer_handle = http_connect(session, &server, host_addr, request)) < 0) - { - rt_kprintf("HTTP: failed to connect to '%s'!\n", host_addr); - rt_free(session); - return RT_NULL; - } - - // http connect returns valid socket. Save in handle list. - session->socket = peer_handle; - - /* open successfully */ - return session; -} - -rt_size_t http_session_read(struct http_session* session, rt_uint8_t *buffer, rt_size_t length) -{ - int bytesRead = 0; - int totalRead = 0; - int left = length; - - // Read until: there is an error, we've read "size" bytes or the remote - // side has closed the connection. - do - { - bytesRead = recv(session->socket, buffer + totalRead, left, 0); - if(bytesRead <= 0) break; - - left -= bytesRead; - totalRead += bytesRead; - } while(left); - - return totalRead; -} - -rt_off_t http_session_seek(struct http_session* session, rt_off_t offset, int mode) -{ - switch(mode) - { - case SEEK_SET: - session->position = offset; - break; - - case SEEK_CUR: - session->position += offset; - break; - - case SEEK_END: - session->position = session->size + offset; - break; - } - - return session->position; -} - -int http_session_close(struct http_session* session) -{ - lwip_close(session->socket); - rt_free(session); - - return 0; -} - -// -// This is the main HTTP client connect work. Makes the connection -// and handles the protocol and reads the return headers. Needs -// to leave the stream at the start of the real data. -// -static int shoutcast_connect(struct shoutcast_session* session, - struct sockaddr_in* server, char* host_addr, const char* url) -{ - int socket_handle; - int peer_handle; - int rc; - char mimeBuffer[256]; - - if((socket_handle = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP )) < 0) - { - rt_kprintf( "ICY: SOCKET FAILED\n" ); - return -1; - } - - peer_handle = connect( socket_handle, (struct sockaddr *) server, sizeof(*server)); - if ( peer_handle < 0 ) - { - rt_kprintf( "ICY: CONNECT FAILED %i\n", peer_handle ); - return -1; - } - - { - char *buf; - rt_uint32_t length; - - buf = rt_malloc (512); - if (*url) - length = rt_snprintf(buf, 512, _shoutcast_get, url, host_addr, ntohs(server->sin_port)); - else - length = rt_snprintf(buf, 512, _shoutcast_get, "/", host_addr, ntohs(server->sin_port)); - - rc = send(peer_handle, buf, length, 0); - rt_kprintf("SHOUTCAST request:\n%s", buf); - - /* release buffer */ - rt_free(buf); - } - - /* read the header information */ - while ( 1 ) - { - // read a line from the header information. - rc = http_read_line(peer_handle, mimeBuffer, 100); - rt_kprintf(">>%s", mimeBuffer); - - if ( rc < 0 ) return rc; - - // End of headers is a blank line. exit. - if (rc == 0) break; - if ((rc == 2) && (mimeBuffer[0] == '\r')) break; - - if(strstr(mimeBuffer, "ICY")) // First line of header, contains status code. Check for an error code - { - rc = shoutcast_is_error_header(mimeBuffer); - if(rc) - { - rt_kprintf("ICY: status code = %d!\n", rc); - return -rc; - } - } - - if (strstr(mimeBuffer, "HTTP/1.")) - { - rc = http_is_error_header(mimeBuffer); - if(rc) - { - rt_kprintf("HTTP: status code = %d!\n", rc); - return -rc; - } - } - - if (strstr(mimeBuffer, "icy-name:")) - { - /* get name */ - char* name; - - name = mimeBuffer + strlen("icy-name:"); - session->station_name = rt_strdup(name); - rt_kprintf("station name: %s\n", session->station_name); - } - - if (strstr(mimeBuffer, "icy-br:")) - { - /* get bitrate */ - session->bitrate = strtol(mimeBuffer + strlen("icy-br:"), RT_NULL, 10); - rt_kprintf("bitrate: %d\n", session->bitrate); - } - - if (strstr(mimeBuffer, "icy-metaint:")) - { - /* get metaint */ - session->metaint = strtol(mimeBuffer + strlen("icy-metaint:"), RT_NULL, 10); - rt_kprintf("metaint: %d\n", session->metaint); - } - - if (strstr(mimeBuffer, "content-type:")) - { - /* check content-type */ - if (strstr(mimeBuffer, "audio/mpeg") == RT_NULL) - { - rt_kprintf("ICY content is not audio/mpeg.\n"); - return -1; - } - } - - if (strstr(mimeBuffer, "Content-Type:")) - { - /* check content-type */ - if (strstr(mimeBuffer, "audio/mpeg") == RT_NULL) - { - rt_kprintf("ICY content is not audio/mpeg.\n"); - return -1; - } - } - } - - // We've sent the request, and read the headers. SockHandle is - // now at the start of the main data read for a file io read. - return peer_handle; -} - -struct shoutcast_session* shoutcast_session_open(char* url) -{ - int peer_handle = 0; - struct sockaddr_in server; - char *request, host_addr[32]; - struct shoutcast_session* session; - - session = (struct shoutcast_session*) rt_malloc(sizeof(struct shoutcast_session)); - if(session == RT_NULL) return RT_NULL; - - session->metaint = 0; - session->current_meta_chunk = 0; - session->bitrate = 0; - session->station_name = RT_NULL; - - /* Check valid IP address and URL */ - if(http_resolve_address(&server, url, &host_addr[0], &request) != 0) - { - rt_free(session); - return RT_NULL; - } - - rt_kprintf("connect to: %s...\n", host_addr); - - // Now we connect and initiate the transfer by sending a - // request header to the server, and receiving the response header - if((peer_handle = shoutcast_connect(session, &server, host_addr, request)) < 0) - { - rt_kprintf("SHOUTCAST: failed to connect to '%s'!\n", host_addr); - if (session->station_name != RT_NULL) - rt_free(session->station_name); - rt_free(session); - return RT_NULL; - } - - // http connect returns valid socket. Save in handle list. - session->socket = peer_handle; - - /* open successfully */ - return session; -} - -rt_size_t shoutcast_session_read(struct shoutcast_session* session, rt_uint8_t *buffer, rt_size_t length) -{ - int bytesRead = 0; - int totalRead = 0; - int left = length; - static rt_uint32_t first_meta_size = 0; - - // Read until: there is an error, we've read "size" bytes or the remote - // side has closed the connection. - do - { - bytesRead = recv(session->socket, buffer + totalRead, left, 0); - if(bytesRead <= 0) - { - rt_kprintf("no data on recv, len %d,err %d\n", bytesRead, - lwip_get_error(session->socket)); - break; - } - - left -= bytesRead; - totalRead += bytesRead; - } while(left); - - /* handle meta */ - if (first_meta_size > 0) - { - /* skip meta data */ - memmove(&buffer[0], &buffer[first_meta_size], totalRead - first_meta_size); - - // rt_kprintf("remove meta: len %d\n", first_meta_size); - - totalRead = totalRead - first_meta_size; - first_meta_size = 0; - session->current_meta_chunk = totalRead; - } - else - { - if (session->current_meta_chunk + totalRead == session->metaint) - { - rt_uint8_t meta_data; - recv(session->socket, &meta_data, 1, 0); - - /* remove meta data in next packet */ - first_meta_size = meta_data * 16; - session->current_meta_chunk = 0; - - // rt_kprintf("get meta: len %d\n", first_meta_size); - } - else if (session->current_meta_chunk + totalRead > session->metaint) - { - int meta_length, next_chunk_length; - - // rt_kprintf("c: %d, total: %d, m: %d\n", session->current_meta_chunk, totalRead, session->metaint); - - /* get the length of meta data */ - meta_length = buffer[session->metaint - session->current_meta_chunk] * 16; - next_chunk_length = totalRead - (session->metaint - session->current_meta_chunk) - - (meta_length + 1); - - // rt_kprintf("l: %d, n: %d\n", meta_length, next_chunk_length); - - /* skip meta data */ - memmove(&buffer[session->metaint - session->current_meta_chunk], - &buffer[session->metaint - session->current_meta_chunk + meta_length + 1], - next_chunk_length); - - /* set new current meta chunk */ - session->current_meta_chunk = next_chunk_length; - totalRead = totalRead - (meta_length + 1); - } - else - { - session->current_meta_chunk += totalRead; - } - } - - return totalRead; -} - -rt_off_t shoutcast_session_seek(struct shoutcast_session* session, rt_off_t offset, int mode) -{ - /* not support seek yet */ - return 0; -} - -int shoutcast_session_close(struct shoutcast_session* session) -{ - lwip_close(session->socket); - if (session->station_name != RT_NULL) - rt_free(session->station_name); - rt_free(session); - - return 0; -} - -#include -void http_test(char* url) -{ - struct http_session* session; - char buffer[80]; - rt_size_t length; - - session = http_session_open(url); - if (session == RT_NULL) - { - rt_kprintf("open http session failed\n"); - return; - } - - do - { - rt_memset(buffer, 0, sizeof(buffer)); - length = http_session_read(session, (rt_uint8_t*)buffer, sizeof(buffer)); - - rt_kprintf(buffer);rt_kprintf("\n"); - } while (length > 0); - - http_session_close(session); -} -FINSH_FUNCTION_EXPORT(http_test, http client test); - -void shoutcast_test(char* url) -{ - struct shoutcast_session* session; - - session = shoutcast_session_open(url); - if (session == RT_NULL) - { - rt_kprintf("open shoutcast session failed\n"); - return; - } - - shoutcast_session_close(session); -} -FINSH_FUNCTION_EXPORT(shoutcast_test, shoutcast client test); - diff --git a/bsp/stm32_radio/http.h b/bsp/stm32_radio/http.h deleted file mode 100644 index 45be693b2b..0000000000 --- a/bsp/stm32_radio/http.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __HTTP_H__ -#define __HTTP_H__ - -#include - -struct http_session -{ - char* user_agent; - int socket; - - /* size of http file */ - rt_size_t size; - rt_off_t position; -}; - -struct shoutcast_session -{ - int socket; - - /* shoutcast name and bitrate */ - char* station_name; - int bitrate; - - /* size of meta data */ - rt_size_t metaint; - rt_size_t current_meta_chunk; -}; - -struct http_session* http_session_open(char* url); -rt_size_t http_session_read(struct http_session* session, rt_uint8_t *buffer, rt_size_t length); -rt_off_t http_session_seek(struct http_session* session, rt_off_t offset, int mode); -int http_session_close(struct http_session* session); - -struct shoutcast_session* shoutcast_session_open(char* url); -rt_size_t shoutcast_session_read(struct shoutcast_session* session, rt_uint8_t *buffer, rt_size_t length); -rt_off_t shoutcast_session_seek(struct shoutcast_session* session, rt_off_t offset, int mode); -int shoutcast_session_close(struct shoutcast_session* session); - -#endif diff --git a/bsp/stm32_radio/ili9325/ili9325.c b/bsp/stm32_radio/ili9325/ili9325.c deleted file mode 100644 index c8cf1a513c..0000000000 --- a/bsp/stm32_radio/ili9325/ili9325.c +++ /dev/null @@ -1,508 +0,0 @@ -#include "stm32f10x.h" -#include "ili9325.h" - -/* LCD Registers */ -#define R0 0x00 -#define R1 0x01 -#define R2 0x02 -#define R3 0x03 -#define R4 0x04 -#define R5 0x05 -#define R6 0x06 -#define R7 0x07 -#define R8 0x08 -#define R9 0x09 -#define R10 0x0A -#define R12 0x0C -#define R13 0x0D -#define R14 0x0E -#define R15 0x0F -#define R16 0x10 -#define R17 0x11 -#define R18 0x12 -#define R19 0x13 -#define R20 0x14 -#define R21 0x15 -#define R22 0x16 -#define R23 0x17 -#define R24 0x18 -#define R25 0x19 -#define R26 0x1A -#define R27 0x1B -#define R28 0x1C -#define R29 0x1D -#define R30 0x1E -#define R31 0x1F -#define R32 0x20 -#define R33 0x21 -#define R34 0x22 -#define R36 0x24 -#define R37 0x25 -#define R40 0x28 -#define R41 0x29 -#define R43 0x2B -#define R45 0x2D -#define R48 0x30 -#define R49 0x31 -#define R50 0x32 -#define R51 0x33 -#define R52 0x34 -#define R53 0x35 -#define R54 0x36 -#define R55 0x37 -#define R56 0x38 -#define R57 0x39 -#define R59 0x3B -#define R60 0x3C -#define R61 0x3D -#define R62 0x3E -#define R63 0x3F -#define R64 0x40 -#define R65 0x41 -#define R66 0x42 -#define R67 0x43 -#define R68 0x44 -#define R69 0x45 -#define R70 0x46 -#define R71 0x47 -#define R72 0x48 -#define R73 0x49 -#define R74 0x4A -#define R75 0x4B -#define R76 0x4C -#define R77 0x4D -#define R78 0x4E -#define R79 0x4F -#define R80 0x50 -#define R81 0x51 -#define R82 0x52 -#define R83 0x53 -#define R96 0x60 -#define R97 0x61 -#define R106 0x6A -#define R118 0x76 -#define R128 0x80 -#define R129 0x81 -#define R130 0x82 -#define R131 0x83 -#define R132 0x84 -#define R133 0x85 -#define R134 0x86 -#define R135 0x87 -#define R136 0x88 -#define R137 0x89 -#define R139 0x8B -#define R140 0x8C -#define R141 0x8D -#define R143 0x8F -#define R144 0x90 -#define R145 0x91 -#define R146 0x92 -#define R147 0x93 -#define R148 0x94 -#define R149 0x95 -#define R150 0x96 -#define R151 0x97 -#define R152 0x98 -#define R153 0x99 -#define R154 0x9A -#define R157 0x9D -#define R192 0xC0 -#define R193 0xC1 -#define R229 0xE5 - -/* LCD color */ -#define White 0xFFFF -#define Black 0x0000 -#define Grey 0xF7DE -#define Blue 0x001F -#define Blue2 0x051F -#define Red 0xF800 -#define Magenta 0xF81F -#define Green 0x07E0 -#define Cyan 0x7FFF -#define Yellow 0xFFE0 - -static u16 DeviceCode; - -/******************************************************************************* -* Function Name : LCD_FSMCConfig -* Description : Configures the Parallel interface (FSMC) for LCD(Parallel mode) -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -static void LCD_FSMCConfig(void) -{ - FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; - FSMC_NORSRAMTimingInitTypeDef p; - - /*-- FSMC Configuration ------------------------------------------------------*/ - /*----------------------- SRAM Bank 4 ----------------------------------------*/ - /* FSMC_Bank1_NORSRAM4 configuration */ - p.FSMC_AddressSetupTime = 0; - p.FSMC_AddressHoldTime = 0; - p.FSMC_DataSetupTime = 2; - p.FSMC_BusTurnAroundDuration = 0; - p.FSMC_CLKDivision = 0; - p.FSMC_DataLatency = 0; - p.FSMC_AccessMode = FSMC_AccessMode_A; - - /* Color LCD configuration ------------------------------------ - LCD configured as follow: - - Data/Address MUX = Disable - - Memory Type = SRAM - - Data Width = 16bit - - Write Operation = Enable - - Extended Mode = Enable - - Asynchronous Wait = Disable */ - FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2; - FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; - FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; - FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; - FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; - FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; - FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; - FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; - FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; - FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; - - FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); -} - -/******************************************************************************* -* Function Name : ili9325_WriteReg -* Description : Writes to the selected LCD register. -* Input : - LCD_Reg: address of the selected register. -* - LCD_RegValue: value to write to the selected register. -* Output : None -* Return : None -*******************************************************************************/ -void ili9325_WriteReg(u8 LCD_Reg,u16 LCD_RegValue) -{ - /* Write 16-bit Index, then Write Reg */ - ili9325_REG = LCD_Reg; - /* Write 16-bit Reg */ - ili9325_RAM = LCD_RegValue; -} - -/******************************************************************************* -* Function Name : LCD_ReadReg -* Description : Reads the selected LCD Register. -* Input : None -* Output : None -* Return : LCD Register Value. -*******************************************************************************/ -u16 LCD_ReadReg(u8 LCD_Reg) -{ - /* Write 16-bit Index (then Read Reg) */ - ili9325_REG = LCD_Reg; - /* Read 16-bit Reg */ - return (ili9325_RAM); -} - -/******************************************************************************* -* Function Name : ili9325_WriteRAM_Prepare -* Description : Prepare to write to the LCD RAM. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ili9325_WriteRAM_Prepare(void) -{ - ili9325_REG = R34; -} - -/******************************************************************************* -* Function Name : ili9325_WriteRAM -* Description : Writes to the LCD RAM. -* Input : - RGB_Code: the pixel color in RGB mode (5-6-5). -* Output : None -* Return : None -*******************************************************************************/ -void ili9325_WriteRAM(u16 RGB_Code) -{ - /* Write 16-bit GRAM Reg */ - ili9325_RAM = RGB_Code; -} - -/* ¶Áȡָ¶¨µØÖ·µÄGRAM */ -unsigned short ili9325_ReadGRAM(unsigned short x,unsigned short y) -{ - unsigned short temp; - ili9325_SetCursor(x,y); - ili9325_REG = R34; - /* dummy read */ - temp = ili9325_RAM; - temp = ili9325_RAM; - return temp; -} - -void rt_kprintf(const char *fmt, ...); -#define printf rt_kprintf -void ili9325_Initializtion(void) -{ - volatile unsigned int i; - LCD_FSMCConfig(); - - DeviceCode = LCD_ReadReg(0x0000); - - /* DeviceCode check */ - if( (DeviceCode != 0x9325) && (DeviceCode != 0x9328) && (DeviceCode != 0x7783) ) - { - printf("Invalid LCD ID:%08X\r\n",DeviceCode); - printf("Please check you hardware."); - while(1); - } - - if (DeviceCode==0x9325||DeviceCode==0x9328) - { - ili9325_WriteReg(0x00e7,0x0010); - ili9325_WriteReg(0x0000,0x0001); //start internal osc -#if defined(_ILI_REVERSE_DIRECTION_) - ili9325_WriteReg(0x0001,0x0000); //Reverse Display -#else - ili9325_WriteReg(0x0001,0x0100); // -#endif - ili9325_WriteReg(0x0002,0x0700); //power on sequence - /* [5:4]-ID1~ID0 [3]-AM-1´¹Ö±-0ˮƽ */ - ili9325_WriteReg(0x0003,(1<<12)|(1<<5)|(0<<4) | (1<<3) ); - ili9325_WriteReg(0x0004,0x0000); - ili9325_WriteReg(0x0008,0x0207); - ili9325_WriteReg(0x0009,0x0000); - ili9325_WriteReg(0x000a,0x0000); //display setting - ili9325_WriteReg(0x000c,0x0001); //display setting - ili9325_WriteReg(0x000d,0x0000); //0f3c - ili9325_WriteReg(0x000f,0x0000); - //Power On sequence // - ili9325_WriteReg(0x0010,0x0000); - ili9325_WriteReg(0x0011,0x0007); - ili9325_WriteReg(0x0012,0x0000); - ili9325_WriteReg(0x0013,0x0000); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0010,0x1590); - ili9325_WriteReg(0x0011,0x0227); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0012,0x009c); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0013,0x1900); - ili9325_WriteReg(0x0029,0x0023); - ili9325_WriteReg(0x002b,0x000e); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0020,0x0000); - ili9325_WriteReg(0x0021,0x0000); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0030,0x0007); - ili9325_WriteReg(0x0031,0x0707); - ili9325_WriteReg(0x0032,0x0006); - ili9325_WriteReg(0x0035,0x0704); - ili9325_WriteReg(0x0036,0x1f04); - ili9325_WriteReg(0x0037,0x0004); - ili9325_WriteReg(0x0038,0x0000); - ili9325_WriteReg(0x0039,0x0706); - ili9325_WriteReg(0x003c,0x0701); - ili9325_WriteReg(0x003d,0x000f); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0050,0x0000); - ili9325_WriteReg(0x0051,0x00ef); - ili9325_WriteReg(0x0052,0x0000); - ili9325_WriteReg(0x0053,0x013f); -#if defined(_ILI_REVERSE_DIRECTION_) - ili9325_WriteReg(0x0060,0x2700); -#else - ili9325_WriteReg(0x0060,0xA700); -#endif - ili9325_WriteReg(0x0061,0x0001); - ili9325_WriteReg(0x006a,0x0000); - ili9325_WriteReg(0x0080,0x0000); - ili9325_WriteReg(0x0081,0x0000); - ili9325_WriteReg(0x0082,0x0000); - ili9325_WriteReg(0x0083,0x0000); - ili9325_WriteReg(0x0084,0x0000); - ili9325_WriteReg(0x0085,0x0000); - ili9325_WriteReg(0x0090,0x0010); - ili9325_WriteReg(0x0092,0x0000); - ili9325_WriteReg(0x0093,0x0003); - ili9325_WriteReg(0x0095,0x0110); - ili9325_WriteReg(0x0097,0x0000); - ili9325_WriteReg(0x0098,0x0000); - //display on sequence - ili9325_WriteReg(0x0007,0x0133); - ili9325_WriteReg(0x0020,0x0000); - ili9325_WriteReg(0x0021,0x0000); - } - else if(DeviceCode==0x7783) - { - // Start Initial Sequence - ili9325_WriteReg(0x00FF,0x0001); - ili9325_WriteReg(0x00F3,0x0008); - ili9325_WriteReg(0x0001,0x0100); - ili9325_WriteReg(0x0002,0x0700); - ili9325_WriteReg(0x0003,0x1030); //0x1030 - ili9325_WriteReg(0x0008,0x0302); - ili9325_WriteReg(0x0008,0x0207); - ili9325_WriteReg(0x0009,0x0000); - ili9325_WriteReg(0x000A,0x0000); - ili9325_WriteReg(0x0010,0x0000); //0x0790 - ili9325_WriteReg(0x0011,0x0005); - ili9325_WriteReg(0x0012,0x0000); - ili9325_WriteReg(0x0013,0x0000); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0010,0x12B0); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0011,0x0007); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0012,0x008B); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0013,0x1700); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - ili9325_WriteReg(0x0029,0x0022); - - //################# void Gamma_Set(void) ####################// - ili9325_WriteReg(0x0030,0x0000); - ili9325_WriteReg(0x0031,0x0707); - ili9325_WriteReg(0x0032,0x0505); - ili9325_WriteReg(0x0035,0x0107); - ili9325_WriteReg(0x0036,0x0008); - ili9325_WriteReg(0x0037,0x0000); - ili9325_WriteReg(0x0038,0x0202); - ili9325_WriteReg(0x0039,0x0106); - ili9325_WriteReg(0x003C,0x0202); - ili9325_WriteReg(0x003D,0x0408); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - - - ili9325_WriteReg(0x0050,0x0000); - ili9325_WriteReg(0x0051,0x00EF); - ili9325_WriteReg(0x0052,0x0000); - ili9325_WriteReg(0x0053,0x013F); - ili9325_WriteReg(0x0060,0xA700); - ili9325_WriteReg(0x0061,0x0001); - ili9325_WriteReg(0x0090,0x0033); - ili9325_WriteReg(0x002B,0x000B); - ili9325_WriteReg(0x0007,0x0133); - for (i=50000; i>0; i--); - for (i=50000; i>0; i--); - } - - - ili9325_Clear( Blue ); -} - -/**************************************************************************** -* Ãû ³Æ£ºvoid ili9325_SetCursor(u16 x,u16 y) -* ¹¦ ÄÜ£ºÉèÖÃÆÁÄ»×ù±ê -* Èë¿Ú²ÎÊý£ºx ÐÐ×ù±ê -* y ÁÐ×ù±ê -* ³ö¿Ú²ÎÊý£ºÎÞ -* ˵ Ã÷£º -* µ÷Ó÷½·¨£ºili9325_SetCursor(10,10); -****************************************************************************/ -void ili9325_SetCursor(u16 x,u16 y) -{ - ili9325_WriteReg(R32,x); /* 0-239 */ - ili9325_WriteReg(R33,y); /* 0-319 */ -} - -/**************************************************************************** -* Ãû ³Æ£ºvoid ili9325_SetWindows(u16 StartX,u16 StartY,u16 EndX,u16 EndY) -* ¹¦ ÄÜ£ºÉèÖô°¿ÚÇøÓò -* Èë¿Ú²ÎÊý£ºStartX ÐÐÆðʼ×ù±ê -* StartY ÁÐÆðʼ×ù±ê -* EndX ÐнáÊø×ù±ê -* EndY ÁнáÊø×ù±ê -* ³ö¿Ú²ÎÊý£ºÎÞ -* ˵ Ã÷£º -* µ÷Ó÷½·¨£ºili9325_SetWindows(0,0,100,100)£» -****************************************************************************/ -void ili9325_SetWindows(u16 StartX,u16 StartY,u16 EndX,u16 EndY) -{ - ili9325_SetCursor(StartX,StartY); - ili9325_WriteReg(0x0050, StartX); - ili9325_WriteReg(0x0052, StartY); - ili9325_WriteReg(0x0051, EndX); - ili9325_WriteReg(0x0053, EndY); -} - -/**************************************************************************** -* Ãû ³Æ£ºvoid ili9325_Clear(u16 dat) -* ¹¦ ÄÜ£º½«ÆÁÄ»Ìî³ä³ÉÖ¸¶¨µÄÑÕÉ«£¬ÈçÇåÆÁ£¬ÔòÌî³ä 0xffff -* Èë¿Ú²ÎÊý£ºdat Ìî³äÖµ -* ³ö¿Ú²ÎÊý£ºÎÞ -* ˵ Ã÷£º -* µ÷Ó÷½·¨£ºili9325_Clear(0xffff); -****************************************************************************/ -void ili9325_Clear(u16 Color) -{ - u32 index=0; - ili9325_SetCursor(0,0); - ili9325_WriteRAM_Prepare(); /* Prepare to write GRAM */ - for (index=0; index<76800; index++) - { - ili9325_RAM=Color; - } -} - -/**************************************************************************** -* Ãû ³Æ£ºvoid ili9325_DrawPicture(u16 StartX,u16 StartY,u16 EndX,u16 EndY,u16 *pic) -* ¹¦ ÄÜ£ºÔÚÖ¸¶¨×ù±ê·¶Î§ÏÔʾһ¸±Í¼Æ¬ -* Èë¿Ú²ÎÊý£ºStartX ÐÐÆðʼ×ù±ê -* StartY ÁÐÆðʼ×ù±ê -* EndX ÐнáÊø×ù±ê -* EndY ÁнáÊø×ù±ê - pic ͼƬͷָÕë -* ³ö¿Ú²ÎÊý£ºÎÞ -* ˵ Ã÷£ºÍ¼Æ¬È¡Ä£¸ñʽΪˮƽɨÃ裬16λÑÕɫģʽ -* µ÷Ó÷½·¨£ºili9325_DrawPicture(0,0,100,100,(u16*)demo); -****************************************************************************/ -void ili9325_DrawPicture(u16 StartX,u16 StartY,u16 EndX,u16 EndY,u16 *pic) -{ - u16 i; - ili9325_SetWindows(StartX,StartY,EndX,EndY); - ili9325_SetCursor(StartX,StartY); - - ili9325_WriteRAM_Prepare(); - for (i=0; i<(EndX*EndY); i++) - { - ili9325_WriteRAM(*pic++); - } -} - - -/**************************************************************************** -* Ãû ³Æ£ºu16 ili9325_BGR2RGB(u16 c) -* ¹¦ ÄÜ£ºRRRRRGGGGGGBBBBB ¸ÄΪ BBBBBGGGGGGRRRRR ¸ñʽ -* Èë¿Ú²ÎÊý£ºc BRG ÑÕɫֵ -* ³ö¿Ú²ÎÊý£ºRGB ÑÕɫֵ -* ˵ Ã÷£ºÄÚ²¿º¯Êýµ÷Óà -* µ÷Ó÷½·¨£º -****************************************************************************/ -unsigned short ili9325_BGR2RGB(unsigned short c) -{ - u16 r, g, b, rgb; - - b = (c>>0) & 0x1f; - g = (c>>5) & 0x3f; - r = (c>>11) & 0x1f; - - rgb = (b<<11) + (g<<5) + (r<<0); - - return( rgb ); -} diff --git a/bsp/stm32_radio/ili9325/ili9325.h b/bsp/stm32_radio/ili9325/ili9325.h deleted file mode 100644 index 540f91ebec..0000000000 --- a/bsp/stm32_radio/ili9325/ili9325.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef ILI9325_H_INCLUDED -#define ILI9325_H_INCLUDED - -extern void ili9325_Initializtion(void); -extern void ili9325_SetCursor(u16 x,u16 y); -extern void ili9325_Clear(u16 Color); - -extern unsigned short ili9325_BGR2RGB(unsigned short c); - -extern void ili9325_WriteRAM_Prepare(void); -extern void ili9325_WriteRAM(u16 RGB_Code); -extern unsigned short ili9325_ReadGRAM(unsigned short x,unsigned short y); -extern void ili9325_WriteReg(u8 LCD_Reg,u16 LCD_RegValue); - -/* If LCD Display in wrong dirction uncomment this option*/ -#define _ILI_REVERSE_DIRECTION_ - -/* LCD is connected to the FSMC_Bank1_NOR/SRAM2 and NE2 is used as ship select signal */ -/* RS <==> A2 */ -#define ili9325_REG (*((volatile unsigned short *) 0x64000000)) /* RS = 0 */ -#define ili9325_RAM (*((volatile unsigned short *) 0x64000008)) /* RS = 1 */ - -#endif diff --git a/bsp/stm32_radio/info.c b/bsp/stm32_radio/info.c deleted file mode 100644 index de5ad25fa4..0000000000 --- a/bsp/stm32_radio/info.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include -#include - -#include -#include - -#include "network.xpm" - -static rtgui_image_t *rtt_image = RT_NULL; -static rtgui_image_t *network_image = RT_NULL; -static rtgui_image_t *usb_image = RT_NULL; -static rtgui_image_t *power_image = RT_NULL; - -static rt_bool_t view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) -{ - if (event->type == RTGUI_EVENT_PAINT) - { - struct rtgui_dc* dc; - struct rtgui_rect rect; - - dc = rtgui_dc_begin_drawing(widget); - if (dc == RT_NULL) return RT_FALSE; - rtgui_widget_get_rect(widget, &rect); - - rtgui_dc_fill_rect(dc, &rect); - rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y2 - 1); - - /* draw RT-Thread logo */ - rtt_image = rtgui_image_create_from_file("hdc", - "/resource/RTT.hdc", RT_FALSE); - if (rtt_image != RT_NULL) - { - rtgui_image_blit(rtt_image, dc, &rect); - rtgui_image_destroy(rtt_image); - - rtt_image = RT_NULL; - } - - if (network_image != RT_NULL) - { - rect.x1 = rect.x2 - (network_image->w + 2); - rtgui_image_blit(network_image, dc, &rect); - } - - rtgui_dc_end_drawing(dc); - - return RT_FALSE; - } - - return rtgui_view_event_handler(widget, event); -} - -static void info_entry(void* parameter) -{ - rt_mq_t mq; - struct rtgui_view* view; - struct rtgui_workbench* workbench; - - mq = rt_mq_create("qInfo", 256, 4, RT_IPC_FLAG_FIFO); - rtgui_thread_register(rt_thread_self(), mq); - - network_image = rtgui_image_create_from_mem("xpm", - (rt_uint8_t*)network_xpm, sizeof(network_xpm), RT_TRUE); - workbench = rtgui_workbench_create("info", "workbench"); - if (workbench == RT_NULL) return; - - view = rtgui_view_create("view"); - RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(view)) = white; - rtgui_widget_set_event_handler(RTGUI_WIDGET(view), view_event_handler); - - rtgui_workbench_add_view(workbench, view); - - rtgui_view_show(view, RT_FALSE); - - rtgui_workbench_event_loop(workbench); - - rtgui_thread_deregister(rt_thread_self()); - rt_mq_delete(mq); -} - -void info_init() -{ - rt_thread_t tid; - - tid = rt_thread_create("info", - info_entry, RT_NULL, - 2048, 25, 10); - - if (tid != RT_NULL) rt_thread_startup(tid); -} diff --git a/bsp/stm32_radio/key.c b/bsp/stm32_radio/key.c deleted file mode 100644 index 8fcfc58a2b..0000000000 --- a/bsp/stm32_radio/key.c +++ /dev/null @@ -1,139 +0,0 @@ -#include -#include - -#include -#include - -/* -key_enter PF11 -key_down PG15 -key_up PG11 -key_right PG14 -key_left PG13 -*/ -#define key_enter_GETVALUE() GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_11) -#define key_down_GETVALUE() GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15) -#define key_up_GETVALUE() GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_11) -#define key_right_GETVALUE() GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_14) -#define key_left_GETVALUE() GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_13) - -/* from remote.c */ -extern void rem_start(void); -extern void rem_encoder(struct rtgui_event_kbd * p); -extern unsigned int rem_mode; -/* from remote.c */ - -static void GPIO_Configuration(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - /* init gpio configuration */ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE,ENABLE); - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; - GPIO_Init(GPIOG,&GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; - GPIO_Init(GPIOF,&GPIO_InitStructure); - - /* PE2 LED */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_Init(GPIOE,&GPIO_InitStructure); - GPIO_SetBits(GPIOE,GPIO_Pin_2); -} - -static void key_thread_entry(void *parameter) -{ - rt_time_t next_delay; - struct rtgui_event_kbd kbd_event; - - GPIO_Configuration(); - /* start remote */ - rem_start(); - - /* init keyboard event */ - RTGUI_EVENT_KBD_INIT(&kbd_event); - kbd_event.mod = RTGUI_KMOD_NONE; - kbd_event.unicode = 0; - - while (1) - { - next_delay = 10; - kbd_event.key = RTGUIK_UNKNOWN; - kbd_event.type = RTGUI_KEYDOWN; - - if( rem_mode== 2 ) - { - rem_encoder(&kbd_event); - } - - if ( key_enter_GETVALUE() == 0 ) - { - rt_thread_delay( next_delay*4 ); - if (key_enter_GETVALUE() == 0) - { - /* HOME key */ - rt_kprintf("key_home\n"); - kbd_event.key = RTGUIK_HOME; - } - else - { - rt_kprintf("key_enter\n"); - kbd_event.key = RTGUIK_RETURN; - } - } - - if ( key_down_GETVALUE() == 0 ) - { - rt_kprintf("key_down\n"); - kbd_event.key = RTGUIK_DOWN; - } - - if ( key_up_GETVALUE() == 0 ) - { - rt_kprintf("key_up\n"); - kbd_event.key = RTGUIK_UP; - } - - if ( key_right_GETVALUE() == 0 ) - { - rt_kprintf("key_right\n"); - kbd_event.key = RTGUIK_RIGHT; - } - - if ( key_left_GETVALUE() == 0 ) - { - rt_kprintf("key_left\n"); - kbd_event.key = RTGUIK_LEFT; - } - - if (kbd_event.key != RTGUIK_UNKNOWN) - { - /* post down event */ - rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); - - next_delay = 10; - /* delay to post up event */ - rt_thread_delay(next_delay); - - /* post up event */ - kbd_event.type = RTGUI_KEYUP; - rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); - } - - /* wait next key press */ - rt_thread_delay(next_delay); - } -} - -static rt_thread_t key_tid; -void rt_hw_key_init(void) -{ - key_tid = rt_thread_create("key", - key_thread_entry, RT_NULL, - 768, 30, 5); - if (key_tid != RT_NULL) rt_thread_startup(key_tid); -} diff --git a/bsp/stm32_radio/lcd.c b/bsp/stm32_radio/lcd.c deleted file mode 100644 index e95528a767..0000000000 --- a/bsp/stm32_radio/lcd.c +++ /dev/null @@ -1,463 +0,0 @@ -#include "stm32f10x.h" -#include "rtthread.h" -#include "board.h" -#include -#include -#include -#include - -#if (LCD_VERSION == 1) -#include "fmt0371/FMT0371.h" -#endif - -#if (LCD_VERSION == 2) -#include "ili9325/ili9325.h" -#endif - -rt_err_t rt_hw_lcd_init(void); -void rt_hw_lcd_update(rtgui_rect_t *rect); -rt_uint8_t * rt_hw_lcd_get_framebuffer(void); -void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y); -void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y); -void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y); -void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t y2); -void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y); - -struct rtgui_graphic_driver _rtgui_lcd_driver = -{ - "lcd", - 2, - 240, - 320, - rt_hw_lcd_update, - rt_hw_lcd_get_framebuffer, - rt_hw_lcd_set_pixel, - rt_hw_lcd_get_pixel, - rt_hw_lcd_draw_hline, - rt_hw_lcd_draw_vline, - rt_hw_lcd_draw_raw_hline -}; - -extern void info_init(void); -extern void player_init(void); -void radio_rtgui_init(void) -{ - rtgui_rect_t rect; - - rtgui_system_server_init(); - - /* register dock panel */ - rect.x1 = 0; - rect.y1 = 0; - rect.x2 = 240; - rect.y2 = 25; - rtgui_panel_register("info", &rect); - - /* register main panel */ - rect.x1 = 0; - rect.y1 = 25; - rect.x2 = 320; - rect.y2 = 320; - rtgui_panel_register("main", &rect); - rtgui_panel_set_default_focused("main"); - - rt_hw_lcd_init(); - - info_init(); - player_init(); -} - -#if (LCD_VERSION == 1) -void rt_hw_lcd_update(rtgui_rect_t *rect) -{ - /* nothing for none-DMA mode driver */ -} - -rt_uint8_t * rt_hw_lcd_get_framebuffer(void) -{ - return RT_NULL; /* no framebuffer driver */ -} - -void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y) -{ - unsigned short p; - - /* get color pixel */ - p = rtgui_color_to_565p(*c); - - /* set X point */ - LCD_ADDR = 0x02; - LCD_DATA = x; - - /* set Y point */ - LCD_ADDR = 0x03; - LCD_DATA16(y); - - /* write pixel */ - LCD_ADDR = 0x0E; - LCD_DATA16(p); -} - -void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y) -{ - /* set X point */ - LCD_ADDR = 0x02; - LCD_DATA = x; - - /* set Y point */ - LCD_ADDR = 0x03; - LCD_DATA16( y ); - - /* read pixel */ - LCD_ADDR = 0x0F; - /* dummy read */ - x = LCD_DATA; - - *c = rtgui_color_from_565p( LCD_DATA16_READ() ); -} - -void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y) -{ - unsigned short p; - - /* get color pixel */ - p = rtgui_color_to_565p(*c); - - /* set X point */ - LCD_ADDR = 0x02; - LCD_DATA = x1; - - /* set Y point */ - LCD_ADDR = 0x03; - LCD_DATA16( y ); - - /* write pixel */ - LCD_ADDR = 0x0E; - while (x1 < x2) - { - LCD_DATA16(p); - x1 ++; - } -} - -void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t y2) -{ - unsigned short p; - - /* get color pixel */ - p = rtgui_color_to_565p(*c); - - /* set X point */ - LCD_ADDR = 0x02; - LCD_DATA = x; - - while (y1 < y2) - { - /* set Y point */ - LCD_ADDR = 0x03; - LCD_DATA16( y1 ); - - /* write pixel */ - LCD_ADDR = 0x0E; - LCD_DATA16(p); - - y1 ++; - } -} - -void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y) -{ - rt_uint16_t *ptr; - - /* get pixel */ - ptr = (rt_uint16_t*) pixels; - - /* set X point */ - LCD_ADDR = 0x02; - LCD_DATA = x1; - - /* set Y point */ - LCD_ADDR = 0x03; - LCD_DATA16( y ); - - /* write pixel */ - LCD_ADDR = 0x0E; - while (x1 < x2) - { - LCD_DATA16(*ptr); - x1 ++; - ptr ++; - } -} - -rt_err_t rt_hw_lcd_init(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOF,&GPIO_InitStructure); - GPIO_SetBits(GPIOF,GPIO_Pin_9); - - ftm0371_port_init(); - ftm0371_init(); - - //LCD GRAM test - { - unsigned int test_x; - unsigned int test_y; - unsigned short temp; - - rt_kprintf("\r\nLCD GRAM test...."); - - //write - temp = 0; - for( test_y=0; test_y<320; test_y++) - { - /* set X point */ - LCD_ADDR = 0x02; - LCD_DATA = 0; - - /* set Y point */ - LCD_ADDR = 0x03; - LCD_DATA16( test_y ); - - /* write pixel */ - LCD_ADDR = 0x0E; - for(test_x=0; test_x<240; test_x++) - { - LCD_DATA16(temp++); - } - } - - temp = 0; - for( test_y=0; test_y<320; test_y++) - { - /* set X point */ - LCD_ADDR = 0x02; - LCD_DATA = 0; - - /* set Y point */ - LCD_ADDR = 0x03; - LCD_DATA16( test_y ); - - /* write pixel */ - LCD_ADDR = 0x0f; - /* dummy read */ - test_x = LCD_DATA; - for(test_x=0; test_x<240; test_x++) - { - if ( LCD_DATA16_READ() != temp++) - { - rt_kprintf(" LCD GRAM ERR!!"); - while(1); - } - } - } - rt_kprintf(" TEST PASS!\r\n"); - }//LCD GRAM TEST - -#ifndef DRIVER_TEST - /* add lcd driver into graphic driver */ - rtgui_graphic_driver_add(&_rtgui_lcd_driver); -#endif - - return RT_EOK; -} - -#include - -void hline(rt_base_t x1, rt_base_t x2, rt_base_t y, rt_uint32_t pixel) -{ - rt_hw_lcd_draw_hline(&pixel, x1, x2, y); -} -FINSH_FUNCTION_EXPORT(hline, draw a hline); - -void vline(int x, int y1, int y2, rt_uint32_t pixel) -{ - rt_hw_lcd_draw_vline(&pixel, x, y1, y2); -} -FINSH_FUNCTION_EXPORT(vline, draw a vline); - -void cls() -{ - rt_size_t index; - rtgui_color_t white = RTGUI_RGB(0xff, 0xff, 0xff); - - for (index = 0; index < 320; index ++) - rt_hw_lcd_draw_hline(&white, 0, 240, index); -} -FINSH_FUNCTION_EXPORT(cls, clear screen); -#endif - -#if (LCD_VERSION == 2) -void rt_hw_lcd_update(rtgui_rect_t *rect) -{ - /* nothing for none-DMA mode driver */ -} - -rt_uint8_t * rt_hw_lcd_get_framebuffer(void) -{ - return RT_NULL; /* no framebuffer driver */ -} - -/* ÉèÖÃÏñËØµã ÑÕÉ«,X,Y */ -void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y) -{ - unsigned short p; - - /* get color pixel */ - p = rtgui_color_to_565p(*c); - ili9325_SetCursor(x,y); - - ili9325_WriteRAM_Prepare(); - ili9325_RAM = p ; -} - -/* »ñÈ¡ÏñËØµãÑÕÉ« */ -void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y) -{ - unsigned short p; - p = ili9325_BGR2RGB( ili9325_ReadGRAM(x,y) ); - *c = rtgui_color_from_565p(p); -} - -/* »­Ë®Æ½Ïß */ -void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y) -{ - unsigned short p; - - /* get color pixel */ - p = rtgui_color_to_565p(*c); - - /* [5:4]-ID~ID0 [3]-AM-1´¹Ö±-0ˮƽ */ - ili9325_WriteReg(0x0003,(1<<12)|(1<<5)|(1<<4) | (0<<3) ); - - ili9325_SetCursor(x1, y); - ili9325_WriteRAM_Prepare(); /* Prepare to write GRAM */ - while (x1 < x2) - { - ili9325_RAM = p ; - x1++; - } -} - -/* ´¹Ö±Ïß */ -void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t y2) -{ - unsigned short p; - - /* get color pixel */ - p = rtgui_color_to_565p(*c); - - /* [5:4]-ID~ID0 [3]-AM-1´¹Ö±-0ˮƽ */ - ili9325_WriteReg(0x0003,(1<<12)|(1<<5)|(0<<4) | (1<<3) ); - - ili9325_SetCursor(x, y1); - ili9325_WriteRAM_Prepare(); /* Prepare to write GRAM */ - while (y1 < y2) - { - ili9325_RAM = p ; - y1++; - } -} - -/* ?? */ -void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y) -{ - rt_uint16_t *ptr; - - /* get pixel */ - ptr = (rt_uint16_t*) pixels; - - /* [5:4]-ID~ID0 [3]-AM-1´¹Ö±-0ˮƽ */ - ili9325_WriteReg(0x0003,(1<<12)|(1<<5)|(1<<4) | (0<<3) ); - - ili9325_SetCursor(x1, y); - ili9325_WriteRAM_Prepare(); /* Prepare to write GRAM */ - while (x1 < x2) - { - ili9325_RAM = *ptr ; - x1 ++; - ptr ++; - } -} - -rt_err_t rt_hw_lcd_init(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOF,&GPIO_InitStructure); - GPIO_SetBits(GPIOF,GPIO_Pin_9); - - ili9325_Initializtion(); - - /* LCD GRAM TEST */ - { - unsigned short temp; - unsigned int test_x; - unsigned int test_y; - - rt_kprintf("\r\nLCD GRAM test...."); - - /* write */ - temp=0; - /* [5:4]-ID~ID0 [3]-AM-1´¹Ö±-0ˮƽ */ - ili9325_WriteReg(0x0003,(1<<12)|(1<<5)|(1<<4) | (0<<3) ); - ili9325_SetCursor(0,0); - ili9325_WriteRAM_Prepare(); - for(test_y=0; test_y<76800; test_y++) - { - ili9325_RAM = temp++ ; - } - - /* read */ - temp=0; - for(test_y=0; test_y<320; test_y++) - { - for(test_x=0; test_x<240; test_x++) - { - if( ili9325_BGR2RGB( ili9325_ReadGRAM(test_x,test_y) ) != temp++) - { - rt_kprintf(" LCD GRAM ERR!!"); - while(1); - } - } - } - rt_kprintf(" TEST PASS!\r\n"); - }/* LCD GRAM TEST */ - -#ifndef DRIVER_TEST - /* add lcd driver into graphic driver */ - rtgui_graphic_driver_add(&_rtgui_lcd_driver); -#endif - - return RT_EOK; -} - -#include - -void hline(rt_base_t x1, rt_base_t x2, rt_base_t y, rt_uint32_t pixel) -{ - rt_hw_lcd_draw_hline(&pixel, x1, x2, y); -} -FINSH_FUNCTION_EXPORT(hline, draw a hline); - -void vline(int x, int y1, int y2, rt_uint32_t pixel) -{ - rt_hw_lcd_draw_vline(&pixel, x, y1, y2); -} -FINSH_FUNCTION_EXPORT(vline, draw a vline); - -void cls() -{ - ili9325_Clear(0x051F); -} -FINSH_FUNCTION_EXPORT(cls, clear screen); -#endif diff --git a/bsp/stm32_radio/lcd.h b/bsp/stm32_radio/lcd.h deleted file mode 100644 index 7c1bf6c6de..0000000000 --- a/bsp/stm32_radio/lcd.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * File : lcd.h - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-10-16 Bernard first version - */ - -#ifndef __LCD_HW_H__ -#define __LCD_HW_H__ - -rt_err_t rt_hw_lcd_init(void); - -#endif diff --git a/bsp/stm32_radio/libwma/SOURCES b/bsp/stm32_radio/libwma/SOURCES deleted file mode 100644 index 967577d0db..0000000000 --- a/bsp/stm32_radio/libwma/SOURCES +++ /dev/null @@ -1,3 +0,0 @@ -wmadeci.c -wmafixed.c -bitstream.c diff --git a/bsp/stm32_radio/libwma/asf.h b/bsp/stm32_radio/libwma/asf.h deleted file mode 100644 index 8cae8fae1d..0000000000 --- a/bsp/stm32_radio/libwma/asf.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _ASF_H -#define _ASF_H - -#include - -/* ASF codec IDs */ -#define ASF_CODEC_ID_WMAV1 0x160 -#define ASF_CODEC_ID_WMAV2 0x161 - -struct asf_waveformatex_s { - uint32_t packet_size; - int audiostream; - uint16_t codec_id; - uint16_t channels; - uint32_t rate; - uint32_t bitrate; - uint16_t blockalign; - uint16_t bitspersample; - uint16_t datalen; - uint8_t data[6]; -}; -typedef struct asf_waveformatex_s asf_waveformatex_t; - -#endif diff --git a/bsp/stm32_radio/libwma/asm_arm.h b/bsp/stm32_radio/libwma/asm_arm.h deleted file mode 100644 index 163dc3aefb..0000000000 --- a/bsp/stm32_radio/libwma/asm_arm.h +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: arm7 and later wide math functions - - ********************************************************************/ - -#ifndef __ASM_ARM_H__ -#define __ASM_ARM_H__ - -int32_t MULT32(int32_t x, int32_t y); -int32_t MULT31(int32_t x, int32_t y); -int32_t MULT31_SHIFT15(int32_t x, int32_t y); - -#define MB() - -void XPROD32(int32_t a, int32_t b, - int32_t t, int32_t v, - int32_t *x, int32_t *y); -void XPROD31(int32_t a, int32_t b, - int32_t t, int32_t v, - int32_t *x, int32_t *y); -void XNPROD31(int32_t a, int32_t b, - int32_t t, int32_t v, - int32_t *x, int32_t *y); - -int32_t CLIP_TO_15(int32_t x); - -#endif diff --git a/bsp/stm32_radio/libwma/bswap.h b/bsp/stm32_radio/libwma/bswap.h deleted file mode 100644 index 33377cfcba..0000000000 --- a/bsp/stm32_radio/libwma/bswap.h +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @file bswap.h - * byte swap. - */ - -#ifndef __BSWAP_H__ -#define __BSWAP_H__ - -#ifdef HAVE_BYTESWAP_H -#include -#else - -#ifdef ROCKBOX -#include "codecs.h" - -/* rockbox' optimised inline functions */ -#define bswap_16(x) swap16(x) -#define bswap_32(x) swap32(x) - -static inline uint64_t ByteSwap64(uint64_t x) -{ - union { - uint64_t ll; - struct { - uint32_t l,h; - } l; - } r; - r.l.l = bswap_32 (x); - r.l.h = bswap_32 (x>>32); - return r.ll; -} -#define bswap_64(x) ByteSwap64(x) - -#elif defined(ARCH_X86) -static inline unsigned short ByteSwap16(unsigned short x) -{ - __asm("xchgb %b0,%h0" : - "=q" (x) : - "0" (x)); - return x; -} -#define bswap_16(x) ByteSwap16(x) - -static inline unsigned int ByteSwap32(unsigned int x) -{ -#if __CPU__ > 386 - __asm("bswap %0": - "=r" (x) : -#else - __asm("xchgb %b0,%h0\n" - " rorl $16,%0\n" - " xchgb %b0,%h0": - "=q" (x) : -#endif - "0" (x)); - return x; -} -#define bswap_32(x) ByteSwap32(x) - -static inline unsigned long long int ByteSwap64(unsigned long long int x) -{ - register union { __extension__ uint64_t __ll; - uint32_t __l[2]; } __x; - asm("xchgl %0,%1": - "=r"(__x.__l[0]),"=r"(__x.__l[1]): - "0"(bswap_32((unsigned long)x)),"1"(bswap_32((unsigned long)(x>>32)))); - return __x.__ll; -} -#define bswap_64(x) ByteSwap64(x) - -#elif defined(ARCH_SH4) - -static inline uint16_t ByteSwap16(uint16_t x) { - __asm__("swap.b %0,%0":"=r"(x):"0"(x)); - return x; -} - -static inline uint32_t ByteSwap32(uint32_t x) { - __asm__( - "swap.b %0,%0\n" - "swap.w %0,%0\n" - "swap.b %0,%0\n" - :"=r"(x):"0"(x)); - return x; -} - -#define bswap_16(x) ByteSwap16(x) -#define bswap_32(x) ByteSwap32(x) - -static inline uint64_t ByteSwap64(uint64_t x) -{ - union { - uint64_t ll; - struct { - uint32_t l,h; - } l; - } r; - r.l.l = bswap_32 (x); - r.l.h = bswap_32 (x>>32); - return r.ll; -} -#define bswap_64(x) ByteSwap64(x) - -#else - -#define bswap_16(x) (((x) & 0x00ff) << 8 | ((x) & 0xff00) >> 8) - - -// code from bits/byteswap.h (C) 1997, 1998 Free Software Foundation, Inc. -#define bswap_32(x) \ - ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \ - (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)) - -static inline uint64_t ByteSwap64(uint64_t x) -{ - union { - uint64_t ll; - uint32_t l[2]; - } w, r; - w.ll = x; - r.l[0] = bswap_32 (w.l[1]); - r.l[1] = bswap_32 (w.l[0]); - return r.ll; -} -#define bswap_64(x) ByteSwap64(x) - -#endif /* !ARCH_X86 */ - -#endif /* !HAVE_BYTESWAP_H */ - -// be2me ... BigEndian to MachineEndian -// le2me ... LittleEndian to MachineEndian - -#ifdef WORDS_BIGENDIAN -#define be2me_16(x) (x) -#define be2me_32(x) (x) -#define be2me_64(x) (x) -#define le2me_16(x) bswap_16(x) -#define le2me_32(x) bswap_32(x) -#define le2me_64(x) bswap_64(x) -#else -#define be2me_16(x) bswap_16(x) -#define be2me_32(x) bswap_32(x) -#define be2me_64(x) bswap_64(x) -#define le2me_16(x) (x) -#define le2me_32(x) (x) -#define le2me_64(x) (x) -#endif - -#endif /* __BSWAP_H__ */ diff --git a/bsp/stm32_radio/libwma/codeclib.h b/bsp/stm32_radio/libwma/codeclib.h deleted file mode 100644 index a144bd4ae5..0000000000 --- a/bsp/stm32_radio/libwma/codeclib.h +++ /dev/null @@ -1,79 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id: codeclib.h 19704 2009-01-07 09:53:46Z zagor $ - * - * Copyright (C) 2005 Dave Chapman - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#ifndef __CODECLIB_H__ -#define __CODECLIB_H__ -#include "ffmpeg_config.h" -// #include "codecs.h" -// #include - -extern struct codec_api *ci; -extern size_t mem_ptr; -extern size_t bufsize; -extern unsigned char* mp3buf; /* The actual MP3 buffer from Rockbox */ -extern unsigned char* mallocbuf; /* The free space after the codec in the codec buffer */ -extern unsigned char* filebuf; /* The rest of the MP3 buffer */ - -/* Standard library functions that are used by the codecs follow here */ - -/* Get these functions 'out of the way' of the standard functions. Not doing - * so confuses the cygwin linker, and maybe others. These functions need to - * be implemented elsewhere */ -#define malloc(x) codec_malloc(x) -#define calloc(x,y) codec_calloc(x,y) -#define realloc(x,y) codec_realloc(x,y) -#define free(x) codec_free(x) -#define alloca(x) __builtin_alloca(x) - -void* codec_malloc(size_t size); -void* codec_calloc(size_t nmemb, size_t size); -void* codec_realloc(void* ptr, size_t size); -void codec_free(void* ptr); - -void *memcpy(void *dest, const void *src, size_t n); -void *memset(void *s, int c, size_t n); -int memcmp(const void *s1, const void *s2, size_t n); -void *memmove(void *s1, const void *s2, size_t n); - -size_t strlen(const char *s); -char *strcpy(char *dest, const char *src); -char *strcat(char *dest, const char *src); -int strcmp(const char *, const char *); - -void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); - -#define abs(x) ((x)>0?(x):-(x)) -#define labs(x) abs(x) - -/*MDCT library functions*/ - -extern void mdct_backward(int n, int32_t *in, int32_t *out); - -#if defined(CPU_ARM) && (ARM_ARCH == 4) -/* optimised unsigned integer division for ARMv4, in IRAM */ -unsigned udiv32_arm(unsigned a, unsigned b); -#define UDIV32(a, b) udiv32_arm(a, b) -#else -/* default */ -#define UDIV32(a, b) (a / b) -#endif - -#endif diff --git a/bsp/stm32_radio/libwma/ffmpeg_config.h b/bsp/stm32_radio/libwma/ffmpeg_config.h deleted file mode 100644 index df704690bd..0000000000 --- a/bsp/stm32_radio/libwma/ffmpeg_config.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Automatically generated by configure - do not modify */ -#ifndef _FFMPEG_CONFIG_H -#define _FFMPEG_CONFIG_H -// #include "codecs.h" - -#ifdef CPU_ARM -#define CONFIG_ALIGN 1 -#endif - -#ifdef ROCKBOX_BIG_ENDIAN -#define WORDS_BIGENDIAN -#endif - -#include -#include -#include - -#define inline __inline -typedef unsigned long long uint64_t; - -#define DEBUGF(fmt, ...) - -#endif diff --git a/bsp/stm32_radio/libwma/libwma.make b/bsp/stm32_radio/libwma/libwma.make deleted file mode 100644 index 066856c456..0000000000 --- a/bsp/stm32_radio/libwma/libwma.make +++ /dev/null @@ -1,18 +0,0 @@ -# __________ __ ___. -# Open \______ \ ____ ____ | | _\_ |__ _______ ___ -# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / -# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < -# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ -# \/ \/ \/ \/ \/ -# $Id: libwma.make 20151 2009-03-01 09:04:15Z amiconn $ -# - -# libwma -WMALIB := $(CODECDIR)/libwma.a -WMALIB_SRC := $(call preprocess, $(APPSDIR)/codecs/libwma/SOURCES) -WMALIB_OBJ := $(call c2obj, $(WMALIB_SRC)) -OTHER_SRC += $(WMALIB_SRC) - -$(WMALIB): $(WMALIB_OBJ) - $(SILENT)$(shell rm -f $@) - $(call PRINTS,AR $(@F))$(AR) rcs $@ $^ >/dev/null diff --git a/bsp/stm32_radio/libwma/mdct2.c b/bsp/stm32_radio/libwma/mdct2.c deleted file mode 100644 index d80b61837f..0000000000 --- a/bsp/stm32_radio/libwma/mdct2.c +++ /dev/null @@ -1,375 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: normalized modified discrete cosine transform - power of two length transform only [64 <= n ] - - - Original algorithm adapted long ago from _The use of multirate filter - banks for coding of high quality digital audio_, by T. Sporer, - K. Brandenburg and B. Edler, collection of the European Signal - Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp - 211-214 - - The below code implements an algorithm that no longer looks much like - that presented in the paper, but the basic structure remains if you - dig deep enough to see it. - - This module DOES NOT INCLUDE code to generate/apply the window - function. Everybody has their own weird favorite including me... I - happen to like the properties of y=sin(.5PI*sin^2(x)), but others may - vehemently disagree. - - ********************************************************************/ - -/*Tremor IMDCT adapted for use with libwmai*/ - - -#include "mdct2.h" -#include "mdct_lookup.h" -#include "codeclib.h" -#include "asm_arm.h" - -extern void mdct_butterfly_32(int32_t *x); -extern void mdct_butterfly_generic_loop(int32_t *x1, int32_t *x2, - const int32_t *T0, int step, - const int32_t *Ttop); - -static inline void mdct_butterfly_generic(int32_t *x,int points, int step) -{ - mdct_butterfly_generic_loop(x + points, x + (points>>1), sincos_lookup0, step, sincos_lookup0+1024); -} - -static inline void mdct_butterflies(int32_t *x,int points,int shift) -{ - int stages=8-shift; - int i,j; - - for(i=0;--stages>0;i++) - { - for(j=0;j<(1<>i)*j,points>>i,4<<(i+shift)); - } - - for(j=0;j>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8); -} - -static inline void mdct_bitreverse(int32_t *x,int n,int step,int shift) -{ - int bit = 0; - int32_t *w0 = x; - int32_t *w1 = x = w0+(n>>1); - const int32_t *T = (step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; - const int32_t *Ttop = T+1024; - int32_t r2; - - do - { - int32_t r3 = bitrev12(bit++); - int32_t *x0 = x + ((r3 ^ 0xfff)>>shift) -1; - int32_t *x1 = x + (r3>>shift); - - register int32_t r0 = x0[0] + x1[0]; - register int32_t r1 = x1[1] - x0[1]; - - XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); - T+=step; - - w1 -= 4; - - r0 = (x0[1] + x1[1])>>1; - r1 = (x0[0] - x1[0])>>1; - w0[0] = r0 + r2; - w0[1] = r1 + r3; - w1[2] = r0 - r2; - w1[3] = r3 - r1; - - r3 = bitrev12(bit++); - x0 = x + ((r3 ^ 0xfff)>>shift) -1; - x1 = x + (r3>>shift); - - r0 = x0[0] + x1[0]; - r1 = x1[1] - x0[1]; - - XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); - T+=step; - - r0 = (x0[1] + x1[1])>>1; - r1 = (x0[0] - x1[0])>>1; - w0[2] = r0 + r2; - w0[3] = r1 + r3; - w1[0] = r0 - r2; - w1[1] = r3 - r1; - - w0 += 4; - } - while(T>shift) -1; - int32_t *x1 = x + (r3>>shift); - - register int32_t r0 = x0[0] + x1[0]; - register int32_t r1 = x1[1] - x0[1]; - - T-=step; - XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); - - w1 -= 4; - - r0 = (x0[1] + x1[1])>>1; - r1 = (x0[0] - x1[0])>>1; - w0[0] = r0 + r2; - w0[1] = r1 + r3; - w1[2] = r0 - r2; - w1[3] = r3 - r1; - - r3 = bitrev12(bit++); - x0 = x + ((r3 ^ 0xfff)>>shift) -1; - x1 = x + (r3>>shift); - - r0 = x0[0] + x1[0]; - r1 = x1[1] - x0[1]; - - T-=step; - XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); - - r0 = (x0[1] + x1[1])>>1; - r1 = (x0[0] - x1[0])>>1; - w0[2] = r0 + r2; - w0[3] = r1 + r3; - w1[0] = r0 - r2; - w1[1] = r3 - r1; - - w0 += 4; - } - while(w0>1; - int n4=n>>2; - int32_t *iX; - int32_t *oX; - const int32_t *T; - const int32_t *V; - int shift; - int step; - for (shift=6;!(n&(1<=in+n4); - do - { - oX-=4; - XPROD31( iX[4], iX[6], T[1], T[0], &oX[2], &oX[3] ); - T-=step; - XPROD31( iX[0], iX[2], T[1], T[0], &oX[0], &oX[1] ); - T-=step; - iX-=8; - } - while(iX>=in); - - iX = in+n2-8; - oX = out+n2+n4; - T = sincos_lookup0; - - do - { - T+=step; - XNPROD31( iX[6], iX[4], T[0], T[1], &oX[0], &oX[1] ); - T+=step; - XNPROD31( iX[2], iX[0], T[0], T[1], &oX[2], &oX[3] ); - iX-=8; - oX+=4; - } - while(iX>=in+n4); - do - { - T-=step; - XNPROD31( iX[6], iX[4], T[1], T[0], &oX[0], &oX[1] ); - T-=step; - XNPROD31( iX[2], iX[0], T[1], T[0], &oX[2], &oX[3] ); - iX-=8; - oX+=4; - } - while(iX>=in); - - mdct_butterflies(out+n2,n2,shift); - mdct_bitreverse(out,n,step,shift); - /* rotate + window */ - - step>>=2; - { - int32_t *oX1=out+n2+n4; - int32_t *oX2=out+n2+n4; - int32_t *iX =out; - - switch(step) - { - default: - { - T=(step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; - do - { - oX1-=4; - XPROD31( iX[0], -iX[1], T[0], T[1], &oX1[3], &oX2[0] ); - T+=step; - XPROD31( iX[2], -iX[3], T[0], T[1], &oX1[2], &oX2[1] ); - T+=step; - XPROD31( iX[4], -iX[5], T[0], T[1], &oX1[1], &oX2[2] ); - T+=step; - XPROD31( iX[6], -iX[7], T[0], T[1], &oX1[0], &oX2[3] ); - T+=step; - oX2+=4; - iX+=8; - } - while(iX>1; - t1 = (*T++)>>1; - do - { - oX1-=4; - - t0 += (v0 = (*V++)>>1); - t1 += (v1 = (*V++)>>1); - XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); - v0 += (t0 = (*T++)>>1); - v1 += (t1 = (*T++)>>1); - XPROD31( iX[2], -iX[3], v0, v1, &oX1[2], &oX2[1] ); - t0 += (v0 = (*V++)>>1); - t1 += (v1 = (*V++)>>1); - XPROD31( iX[4], -iX[5], t0, t1, &oX1[1], &oX2[2] ); - v0 += (t0 = (*T++)>>1); - v1 += (t1 = (*T++)>>1); - XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); - - oX2+=4; - iX+=8; - } - while(iX>2); - t1 += (q1 = (v1-t1)>>2); - XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); - t0 = v0-q0; - t1 = v1-q1; - XPROD31( iX[2], -iX[3], t0, t1, &oX1[2], &oX2[1] ); - - t0 = *T++; - t1 = *T++; - v0 += (q0 = (t0-v0)>>2); - v1 += (q1 = (t1-v1)>>2); - XPROD31( iX[4], -iX[5], v0, v1, &oX1[1], &oX2[2] ); - v0 = t0-q0; - v1 = t1-q1; - XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); - - oX2+=4; - iX+=8; - } - while(iXoX2); - } -} diff --git a/bsp/stm32_radio/libwma/mdct2.h b/bsp/stm32_radio/libwma/mdct2.h deleted file mode 100644 index 2458b408b9..0000000000 --- a/bsp/stm32_radio/libwma/mdct2.h +++ /dev/null @@ -1,75 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: modified discrete cosine transform prototypes - - ********************************************************************/ - -#ifndef _OGG_mdct_H_ -#define _OGG_mdct_H_ - -#include "ffmpeg_config.h" - -#ifdef _LOW_ACCURACY_ -# define X(n) (((((n)>>22)+1)>>1) - ((((n)>>22)+1)>>9)) -# //define LOOKUP_T const unsigned char -#else -# define X(n) (n) -# //define LOOKUP_T const ogg_int32_t -#endif - -// #include -#include "asm_arm.h" -// #include "asm_mcf5249.h" -// #include "codeclib_misc.h" - -#ifndef ICONST_ATTR_TREMOR_WINDOW -#define ICONST_ATTR_TREMOR_WINDOW ICONST_ATTR -#endif - -#ifndef ICODE_ATTR_TREMOR_MDCT -#define ICODE_ATTR_TREMOR_MDCT ICODE_ATTR -#endif - -#ifndef ICODE_ATTR_TREMOR_NOT_MDCT -#define ICODE_ATTR_TREMOR_NOT_MDCT ICODE_ATTR -#endif - - - -#ifdef _LOW_ACCURACY_ -#define cPI3_8 (0x0062) -#define cPI2_8 (0x00b5) -#define cPI1_8 (0x00ed) -#else -#define cPI3_8 (0x30fbc54d) -#define cPI2_8 (0x5a82799a) -#define cPI1_8 (0x7641af3d) -#endif - - -extern void mdct_backward(int n, int32_t *in, int32_t *out); - -#endif - - - - - - - - - - - - diff --git a/bsp/stm32_radio/libwma/mdct_arm.S b/bsp/stm32_radio/libwma/mdct_arm.S deleted file mode 100644 index 99320e8134..0000000000 --- a/bsp/stm32_radio/libwma/mdct_arm.S +++ /dev/null @@ -1,415 +0,0 @@ -cPI3_8 EQU 0x30fbc54d -cPI2_8 EQU 0x5a82799a -cPI1_8 EQU 0x7641af3d - - AREA |.text|, CODE, READONLY, ALIGN=2 - THUMB - REQUIRE8 - PRESERVE8 - -mdct_butterfly_8 PROC - add r9, r5, r1 ; x4 + x0 - sub r5, r5, r1 ; x4 - x0 - add r7, r6, r2 ; x5 + x1 - sub r6, r6, r2 ; x5 - x1 - add r8, r10, r3 ; x6 + x2 - sub r10, r10, r3 ; x6 - x2 - add r12, r11, r4 ; x7 + x3 - sub r11, r11, r4 ; x7 - x3 - - add r1, r10, r6 ; y0 = (x6 - x2) + (x5 - x1) - sub r2, r11, r5 ; y1 = (x7 - x3) - (x4 - x0) - sub r3, r10, r6 ; y2 = (x6 - x2) - (x5 - x1) - add r4, r11, r5 ; y3 = (x7 - x3) + (x4 - x0) - sub r5, r8, r9 ; y4 = (x6 + x2) - (x4 + x0) - sub r6, r12, r7 ; y5 = (x7 + x3) - (x5 + x1) - add r10, r8, r9 ; y6 = (x6 + x2) + (x4 + x0) - add r11, r12, r7 ; y7 = (x7 + x3) + (x5 + x1) - stmia r0, {r1, r2, r3, r4, r5, r6, r10, r11} - - bx lr - - ENDP - -mdct_butterfly_16 PROC - str lr, [sp, #-4]! - add r1, r0, #8*4 - - ldmia r0, {r2, r3, r4, r5} - ldmia r1, {r6, r7, r8, r9} - add r6, r6, r2 ; y8 = x8 + x0 - rsb r2, r6, r2, lsl #1 ; x0 - x8 - add r7, r7, r3 ; y9 = x9 + x1 - rsb r3, r7, r3, lsl #1 ; x1 - x9 - add r8, r8, r4 ; y10 = x10 + x2 - sub r11, r8, r4, lsl #1 ; x10 - x2 - add r9, r9, r5 ; y11 = x11 + x3 - rsb r10, r9, r5, lsl #1 ; x3 - x11 - - stmia r1!, {r6, r7, r8, r9} - - add r2, r2, r3 ; (x0 - x8) + (x1 - x9) - rsb r3, r2, r3, lsl #1 ; (x1 - x9) - (x0 - x8) - - ldr r12, =cPI2_8 - smull r8, r5, r12, r2 - smull r8, r6, r12, r3 - mov r5, r5, lsl #1 - mov r6, r6, lsl #1 - - stmia r0!, {r5, r6, r10, r11} - - ldmia r0, {r2, r3, r4, r5} - ldmia r1, {r6, r7, r8, r9} - add r6, r6, r2 ; y12 = x12 + x4 - sub r2, r6, r2, lsl #1 ; x12 - x4 - add r7, r7, r3 ; y13 = x13 + x5 - sub r3, r7, r3, lsl #1 ; x13 - x5 - add r8, r8, r4 ; y10 = x14 + x6 - sub r10, r8, r4, lsl #1 ; x14 - x6 - add r9, r9, r5 ; y11 = x15 + x7 - sub r11, r9, r5, lsl #1 ; x15 - x7 - - stmia r1, {r6, r7, r8, r9} - - sub r2, r2, r3 ; (x12 - x4) - (x13 - x5) - add r3, r2, r3, lsl #1 ; (x12 - x4) + (x13 - x5) - - smull r8, r5, r12, r2 - smull r8, r6, r12, r3 - mov r5, r5, lsl #1 - mov r6, r6, lsl #1 - ; no stmia here, r5, r6, r10, r11 are passed to mdct_butterfly_8 - - sub r0, r0, #4*4 - ldmia r0, {r1, r2, r3, r4} - bl mdct_butterfly_8 - add r0, r0, #8*4 - ldmia r0, {r1, r2, r3, r4, r5, r6, r10, r11} - bl mdct_butterfly_8 - - ldr pc, [sp], #4 - - ENDP - -mdct_butterfly_32 PROC - EXPORT mdct_butterfly_32 - - stmdb sp!, {r4-r11, lr} - - add r1, r0, #16*4 - - ldmia r0, {r2, r3, r4, r5} - ldmia r1, {r6, r7, r8, r9} - add r6, r6, r2 ; y16 = x16 + x0 - rsb r2, r6, r2, lsl #1 ; x0 - x16 - add r7, r7, r3 ; y17 = x17 + x1 - rsb r3, r7, r3, lsl #1 ; x1 - x17 - add r8, r8, r4 ; y18 = x18 + x2 - rsb r4, r8, r4, lsl #1 ; x2 - x18 - add r9, r9, r5 ; y19 = x19 + x3 - rsb r5, r9, r5, lsl #1 ; x3 - x19 - - stmia r1!, {r6, r7, r8, r9} - - ldr r12, =cPI1_8 - ldr lr, =cPI3_8 - smull r10, r6, r12, r2 - rsb r2, r2, #0 - smlal r10, r6, lr, r3 - smull r10, r7, r12, r3 - smlal r10, r7, lr, r2 - mov r6, r6, lsl #1 - mov r7, r7, lsl #1 - - add r4, r4, r5 ; (x3 - x19) + (x2 - x18) - rsb r5, r4, r5, lsl #1 ; (x3 - x19) - (x2 - x18) - - ldr r11, =cPI2_8 - smull r10, r8, r4, r11 - smull r10, r9, r5, r11 - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - - stmia r0!, {r6, r7, r8, r9} - - ldmia r0, {r2, r3, r4, r5} - ldmia r1, {r6, r7, r8, r9} - add r6, r6, r2 ; y20 = x20 + x4 - rsb r2, r6, r2, lsl #1 ; x4 - x20 - add r7, r7, r3 ; y21 = x21 + x5 - rsb r3, r7, r3, lsl #1 ; x5 - x21 - add r8, r8, r4 ; y22 = x22 + x6 - sub r4, r8, r4, lsl #1 ; x22 - x6 - add r9, r9, r5 ; y23 = x23 + x7 - rsb r5, r9, r5, lsl #1 ; x7 - x23 - - stmia r1!, {r6, r7, r8, r9} - - smull r10, r6, lr, r2 - rsb r2, r2, #0 - smlal r10, r6, r12, r3 - smull r10, r7, lr, r3 - smlal r10, r7, r12, r2 - mov r6, r6, lsl #1 - mov r7, r7, lsl #1 - - mov r8, r5 - mov r9, r4 - stmia r0!, {r6, r7, r8, r9} - - ldmia r0, {r2, r3, r4, r5} - ldmia r1, {r6, r7, r8, r9} - add r6, r6, r2 ; y24 = x24 + x8 - sub r2, r6, r2, lsl #1 ; x24 - x8 - add r7, r7, r3 ; y25 = x25 + x9 - sub r3, r7, r3, lsl #1 ; x25 - x9 - add r8, r8, r4 ; y26 = x26 + x10 - sub r4, r8, r4, lsl #1 ; x26 - x10 - add r9, r9, r5 ; y27 = x27 + x11 - sub r5, r9, r5, lsl #1 ; x27 - x11 - - stmia r1!, {r6, r7, r8, r9} - - smull r10, r7, lr, r3 - rsb r3, r3, #0 - smlal r10, r7, r12, r2 - smull r10, r6, r12, r3 - smlal r10, r6, lr, r2 - mov r6, r6, lsl #1 - mov r7, r7, lsl #1 - - sub r4, r4, r5 ; (x26 - x10) - (x27 - x11) - add r5, r4, r5, lsl #1 ; (x26 - x10) + (x27 - x11) - - ldr r11, =cPI2_8 - smull r10, r8, r11, r4 - smull r10, r9, r11, r5 - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - - stmia r0!, {r6, r7, r8, r9} - - ldmia r0, {r2, r3, r4, r5} - ldmia r1, {r6, r7, r8, r9} - add r6, r6, r2 ; y28 = x28 + x12 - sub r2, r6, r2, lsl #1 ; x28 - x12 - add r7, r7, r3 ; y29 = x29 + x13 - sub r3, r7, r3, lsl #1 ; x29 - x13 - add r8, r8, r4 ; y30 = x30 + x14 - sub r4, r8, r4, lsl #1 ; x30 - x14 - add r9, r9, r5 ; y31 = x31 + x15 - sub r5, r9, r5, lsl #1 ; x31 - x15 - - stmia r1, {r6, r7, r8, r9} - - smull r10, r7, r12, r3 - rsb r3, r3, #0 - smlal r10, r7, lr, r2 - smull r10, r6, lr, r3 - smlal r10, r6, r12, r2 - mov r6, r6, lsl #1 - mov r7, r7, lsl #1 - - mov r8, r4 - mov r9, r5 - stmia r0, {r6, r7, r8, r9} - - sub r0, r0, #12*4 - str r0, [sp, #-4]! - bl mdct_butterfly_16 - - ldr r0, [sp], #4 - add r0, r0, #16*4 - bl mdct_butterfly_16 - - ldmia sp!, {r4-r11, pc} - - ENDP - - ; mdct_butterfly_generic_loop(x1, x2, T0, step, Ttop) -mdct_butterfly_generic_loop PROC - EXPORT mdct_butterfly_generic_loop - stmdb sp!, {r4-r11, lr} - str r2, [sp, #-4] - ldr r4, [sp, #36] - -label_1 - ldmdb r0, {r6, r7, r8, r9} - ldmdb r1, {r10, r11, r12, r14} - - add r6, r6, r10 - sub r10, r6, r10, lsl #1 - add r7, r7, r11 - rsb r11, r7, r11, lsl #1 - add r8, r8, r12 - sub r12, r8, r12, lsl #1 - add r9, r9, r14 - rsb r14, r9, r14, lsl #1 - - stmdb r0!, {r6, r7, r8, r9} - - ldmia r2, {r6, r7} - smull r5, r8, r6, r14 - rsb r14, r14, #0 - smlal r5, r8, r7, r12 - smull r5, r9, r6, r12 - smlal r5, r9, r7, r14 - - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - stmdb r1!, {r8, r9} - add r2, r2, r3, lsl #2 - - ldmia r2, {r6, r7} - smull r5, r8, r6, r11 - rsb r11, r11, #0 - smlal r5, r8, r7, r10 - smull r5, r9, r6, r10 - smlal r5, r9, r7, r11 - - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - stmdb r1!, {r8, r9} - add r2, r2, r3, lsl #2 - - cmp r2, r4 - blo label_1 - - ldr r4, [sp, #-4] - -label_2 - ldmdb r0, {r6, r7, r8, r9} - ldmdb r1, {r10, r11, r12, r14} - - add r6, r6, r10 - sub r10, r6, r10, lsl #1 - add r7, r7, r11 - sub r11, r7, r11, lsl #1 - add r8, r8, r12 - sub r12, r8, r12, lsl #1 - add r9, r9, r14 - sub r14, r9, r14, lsl #1 - - stmdb r0!, {r6, r7, r8, r9} - - ldmia r2, {r6, r7} - smull r5, r9, r6, r14 - rsb r14, r14, #0 - smlal r5, r9, r7, r12 - smull r5, r8, r6, r12 - smlal r5, r8, r7, r14 - - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - stmdb r1!, {r8, r9} - sub r2, r2, r3, lsl #2 - - ldmia r2, {r6, r7} - smull r5, r9, r6, r11 - rsb r11, r11, #0 - smlal r5, r9, r7, r10 - smull r5, r8, r6, r10 - smlal r5, r8, r7, r11 - - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - stmdb r1!, {r8, r9} - sub r2, r2, r3, lsl #2 - - cmp r2, r4 - bhi label_2 - - ldr r4, [sp, #36] - -label_3 - ldmdb r0, {r6, r7, r8, r9} - ldmdb r1, {r10, r11, r12, r14} - - add r6, r6, r10 - rsb r10, r6, r10, lsl #1 - add r7, r7, r11 - rsb r11, r7, r11, lsl #1 - add r8, r8, r12 - rsb r12, r8, r12, lsl #1 - add r9, r9, r14 - rsb r14, r9, r14, lsl #1 - - stmdb r0!, {r6, r7, r8, r9} - - ldmia r2, {r6, r7} - smull r5, r8, r6, r12 - rsb r12, r12, #0 - smlal r5, r8, r7, r14 - smull r5, r9, r6, r14 - smlal r5, r9, r7, r12 - - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - stmdb r1!, {r8, r9} - add r2, r2, r3, lsl #2 - - ldmia r2, {r6, r7} - smull r5, r8, r6, r10 - rsb r10, r10, #0 - smlal r5, r8, r7, r11 - smull r5, r9, r6, r11 - smlal r5, r9, r7, r10 - - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - stmdb r1!, {r8, r9} - add r2, r2, r3, lsl #2 - - cmp r2, r4 - blo label_3 - - ldr r4, [sp, #-4] - -label_4 - ldmdb r0, {r6, r7, r8, r9} - ldmdb r1, {r10, r11, r12, r14} - - add r6, r6, r10 - sub r10, r6, r10, lsl #1 - add r7, r7, r11 - rsb r11, r7, r11, lsl #1 - add r8, r8, r12 - sub r12, r8, r12, lsl #1 - add r9, r9, r14 - rsb r14, r9, r14, lsl #1 - - stmdb r0!, {r6, r7, r8, r9} - - ldmia r2, {r6, r7} - smull r5, r9, r6, r12 - smlal r5, r9, r7, r14 - rsb r12, r12, #0 - smull r5, r8, r6, r14 - smlal r5, r8, r7, r12 - - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - stmdb r1!, {r8, r9} - sub r2, r2, r3, lsl #2 - - ldmia r2, {r6, r7} - smull r5, r9, r6, r10 - rsb r10, r10, #0 - smlal r5, r9, r7, r11 - smull r5, r8, r6, r11 - smlal r5, r8, r7, r10 - - mov r8, r8, lsl #1 - mov r9, r9, lsl #1 - stmdb r1!, {r8, r9} - sub r2, r2, r3, lsl #2 - - cmp r2, r4 - bhi label_4 - - ldmia sp!, {r4-r11, pc} - - ENDP - - END diff --git a/bsp/stm32_radio/libwma/mdct_lookup.h b/bsp/stm32_radio/libwma/mdct_lookup.h deleted file mode 100644 index 45cee5f60e..0000000000 --- a/bsp/stm32_radio/libwma/mdct_lookup.h +++ /dev/null @@ -1,544 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * - * * - ******************************************************************** - - function: sin,cos lookup tables - - ********************************************************************/ - - - - - - - -/* {sin(2*i*PI/4096), cos(2*i*PI/4096)}, with i = 0 to 512 */ -static const int32_t sincos_lookup0[1026] = { - X(0x00000000), X(0x7fffffff), X(0x003243f5), X(0x7ffff621), - X(0x006487e3), X(0x7fffd886), X(0x0096cbc1), X(0x7fffa72c), - X(0x00c90f88), X(0x7fff6216), X(0x00fb5330), X(0x7fff0943), - X(0x012d96b1), X(0x7ffe9cb2), X(0x015fda03), X(0x7ffe1c65), - X(0x01921d20), X(0x7ffd885a), X(0x01c45ffe), X(0x7ffce093), - X(0x01f6a297), X(0x7ffc250f), X(0x0228e4e2), X(0x7ffb55ce), - X(0x025b26d7), X(0x7ffa72d1), X(0x028d6870), X(0x7ff97c18), - X(0x02bfa9a4), X(0x7ff871a2), X(0x02f1ea6c), X(0x7ff75370), - X(0x03242abf), X(0x7ff62182), X(0x03566a96), X(0x7ff4dbd9), - X(0x0388a9ea), X(0x7ff38274), X(0x03bae8b2), X(0x7ff21553), - X(0x03ed26e6), X(0x7ff09478), X(0x041f6480), X(0x7feeffe1), - X(0x0451a177), X(0x7fed5791), X(0x0483ddc3), X(0x7feb9b85), - X(0x04b6195d), X(0x7fe9cbc0), X(0x04e8543e), X(0x7fe7e841), - X(0x051a8e5c), X(0x7fe5f108), X(0x054cc7b1), X(0x7fe3e616), - X(0x057f0035), X(0x7fe1c76b), X(0x05b137df), X(0x7fdf9508), - X(0x05e36ea9), X(0x7fdd4eec), X(0x0615a48b), X(0x7fdaf519), - X(0x0647d97c), X(0x7fd8878e), X(0x067a0d76), X(0x7fd6064c), - X(0x06ac406f), X(0x7fd37153), X(0x06de7262), X(0x7fd0c8a3), - X(0x0710a345), X(0x7fce0c3e), X(0x0742d311), X(0x7fcb3c23), - X(0x077501be), X(0x7fc85854), X(0x07a72f45), X(0x7fc560cf), - X(0x07d95b9e), X(0x7fc25596), X(0x080b86c2), X(0x7fbf36aa), - X(0x083db0a7), X(0x7fbc040a), X(0x086fd947), X(0x7fb8bdb8), - X(0x08a2009a), X(0x7fb563b3), X(0x08d42699), X(0x7fb1f5fc), - X(0x09064b3a), X(0x7fae7495), X(0x09386e78), X(0x7faadf7c), - X(0x096a9049), X(0x7fa736b4), X(0x099cb0a7), X(0x7fa37a3c), - X(0x09cecf89), X(0x7f9faa15), X(0x0a00ece8), X(0x7f9bc640), - X(0x0a3308bd), X(0x7f97cebd), X(0x0a6522fe), X(0x7f93c38c), - X(0x0a973ba5), X(0x7f8fa4b0), X(0x0ac952aa), X(0x7f8b7227), - X(0x0afb6805), X(0x7f872bf3), X(0x0b2d7baf), X(0x7f82d214), - X(0x0b5f8d9f), X(0x7f7e648c), X(0x0b919dcf), X(0x7f79e35a), - X(0x0bc3ac35), X(0x7f754e80), X(0x0bf5b8cb), X(0x7f70a5fe), - X(0x0c27c389), X(0x7f6be9d4), X(0x0c59cc68), X(0x7f671a05), - X(0x0c8bd35e), X(0x7f62368f), X(0x0cbdd865), X(0x7f5d3f75), - X(0x0cefdb76), X(0x7f5834b7), X(0x0d21dc87), X(0x7f531655), - X(0x0d53db92), X(0x7f4de451), X(0x0d85d88f), X(0x7f489eaa), - X(0x0db7d376), X(0x7f434563), X(0x0de9cc40), X(0x7f3dd87c), - X(0x0e1bc2e4), X(0x7f3857f6), X(0x0e4db75b), X(0x7f32c3d1), - X(0x0e7fa99e), X(0x7f2d1c0e), X(0x0eb199a4), X(0x7f2760af), - X(0x0ee38766), X(0x7f2191b4), X(0x0f1572dc), X(0x7f1baf1e), - X(0x0f475bff), X(0x7f15b8ee), X(0x0f7942c7), X(0x7f0faf25), - X(0x0fab272b), X(0x7f0991c4), X(0x0fdd0926), X(0x7f0360cb), - X(0x100ee8ad), X(0x7efd1c3c), X(0x1040c5bb), X(0x7ef6c418), - X(0x1072a048), X(0x7ef05860), X(0x10a4784b), X(0x7ee9d914), - X(0x10d64dbd), X(0x7ee34636), X(0x11082096), X(0x7edc9fc6), - X(0x1139f0cf), X(0x7ed5e5c6), X(0x116bbe60), X(0x7ecf1837), - X(0x119d8941), X(0x7ec8371a), X(0x11cf516a), X(0x7ec14270), - X(0x120116d5), X(0x7eba3a39), X(0x1232d979), X(0x7eb31e78), - X(0x1264994e), X(0x7eabef2c), X(0x1296564d), X(0x7ea4ac58), - X(0x12c8106f), X(0x7e9d55fc), X(0x12f9c7aa), X(0x7e95ec1a), - X(0x132b7bf9), X(0x7e8e6eb2), X(0x135d2d53), X(0x7e86ddc6), - X(0x138edbb1), X(0x7e7f3957), X(0x13c0870a), X(0x7e778166), - X(0x13f22f58), X(0x7e6fb5f4), X(0x1423d492), X(0x7e67d703), - X(0x145576b1), X(0x7e5fe493), X(0x148715ae), X(0x7e57dea7), - X(0x14b8b17f), X(0x7e4fc53e), X(0x14ea4a1f), X(0x7e47985b), - X(0x151bdf86), X(0x7e3f57ff), X(0x154d71aa), X(0x7e37042a), - X(0x157f0086), X(0x7e2e9cdf), X(0x15b08c12), X(0x7e26221f), - X(0x15e21445), X(0x7e1d93ea), X(0x16139918), X(0x7e14f242), - X(0x16451a83), X(0x7e0c3d29), X(0x1676987f), X(0x7e0374a0), - X(0x16a81305), X(0x7dfa98a8), X(0x16d98a0c), X(0x7df1a942), - X(0x170afd8d), X(0x7de8a670), X(0x173c6d80), X(0x7ddf9034), - X(0x176dd9de), X(0x7dd6668f), X(0x179f429f), X(0x7dcd2981), - X(0x17d0a7bc), X(0x7dc3d90d), X(0x1802092c), X(0x7dba7534), - X(0x183366e9), X(0x7db0fdf8), X(0x1864c0ea), X(0x7da77359), - X(0x18961728), X(0x7d9dd55a), X(0x18c7699b), X(0x7d9423fc), - X(0x18f8b83c), X(0x7d8a5f40), X(0x192a0304), X(0x7d808728), - X(0x195b49ea), X(0x7d769bb5), X(0x198c8ce7), X(0x7d6c9ce9), - X(0x19bdcbf3), X(0x7d628ac6), X(0x19ef0707), X(0x7d58654d), - X(0x1a203e1b), X(0x7d4e2c7f), X(0x1a517128), X(0x7d43e05e), - X(0x1a82a026), X(0x7d3980ec), X(0x1ab3cb0d), X(0x7d2f0e2b), - X(0x1ae4f1d6), X(0x7d24881b), X(0x1b161479), X(0x7d19eebf), - X(0x1b4732ef), X(0x7d0f4218), X(0x1b784d30), X(0x7d048228), - X(0x1ba96335), X(0x7cf9aef0), X(0x1bda74f6), X(0x7ceec873), - X(0x1c0b826a), X(0x7ce3ceb2), X(0x1c3c8b8c), X(0x7cd8c1ae), - X(0x1c6d9053), X(0x7ccda169), X(0x1c9e90b8), X(0x7cc26de5), - X(0x1ccf8cb3), X(0x7cb72724), X(0x1d00843d), X(0x7cabcd28), - X(0x1d31774d), X(0x7ca05ff1), X(0x1d6265dd), X(0x7c94df83), - X(0x1d934fe5), X(0x7c894bde), X(0x1dc4355e), X(0x7c7da505), - X(0x1df5163f), X(0x7c71eaf9), X(0x1e25f282), X(0x7c661dbc), - X(0x1e56ca1e), X(0x7c5a3d50), X(0x1e879d0d), X(0x7c4e49b7), - X(0x1eb86b46), X(0x7c4242f2), X(0x1ee934c3), X(0x7c362904), - X(0x1f19f97b), X(0x7c29fbee), X(0x1f4ab968), X(0x7c1dbbb3), - X(0x1f7b7481), X(0x7c116853), X(0x1fac2abf), X(0x7c0501d2), - X(0x1fdcdc1b), X(0x7bf88830), X(0x200d888d), X(0x7bebfb70), - X(0x203e300d), X(0x7bdf5b94), X(0x206ed295), X(0x7bd2a89e), - X(0x209f701c), X(0x7bc5e290), X(0x20d0089c), X(0x7bb9096b), - X(0x21009c0c), X(0x7bac1d31), X(0x21312a65), X(0x7b9f1de6), - X(0x2161b3a0), X(0x7b920b89), X(0x219237b5), X(0x7b84e61f), - X(0x21c2b69c), X(0x7b77ada8), X(0x21f3304f), X(0x7b6a6227), - X(0x2223a4c5), X(0x7b5d039e), X(0x225413f8), X(0x7b4f920e), - X(0x22847de0), X(0x7b420d7a), X(0x22b4e274), X(0x7b3475e5), - X(0x22e541af), X(0x7b26cb4f), X(0x23159b88), X(0x7b190dbc), - X(0x2345eff8), X(0x7b0b3d2c), X(0x23763ef7), X(0x7afd59a4), - X(0x23a6887f), X(0x7aef6323), X(0x23d6cc87), X(0x7ae159ae), - X(0x24070b08), X(0x7ad33d45), X(0x243743fa), X(0x7ac50dec), - X(0x24677758), X(0x7ab6cba4), X(0x2497a517), X(0x7aa8766f), - X(0x24c7cd33), X(0x7a9a0e50), X(0x24f7efa2), X(0x7a8b9348), - X(0x25280c5e), X(0x7a7d055b), X(0x2558235f), X(0x7a6e648a), - X(0x2588349d), X(0x7a5fb0d8), X(0x25b84012), X(0x7a50ea47), - X(0x25e845b6), X(0x7a4210d8), X(0x26184581), X(0x7a332490), - X(0x26483f6c), X(0x7a24256f), X(0x26783370), X(0x7a151378), - X(0x26a82186), X(0x7a05eead), X(0x26d809a5), X(0x79f6b711), - X(0x2707ebc7), X(0x79e76ca7), X(0x2737c7e3), X(0x79d80f6f), - X(0x27679df4), X(0x79c89f6e), X(0x27976df1), X(0x79b91ca4), - X(0x27c737d3), X(0x79a98715), X(0x27f6fb92), X(0x7999dec4), - X(0x2826b928), X(0x798a23b1), X(0x2856708d), X(0x797a55e0), - X(0x288621b9), X(0x796a7554), X(0x28b5cca5), X(0x795a820e), - X(0x28e5714b), X(0x794a7c12), X(0x29150fa1), X(0x793a6361), - X(0x2944a7a2), X(0x792a37fe), X(0x29743946), X(0x7919f9ec), - X(0x29a3c485), X(0x7909a92d), X(0x29d34958), X(0x78f945c3), - X(0x2a02c7b8), X(0x78e8cfb2), X(0x2a323f9e), X(0x78d846fb), - X(0x2a61b101), X(0x78c7aba2), X(0x2a911bdc), X(0x78b6fda8), - X(0x2ac08026), X(0x78a63d11), X(0x2aefddd8), X(0x789569df), - X(0x2b1f34eb), X(0x78848414), X(0x2b4e8558), X(0x78738bb3), - X(0x2b7dcf17), X(0x786280bf), X(0x2bad1221), X(0x7851633b), - X(0x2bdc4e6f), X(0x78403329), X(0x2c0b83fa), X(0x782ef08b), - X(0x2c3ab2b9), X(0x781d9b65), X(0x2c69daa6), X(0x780c33b8), - X(0x2c98fbba), X(0x77fab989), X(0x2cc815ee), X(0x77e92cd9), - X(0x2cf72939), X(0x77d78daa), X(0x2d263596), X(0x77c5dc01), - X(0x2d553afc), X(0x77b417df), X(0x2d843964), X(0x77a24148), - X(0x2db330c7), X(0x7790583e), X(0x2de2211e), X(0x777e5cc3), - X(0x2e110a62), X(0x776c4edb), X(0x2e3fec8b), X(0x775a2e89), - X(0x2e6ec792), X(0x7747fbce), X(0x2e9d9b70), X(0x7735b6af), - X(0x2ecc681e), X(0x77235f2d), X(0x2efb2d95), X(0x7710f54c), - X(0x2f29ebcc), X(0x76fe790e), X(0x2f58a2be), X(0x76ebea77), - X(0x2f875262), X(0x76d94989), X(0x2fb5fab2), X(0x76c69647), - X(0x2fe49ba7), X(0x76b3d0b4), X(0x30133539), X(0x76a0f8d2), - X(0x3041c761), X(0x768e0ea6), X(0x30705217), X(0x767b1231), - X(0x309ed556), X(0x76680376), X(0x30cd5115), X(0x7654e279), - X(0x30fbc54d), X(0x7641af3d), X(0x312a31f8), X(0x762e69c4), - X(0x3158970e), X(0x761b1211), X(0x3186f487), X(0x7607a828), - X(0x31b54a5e), X(0x75f42c0b), X(0x31e39889), X(0x75e09dbd), - X(0x3211df04), X(0x75ccfd42), X(0x32401dc6), X(0x75b94a9c), - X(0x326e54c7), X(0x75a585cf), X(0x329c8402), X(0x7591aedd), - X(0x32caab6f), X(0x757dc5ca), X(0x32f8cb07), X(0x7569ca99), - X(0x3326e2c3), X(0x7555bd4c), X(0x3354f29b), X(0x75419de7), - X(0x3382fa88), X(0x752d6c6c), X(0x33b0fa84), X(0x751928e0), - X(0x33def287), X(0x7504d345), X(0x340ce28b), X(0x74f06b9e), - X(0x343aca87), X(0x74dbf1ef), X(0x3468aa76), X(0x74c7663a), - X(0x34968250), X(0x74b2c884), X(0x34c4520d), X(0x749e18cd), - X(0x34f219a8), X(0x7489571c), X(0x351fd918), X(0x74748371), - X(0x354d9057), X(0x745f9dd1), X(0x357b3f5d), X(0x744aa63f), - X(0x35a8e625), X(0x74359cbd), X(0x35d684a6), X(0x74208150), - X(0x36041ad9), X(0x740b53fb), X(0x3631a8b8), X(0x73f614c0), - X(0x365f2e3b), X(0x73e0c3a3), X(0x368cab5c), X(0x73cb60a8), - X(0x36ba2014), X(0x73b5ebd1), X(0x36e78c5b), X(0x73a06522), - X(0x3714f02a), X(0x738acc9e), X(0x37424b7b), X(0x73752249), - X(0x376f9e46), X(0x735f6626), X(0x379ce885), X(0x73499838), - X(0x37ca2a30), X(0x7333b883), X(0x37f76341), X(0x731dc70a), - X(0x382493b0), X(0x7307c3d0), X(0x3851bb77), X(0x72f1aed9), - X(0x387eda8e), X(0x72db8828), X(0x38abf0ef), X(0x72c54fc1), - X(0x38d8fe93), X(0x72af05a7), X(0x39060373), X(0x7298a9dd), - X(0x3932ff87), X(0x72823c67), X(0x395ff2c9), X(0x726bbd48), - X(0x398cdd32), X(0x72552c85), X(0x39b9bebc), X(0x723e8a20), - X(0x39e6975e), X(0x7227d61c), X(0x3a136712), X(0x7211107e), - X(0x3a402dd2), X(0x71fa3949), X(0x3a6ceb96), X(0x71e35080), - X(0x3a99a057), X(0x71cc5626), X(0x3ac64c0f), X(0x71b54a41), - X(0x3af2eeb7), X(0x719e2cd2), X(0x3b1f8848), X(0x7186fdde), - X(0x3b4c18ba), X(0x716fbd68), X(0x3b78a007), X(0x71586b74), - X(0x3ba51e29), X(0x71410805), X(0x3bd19318), X(0x7129931f), - X(0x3bfdfecd), X(0x71120cc5), X(0x3c2a6142), X(0x70fa74fc), - X(0x3c56ba70), X(0x70e2cbc6), X(0x3c830a50), X(0x70cb1128), - X(0x3caf50da), X(0x70b34525), X(0x3cdb8e09), X(0x709b67c0), - X(0x3d07c1d6), X(0x708378ff), X(0x3d33ec39), X(0x706b78e3), - X(0x3d600d2c), X(0x70536771), X(0x3d8c24a8), X(0x703b44ad), - X(0x3db832a6), X(0x7023109a), X(0x3de4371f), X(0x700acb3c), - X(0x3e10320d), X(0x6ff27497), X(0x3e3c2369), X(0x6fda0cae), - X(0x3e680b2c), X(0x6fc19385), X(0x3e93e950), X(0x6fa90921), - X(0x3ebfbdcd), X(0x6f906d84), X(0x3eeb889c), X(0x6f77c0b3), - X(0x3f1749b8), X(0x6f5f02b2), X(0x3f430119), X(0x6f463383), - X(0x3f6eaeb8), X(0x6f2d532c), X(0x3f9a5290), X(0x6f1461b0), - X(0x3fc5ec98), X(0x6efb5f12), X(0x3ff17cca), X(0x6ee24b57), - X(0x401d0321), X(0x6ec92683), X(0x40487f94), X(0x6eaff099), - X(0x4073f21d), X(0x6e96a99d), X(0x409f5ab6), X(0x6e7d5193), - X(0x40cab958), X(0x6e63e87f), X(0x40f60dfb), X(0x6e4a6e66), - X(0x4121589b), X(0x6e30e34a), X(0x414c992f), X(0x6e174730), - X(0x4177cfb1), X(0x6dfd9a1c), X(0x41a2fc1a), X(0x6de3dc11), - X(0x41ce1e65), X(0x6dca0d14), X(0x41f93689), X(0x6db02d29), - X(0x42244481), X(0x6d963c54), X(0x424f4845), X(0x6d7c3a98), - X(0x427a41d0), X(0x6d6227fa), X(0x42a5311b), X(0x6d48047e), - X(0x42d0161e), X(0x6d2dd027), X(0x42faf0d4), X(0x6d138afb), - X(0x4325c135), X(0x6cf934fc), X(0x4350873c), X(0x6cdece2f), - X(0x437b42e1), X(0x6cc45698), X(0x43a5f41e), X(0x6ca9ce3b), - X(0x43d09aed), X(0x6c8f351c), X(0x43fb3746), X(0x6c748b3f), - X(0x4425c923), X(0x6c59d0a9), X(0x4450507e), X(0x6c3f055d), - X(0x447acd50), X(0x6c242960), X(0x44a53f93), X(0x6c093cb6), - X(0x44cfa740), X(0x6bee3f62), X(0x44fa0450), X(0x6bd3316a), - X(0x452456bd), X(0x6bb812d1), X(0x454e9e80), X(0x6b9ce39b), - X(0x4578db93), X(0x6b81a3cd), X(0x45a30df0), X(0x6b66536b), - X(0x45cd358f), X(0x6b4af279), X(0x45f7526b), X(0x6b2f80fb), - X(0x4621647d), X(0x6b13fef5), X(0x464b6bbe), X(0x6af86c6c), - X(0x46756828), X(0x6adcc964), X(0x469f59b4), X(0x6ac115e2), - X(0x46c9405c), X(0x6aa551e9), X(0x46f31c1a), X(0x6a897d7d), - X(0x471cece7), X(0x6a6d98a4), X(0x4746b2bc), X(0x6a51a361), - X(0x47706d93), X(0x6a359db9), X(0x479a1d67), X(0x6a1987b0), - X(0x47c3c22f), X(0x69fd614a), X(0x47ed5be6), X(0x69e12a8c), - X(0x4816ea86), X(0x69c4e37a), X(0x48406e08), X(0x69a88c19), - X(0x4869e665), X(0x698c246c), X(0x48935397), X(0x696fac78), - X(0x48bcb599), X(0x69532442), X(0x48e60c62), X(0x69368bce), - X(0x490f57ee), X(0x6919e320), X(0x49389836), X(0x68fd2a3d), - X(0x4961cd33), X(0x68e06129), X(0x498af6df), X(0x68c387e9), - X(0x49b41533), X(0x68a69e81), X(0x49dd282a), X(0x6889a4f6), - X(0x4a062fbd), X(0x686c9b4b), X(0x4a2f2be6), X(0x684f8186), - X(0x4a581c9e), X(0x683257ab), X(0x4a8101de), X(0x68151dbe), - X(0x4aa9dba2), X(0x67f7d3c5), X(0x4ad2a9e2), X(0x67da79c3), - X(0x4afb6c98), X(0x67bd0fbd), X(0x4b2423be), X(0x679f95b7), - X(0x4b4ccf4d), X(0x67820bb7), X(0x4b756f40), X(0x676471c0), - X(0x4b9e0390), X(0x6746c7d8), X(0x4bc68c36), X(0x67290e02), - X(0x4bef092d), X(0x670b4444), X(0x4c177a6e), X(0x66ed6aa1), - X(0x4c3fdff4), X(0x66cf8120), X(0x4c6839b7), X(0x66b187c3), - X(0x4c9087b1), X(0x66937e91), X(0x4cb8c9dd), X(0x6675658c), - X(0x4ce10034), X(0x66573cbb), X(0x4d092ab0), X(0x66390422), - X(0x4d31494b), X(0x661abbc5), X(0x4d595bfe), X(0x65fc63a9), - X(0x4d8162c4), X(0x65ddfbd3), X(0x4da95d96), X(0x65bf8447), - X(0x4dd14c6e), X(0x65a0fd0b), X(0x4df92f46), X(0x65826622), - X(0x4e210617), X(0x6563bf92), X(0x4e48d0dd), X(0x6545095f), - X(0x4e708f8f), X(0x6526438f), X(0x4e984229), X(0x65076e25), - X(0x4ebfe8a5), X(0x64e88926), X(0x4ee782fb), X(0x64c99498), - X(0x4f0f1126), X(0x64aa907f), X(0x4f369320), X(0x648b7ce0), - X(0x4f5e08e3), X(0x646c59bf), X(0x4f857269), X(0x644d2722), - X(0x4faccfab), X(0x642de50d), X(0x4fd420a4), X(0x640e9386), - X(0x4ffb654d), X(0x63ef3290), X(0x50229da1), X(0x63cfc231), - X(0x5049c999), X(0x63b0426d), X(0x5070e92f), X(0x6390b34a), - X(0x5097fc5e), X(0x637114cc), X(0x50bf031f), X(0x635166f9), - X(0x50e5fd6d), X(0x6331a9d4), X(0x510ceb40), X(0x6311dd64), - X(0x5133cc94), X(0x62f201ac), X(0x515aa162), X(0x62d216b3), - X(0x518169a5), X(0x62b21c7b), X(0x51a82555), X(0x6292130c), - X(0x51ced46e), X(0x6271fa69), X(0x51f576ea), X(0x6251d298), - X(0x521c0cc2), X(0x62319b9d), X(0x524295f0), X(0x6211557e), - X(0x5269126e), X(0x61f1003f), X(0x528f8238), X(0x61d09be5), - X(0x52b5e546), X(0x61b02876), X(0x52dc3b92), X(0x618fa5f7), - X(0x53028518), X(0x616f146c), X(0x5328c1d0), X(0x614e73da), - X(0x534ef1b5), X(0x612dc447), X(0x537514c2), X(0x610d05b7), - X(0x539b2af0), X(0x60ec3830), X(0x53c13439), X(0x60cb5bb7), - X(0x53e73097), X(0x60aa7050), X(0x540d2005), X(0x60897601), - X(0x5433027d), X(0x60686ccf), X(0x5458d7f9), X(0x604754bf), - X(0x547ea073), X(0x60262dd6), X(0x54a45be6), X(0x6004f819), - X(0x54ca0a4b), X(0x5fe3b38d), X(0x54efab9c), X(0x5fc26038), - X(0x55153fd4), X(0x5fa0fe1f), X(0x553ac6ee), X(0x5f7f8d46), - X(0x556040e2), X(0x5f5e0db3), X(0x5585adad), X(0x5f3c7f6b), - X(0x55ab0d46), X(0x5f1ae274), X(0x55d05faa), X(0x5ef936d1), - X(0x55f5a4d2), X(0x5ed77c8a), X(0x561adcb9), X(0x5eb5b3a2), - X(0x56400758), X(0x5e93dc1f), X(0x566524aa), X(0x5e71f606), - X(0x568a34a9), X(0x5e50015d), X(0x56af3750), X(0x5e2dfe29), - X(0x56d42c99), X(0x5e0bec6e), X(0x56f9147e), X(0x5de9cc33), - X(0x571deefa), X(0x5dc79d7c), X(0x5742bc06), X(0x5da5604f), - X(0x57677b9d), X(0x5d8314b1), X(0x578c2dba), X(0x5d60baa7), - X(0x57b0d256), X(0x5d3e5237), X(0x57d5696d), X(0x5d1bdb65), - X(0x57f9f2f8), X(0x5cf95638), X(0x581e6ef1), X(0x5cd6c2b5), - X(0x5842dd54), X(0x5cb420e0), X(0x58673e1b), X(0x5c9170bf), - X(0x588b9140), X(0x5c6eb258), X(0x58afd6bd), X(0x5c4be5b0), - X(0x58d40e8c), X(0x5c290acc), X(0x58f838a9), X(0x5c0621b2), - X(0x591c550e), X(0x5be32a67), X(0x594063b5), X(0x5bc024f0), - X(0x59646498), X(0x5b9d1154), X(0x598857b2), X(0x5b79ef96), - X(0x59ac3cfd), X(0x5b56bfbd), X(0x59d01475), X(0x5b3381ce), - X(0x59f3de12), X(0x5b1035cf), X(0x5a1799d1), X(0x5aecdbc5), - X(0x5a3b47ab), X(0x5ac973b5), X(0x5a5ee79a), X(0x5aa5fda5), - X(0x5a82799a), X(0x5a82799a) - }; - - /* {sin((2*i+1)*PI/4096), cos((2*i+1)*PI/4096)}, with i = 0 to 511 */ -static const int32_t sincos_lookup1[1024] = { - X(0x001921fb), X(0x7ffffd88), X(0x004b65ee), X(0x7fffe9cb), - X(0x007da9d4), X(0x7fffc251), X(0x00afeda8), X(0x7fff8719), - X(0x00e23160), X(0x7fff3824), X(0x011474f6), X(0x7ffed572), - X(0x0146b860), X(0x7ffe5f03), X(0x0178fb99), X(0x7ffdd4d7), - X(0x01ab3e97), X(0x7ffd36ee), X(0x01dd8154), X(0x7ffc8549), - X(0x020fc3c6), X(0x7ffbbfe6), X(0x024205e8), X(0x7ffae6c7), - X(0x027447b0), X(0x7ff9f9ec), X(0x02a68917), X(0x7ff8f954), - X(0x02d8ca16), X(0x7ff7e500), X(0x030b0aa4), X(0x7ff6bcf0), - X(0x033d4abb), X(0x7ff58125), X(0x036f8a51), X(0x7ff4319d), - X(0x03a1c960), X(0x7ff2ce5b), X(0x03d407df), X(0x7ff1575d), - X(0x040645c7), X(0x7fefcca4), X(0x04388310), X(0x7fee2e30), - X(0x046abfb3), X(0x7fec7c02), X(0x049cfba7), X(0x7feab61a), - X(0x04cf36e5), X(0x7fe8dc78), X(0x05017165), X(0x7fe6ef1c), - X(0x0533ab20), X(0x7fe4ee06), X(0x0565e40d), X(0x7fe2d938), - X(0x05981c26), X(0x7fe0b0b1), X(0x05ca5361), X(0x7fde7471), - X(0x05fc89b8), X(0x7fdc247a), X(0x062ebf22), X(0x7fd9c0ca), - X(0x0660f398), X(0x7fd74964), X(0x06932713), X(0x7fd4be46), - X(0x06c5598a), X(0x7fd21f72), X(0x06f78af6), X(0x7fcf6ce8), - X(0x0729bb4e), X(0x7fcca6a7), X(0x075bea8c), X(0x7fc9ccb2), - X(0x078e18a7), X(0x7fc6df08), X(0x07c04598), X(0x7fc3dda9), - X(0x07f27157), X(0x7fc0c896), X(0x08249bdd), X(0x7fbd9fd0), - X(0x0856c520), X(0x7fba6357), X(0x0888ed1b), X(0x7fb7132b), - X(0x08bb13c5), X(0x7fb3af4e), X(0x08ed3916), X(0x7fb037bf), - X(0x091f5d06), X(0x7facac7f), X(0x09517f8f), X(0x7fa90d8e), - X(0x0983a0a7), X(0x7fa55aee), X(0x09b5c048), X(0x7fa1949e), - X(0x09e7de6a), X(0x7f9dbaa0), X(0x0a19fb04), X(0x7f99ccf4), - X(0x0a4c1610), X(0x7f95cb9a), X(0x0a7e2f85), X(0x7f91b694), - X(0x0ab0475c), X(0x7f8d8de1), X(0x0ae25d8d), X(0x7f895182), - X(0x0b147211), X(0x7f850179), X(0x0b4684df), X(0x7f809dc5), - X(0x0b7895f0), X(0x7f7c2668), X(0x0baaa53b), X(0x7f779b62), - X(0x0bdcb2bb), X(0x7f72fcb4), X(0x0c0ebe66), X(0x7f6e4a5e), - X(0x0c40c835), X(0x7f698461), X(0x0c72d020), X(0x7f64aabf), - X(0x0ca4d620), X(0x7f5fbd77), X(0x0cd6da2d), X(0x7f5abc8a), - X(0x0d08dc3f), X(0x7f55a7fa), X(0x0d3adc4e), X(0x7f507fc7), - X(0x0d6cda53), X(0x7f4b43f2), X(0x0d9ed646), X(0x7f45f47b), - X(0x0dd0d01f), X(0x7f409164), X(0x0e02c7d7), X(0x7f3b1aad), - X(0x0e34bd66), X(0x7f359057), X(0x0e66b0c3), X(0x7f2ff263), - X(0x0e98a1e9), X(0x7f2a40d2), X(0x0eca90ce), X(0x7f247ba5), - X(0x0efc7d6b), X(0x7f1ea2dc), X(0x0f2e67b8), X(0x7f18b679), - X(0x0f604faf), X(0x7f12b67c), X(0x0f923546), X(0x7f0ca2e7), - X(0x0fc41876), X(0x7f067bba), X(0x0ff5f938), X(0x7f0040f6), - X(0x1027d784), X(0x7ef9f29d), X(0x1059b352), X(0x7ef390ae), - X(0x108b8c9b), X(0x7eed1b2c), X(0x10bd6356), X(0x7ee69217), - X(0x10ef377d), X(0x7edff570), X(0x11210907), X(0x7ed94538), - X(0x1152d7ed), X(0x7ed28171), X(0x1184a427), X(0x7ecbaa1a), - X(0x11b66dad), X(0x7ec4bf36), X(0x11e83478), X(0x7ebdc0c6), - X(0x1219f880), X(0x7eb6aeca), X(0x124bb9be), X(0x7eaf8943), - X(0x127d7829), X(0x7ea85033), X(0x12af33ba), X(0x7ea1039b), - X(0x12e0ec6a), X(0x7e99a37c), X(0x1312a230), X(0x7e922fd6), - X(0x13445505), X(0x7e8aa8ac), X(0x137604e2), X(0x7e830dff), - X(0x13a7b1bf), X(0x7e7b5fce), X(0x13d95b93), X(0x7e739e1d), - X(0x140b0258), X(0x7e6bc8eb), X(0x143ca605), X(0x7e63e03b), - X(0x146e4694), X(0x7e5be40c), X(0x149fe3fc), X(0x7e53d462), - X(0x14d17e36), X(0x7e4bb13c), X(0x1503153a), X(0x7e437a9c), - X(0x1534a901), X(0x7e3b3083), X(0x15663982), X(0x7e32d2f4), - X(0x1597c6b7), X(0x7e2a61ed), X(0x15c95097), X(0x7e21dd73), - X(0x15fad71b), X(0x7e194584), X(0x162c5a3b), X(0x7e109a24), - X(0x165dd9f0), X(0x7e07db52), X(0x168f5632), X(0x7dff0911), - X(0x16c0cef9), X(0x7df62362), X(0x16f2443e), X(0x7ded2a47), - X(0x1723b5f9), X(0x7de41dc0), X(0x17552422), X(0x7ddafdce), - X(0x17868eb3), X(0x7dd1ca75), X(0x17b7f5a3), X(0x7dc883b4), - X(0x17e958ea), X(0x7dbf298d), X(0x181ab881), X(0x7db5bc02), - X(0x184c1461), X(0x7dac3b15), X(0x187d6c82), X(0x7da2a6c6), - X(0x18aec0db), X(0x7d98ff17), X(0x18e01167), X(0x7d8f4409), - X(0x19115e1c), X(0x7d85759f), X(0x1942a6f3), X(0x7d7b93da), - X(0x1973ebe6), X(0x7d719eba), X(0x19a52ceb), X(0x7d679642), - X(0x19d669fc), X(0x7d5d7a74), X(0x1a07a311), X(0x7d534b50), - X(0x1a38d823), X(0x7d4908d9), X(0x1a6a0929), X(0x7d3eb30f), - X(0x1a9b361d), X(0x7d3449f5), X(0x1acc5ef6), X(0x7d29cd8c), - X(0x1afd83ad), X(0x7d1f3dd6), X(0x1b2ea43a), X(0x7d149ad5), - X(0x1b5fc097), X(0x7d09e489), X(0x1b90d8bb), X(0x7cff1af5), - X(0x1bc1ec9e), X(0x7cf43e1a), X(0x1bf2fc3a), X(0x7ce94dfb), - X(0x1c240786), X(0x7cde4a98), X(0x1c550e7c), X(0x7cd333f3), - X(0x1c861113), X(0x7cc80a0f), X(0x1cb70f43), X(0x7cbcccec), - X(0x1ce80906), X(0x7cb17c8d), X(0x1d18fe54), X(0x7ca618f3), - X(0x1d49ef26), X(0x7c9aa221), X(0x1d7adb73), X(0x7c8f1817), - X(0x1dabc334), X(0x7c837ad8), X(0x1ddca662), X(0x7c77ca65), - X(0x1e0d84f5), X(0x7c6c06c0), X(0x1e3e5ee5), X(0x7c602fec), - X(0x1e6f342c), X(0x7c5445e9), X(0x1ea004c1), X(0x7c4848ba), - X(0x1ed0d09d), X(0x7c3c3860), X(0x1f0197b8), X(0x7c3014de), - X(0x1f325a0b), X(0x7c23de35), X(0x1f63178f), X(0x7c179467), - X(0x1f93d03c), X(0x7c0b3777), X(0x1fc4840a), X(0x7bfec765), - X(0x1ff532f2), X(0x7bf24434), X(0x2025dcec), X(0x7be5ade6), - X(0x205681f1), X(0x7bd9047c), X(0x208721f9), X(0x7bcc47fa), - X(0x20b7bcfe), X(0x7bbf7860), X(0x20e852f6), X(0x7bb295b0), - X(0x2118e3dc), X(0x7ba59fee), X(0x21496fa7), X(0x7b989719), - X(0x2179f64f), X(0x7b8b7b36), X(0x21aa77cf), X(0x7b7e4c45), - X(0x21daf41d), X(0x7b710a49), X(0x220b6b32), X(0x7b63b543), - X(0x223bdd08), X(0x7b564d36), X(0x226c4996), X(0x7b48d225), - X(0x229cb0d5), X(0x7b3b4410), X(0x22cd12bd), X(0x7b2da2fa), - X(0x22fd6f48), X(0x7b1feee5), X(0x232dc66d), X(0x7b1227d3), - X(0x235e1826), X(0x7b044dc7), X(0x238e646a), X(0x7af660c2), - X(0x23beab33), X(0x7ae860c7), X(0x23eeec78), X(0x7ada4dd8), - X(0x241f2833), X(0x7acc27f7), X(0x244f5e5c), X(0x7abdef25), - X(0x247f8eec), X(0x7aafa367), X(0x24afb9da), X(0x7aa144bc), - X(0x24dfdf20), X(0x7a92d329), X(0x250ffeb7), X(0x7a844eae), - X(0x25401896), X(0x7a75b74f), X(0x25702cb7), X(0x7a670d0d), - X(0x25a03b11), X(0x7a584feb), X(0x25d0439f), X(0x7a497feb), - X(0x26004657), X(0x7a3a9d0f), X(0x26304333), X(0x7a2ba75a), - X(0x26603a2c), X(0x7a1c9ece), X(0x26902b39), X(0x7a0d836d), - X(0x26c01655), X(0x79fe5539), X(0x26effb76), X(0x79ef1436), - X(0x271fda96), X(0x79dfc064), X(0x274fb3ae), X(0x79d059c8), - X(0x277f86b5), X(0x79c0e062), X(0x27af53a6), X(0x79b15435), - X(0x27df1a77), X(0x79a1b545), X(0x280edb23), X(0x79920392), - X(0x283e95a1), X(0x79823f20), X(0x286e49ea), X(0x797267f2), - X(0x289df7f8), X(0x79627e08), X(0x28cd9fc1), X(0x79528167), - X(0x28fd4140), X(0x79427210), X(0x292cdc6d), X(0x79325006), - X(0x295c7140), X(0x79221b4b), X(0x298bffb2), X(0x7911d3e2), - X(0x29bb87bc), X(0x790179cd), X(0x29eb0957), X(0x78f10d0f), - X(0x2a1a847b), X(0x78e08dab), X(0x2a49f920), X(0x78cffba3), - X(0x2a796740), X(0x78bf56f9), X(0x2aa8ced3), X(0x78ae9fb0), - X(0x2ad82fd2), X(0x789dd5cb), X(0x2b078a36), X(0x788cf94c), - X(0x2b36ddf7), X(0x787c0a36), X(0x2b662b0e), X(0x786b088c), - X(0x2b957173), X(0x7859f44f), X(0x2bc4b120), X(0x7848cd83), - X(0x2bf3ea0d), X(0x7837942b), X(0x2c231c33), X(0x78264849), - X(0x2c52478a), X(0x7814e9df), X(0x2c816c0c), X(0x780378f1), - X(0x2cb089b1), X(0x77f1f581), X(0x2cdfa071), X(0x77e05f91), - X(0x2d0eb046), X(0x77ceb725), X(0x2d3db928), X(0x77bcfc3f), - X(0x2d6cbb10), X(0x77ab2ee2), X(0x2d9bb5f6), X(0x77994f11), - X(0x2dcaa9d5), X(0x77875cce), X(0x2df996a3), X(0x7775581d), - X(0x2e287c5a), X(0x776340ff), X(0x2e575af3), X(0x77511778), - X(0x2e863267), X(0x773edb8b), X(0x2eb502ae), X(0x772c8d3a), - X(0x2ee3cbc1), X(0x771a2c88), X(0x2f128d99), X(0x7707b979), - X(0x2f41482e), X(0x76f5340e), X(0x2f6ffb7a), X(0x76e29c4b), - X(0x2f9ea775), X(0x76cff232), X(0x2fcd4c19), X(0x76bd35c7), - X(0x2ffbe95d), X(0x76aa670d), X(0x302a7f3a), X(0x76978605), - X(0x30590dab), X(0x768492b4), X(0x308794a6), X(0x76718d1c), - X(0x30b61426), X(0x765e7540), X(0x30e48c22), X(0x764b4b23), - X(0x3112fc95), X(0x76380ec8), X(0x31416576), X(0x7624c031), - X(0x316fc6be), X(0x76115f63), X(0x319e2067), X(0x75fdec60), - X(0x31cc7269), X(0x75ea672a), X(0x31fabcbd), X(0x75d6cfc5), - X(0x3228ff5c), X(0x75c32634), X(0x32573a3f), X(0x75af6a7b), - X(0x32856d5e), X(0x759b9c9b), X(0x32b398b3), X(0x7587bc98), - X(0x32e1bc36), X(0x7573ca75), X(0x330fd7e1), X(0x755fc635), - X(0x333debab), X(0x754bafdc), X(0x336bf78f), X(0x7537876c), - X(0x3399fb85), X(0x75234ce8), X(0x33c7f785), X(0x750f0054), - X(0x33f5eb89), X(0x74faa1b3), X(0x3423d78a), X(0x74e63108), - X(0x3451bb81), X(0x74d1ae55), X(0x347f9766), X(0x74bd199f), - X(0x34ad6b32), X(0x74a872e8), X(0x34db36df), X(0x7493ba34), - X(0x3508fa66), X(0x747eef85), X(0x3536b5be), X(0x746a12df), - X(0x356468e2), X(0x74552446), X(0x359213c9), X(0x744023bc), - X(0x35bfb66e), X(0x742b1144), X(0x35ed50c9), X(0x7415ece2), - X(0x361ae2d3), X(0x7400b69a), X(0x36486c86), X(0x73eb6e6e), - X(0x3675edd9), X(0x73d61461), X(0x36a366c6), X(0x73c0a878), - X(0x36d0d746), X(0x73ab2ab4), X(0x36fe3f52), X(0x73959b1b), - X(0x372b9ee3), X(0x737ff9ae), X(0x3758f5f2), X(0x736a4671), - X(0x37864477), X(0x73548168), X(0x37b38a6d), X(0x733eaa96), - X(0x37e0c7cc), X(0x7328c1ff), X(0x380dfc8d), X(0x7312c7a5), - X(0x383b28a9), X(0x72fcbb8c), X(0x38684c19), X(0x72e69db7), - X(0x389566d6), X(0x72d06e2b), X(0x38c278d9), X(0x72ba2cea), - X(0x38ef821c), X(0x72a3d9f7), X(0x391c8297), X(0x728d7557), - X(0x39497a43), X(0x7276ff0d), X(0x39766919), X(0x7260771b), - X(0x39a34f13), X(0x7249dd86), X(0x39d02c2a), X(0x72333251), - X(0x39fd0056), X(0x721c7580), X(0x3a29cb91), X(0x7205a716), - X(0x3a568dd4), X(0x71eec716), X(0x3a834717), X(0x71d7d585), - X(0x3aaff755), X(0x71c0d265), X(0x3adc9e86), X(0x71a9bdba), - X(0x3b093ca3), X(0x71929789), X(0x3b35d1a5), X(0x717b5fd3), - X(0x3b625d86), X(0x7164169d), X(0x3b8ee03e), X(0x714cbbeb), - X(0x3bbb59c7), X(0x71354fc0), X(0x3be7ca1a), X(0x711dd220), - X(0x3c143130), X(0x7106430e), X(0x3c408f03), X(0x70eea28e), - X(0x3c6ce38a), X(0x70d6f0a4), X(0x3c992ec0), X(0x70bf2d53), - X(0x3cc5709e), X(0x70a7589f), X(0x3cf1a91c), X(0x708f728b), - X(0x3d1dd835), X(0x70777b1c), X(0x3d49fde1), X(0x705f7255), - X(0x3d761a19), X(0x70475839), X(0x3da22cd7), X(0x702f2ccd), - X(0x3dce3614), X(0x7016f014), X(0x3dfa35c8), X(0x6ffea212), - X(0x3e262bee), X(0x6fe642ca), X(0x3e52187f), X(0x6fcdd241), - X(0x3e7dfb73), X(0x6fb5507a), X(0x3ea9d4c3), X(0x6f9cbd79), - X(0x3ed5a46b), X(0x6f841942), X(0x3f016a61), X(0x6f6b63d8), - X(0x3f2d26a0), X(0x6f529d40), X(0x3f58d921), X(0x6f39c57d), - X(0x3f8481dd), X(0x6f20dc92), X(0x3fb020ce), X(0x6f07e285), - X(0x3fdbb5ec), X(0x6eeed758), X(0x40074132), X(0x6ed5bb10), - X(0x4032c297), X(0x6ebc8db0), X(0x405e3a16), X(0x6ea34f3d), - X(0x4089a7a8), X(0x6e89ffb9), X(0x40b50b46), X(0x6e709f2a), - X(0x40e064ea), X(0x6e572d93), X(0x410bb48c), X(0x6e3daaf8), - X(0x4136fa27), X(0x6e24175c), X(0x416235b2), X(0x6e0a72c5), - X(0x418d6729), X(0x6df0bd35), X(0x41b88e84), X(0x6dd6f6b1), - X(0x41e3abbc), X(0x6dbd1f3c), X(0x420ebecb), X(0x6da336dc), - X(0x4239c7aa), X(0x6d893d93), X(0x4264c653), X(0x6d6f3365), - X(0x428fbabe), X(0x6d551858), X(0x42baa4e6), X(0x6d3aec6e), - X(0x42e584c3), X(0x6d20afac), X(0x43105a50), X(0x6d066215), - X(0x433b2585), X(0x6cec03af), X(0x4365e65b), X(0x6cd1947c), - X(0x43909ccd), X(0x6cb71482), X(0x43bb48d4), X(0x6c9c83c3), - X(0x43e5ea68), X(0x6c81e245), X(0x44108184), X(0x6c67300b), - X(0x443b0e21), X(0x6c4c6d1a), X(0x44659039), X(0x6c319975), - X(0x449007c4), X(0x6c16b521), X(0x44ba74bd), X(0x6bfbc021), - X(0x44e4d71c), X(0x6be0ba7b), X(0x450f2edb), X(0x6bc5a431), - X(0x45397bf4), X(0x6baa7d49), X(0x4563be60), X(0x6b8f45c7), - X(0x458df619), X(0x6b73fdae), X(0x45b82318), X(0x6b58a503), - X(0x45e24556), X(0x6b3d3bcb), X(0x460c5cce), X(0x6b21c208), - X(0x46366978), X(0x6b0637c1), X(0x46606b4e), X(0x6aea9cf8), - X(0x468a624a), X(0x6acef1b2), X(0x46b44e65), X(0x6ab335f4), - X(0x46de2f99), X(0x6a9769c1), X(0x470805df), X(0x6a7b8d1e), - X(0x4731d131), X(0x6a5fa010), X(0x475b9188), X(0x6a43a29a), - X(0x478546de), X(0x6a2794c1), X(0x47aef12c), X(0x6a0b7689), - X(0x47d8906d), X(0x69ef47f6), X(0x48022499), X(0x69d3090e), - X(0x482badab), X(0x69b6b9d3), X(0x48552b9b), X(0x699a5a4c), - X(0x487e9e64), X(0x697dea7b), X(0x48a805ff), X(0x69616a65), - X(0x48d16265), X(0x6944da10), X(0x48fab391), X(0x6928397e), - X(0x4923f97b), X(0x690b88b5), X(0x494d341e), X(0x68eec7b9), - X(0x49766373), X(0x68d1f68f), X(0x499f8774), X(0x68b5153a), - X(0x49c8a01b), X(0x689823bf), X(0x49f1ad61), X(0x687b2224), - X(0x4a1aaf3f), X(0x685e106c), X(0x4a43a5b0), X(0x6840ee9b), - X(0x4a6c90ad), X(0x6823bcb7), X(0x4a957030), X(0x68067ac3), - X(0x4abe4433), X(0x67e928c5), X(0x4ae70caf), X(0x67cbc6c0), - X(0x4b0fc99d), X(0x67ae54ba), X(0x4b387af9), X(0x6790d2b6), - X(0x4b6120bb), X(0x677340ba), X(0x4b89badd), X(0x67559eca), - X(0x4bb24958), X(0x6737ecea), X(0x4bdacc28), X(0x671a2b20), - X(0x4c034345), X(0x66fc596f), X(0x4c2baea9), X(0x66de77dc), - X(0x4c540e4e), X(0x66c0866d), X(0x4c7c622d), X(0x66a28524), - X(0x4ca4aa41), X(0x66847408), X(0x4ccce684), X(0x6666531d), - X(0x4cf516ee), X(0x66482267), X(0x4d1d3b7a), X(0x6629e1ec), - X(0x4d455422), X(0x660b91af), X(0x4d6d60df), X(0x65ed31b5), - X(0x4d9561ac), X(0x65cec204), X(0x4dbd5682), X(0x65b0429f), - X(0x4de53f5a), X(0x6591b38c), X(0x4e0d1c30), X(0x657314cf), - X(0x4e34ecfc), X(0x6554666d), X(0x4e5cb1b9), X(0x6535a86b), - X(0x4e846a60), X(0x6516dacd), X(0x4eac16eb), X(0x64f7fd98), - X(0x4ed3b755), X(0x64d910d1), X(0x4efb4b96), X(0x64ba147d), - X(0x4f22d3aa), X(0x649b08a0), X(0x4f4a4f89), X(0x647bed3f), - X(0x4f71bf2e), X(0x645cc260), X(0x4f992293), X(0x643d8806), - X(0x4fc079b1), X(0x641e3e38), X(0x4fe7c483), X(0x63fee4f8), - X(0x500f0302), X(0x63df7c4d), X(0x50363529), X(0x63c0043b), - X(0x505d5af1), X(0x63a07cc7), X(0x50847454), X(0x6380e5f6), - X(0x50ab814d), X(0x63613fcd), X(0x50d281d5), X(0x63418a50), - X(0x50f975e6), X(0x6321c585), X(0x51205d7b), X(0x6301f171), - X(0x5147388c), X(0x62e20e17), X(0x516e0715), X(0x62c21b7e), - X(0x5194c910), X(0x62a219aa), X(0x51bb7e75), X(0x628208a1), - X(0x51e22740), X(0x6261e866), X(0x5208c36a), X(0x6241b8ff), - X(0x522f52ee), X(0x62217a72), X(0x5255d5c5), X(0x62012cc2), - X(0x527c4bea), X(0x61e0cff5), X(0x52a2b556), X(0x61c06410), - X(0x52c91204), X(0x619fe918), X(0x52ef61ee), X(0x617f5f12), - X(0x5315a50e), X(0x615ec603), X(0x533bdb5d), X(0x613e1df0), - X(0x536204d7), X(0x611d66de), X(0x53882175), X(0x60fca0d2), - X(0x53ae3131), X(0x60dbcbd1), X(0x53d43406), X(0x60bae7e1), - X(0x53fa29ed), X(0x6099f505), X(0x542012e1), X(0x6078f344), - X(0x5445eedb), X(0x6057e2a2), X(0x546bbdd7), X(0x6036c325), - X(0x54917fce), X(0x601594d1), X(0x54b734ba), X(0x5ff457ad), - X(0x54dcdc96), X(0x5fd30bbc), X(0x5502775c), X(0x5fb1b104), - X(0x55280505), X(0x5f90478a), X(0x554d858d), X(0x5f6ecf53), - X(0x5572f8ed), X(0x5f4d4865), X(0x55985f20), X(0x5f2bb2c5), - X(0x55bdb81f), X(0x5f0a0e77), X(0x55e303e6), X(0x5ee85b82), - X(0x5608426e), X(0x5ec699e9), X(0x562d73b2), X(0x5ea4c9b3), - X(0x565297ab), X(0x5e82eae5), X(0x5677ae54), X(0x5e60fd84), - X(0x569cb7a8), X(0x5e3f0194), X(0x56c1b3a1), X(0x5e1cf71c), - X(0x56e6a239), X(0x5dfade20), X(0x570b8369), X(0x5dd8b6a7), - X(0x5730572e), X(0x5db680b4), X(0x57551d80), X(0x5d943c4e), - X(0x5779d65b), X(0x5d71e979), X(0x579e81b8), X(0x5d4f883b), - X(0x57c31f92), X(0x5d2d189a), X(0x57e7afe4), X(0x5d0a9a9a), - X(0x580c32a7), X(0x5ce80e41), X(0x5830a7d6), X(0x5cc57394), - X(0x58550f6c), X(0x5ca2ca99), X(0x58796962), X(0x5c801354), - X(0x589db5b3), X(0x5c5d4dcc), X(0x58c1f45b), X(0x5c3a7a05), - X(0x58e62552), X(0x5c179806), X(0x590a4893), X(0x5bf4a7d2), - X(0x592e5e19), X(0x5bd1a971), X(0x595265df), X(0x5bae9ce7), - X(0x59765fde), X(0x5b8b8239), X(0x599a4c12), X(0x5b68596d), - X(0x59be2a74), X(0x5b452288), X(0x59e1faff), X(0x5b21dd90), - X(0x5a05bdae), X(0x5afe8a8b), X(0x5a29727b), X(0x5adb297d), - X(0x5a4d1960), X(0x5ab7ba6c), X(0x5a70b258), X(0x5a943d5e), -}; - diff --git a/bsp/stm32_radio/libwma/types.h b/bsp/stm32_radio/libwma/types.h deleted file mode 100644 index f0dfb4a191..0000000000 --- a/bsp/stm32_radio/libwma/types.h +++ /dev/null @@ -1,4 +0,0 @@ -#include "codeclib.h" - -#define fixed32 int32_t -#define fixed64 int64_t diff --git a/bsp/stm32_radio/libwma/wma_arm.S b/bsp/stm32_radio/libwma/wma_arm.S deleted file mode 100644 index 73f8e11c17..0000000000 --- a/bsp/stm32_radio/libwma/wma_arm.S +++ /dev/null @@ -1,96 +0,0 @@ - AREA |.text|, CODE, READONLY, ALIGN=2 - THUMB - REQUIRE8 - PRESERVE8 - -MULT32 PROC - EXPORT MULT32 - MOV r2,r0 - SMULL r1,r0,r2,r1 - BX lr - ENDP - -MULT31 PROC - EXPORT MULT31 - SMULL r2,r1,r0,r1 - LSL r0,r1,#1 - BX lr - ENDP - -MULT31_SHIFT15 PROC - EXPORT MULT31_SHIFT15 - - SMULL r2,r1,r0,r1 - LSRS r0,r2,#15 - ADC r0,r0,r1,LSL #17 - BX lr - - ENDP - -XPROD32 PROC - EXPORT XPROD32 - - PUSH {r4,r5,lr} - SMULL lr,r12,r0,r2 - SMLAL lr,r12,r1,r3 - RSB lr,r0,#0 - SMULL r2,r0,r1,r2 - SMLAL r2,r0,lr,r3 - LDR r4,[sp,#0xc] - LDR r5,[sp,#0x10] - STR r12,[r4,#0] - STR r0,[r5,#0] - POP {r4,r5,pc} - - ENDP - -XPROD31 PROC - EXPORT XPROD31 - - PUSH {r4,r5,lr} - SMULL lr,r12,r0,r2 - SMLAL lr,r12,r1,r3 - RSB lr,r0,#0 - SMULL r2,r0,r1,r2 - SMLAL r2,r0,lr,r3 - LDR r4,[sp,#0xc] - LDR r5,[sp,#0x10] - LSL r1,r12,#1 - LSL r0,r0,#1 - STR r1,[r4,#0] - STR r0,[r5,#0] - POP {r4,r5,pc} - - ENDP - -XNPROD31 PROC - EXPORT XNPROD31 - - PUSH {r4-r6,lr} - SMULL r4,r12,r0,r2 - RSB lr,r1,#0 - SMLAL r4,r12,lr,r3 - SMULL lr,r2,r1,r2 - SMLAL lr,r2,r0,r3 - LDR r5,[sp,#0x10] - LDR r6,[sp,#0x14] - LSL r0,r12,#1 - STR r0,[r5,#0] - LSL r0,r2,#1 - STR r0,[r6,#0] - POP {r4-r6,pc} - - ENDP - -CLIP_TO_15 PROC - EXPORT CLIP_TO_15 - - SUBS r1, r0, #0x8000 - MOVPL r0, #0x7f00 - ORRPL r0, r0, #0xff - ADDS r1, r0, #0x8000 - MOVMI r0,#0x8000 - BX lr - ENDP - - END diff --git a/bsp/stm32_radio/libwma/wmabitstream.c b/bsp/stm32_radio/libwma/wmabitstream.c deleted file mode 100644 index ba66b9ec48..0000000000 --- a/bsp/stm32_radio/libwma/wmabitstream.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Common bit i/o utils - * Copyright (c) 2000, 2001 Fabrice Bellard. - * Copyright (c) 2002-2004 Michael Niedermayer - * - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * alternative bitstream reader & writer by Michael Niedermayer - */ - -/** - * @file bitstream.c - * bitstream api. - */ - -#include "wmabitstream.h" -#include "codeclib.h" - -/** - * Same as av_mallocz_static(), but does a realloc. - * - * @param[in] ptr The block of memory to reallocate. - * @param[in] size The requested size. - * @return Block of memory of requested size. - * @deprecated. Code which uses ff_realloc_static is broken/missdesigned - * and should correctly use static arrays - */ -attribute_deprecated void *ff_realloc_static(void *ptr, unsigned int size); - - -const uint8_t ff_sqrt_tab[128]={ - 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11 -}; - -const uint8_t ff_log2_tab[256]={ - 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 -}; - - -void align_put_bits(PutBitContext *s) -{ -#ifdef ALT_BITSTREAM_WRITER - put_bits(s,( - s->index) & 7,0); -#else - put_bits(s,s->bit_left & 7,0); -#endif -} - -void ff_put_string(PutBitContext * pbc, char *s, int put_zero) -{ - while(*s){ - put_bits(pbc, 8, *s); - s++; - } - if(put_zero) - put_bits(pbc, 8, 0); -} - -/* VLC decoding */ - -//#define DEBUG_VLC - -#define GET_DATA(v, table, i, wrap, size) \ -{\ - const uint8_t *ptr = (const uint8_t *)table + i * wrap;\ - switch(size) {\ - case 1:\ - v = *(const uint8_t *)ptr;\ - break;\ - case 2:\ - v = *(const uint16_t *)ptr;\ - break;\ - default:\ - v = *(const uint32_t *)ptr;\ - break;\ - }\ -} - - -static int alloc_table(VLC *vlc, int size) -{ - int index; - index = vlc->table_size; - vlc->table_size += size; - if (vlc->table_size > vlc->table_allocated) { - DEBUGF("Tried to allocate past the end of a Huffman table: %d/%d\n", - vlc->table_allocated, vlc->table_allocated+(1 << vlc->bits)); - vlc->table_allocated += (1 << vlc->bits); - if (!vlc->table) - return -1; - } - return index; -} - -static int build_table(VLC *vlc, int table_nb_bits, - int nb_codes, - const void *bits, int bits_wrap, int bits_size, - const void *codes, int codes_wrap, int codes_size, - uint32_t code_prefix, int n_prefix) -{ - int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2; - uint32_t code; - int flags = 0; - VLC_TYPE (*table)[2]; - - table_size = 1 << table_nb_bits; - table_index = alloc_table(vlc, table_size); -#ifdef DEBUG_VLC - printf("new table index=%d size=%d code_prefix=%x n=%d\n", - table_index, table_size, code_prefix, n_prefix); -#endif - if (table_index < 0) - return -1; - table = &vlc->table[table_index]; - - for(i=0;i=32 ? 0xffffffff : (uint32_t)(1 << n_prefix)-1); - else - code_prefix2= code >> n; - if (n > 0 && (int)code_prefix2 == (int)code_prefix) { - if (n <= table_nb_bits) { - /* no need to add another table */ - j = (code << (table_nb_bits - n)) & (table_size - 1); - nb = 1 << (table_nb_bits - n); - for(k=0;k> n_prefix) + (k<> ((flags & INIT_VLC_LE) ? n_prefix : n)) & ((1 << table_nb_bits) - 1); -#ifdef DEBUG_VLC - av_log(NULL, 0,"%4x: n=%d (subtable)\n", - j, n); -#endif - /* compute table size */ - n1 = -table[j][1]; //bits - if (n > n1) - n1 = n; - table[j][1] = -n1; //bits - } - } - } - - /* second pass : fill auxillary tables recursively */ - for(i=0;i table_nb_bits) { - n = table_nb_bits; - table[i][1] = -n; //bits - } - index = build_table(vlc, n, nb_codes, - bits, bits_wrap, bits_size, - codes, codes_wrap, codes_size, - (flags & INIT_VLC_LE) ? (code_prefix | (i << n_prefix)) : ((code_prefix << table_nb_bits) | i), - n_prefix + table_nb_bits); - if (index < 0) - return -1; - /* note: realloc has been done, so reload tables */ - table = &vlc->table[table_index]; - table[i][0] = index; //code - } - } - return table_index; -} - - -/* Build VLC decoding tables suitable for use with get_vlc(). - - 'nb_bits' set thee decoding table size (2^nb_bits) entries. The - bigger it is, the faster is the decoding. But it should not be too - big to save memory and L1 cache. '9' is a good compromise. - - 'nb_codes' : number of vlcs codes - - 'bits' : table which gives the size (in bits) of each vlc code. - - 'codes' : table which gives the bit pattern of of each vlc code. - - 'xxx_wrap' : give the number of bytes between each entry of the - 'bits' or 'codes' tables. - - 'xxx_size' : gives the number of bytes of each entry of the 'bits' - or 'codes' tables. - - 'wrap' and 'size' allows to use any memory configuration and types - (byte/word/long) to store the 'bits' and 'codes' tables. - - 'use_static' should be set to 1 for tables, which should be freed - with av_free_static(), 0 if free_vlc() will be used. -*/ -int init_vlc(VLC *vlc, int nb_bits, int nb_codes, - const void *bits, int bits_wrap, int bits_size, - const void *codes, int codes_wrap, int codes_size, - int flags) -{ - - vlc->bits = nb_bits; - vlc->table_size = 0; - -#ifdef DEBUG_VLC - printf("build table nb_codes=%d\n", nb_codes); -#endif - - if (build_table(vlc, nb_bits, nb_codes, - bits, bits_wrap, bits_size, - codes, codes_wrap, codes_size, - 0, 0) < 0) { - //av_free(vlc->table); - return -1; - } - /* return flags to block gcc warning while allowing us to keep - * consistent with ffmpeg's function parameters - */ - return flags; -} - - diff --git a/bsp/stm32_radio/libwma/wmabitstream.h b/bsp/stm32_radio/libwma/wmabitstream.h deleted file mode 100644 index 77ccff695e..0000000000 --- a/bsp/stm32_radio/libwma/wmabitstream.h +++ /dev/null @@ -1,989 +0,0 @@ -/* - * copyright (c) 2004 Michael Niedermayer - * - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file bitstream.h - * bitstream api header. - */ - -#ifndef BITSTREAM_H -#define BITSTREAM_H - -#define av_always_inline inline -#define attribute_deprecated - -#include -#include "ffmpeg_config.h" -#include - -#include "bswap.h" - -extern const uint8_t ff_log2_tab[256]; - - -/*misc utility functions added to make it compile */ -static inline int av_log2(unsigned int v) -{ - int n; - - n = 0; - if (v & 0xffff0000) { - v >>= 16; - n += 16; - } - if (v & 0xff00) { - v >>= 8; - n += 8; - } - n += ff_log2_tab[v]; - - return n; -} - - -//#include "log.h" - -#if defined(ALT_BITSTREAM_READER_LE) && !defined(ALT_BITSTREAM_READER) -#define ALT_BITSTREAM_READER -#endif - -//#define ALT_BITSTREAM_WRITER -//#define ALIGNED_BITSTREAM_WRITER -#if !defined(LIBMPEG2_BITSTREAM_READER) && !defined(A32_BITSTREAM_READER) && !defined(ALT_BITSTREAM_READER) -# ifdef ARCH_ARMV4L -# define A32_BITSTREAM_READER -# else -#define ALT_BITSTREAM_READER -//#define LIBMPEG2_BITSTREAM_READER -//#define A32_BITSTREAM_READER -# endif -#endif -#define LIBMPEG2_BITSTREAM_READER_HACK //add BERO - -extern const uint8_t ff_reverse[256]; - -#if defined(ARCH_X86) -// avoid +32 for shift optimization (gcc should do that ...) -static inline int32_t NEG_SSR32( int32_t a, int8_t s){ - asm ("sarl %1, %0\n\t" - : "+r" (a) - : "ic" ((uint8_t)(-s)) - ); - return a; -} -static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ - asm ("shrl %1, %0\n\t" - : "+r" (a) - : "ic" ((uint8_t)(-s)) - ); - return a; -} -#else -# define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s))) -# define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s))) -#endif - -/* bit output */ - -/* buf and buf_end must be present and used by every alternative writer. */ -typedef struct PutBitContext { -#ifdef ALT_BITSTREAM_WRITER - uint8_t *buf, *buf_end; - int index; -#else - uint32_t bit_buf; - int bit_left; - uint8_t *buf, *buf_ptr, *buf_end; -#endif -} PutBitContext; - -static inline void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size) -{ - if(buffer_size < 0) { - buffer_size = 0; - buffer = NULL; - } - - s->buf = buffer; - s->buf_end = s->buf + buffer_size; -#ifdef ALT_BITSTREAM_WRITER - s->index=0; - ((uint32_t*)(s->buf))[0]=0; -// memset(buffer, 0, buffer_size); -#else - s->buf_ptr = s->buf; - s->bit_left=32; - s->bit_buf=0; -#endif -} - -/* return the number of bits output */ -static inline int put_bits_count(PutBitContext *s) -{ -#ifdef ALT_BITSTREAM_WRITER - return s->index; -#else - return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left; -#endif -} - -/* pad the end of the output stream with zeros */ -static inline void flush_put_bits(PutBitContext *s) -{ -#ifdef ALT_BITSTREAM_WRITER - align_put_bits(s); -#else - s->bit_buf<<= s->bit_left; - while (s->bit_left < 32) { - /* XXX: should test end of buffer */ - *s->buf_ptr++=s->bit_buf >> 24; - s->bit_buf<<=8; - s->bit_left+=8; - } - s->bit_left=32; - s->bit_buf=0; -#endif -} - -void align_put_bits(PutBitContext *s); -void ff_put_string(PutBitContext * pbc, char *s, int put_zero); - -/* bit input */ -/* buffer, buffer_end and size_in_bits must be present and used by every reader */ -typedef struct GetBitContext { - const uint8_t *buffer, *buffer_end; -#ifdef ALT_BITSTREAM_READER - int index; -#elif defined LIBMPEG2_BITSTREAM_READER - uint8_t *buffer_ptr; - uint32_t cache; - int bit_count; -#elif defined A32_BITSTREAM_READER - uint32_t *buffer_ptr; - uint32_t cache0; - uint32_t cache1; - int bit_count; -#endif - int size_in_bits; -} GetBitContext; - -#define VLC_TYPE int16_t - -typedef struct VLC { - int bits; - VLC_TYPE (*table)[2]; ///< code, bits - int table_size, table_allocated; -} VLC; - -typedef struct RL_VLC_ELEM { - int16_t level; - int8_t len; - uint8_t run; -} RL_VLC_ELEM; - -#if defined(ARCH_SPARC) || defined(ARCH_ARMV4L) || defined(ARCH_MIPS) || defined(ARCH_BFIN) -#define UNALIGNED_STORES_ARE_BAD -#endif - -/* used to avoid missaligned exceptions on some archs (alpha, ...) */ -#if defined(ARCH_X86) || defined(CPU_COLDFIRE) -# define unaligned16(a) (*(const uint16_t*)(a)) -# define unaligned32(a) (*(const uint32_t*)(a)) -# define unaligned64(a) (*(const uint64_t*)(a)) -#else -# ifdef __GNUC__ -# define unaligned(x) \ -static inline uint##x##_t unaligned##x(const void *v) { \ - struct Unaligned { \ - uint##x##_t i; \ - } __attribute__((packed)); \ - \ - return ((const struct Unaligned *) v)->i; \ -} -# elif defined(__DECC) -# define unaligned(x) \ -static inline uint##x##_t unaligned##x(const void *v) { \ - return *(const __unaligned uint##x##_t *) v; \ -} -# else -# define unaligned(x) \ -static inline uint##x##_t unaligned##x(const void *v) { \ - return *(const uint##x##_t *) v; \ -} -# endif -unaligned(16) -unaligned(32) -unaligned(64) -#undef unaligned -#endif /* defined(ARCH_X86) */ - -#ifndef ALT_BITSTREAM_WRITER -static inline void put_bits(PutBitContext *s, int n, unsigned int value) -{ - unsigned int bit_buf; - int bit_left; - - // printf("put_bits=%d %x\n", n, value); - // assert(n == 32 || value < (1U << n)); - - bit_buf = s->bit_buf; - bit_left = s->bit_left; - - // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf); - /* XXX: optimize */ - if (n < bit_left) { - bit_buf = (bit_buf<> (n - bit_left); -#ifdef UNALIGNED_STORES_ARE_BAD - if (3 & (intptr_t) s->buf_ptr) { - s->buf_ptr[0] = bit_buf >> 24; - s->buf_ptr[1] = bit_buf >> 16; - s->buf_ptr[2] = bit_buf >> 8; - s->buf_ptr[3] = bit_buf ; - } else -#endif - *(uint32_t *)s->buf_ptr = be2me_32(bit_buf); - //printf("bitbuf = %08x\n", bit_buf); - s->buf_ptr+=4; - bit_left+=32 - n; - bit_buf = value; - } - - s->bit_buf = bit_buf; - s->bit_left = bit_left; -} -#endif - - -#ifdef ALT_BITSTREAM_WRITER -static inline void put_bits(PutBitContext *s, int n, unsigned int value) -{ -# ifdef ALIGNED_BITSTREAM_WRITER -# if defined(ARCH_X86) - asm volatile( - "movl %0, %%ecx \n\t" - "xorl %%eax, %%eax \n\t" - "shrdl %%cl, %1, %%eax \n\t" - "shrl %%cl, %1 \n\t" - "movl %0, %%ecx \n\t" - "shrl $3, %%ecx \n\t" - "andl $0xFFFFFFFC, %%ecx \n\t" - "bswapl %1 \n\t" - "orl %1, (%2, %%ecx) \n\t" - "bswapl %%eax \n\t" - "addl %3, %0 \n\t" - "movl %%eax, 4(%2, %%ecx) \n\t" - : "=&r" (s->index), "=&r" (value) - : "r" (s->buf), "r" (n), "0" (s->index), "1" (value<<(-n)) - : "%eax", "%ecx" - ); -# else - int index= s->index; - uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5); - - value<<= 32-n; - - ptr[0] |= be2me_32(value>>(index&31)); - ptr[1] = be2me_32(value<<(32-(index&31))); -//if(n>24) printf("%d %d\n", n, value); - index+= n; - s->index= index; -# endif -# else //ALIGNED_BITSTREAM_WRITER -# if defined(ARCH_X86) - asm volatile( - "movl $7, %%ecx \n\t" - "andl %0, %%ecx \n\t" - "addl %3, %%ecx \n\t" - "negl %%ecx \n\t" - "shll %%cl, %1 \n\t" - "bswapl %1 \n\t" - "movl %0, %%ecx \n\t" - "shrl $3, %%ecx \n\t" - "orl %1, (%%ecx, %2) \n\t" - "addl %3, %0 \n\t" - "movl $0, 4(%%ecx, %2) \n\t" - : "=&r" (s->index), "=&r" (value) - : "r" (s->buf), "r" (n), "0" (s->index), "1" (value) - : "%ecx" - ); -# else - int index= s->index; - uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3)); - - ptr[0] |= be2me_32(value<<(32-n-(index&7) )); - ptr[1] = 0; -//if(n>24) printf("%d %d\n", n, value); - index+= n; - s->index= index; -# endif -# endif //!ALIGNED_BITSTREAM_WRITER -} -#endif - - -static inline uint8_t* pbBufPtr(PutBitContext *s) -{ -#ifdef ALT_BITSTREAM_WRITER - return s->buf + (s->index>>3); -#else - return s->buf_ptr; -#endif -} - -/** - * - * PutBitContext must be flushed & aligned to a byte boundary before calling this. - */ -static inline void skip_put_bytes(PutBitContext *s, int n){ - // assert((put_bits_count(s)&7)==0); -#ifdef ALT_BITSTREAM_WRITER - FIXME may need some cleaning of the buffer - s->index += n<<3; -#else - // assert(s->bit_left==32); - s->buf_ptr += n; -#endif -} - -/** - * skips the given number of bits. - * must only be used if the actual values in the bitstream dont matter - */ -static inline void skip_put_bits(PutBitContext *s, int n){ -#ifdef ALT_BITSTREAM_WRITER - s->index += n; -#else - s->bit_left -= n; - s->buf_ptr-= s->bit_left>>5; - s->bit_left &= 31; -#endif -} - -/** - * Changes the end of the buffer. - */ -static inline void set_put_bits_buffer_size(PutBitContext *s, int size){ - s->buf_end= s->buf + size; -} - -/* Bitstream reader API docs: -name - abritary name which is used as prefix for the internal variables - -gb - getbitcontext - -OPEN_READER(name, gb) - loads gb into local variables - -CLOSE_READER(name, gb) - stores local vars in gb - -UPDATE_CACHE(name, gb) - refills the internal cache from the bitstream - after this call at least MIN_CACHE_BITS will be available, - -GET_CACHE(name, gb) - will output the contents of the internal cache, next bit is MSB of 32 or 64 bit (FIXME 64bit) - -SHOW_UBITS(name, gb, num) - will return the next num bits - -SHOW_SBITS(name, gb, num) - will return the next num bits and do sign extension - -SKIP_BITS(name, gb, num) - will skip over the next num bits - note, this is equivalent to SKIP_CACHE; SKIP_COUNTER - -SKIP_CACHE(name, gb, num) - will remove the next num bits from the cache (note SKIP_COUNTER MUST be called before UPDATE_CACHE / CLOSE_READER) - -SKIP_COUNTER(name, gb, num) - will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS) - -LAST_SKIP_CACHE(name, gb, num) - will remove the next num bits from the cache if it is needed for UPDATE_CACHE otherwise it will do nothing - -LAST_SKIP_BITS(name, gb, num) - is equivalent to SKIP_LAST_CACHE; SKIP_COUNTER - -for examples see get_bits, show_bits, skip_bits, get_vlc -*/ - -static inline int unaligned32_be(const void *v) -{ -#ifdef CONFIG_ALIGN - const uint8_t *p=v; - return (((p[0]<<8) | p[1])<<16) | (p[2]<<8) | (p[3]); -#else - return be2me_32( unaligned32(v)); //original -#endif -} - -static inline int unaligned32_le(const void *v) -{ -#ifdef CONFIG_ALIGN - const uint8_t *p=v; - return (((p[3]<<8) | p[2])<<16) | (p[1]<<8) | (p[0]); -#else - return le2me_32( unaligned32(v)); //original -#endif -} - -#ifdef ALT_BITSTREAM_READER -# define MIN_CACHE_BITS 25 - -# define OPEN_READER(name, gb)\ - int name##_index= (gb)->index;\ - int name##_cache= 0;\ - -# define CLOSE_READER(name, gb)\ - (gb)->index= name##_index;\ - -# ifdef ALT_BITSTREAM_READER_LE -# define UPDATE_CACHE(name, gb)\ - name##_cache= unaligned32_le( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) >> (name##_index&0x07);\ - -# define SKIP_CACHE(name, gb, num)\ - name##_cache >>= (num); -# else -# define UPDATE_CACHE(name, gb)\ - name##_cache= unaligned32_be( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\ - -# define SKIP_CACHE(name, gb, num)\ - name##_cache <<= (num); -# endif - -// FIXME name? -# define SKIP_COUNTER(name, gb, num)\ - name##_index += (num);\ - -# define SKIP_BITS(name, gb, num)\ - {\ - SKIP_CACHE(name, gb, num)\ - SKIP_COUNTER(name, gb, num)\ - }\ - -# define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) -# define LAST_SKIP_CACHE(name, gb, num) ; - -# ifdef ALT_BITSTREAM_READER_LE -# define SHOW_UBITS(name, gb, num)\ - ((name##_cache) & (NEG_USR32(0xffffffff,num))) - -# define SHOW_SBITS(name, gb, num)\ - NEG_SSR32((name##_cache)<<(32-(num)), num) -# else -# define SHOW_UBITS(name, gb, num)\ - NEG_USR32(name##_cache, num) - -# define SHOW_SBITS(name, gb, num)\ - NEG_SSR32(name##_cache, num) -# endif - -# define GET_CACHE(name, gb)\ - ((uint32_t)name##_cache) - -static inline int get_bits_count(GetBitContext *s){ - return s->index; -} - -static inline void skip_bits_long(GetBitContext *s, int n){ - s->index += n; -} - -#elif defined LIBMPEG2_BITSTREAM_READER -//libmpeg2 like reader - -# define MIN_CACHE_BITS 17 - -# define OPEN_READER(name, gb)\ - int name##_bit_count=(gb)->bit_count;\ - int name##_cache= (gb)->cache;\ - uint8_t * name##_buffer_ptr=(gb)->buffer_ptr;\ - -# define CLOSE_READER(name, gb)\ - (gb)->bit_count= name##_bit_count;\ - (gb)->cache= name##_cache;\ - (gb)->buffer_ptr= name##_buffer_ptr;\ - -#ifdef LIBMPEG2_BITSTREAM_READER_HACK - -# define UPDATE_CACHE(name, gb)\ - if(name##_bit_count >= 0){\ - name##_cache+= (int)be2me_16(*(uint16_t*)name##_buffer_ptr) << name##_bit_count;\ - name##_buffer_ptr += 2;\ - name##_bit_count-= 16;\ - }\ - -#else - -# define UPDATE_CACHE(name, gb)\ - if(name##_bit_count >= 0){\ - name##_cache+= ((name##_buffer_ptr[0]<<8) + name##_buffer_ptr[1]) << name##_bit_count;\ - name##_buffer_ptr+=2;\ - name##_bit_count-= 16;\ - }\ - -#endif - -# define SKIP_CACHE(name, gb, num)\ - name##_cache <<= (num);\ - -# define SKIP_COUNTER(name, gb, num)\ - name##_bit_count += (num);\ - -# define SKIP_BITS(name, gb, num)\ - {\ - SKIP_CACHE(name, gb, num)\ - SKIP_COUNTER(name, gb, num)\ - }\ - -# define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num) -# define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num) - -# define SHOW_UBITS(name, gb, num)\ - NEG_USR32(name##_cache, num) - -# define SHOW_SBITS(name, gb, num)\ - NEG_SSR32(name##_cache, num) - -# define GET_CACHE(name, gb)\ - ((uint32_t)name##_cache) - -static inline int get_bits_count(GetBitContext *s){ - return (s->buffer_ptr - s->buffer)*8 - 16 + s->bit_count; -} - -static inline void skip_bits_long(GetBitContext *s, int n){ - OPEN_READER(re, s) - re_bit_count += n; - re_buffer_ptr += 2*(re_bit_count>>4); - re_bit_count &= 15; - re_cache = ((re_buffer_ptr[-2]<<8) + re_buffer_ptr[-1]) << (16+re_bit_count); - UPDATE_CACHE(re, s) - CLOSE_READER(re, s) -} - -#elif defined A32_BITSTREAM_READER - -# define MIN_CACHE_BITS 32 - -# define OPEN_READER(name, gb)\ - int name##_bit_count=(gb)->bit_count;\ - uint32_t name##_cache0= (gb)->cache0;\ - uint32_t name##_cache1= (gb)->cache1;\ - uint32_t * name##_buffer_ptr=(gb)->buffer_ptr;\ - -# define CLOSE_READER(name, gb)\ - (gb)->bit_count= name##_bit_count;\ - (gb)->cache0= name##_cache0;\ - (gb)->cache1= name##_cache1;\ - (gb)->buffer_ptr= name##_buffer_ptr;\ - -# define UPDATE_CACHE(name, gb)\ - if(name##_bit_count > 0){\ - const uint32_t next= be2me_32( *name##_buffer_ptr );\ - name##_cache0 |= NEG_USR32(next,name##_bit_count);\ - name##_cache1 |= next<buffer_ptr - s->buffer)*8 - 32 + s->bit_count; -} - -static inline void skip_bits_long(GetBitContext *s, int n){ - OPEN_READER(re, s) - re_bit_count += n; - re_buffer_ptr += re_bit_count>>5; - re_bit_count &= 31; - re_cache0 = be2me_32( re_buffer_ptr[-1] ) << re_bit_count; - re_cache1 = 0; - UPDATE_CACHE(re, s) - CLOSE_READER(re, s) -} - -#endif - -/** - * read mpeg1 dc style vlc (sign bit + mantisse with no MSB). - * if MSB not set it is negative - * @param n length in bits - * @author BERO - */ -static inline int get_xbits(GetBitContext *s, int n){ - register int sign; - register int32_t cache; - OPEN_READER(re, s) - UPDATE_CACHE(re, s) - cache = GET_CACHE(re,s); - sign=(~cache)>>31; - LAST_SKIP_BITS(re, s, n) - CLOSE_READER(re, s) - return (NEG_USR32(sign ^ cache, n) ^ sign) - sign; -} - -static inline int get_sbits(GetBitContext *s, int n){ - register int tmp; - OPEN_READER(re, s) - UPDATE_CACHE(re, s) - tmp= SHOW_SBITS(re, s, n); - LAST_SKIP_BITS(re, s, n) - CLOSE_READER(re, s) - return tmp; -} - -/** - * reads 1-17 bits. - * Note, the alt bitstream reader can read up to 25 bits, but the libmpeg2 reader can't - */ -static inline unsigned int get_bits(GetBitContext *s, int n){ - register int tmp; - OPEN_READER(re, s) - UPDATE_CACHE(re, s) - tmp= SHOW_UBITS(re, s, n); - LAST_SKIP_BITS(re, s, n) - CLOSE_READER(re, s) - return tmp; -} - -/** - * shows 1-17 bits. - * Note, the alt bitstream reader can read up to 25 bits, but the libmpeg2 reader can't - */ -static inline unsigned int show_bits(GetBitContext *s, int n){ - register int tmp; - OPEN_READER(re, s) - UPDATE_CACHE(re, s) - tmp= SHOW_UBITS(re, s, n); -// CLOSE_READER(re, s) - return tmp; -} - -static inline void skip_bits(GetBitContext *s, int n){ - //Note gcc seems to optimize this to s->index+=n for the ALT_READER :)) - OPEN_READER(re, s) - UPDATE_CACHE(re, s) - LAST_SKIP_BITS(re, s, n) - CLOSE_READER(re, s) -} - -static inline unsigned int get_bits1(GetBitContext *s){ -#ifdef ALT_BITSTREAM_READER - int index= s->index; - uint8_t result= s->buffer[ index>>3 ]; -#ifdef ALT_BITSTREAM_READER_LE - result>>= (index&0x07); - result&= 1; -#else - result<<= (index&0x07); - result>>= 8 - 1; -#endif - index++; - s->index= index; - - return result; -#else - return get_bits(s, 1); -#endif -} - -static inline unsigned int show_bits1(GetBitContext *s){ - return show_bits(s, 1); -} - -static inline void skip_bits1(GetBitContext *s){ - skip_bits(s, 1); -} - -/** - * reads 0-32 bits. - */ -static inline unsigned int get_bits_long(GetBitContext *s, int n){ - if(n<=17) return get_bits(s, n); - else{ -#ifdef ALT_BITSTREAM_READER_LE - int ret= get_bits(s, 16); - return ret | (get_bits(s, n-16) << 16); -#else - int ret= get_bits(s, 16) << (n-16); - return ret | get_bits(s, n-16); -#endif - } -} - -/** - * shows 0-32 bits. - */ -static inline unsigned int show_bits_long(GetBitContext *s, int n){ - if(n<=17) return show_bits(s, n); - else{ - GetBitContext gb= *s; - int ret= get_bits_long(s, n); - *s= gb; - return ret; - } -} - -/* -static inline int check_marker(GetBitContext *s, const char *msg) -{ - int bit= get_bits1(s); - if(!bit) - av_log(NULL, AV_LOG_INFO, "Marker bit missing %s\n", msg); - - return bit; -} -*/ -/** - * init GetBitContext. - * @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger then the actual read bits - * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end - * @param bit_size the size of the buffer in bits - */ -static inline void init_get_bits(GetBitContext *s, - const uint8_t *buffer, int bit_size) -{ - int buffer_size= (bit_size+7)>>3; - if(buffer_size < 0 || bit_size < 0) { - buffer_size = bit_size = 0; - buffer = NULL; - } - - s->buffer= buffer; - s->size_in_bits= bit_size; - s->buffer_end= buffer + buffer_size; -#ifdef ALT_BITSTREAM_READER - s->index=0; -#elif defined LIBMPEG2_BITSTREAM_READER - s->buffer_ptr = (uint8_t*)((intptr_t)buffer&(~1)); - s->bit_count = 16 + 8*((intptr_t)buffer&1); - skip_bits_long(s, 0); -#elif defined A32_BITSTREAM_READER - s->buffer_ptr = (uint32_t*)((intptr_t)buffer&(~3)); - s->bit_count = 32 + 8*((intptr_t)buffer&3); - skip_bits_long(s, 0); -#endif -} - -static inline void align_get_bits(GetBitContext *s) -{ - int n= (-get_bits_count(s)) & 7; - if(n) skip_bits(s, n); -} - -int init_vlc(VLC *vlc, int nb_bits, int nb_codes, - const void *bits, int bits_wrap, int bits_size, - const void *codes, int codes_wrap, int codes_size, - int flags); -#define INIT_VLC_USE_STATIC 1 -#define INIT_VLC_LE 2 -void free_vlc(VLC *vlc); - -/** - * - * if the vlc code is invalid and max_depth=1 than no bits will be removed - * if the vlc code is invalid and max_depth>1 than the number of bits removed - * is undefined - */ -#define GET_VLC(code, name, gb, table, bits, max_depth)\ -{\ - int n, index, nb_bits;\ -\ - index= SHOW_UBITS(name, gb, bits);\ - code = table[index][0];\ - n = table[index][1];\ -\ - if(max_depth > 1 && n < 0){\ - LAST_SKIP_BITS(name, gb, bits)\ - UPDATE_CACHE(name, gb)\ -\ - nb_bits = -n;\ -\ - index= SHOW_UBITS(name, gb, nb_bits) + code;\ - code = table[index][0];\ - n = table[index][1];\ - if(max_depth > 2 && n < 0){\ - LAST_SKIP_BITS(name, gb, nb_bits)\ - UPDATE_CACHE(name, gb)\ -\ - nb_bits = -n;\ -\ - index= SHOW_UBITS(name, gb, nb_bits) + code;\ - code = table[index][0];\ - n = table[index][1];\ - }\ - }\ - SKIP_BITS(name, gb, n)\ -} - -#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update)\ -{\ - int n, index, nb_bits;\ -\ - index= SHOW_UBITS(name, gb, bits);\ - level = table[index].level;\ - n = table[index].len;\ -\ - if(max_depth > 1 && n < 0){\ - SKIP_BITS(name, gb, bits)\ - if(need_update){\ - UPDATE_CACHE(name, gb)\ - }\ -\ - nb_bits = -n;\ -\ - index= SHOW_UBITS(name, gb, nb_bits) + level;\ - level = table[index].level;\ - n = table[index].len;\ - }\ - run= table[index].run;\ - SKIP_BITS(name, gb, n)\ -} - - -/** - * parses a vlc code, faster then get_vlc() - * @param bits is the number of bits which will be read at once, must be - * identical to nb_bits in init_vlc() - * @param max_depth is the number of times bits bits must be read to completely - * read the longest vlc code - * = (max_vlc_length + bits - 1) / bits - */ -static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], - int bits, int max_depth) -{ - int code; - - OPEN_READER(re, s) - UPDATE_CACHE(re, s) - - GET_VLC(code, re, s, table, bits, max_depth) - - CLOSE_READER(re, s) - return code; -} - -//#define TRACE - -#ifdef TRACE -static inline void print_bin(int bits, int n){ - int i; - - for(i=n-1; i>=0; i--){ - av_log(NULL, AV_LOG_DEBUG, "%d", (bits>>i)&1); - } - for(i=n; i<24; i++) - av_log(NULL, AV_LOG_DEBUG, " "); -} - -static inline int get_bits_trace(GetBitContext *s, int n, char *file, const char *func, int line){ - int r= get_bits(s, n); - - print_bin(r, n); - av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d bit @%5d in %s %s:%d\n", r, n, r, get_bits_count(s)-n, file, func, line); - return r; -} -static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int max_depth, char *file, const char *func, int line){ - int show= show_bits(s, 24); - int pos= get_bits_count(s); - int r= get_vlc2(s, table, bits, max_depth); - int len= get_bits_count(s) - pos; - int bits2= show>>(24-len); - - print_bin(bits2, len); - - av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d vlc @%5d in %s %s:%d\n", bits2, len, r, pos, file, func, line); - return r; -} -static inline int get_xbits_trace(GetBitContext *s, int n, char *file, const char *func, int line){ - int show= show_bits(s, n); - int r= get_xbits(s, n); - - print_bin(show, n); - av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d xbt @%5d in %s %s:%d\n", show, n, r, get_bits_count(s)-n, file, func, line); - return r; -} - -#define get_bits(s, n) get_bits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__) -#define get_bits1(s) get_bits_trace(s, 1, __FILE__, __PRETTY_FUNCTION__, __LINE__) -#define get_xbits(s, n) get_xbits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__) -#define get_vlc(s, vlc) get_vlc_trace(s, (vlc)->table, (vlc)->bits, 3, __FILE__, __PRETTY_FUNCTION__, __LINE__) -#define get_vlc2(s, tab, bits, max) get_vlc_trace(s, tab, bits, max, __FILE__, __PRETTY_FUNCTION__, __LINE__) - -#define tprintf(p, ...) av_log(p, AV_LOG_DEBUG, __VA_ARGS__) - -#else //TRACE -#define tprintf(p, ...) {} -#endif - -static inline int decode012(GetBitContext *gb){ - int n; - n = get_bits1(gb); - if (n == 0) - return 0; - else - return get_bits1(gb) + 1; -} - -#endif /* BITSTREAM_H */ diff --git a/bsp/stm32_radio/libwma/wmadata.h b/bsp/stm32_radio/libwma/wmadata.h deleted file mode 100644 index 29a2418a66..0000000000 --- a/bsp/stm32_radio/libwma/wmadata.h +++ /dev/null @@ -1,2609 +0,0 @@ -/* - * WMA compatible decoder - * copyright (c) 2002 The FFmpeg Project - * - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file wmadata.h - * Various WMA tables. - */ - -static const uint16_t wma_critical_freqs[25] = { - 100, 200, 300, 400, 510, 630, 770, 920, - 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, - 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500, - 24500, -}; - -/* first value is number of bands */ -static const uint8_t exponent_band_22050[3][25] = { - { 10, 4, 8, 4, 8, 8, 12, 20, 24, 24, 16, }, - { 14, 4, 8, 8, 4, 12, 12, 16, 24, 16, 20, 24, 32, 40, 36, }, - { 23, 4, 4, 4, 8, 4, 4, 8, 8, 8, 8, 8, 12, 12, 16, 16, 24, 24, 32, 44, 48, 60, 84, 72, }, -}; - -static const uint8_t exponent_band_32000[3][25] = { - { 11, 4, 4, 8, 4, 4, 12, 16, 24, 20, 28, 4, }, - { 15, 4, 8, 4, 4, 8, 8, 16, 20, 12, 20, 20, 28, 40, 56, 8, }, - { 16, 8, 4, 8, 8, 12, 16, 20, 24, 40, 32, 32, 44, 56, 80, 112, 16, }, -}; - -static const uint8_t exponent_band_44100[3][25] = { - { 12, 4, 4, 4, 4, 4, 8, 8, 8, 12, 16, 20, 36, }, - { 15, 4, 8, 4, 8, 8, 4, 8, 8, 12, 12, 12, 24, 28, 40, 76, }, - { 17, 4, 8, 8, 4, 12, 12, 8, 8, 24, 16, 20, 24, 32, 40, 60, 80, 152, }, -}; - -static const uint16_t hgain_huffcodes[37] = { - 0x00003, 0x002e7, 0x00001, 0x005cd, 0x0005d, 0x005c9, 0x0005e, 0x00003, - 0x00016, 0x0000b, 0x00001, 0x00006, 0x00001, 0x00006, 0x00004, 0x00005, - 0x00004, 0x00007, 0x00003, 0x00007, 0x00004, 0x0000a, 0x0000a, 0x00002, - 0x00003, 0x00000, 0x00005, 0x00002, 0x0005f, 0x00004, 0x00003, 0x00002, - 0x005c8, 0x000b8, 0x005ca, 0x005cb, 0x005cc, -}; - -static const uint8_t hgain_huffbits[37] = { - 10, 12, 10, 13, 9, 13, 9, 8, - 7, 5, 5, 4, 4, 3, 3, 3, - 4, 3, 4, 4, 5, 5, 6, 8, - 7, 10, 8, 10, 9, 8, 9, 9, - 13, 10, 13, 13, 13, -}; - -static const fixed32 lsp_codebook[NB_LSP_COEFS][16] = { -{0x1fcc2,0x1fabd,0x1f8c7,0x1f66d,0x1f34c,0x1eef1,0x1e83e,0x1dca6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, -{0x1f8fc,0x1f5f9,0x1f328,0x1f025,0x1ecd8,0x1e8fc,0x1e46f,0x1df1b,0x1d87c,0x1d047,0x1c6b5,0x1bb8f,0x1add8,0x19c0e,0x18220,0x154ca}, -{0x1e6ae,0x1dd65,0x1d58e,0x1cd3b,0x1c439,0x1ba69,0x1af5e,0x1a32c,0x195c4,0x18498,0x16fd2,0x156ea,0x13de4,0x11f63,0xf7ae,0xbd90}, -{0x1c4fa,0x1ada0,0x19976,0x1891d,0x17986,0x1697f,0x15858,0x145fd,0x1316b,0x11900,0xfcfa,0xdf55,0xbe63,0x9902,0x6e83,0x2e05}, -{0x16f2d,0x15205,0x135f3,0x11b14,0x10170,0xe743,0xcdec,0xb504,0x9ab2,0x7f86,0x6296,0x4565,0x24e2,0x90,0xffffd52f,0xffffa172}, -{0xffbc,0xd786,0xb521,0x943e,0x7876,0x5ea3,0x44ad,0x2bf0,0x1274,0xfffff829,0xfffe9981,0xffffbfab,0xffffa0bb,0xffff7d3f,0xffff59e3,0xffff3269}, -{0x43e1,0x102a,0xffffe94a,0xffffc9fa,0xffffb076,0xffff9a6b,0xffff871c,0xffff7555,0xffff62b4,0xffff4f81,0xffff3bf4,0xffff25f7,0xffff0c0f,0xfffeef53,0xfffecb7e,0xfffe9fb3}, -{0xffff75ea,0xffff4325,0xffff1da2,0xfffefd23,0xfffeddb9,0xfffebb51,0xfffe945f,0xfffe6131,0xfffee5fe,0xfffed5ba,0xfffec442,0xfffeb224,0xfffe9f95,0xfffe880e,0xfffe6c7a,0xfffe54c1}, -{0xffff9d2e,0xffff709e,0xffff5489,0xffff3d5e,0xffff295b,0xffff1761,0xffff06a2,0xfffef68a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, -{0xfffe7045,0xfffe572f,0xfffe45ea,0xfffe38af,0xfffe2d8f,0xfffe2347,0xfffe18df,0xfffe0d42,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0} -}; - -static const uint32_t scale_huffcodes[121] = { - 0x3ffe8, 0x3ffe6, 0x3ffe7, 0x3ffe5, 0x7fff5, 0x7fff1, 0x7ffed, 0x7fff6, - 0x7ffee, 0x7ffef, 0x7fff0, 0x7fffc, 0x7fffd, 0x7ffff, 0x7fffe, 0x7fff7, - 0x7fff8, 0x7fffb, 0x7fff9, 0x3ffe4, 0x7fffa, 0x3ffe3, 0x1ffef, 0x1fff0, - 0x0fff5, 0x1ffee, 0x0fff2, 0x0fff3, 0x0fff4, 0x0fff1, 0x07ff6, 0x07ff7, - 0x03ff9, 0x03ff5, 0x03ff7, 0x03ff3, 0x03ff6, 0x03ff2, 0x01ff7, 0x01ff5, - 0x00ff9, 0x00ff7, 0x00ff6, 0x007f9, 0x00ff4, 0x007f8, 0x003f9, 0x003f7, - 0x003f5, 0x001f8, 0x001f7, 0x000fa, 0x000f8, 0x000f6, 0x00079, 0x0003a, - 0x00038, 0x0001a, 0x0000b, 0x00004, 0x00000, 0x0000a, 0x0000c, 0x0001b, - 0x00039, 0x0003b, 0x00078, 0x0007a, 0x000f7, 0x000f9, 0x001f6, 0x001f9, - 0x003f4, 0x003f6, 0x003f8, 0x007f5, 0x007f4, 0x007f6, 0x007f7, 0x00ff5, - 0x00ff8, 0x01ff4, 0x01ff6, 0x01ff8, 0x03ff8, 0x03ff4, 0x0fff0, 0x07ff4, - 0x0fff6, 0x07ff5, 0x3ffe2, 0x7ffd9, 0x7ffda, 0x7ffdb, 0x7ffdc, 0x7ffdd, - 0x7ffde, 0x7ffd8, 0x7ffd2, 0x7ffd3, 0x7ffd4, 0x7ffd5, 0x7ffd6, 0x7fff2, - 0x7ffdf, 0x7ffe7, 0x7ffe8, 0x7ffe9, 0x7ffea, 0x7ffeb, 0x7ffe6, 0x7ffe0, - 0x7ffe1, 0x7ffe2, 0x7ffe3, 0x7ffe4, 0x7ffe5, 0x7ffd7, 0x7ffec, 0x7fff4, - 0x7fff3, -}; - -static const uint8_t scale_huffbits[121] = { - 18, 18, 18, 18, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 18, 19, 18, 17, 17, - 16, 17, 16, 16, 16, 16, 15, 15, - 14, 14, 14, 14, 14, 14, 13, 13, - 12, 12, 12, 11, 12, 11, 10, 10, - 10, 9, 9, 8, 8, 8, 7, 6, - 6, 5, 4, 3, 1, 4, 4, 5, - 6, 6, 7, 7, 8, 8, 9, 9, - 10, 10, 10, 11, 11, 11, 11, 12, - 12, 13, 13, 13, 14, 14, 16, 15, - 16, 15, 18, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, -}; - -static const uint32_t coef0_huffcodes[666] = { - 0x00258, 0x0003d, 0x00000, 0x00005, 0x00008, 0x00008, 0x0000c, 0x0001b, - 0x0001f, 0x00015, 0x00024, 0x00032, 0x0003a, 0x00026, 0x0002c, 0x0002f, - 0x0004a, 0x0004d, 0x00061, 0x00070, 0x00073, 0x00048, 0x00052, 0x0005a, - 0x0005d, 0x0006e, 0x00099, 0x0009e, 0x000c1, 0x000ce, 0x000e4, 0x000f0, - 0x00093, 0x0009e, 0x000a2, 0x000a1, 0x000b8, 0x000d2, 0x000d3, 0x0012e, - 0x00130, 0x000de, 0x0012d, 0x0019b, 0x001e4, 0x00139, 0x0013a, 0x0013f, - 0x0014f, 0x0016d, 0x001a2, 0x0027c, 0x0027e, 0x00332, 0x0033c, 0x0033f, - 0x0038b, 0x00396, 0x003c5, 0x00270, 0x0027c, 0x0025a, 0x00395, 0x00248, - 0x004bd, 0x004fb, 0x00662, 0x00661, 0x0071b, 0x004e6, 0x004ff, 0x00666, - 0x0071c, 0x0071a, 0x0071f, 0x00794, 0x00536, 0x004e2, 0x0078e, 0x004ee, - 0x00518, 0x00535, 0x004fb, 0x0078d, 0x00530, 0x00680, 0x0068f, 0x005cb, - 0x00965, 0x006a6, 0x00967, 0x0097f, 0x00682, 0x006ae, 0x00cd0, 0x00e28, - 0x00f13, 0x00f1f, 0x009f5, 0x00cd3, 0x00f11, 0x00926, 0x00964, 0x00f32, - 0x00f12, 0x00f30, 0x00966, 0x00d0b, 0x00a68, 0x00b91, 0x009c7, 0x00b73, - 0x012fa, 0x0131d, 0x013f9, 0x01ca0, 0x0199c, 0x01c7a, 0x0198c, 0x01248, - 0x01c74, 0x01c64, 0x0139e, 0x012fd, 0x00a77, 0x012fc, 0x01c7b, 0x012ca, - 0x014cc, 0x014d2, 0x014e3, 0x014dc, 0x012dc, 0x03344, 0x02598, 0x0263c, - 0x0333b, 0x025e6, 0x01a1c, 0x01e3c, 0x014e2, 0x033d4, 0x01a11, 0x03349, - 0x03cce, 0x014e1, 0x01a34, 0x0273e, 0x02627, 0x0273f, 0x038ee, 0x03971, - 0x03c67, 0x03c61, 0x0333d, 0x038c2, 0x0263f, 0x038cd, 0x02638, 0x02e41, - 0x0351f, 0x03348, 0x03c66, 0x03562, 0x02989, 0x027d5, 0x0333c, 0x02e4f, - 0x0343b, 0x02ddf, 0x04bc8, 0x029c0, 0x02e57, 0x04c72, 0x025b7, 0x03547, - 0x03540, 0x029d3, 0x04c45, 0x025bb, 0x06600, 0x04c73, 0x04bce, 0x0357b, - 0x029a6, 0x029d2, 0x0263e, 0x0298a, 0x07183, 0x06602, 0x07958, 0x04b66, - 0x0537d, 0x05375, 0x04fe9, 0x04b67, 0x0799f, 0x04bc9, 0x051fe, 0x06a3b, - 0x05bb6, 0x04fa8, 0x0728f, 0x05376, 0x0492c, 0x0537e, 0x0795a, 0x06a3c, - 0x0e515, 0x07887, 0x0683a, 0x051f9, 0x051fd, 0x0cc6a, 0x06a8a, 0x0cc6d, - 0x05bb3, 0x0683b, 0x051fc, 0x05378, 0x0728e, 0x07886, 0x05bb7, 0x0f2a4, - 0x0795b, 0x0683c, 0x09fc1, 0x0683d, 0x0b752, 0x09678, 0x0a3e8, 0x06ac7, - 0x051f0, 0x0b759, 0x06af3, 0x04b6b, 0x0f2a0, 0x0f2ad, 0x096c3, 0x0e518, - 0x0b75c, 0x0d458, 0x0cc6b, 0x0537c, 0x067aa, 0x04fea, 0x0343a, 0x0cc71, - 0x0967f, 0x09fc4, 0x096c2, 0x0e516, 0x0f2a1, 0x0d45c, 0x0d45d, 0x0d45e, - 0x12fb9, 0x0967e, 0x1982f, 0x09883, 0x096c4, 0x0b753, 0x12fb8, 0x0f2a8, - 0x1ca21, 0x096c5, 0x0e51a, 0x1ca27, 0x12f3c, 0x0d471, 0x0f2aa, 0x0b75b, - 0x12fbb, 0x0f2a9, 0x0f2ac, 0x0d45a, 0x0b74f, 0x096c8, 0x16e91, 0x096ca, - 0x12fbf, 0x0d0a7, 0x13103, 0x0d516, 0x16e99, 0x12cbd, 0x0a3ea, 0x19829, - 0x0b755, 0x29ba7, 0x1ca28, 0x29ba5, 0x16e93, 0x1982c, 0x19828, 0x25994, - 0x0a3eb, 0x1ca29, 0x16e90, 0x1ca25, 0x1982d, 0x1ca26, 0x16e9b, 0x0b756, - 0x0967c, 0x25997, 0x0b75f, 0x198d3, 0x0b757, 0x19a2a, 0x0d45b, 0x0e517, - 0x1ca24, 0x1ca23, 0x1ca22, 0x0b758, 0x16e97, 0x0cd14, 0x13100, 0x00007, - 0x0003b, 0x0006b, 0x00097, 0x00138, 0x00125, 0x00173, 0x00258, 0x00335, - 0x0028e, 0x004c6, 0x00715, 0x00729, 0x004ef, 0x00519, 0x004ed, 0x00532, - 0x0068c, 0x00686, 0x00978, 0x00e5d, 0x00e31, 0x009f4, 0x00b92, 0x012f8, - 0x00d06, 0x00a67, 0x00d44, 0x00a76, 0x00d59, 0x012cd, 0x01c78, 0x01c75, - 0x0199f, 0x0198f, 0x01c67, 0x014c6, 0x01c79, 0x01c76, 0x00b94, 0x00d1b, - 0x01e32, 0x01e31, 0x01ab0, 0x01a05, 0x01aa1, 0x0333a, 0x025e5, 0x02626, - 0x03541, 0x03544, 0x03421, 0x03546, 0x02e55, 0x02e56, 0x0492d, 0x02dde, - 0x0299b, 0x02ddc, 0x0357a, 0x0249c, 0x0668b, 0x1c77f, 0x1ca20, 0x0d45f, - 0x09886, 0x16e9a, 0x0f2a7, 0x0b751, 0x0a3ee, 0x0cf59, 0x0cf57, 0x0b754, - 0x0d0a6, 0x16e98, 0x0b760, 0x06ac6, 0x0a3f0, 0x12fbe, 0x13104, 0x0f2a5, - 0x0a3ef, 0x0d472, 0x12cba, 0x1982e, 0x16e9c, 0x1c77e, 0x198d0, 0x13105, - 0x16e92, 0x0b75d, 0x0d459, 0x0001a, 0x000c0, 0x0016c, 0x003cd, 0x00350, - 0x0067b, 0x0051e, 0x006a9, 0x009f4, 0x00b72, 0x00d09, 0x01249, 0x01e3d, - 0x01ca1, 0x01a1f, 0x01721, 0x01a8a, 0x016e8, 0x03347, 0x01a35, 0x0249d, - 0x0299a, 0x02596, 0x02e4e, 0x0298b, 0x07182, 0x04c46, 0x025ba, 0x02e40, - 0x027d6, 0x04fe8, 0x06607, 0x05310, 0x09884, 0x072e1, 0x06a3d, 0x04b6a, - 0x04c7a, 0x06603, 0x04c7b, 0x03428, 0x06605, 0x09664, 0x09fc0, 0x071de, - 0x06601, 0x05bb2, 0x09885, 0x0a3e2, 0x1c61f, 0x12cbb, 0x0b750, 0x0cf58, - 0x0967d, 0x25995, 0x668ad, 0x0b75a, 0x09fc2, 0x0537f, 0x0b75e, 0x13fae, - 0x12fbc, 0x00031, 0x001c4, 0x004c5, 0x005b8, 0x00cf4, 0x0096f, 0x00d46, - 0x01e57, 0x01a04, 0x02625, 0x03346, 0x028f9, 0x04c47, 0x072e0, 0x04b69, - 0x03420, 0x07957, 0x06639, 0x0799e, 0x07959, 0x07881, 0x04b68, 0x09fc3, - 0x09fd6, 0x0cc70, 0x0a3f1, 0x12cbe, 0x0e30e, 0x0e51b, 0x06af2, 0x12cbc, - 0x1c77d, 0x0f2ab, 0x12fbd, 0x1aa2f, 0x0a3ec, 0x0d473, 0x05377, 0x0a3e9, - 0x1982b, 0x0e300, 0x12f3f, 0x0cf5f, 0x096c0, 0x38c3c, 0x16e94, 0x16e95, - 0x12f3d, 0x29ba4, 0x29ba6, 0x1c77c, 0x6a8ba, 0x3545c, 0x33457, 0x668ac, - 0x6a8bb, 0x16e9d, 0x0e519, 0x25996, 0x12f3e, 0x00036, 0x0033e, 0x006ad, - 0x00d03, 0x012c8, 0x0124a, 0x03c42, 0x03ccd, 0x06606, 0x07880, 0x06852, - 0x06a3a, 0x05bb4, 0x0f2a2, 0x09fc7, 0x12cb9, 0x0cc6c, 0x0a6e8, 0x096c1, - 0x0004a, 0x00355, 0x012f9, 0x014e8, 0x01abe, 0x025b6, 0x0492e, 0x09fc6, - 0x051ff, 0x0cc6f, 0x096cb, 0x0d071, 0x198d1, 0x12cb8, 0x38c3d, 0x13faf, - 0x096c9, 0x0009d, 0x00539, 0x012ce, 0x0341f, 0x029c1, 0x04b33, 0x0a3e3, - 0x0d070, 0x16e96, 0x0b763, 0x000a0, 0x009ce, 0x038cc, 0x0343d, 0x051fa, - 0x09888, 0x12fba, 0x000df, 0x00a75, 0x029a7, 0x09fc5, 0x0e301, 0x0967b, - 0x001e7, 0x012c9, 0x051fb, 0x09889, 0x0f2a6, 0x0016f, 0x01cb9, 0x0cf5a, - 0x12cbf, 0x09679, 0x00272, 0x01a15, 0x0967a, 0x003cb, 0x025f6, 0x0b762, - 0x0028d, 0x03c60, 0x0cf5e, 0x00352, 0x03ccc, 0x0072f, 0x07186, 0x004ec, - 0x05379, 0x0068e, 0x09887, 0x006a7, 0x06af1, 0x00e29, 0x0cf5b, 0x00f31, - 0x0d470, 0x009c6, 0x013fb, 0x13102, 0x019a5, 0x13101, 0x01983, 0x01c65, - 0x0124f, 0x014c7, 0x01726, 0x01abf, 0x03304, 0x02624, 0x03c41, 0x027d7, - 0x02ddd, 0x02e54, 0x0343c, 0x06604, 0x07181, 0x0663a, 0x04fa9, 0x0663b, - 0x05311, 0x0537a, 0x06839, 0x05bb5, 0x0492f, 0x06af0, 0x096c7, 0x0cc6e, - 0x0537b, 0x0cf5c, 0x0cf56, 0x198d2, 0x0cf5d, 0x0a3ed, 0x0f2a3, 0x1982a, - 0x0b761, 0x096c6, -}; - -static const uint8_t coef0_huffbits[666] = { - 11, 6, 2, 3, 4, 5, 5, 5, - 5, 6, 6, 6, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 11, 11, 11, 10, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 12, 12, 11, 12, - 12, 12, 12, 11, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 13, 13, 12, - 12, 12, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 14, - 13, 13, 13, 13, 13, 13, 13, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 13, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 15, - 15, 14, 14, 15, 15, 15, 14, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 14, 15, 15, 15, 15, 16, - 16, 16, 15, 16, 15, 15, 16, 16, - 16, 16, 15, 16, 16, 16, 15, 16, - 16, 15, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 15, 15, 16, 16, - 15, 16, 16, 16, 17, 17, 17, 16, - 16, 17, 16, 16, 16, 16, 17, 16, - 17, 17, 16, 16, 15, 15, 15, 16, - 17, 16, 17, 16, 16, 17, 17, 17, - 17, 17, 17, 16, 17, 17, 17, 16, - 17, 17, 16, 17, 17, 17, 16, 17, - 17, 16, 16, 17, 17, 17, 18, 17, - 17, 17, 17, 17, 18, 18, 17, 17, - 17, 19, 17, 19, 18, 17, 17, 18, - 17, 17, 18, 17, 17, 17, 18, 17, - 17, 18, 17, 17, 17, 17, 17, 16, - 17, 17, 17, 17, 18, 16, 17, 4, - 6, 8, 9, 9, 10, 10, 10, 10, - 11, 11, 11, 11, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 14, 13, 13, 13, 13, - 13, 13, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 16, 15, - 15, 15, 15, 15, 15, 17, 17, 17, - 16, 18, 16, 17, 17, 16, 16, 17, - 17, 18, 17, 16, 17, 17, 17, 16, - 17, 17, 18, 17, 18, 17, 17, 17, - 18, 17, 17, 5, 8, 10, 10, 11, - 11, 12, 12, 12, 13, 13, 14, 13, - 13, 14, 14, 14, 14, 14, 14, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 16, 16, 15, 16, 16, - 15, 15, 15, 15, 15, 16, 16, 15, - 15, 16, 16, 17, 17, 18, 17, 16, - 17, 18, 19, 17, 16, 16, 17, 17, - 17, 6, 9, 11, 12, 12, 13, 13, - 13, 14, 14, 14, 15, 15, 15, 16, - 15, 15, 15, 15, 15, 15, 16, 16, - 16, 16, 17, 18, 16, 16, 16, 18, - 17, 16, 17, 18, 17, 17, 16, 17, - 17, 16, 17, 16, 17, 18, 18, 18, - 17, 19, 19, 17, 20, 19, 18, 19, - 20, 18, 16, 18, 17, 7, 10, 12, - 13, 13, 14, 14, 14, 15, 15, 16, - 16, 16, 16, 16, 18, 16, 17, 17, - 8, 11, 13, 14, 14, 15, 16, 16, - 16, 16, 17, 17, 17, 18, 18, 17, - 17, 8, 12, 14, 15, 15, 15, 17, - 17, 18, 17, 9, 12, 14, 15, 16, - 16, 17, 9, 13, 15, 16, 16, 17, - 9, 13, 16, 16, 16, 10, 13, 16, - 18, 17, 10, 14, 17, 10, 14, 17, - 11, 14, 16, 11, 14, 11, 15, 12, - 16, 12, 16, 12, 16, 12, 16, 12, - 17, 13, 13, 17, 13, 17, 13, 13, - 14, 14, 14, 14, 14, 14, 14, 15, - 15, 15, 15, 15, 15, 15, 16, 15, - 16, 16, 16, 16, 16, 16, 17, 16, - 16, 16, 16, 17, 16, 17, 16, 17, - 17, 17, -}; - -static const uint32_t coef1_huffcodes[555] = { - 0x00115, 0x00002, 0x00001, 0x00000, 0x0000d, 0x00007, 0x00013, 0x0001d, - 0x00008, 0x0000c, 0x00023, 0x0002b, 0x0003f, 0x00017, 0x0001b, 0x00043, - 0x00049, 0x00050, 0x00055, 0x00054, 0x00067, 0x00064, 0x0007b, 0x0002d, - 0x00028, 0x0002a, 0x00085, 0x00089, 0x0002b, 0x00035, 0x00090, 0x00091, - 0x00094, 0x00088, 0x000c1, 0x000c6, 0x000f2, 0x000e3, 0x000c5, 0x000e2, - 0x00036, 0x000f0, 0x000a7, 0x000cd, 0x000fb, 0x00059, 0x00116, 0x00103, - 0x00108, 0x0012b, 0x0012d, 0x00188, 0x0012e, 0x0014c, 0x001c3, 0x00187, - 0x001e7, 0x0006f, 0x00094, 0x00069, 0x001e6, 0x001ca, 0x00147, 0x00195, - 0x000a7, 0x00213, 0x00209, 0x00303, 0x00295, 0x00289, 0x0028c, 0x0028d, - 0x00312, 0x00330, 0x0029b, 0x00308, 0x00328, 0x0029a, 0x0025e, 0x003c5, - 0x00384, 0x0039f, 0x00397, 0x00296, 0x0032e, 0x00332, 0x003c6, 0x003e6, - 0x0012d, 0x000d1, 0x00402, 0x000dd, 0x00161, 0x0012b, 0x00127, 0x0045d, - 0x00601, 0x004ab, 0x0045f, 0x00410, 0x004bf, 0x00528, 0x0045c, 0x00424, - 0x00400, 0x00511, 0x00618, 0x0073d, 0x0063a, 0x00614, 0x0073c, 0x007c0, - 0x007cf, 0x00802, 0x00966, 0x00964, 0x00951, 0x008a0, 0x00346, 0x00803, - 0x00a52, 0x0024a, 0x007c1, 0x0063f, 0x00126, 0x00406, 0x00789, 0x008a2, - 0x00960, 0x00967, 0x00c05, 0x00c70, 0x00c79, 0x00a5d, 0x00c26, 0x00c4d, - 0x00372, 0x008a5, 0x00c08, 0x002c5, 0x00f11, 0x00cc4, 0x00f8e, 0x00e16, - 0x00496, 0x00e77, 0x00f9c, 0x00c25, 0x00f1e, 0x00c27, 0x00f1f, 0x00e17, - 0x00ccd, 0x00355, 0x00c09, 0x00c78, 0x00f90, 0x00521, 0x00357, 0x00356, - 0x0068e, 0x00f9d, 0x00c04, 0x00e58, 0x00a20, 0x00a2c, 0x00c4c, 0x0052f, - 0x00f8d, 0x01178, 0x01053, 0x01097, 0x0180f, 0x0180d, 0x012fb, 0x012aa, - 0x0202a, 0x00a40, 0x018ed, 0x01ceb, 0x01455, 0x018e3, 0x012a1, 0x00354, - 0x00353, 0x00f1c, 0x00c7b, 0x00c37, 0x0101d, 0x012cb, 0x01142, 0x0197d, - 0x01095, 0x01e3b, 0x0186b, 0x00588, 0x01c2a, 0x014b8, 0x01e3a, 0x018ec, - 0x01f46, 0x012fa, 0x00a53, 0x01ce8, 0x00a55, 0x01c29, 0x0117b, 0x01052, - 0x012a0, 0x00589, 0x00950, 0x01c2b, 0x00a50, 0x0208b, 0x0180e, 0x02027, - 0x02556, 0x01e20, 0x006e7, 0x01c28, 0x0197a, 0x00684, 0x020a2, 0x01f22, - 0x03018, 0x039cf, 0x03e25, 0x02557, 0x0294c, 0x028a6, 0x00d11, 0x028a9, - 0x02979, 0x00d46, 0x00a56, 0x039ce, 0x030cc, 0x0329a, 0x0149d, 0x0510f, - 0x0451c, 0x02028, 0x03299, 0x01ced, 0x014b9, 0x00f85, 0x00c7a, 0x01800, - 0x00341, 0x012ca, 0x039c8, 0x0329d, 0x00d0d, 0x03e20, 0x05144, 0x00d45, - 0x030d0, 0x0186d, 0x030d5, 0x00d0f, 0x00d40, 0x04114, 0x020a1, 0x0297f, - 0x03e24, 0x032f1, 0x04047, 0x030d4, 0x028a8, 0x00d0e, 0x0451d, 0x04044, - 0x0297e, 0x04042, 0x030d2, 0x030cf, 0x03e21, 0x03e26, 0x028a5, 0x0451a, - 0x00d48, 0x01a16, 0x00d44, 0x04518, 0x0149b, 0x039ca, 0x01498, 0x0403d, - 0x0451b, 0x0149c, 0x032f3, 0x030cb, 0x08073, 0x03e22, 0x0529a, 0x020aa, - 0x039cc, 0x0738a, 0x06530, 0x07389, 0x06193, 0x08071, 0x04043, 0x030ce, - 0x05147, 0x07388, 0x05145, 0x08072, 0x04521, 0x00d47, 0x0297c, 0x030cd, - 0x030ca, 0x0000b, 0x0000c, 0x00083, 0x000e4, 0x00048, 0x00102, 0x001cc, - 0x001f5, 0x00097, 0x0020b, 0x00124, 0x00453, 0x00627, 0x00639, 0x00605, - 0x00517, 0x001b8, 0x00663, 0x00667, 0x007c3, 0x00823, 0x00961, 0x00963, - 0x00e5a, 0x00e59, 0x00a2b, 0x00cbf, 0x00292, 0x00a2d, 0x007d0, 0x00953, - 0x00cc5, 0x00f84, 0x004ab, 0x014a7, 0x0068a, 0x0117a, 0x0052e, 0x01442, - 0x0052c, 0x00c77, 0x00f8f, 0x004aa, 0x01094, 0x01801, 0x012c4, 0x0297b, - 0x00952, 0x01f19, 0x006a5, 0x01149, 0x012c5, 0x01803, 0x022f2, 0x0329b, - 0x04520, 0x0149e, 0x00d13, 0x01f16, 0x01ce9, 0x0101c, 0x006e6, 0x039c9, - 0x06191, 0x07c8e, 0x06192, 0x0ca63, 0x039cd, 0x06190, 0x06884, 0x06885, - 0x07382, 0x00d49, 0x00d41, 0x0450c, 0x0149a, 0x030d1, 0x08077, 0x03e23, - 0x01a15, 0x0e701, 0x0e702, 0x08079, 0x0822a, 0x0a218, 0x07887, 0x0403f, - 0x0520b, 0x0529b, 0x0e700, 0x04519, 0x00007, 0x000e0, 0x000d0, 0x0039b, - 0x003e5, 0x00163, 0x0063e, 0x007c9, 0x00806, 0x00954, 0x01044, 0x01f44, - 0x0197c, 0x01f45, 0x00a51, 0x01f47, 0x00951, 0x0052d, 0x02291, 0x0092f, - 0x00a54, 0x00d12, 0x0297d, 0x00d0c, 0x01499, 0x0329e, 0x032f0, 0x02025, - 0x039c6, 0x00a57, 0x03e46, 0x00d42, 0x0738b, 0x05146, 0x04046, 0x08078, - 0x0510e, 0x07886, 0x02904, 0x04156, 0x04157, 0x06032, 0x030d3, 0x08bce, - 0x04040, 0x0403e, 0x0a414, 0x10457, 0x08075, 0x06887, 0x07c8f, 0x039c7, - 0x07387, 0x08070, 0x08bcf, 0x1482a, 0x10456, 0x1482b, 0x01a17, 0x06886, - 0x0450d, 0x00013, 0x0006b, 0x00615, 0x0080b, 0x0082b, 0x00952, 0x00e5b, - 0x018e2, 0x0186c, 0x01f18, 0x0329f, 0x00d43, 0x03e29, 0x05140, 0x05141, - 0x0ca62, 0x06033, 0x03c42, 0x03e28, 0x0450f, 0x0a21a, 0x07384, 0x0a219, - 0x0e703, 0x0a21b, 0x01a14, 0x07383, 0x045e6, 0x0007a, 0x0012c, 0x00ccc, - 0x0068f, 0x01802, 0x00a52, 0x00953, 0x04045, 0x01a20, 0x0451f, 0x000a4, - 0x00735, 0x01cec, 0x02029, 0x020a3, 0x0451e, 0x00069, 0x00c24, 0x02024, - 0x032f2, 0x05142, 0x00196, 0x00523, 0x000a6, 0x0197b, 0x0030b, 0x0092e, - 0x003e9, 0x03e27, 0x00160, 0x05143, 0x00652, 0x04041, 0x00734, 0x028a7, - 0x0080f, 0x01483, 0x0097c, 0x00340, 0x0068b, 0x00522, 0x01054, 0x01096, - 0x01f17, 0x0202b, 0x01cea, 0x020a0, 0x02978, 0x02026, 0x0297a, 0x039cb, - 0x03e2b, 0x0149f, 0x0329c, 0x07385, 0x08074, 0x0450e, 0x03e2a, 0x05149, - 0x08076, 0x07386, 0x05148, -}; - -static const uint8_t coef1_huffbits[555] = { - 9, 5, 2, 4, 4, 5, 5, 5, - 6, 6, 6, 6, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 10, 10, 10, 9, 9, 9, 9, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 11, 11, 11, 11, 11, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 13, 12, 12, 12, 12, 12, 12, 12, - 13, 12, 12, 12, 12, 12, 12, 12, - 12, 13, 12, 12, 12, 13, 13, 13, - 13, 12, 12, 12, 12, 12, 12, 13, - 12, 13, 13, 13, 13, 13, 13, 13, - 14, 14, 13, 13, 13, 13, 13, 13, - 13, 12, 12, 12, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 14, 13, 14, 13, 13, 13, - 13, 13, 14, 13, 14, 14, 13, 14, - 14, 13, 14, 13, 13, 14, 14, 13, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 15, 14, 14, 14, 14, 15, 15, - 15, 14, 14, 13, 13, 12, 12, 13, - 13, 13, 14, 14, 15, 14, 15, 15, - 14, 13, 14, 15, 15, 15, 14, 14, - 14, 14, 15, 14, 14, 15, 15, 15, - 14, 15, 14, 14, 14, 14, 14, 15, - 15, 16, 15, 15, 15, 14, 15, 15, - 15, 15, 14, 14, 16, 14, 15, 14, - 14, 15, 15, 15, 15, 16, 15, 14, - 15, 15, 15, 16, 15, 15, 14, 14, - 14, 4, 7, 8, 8, 9, 9, 9, - 9, 10, 10, 11, 11, 11, 11, 11, - 11, 12, 11, 11, 11, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 11, 12, - 12, 12, 13, 13, 13, 13, 13, 13, - 13, 12, 12, 13, 13, 13, 13, 14, - 14, 13, 14, 13, 13, 13, 14, 14, - 15, 15, 14, 13, 13, 13, 14, 14, - 15, 15, 15, 16, 14, 15, 17, 17, - 15, 15, 15, 15, 15, 14, 16, 14, - 16, 16, 16, 16, 16, 16, 15, 15, - 17, 15, 16, 15, 6, 8, 10, 10, - 10, 11, 11, 11, 12, 12, 13, 13, - 13, 13, 14, 13, 14, 13, 14, 14, - 14, 14, 14, 15, 15, 14, 14, 14, - 14, 14, 14, 15, 15, 15, 15, 16, - 15, 15, 16, 15, 15, 15, 14, 16, - 15, 15, 18, 17, 16, 17, 15, 14, - 15, 16, 16, 19, 17, 19, 16, 17, - 15, 7, 10, 11, 12, 12, 12, 12, - 13, 13, 13, 14, 15, 14, 15, 15, - 16, 15, 14, 14, 15, 16, 15, 16, - 16, 16, 16, 15, 15, 7, 11, 12, - 13, 13, 14, 14, 15, 15, 15, 8, - 11, 13, 14, 14, 15, 9, 12, 14, - 14, 15, 9, 13, 10, 13, 10, 14, - 10, 14, 11, 15, 11, 15, 11, 14, - 12, 15, 12, 13, 13, 13, 13, 13, - 13, 14, 13, 14, 14, 14, 14, 14, - 14, 15, 14, 15, 16, 15, 14, 15, - 16, 15, 15, -}; - -static const uint32_t coef2_huffcodes[1336] = { - 0x003e6, 0x000f6, 0x00000, 0x00002, 0x00006, 0x0000f, 0x0001b, 0x00028, - 0x00039, 0x0003f, 0x0006b, 0x00076, 0x000b7, 0x000e8, 0x000ef, 0x00169, - 0x001a7, 0x001d4, 0x001dc, 0x002c4, 0x00349, 0x00355, 0x00391, 0x003dc, - 0x00581, 0x005b2, 0x00698, 0x0070c, 0x00755, 0x0073a, 0x00774, 0x007cf, - 0x00b0a, 0x00b66, 0x00d2e, 0x00d5e, 0x00e1b, 0x00eac, 0x00e5a, 0x00f7e, - 0x00fa1, 0x0163e, 0x01a37, 0x01a52, 0x01c39, 0x01ab3, 0x01d5f, 0x01cb6, - 0x01f52, 0x01dd9, 0x02c04, 0x02c2e, 0x02c2d, 0x02c23, 0x03467, 0x034a3, - 0x0351b, 0x03501, 0x03a5d, 0x0351c, 0x03875, 0x03dea, 0x0397b, 0x039db, - 0x03df1, 0x039d8, 0x03bb4, 0x0580a, 0x0584d, 0x05842, 0x05b13, 0x058ea, - 0x0697d, 0x06a06, 0x068cc, 0x06ac7, 0x06a96, 0x072f4, 0x07543, 0x072b4, - 0x07d20, 0x0b003, 0x073b5, 0x07be6, 0x0d180, 0x07bd1, 0x07cb8, 0x07d06, - 0x07d25, 0x0d2f2, 0x0d19a, 0x0d334, 0x0e1dc, 0x0d529, 0x0d584, 0x0e1d2, - 0x0e5e3, 0x0eec4, 0x0e564, 0x0fa49, 0x16001, 0x0eedc, 0x0f7fa, 0x1a32c, - 0x16131, 0x16003, 0x0f9c8, 0x1ef80, 0x1d2a0, 0x1aa4b, 0x0f7ce, 0x1abfe, - 0x1aa50, 0x1a458, 0x1a816, 0x1cae4, 0x1d2fe, 0x1d52e, 0x1aa4c, 0x2c245, - 0x1d2a1, 0x1a35d, 0x1ca1b, 0x1d5d8, 0x1f531, 0x1ca1c, 0x1f389, 0x1f4af, - 0x3a5e7, 0x351fb, 0x2c24b, 0x34bce, 0x2c24d, 0x2c249, 0x2c24a, 0x72dfc, - 0x357ef, 0x35002, 0x3a5e6, 0x39431, 0x5843b, 0x34a77, 0x58431, 0x3a5f3, - 0x3a5dd, 0x3e5e5, 0x356bd, 0x3976e, 0x6a3d2, 0x3500d, 0x694c4, 0x580bd, - 0x3e5e8, 0x74b95, 0x34a6e, 0x3977c, 0x39432, 0x5b0d2, 0x6a3d8, 0x580b8, - 0x5b0cb, 0x5b0d7, 0x72dee, 0x72ded, 0x72dec, 0x74b9c, 0x3977f, 0x72dea, - 0x74b9e, 0x7be7d, 0x580bf, 0x5b0d5, 0x7cba8, 0x74b91, 0x3e5dd, 0xb6171, - 0xd46b3, 0xd46b9, 0x7cba1, 0x74b9f, 0x72de1, 0xe59f5, 0x3e5eb, 0x00004, - 0x00015, 0x00038, 0x00075, 0x000e8, 0x001d3, 0x00347, 0x0039c, 0x00690, - 0x0074a, 0x00b60, 0x00e93, 0x00f74, 0x0163d, 0x01a5a, 0x01d24, 0x01cbe, - 0x01f4b, 0x03468, 0x03562, 0x03947, 0x03e82, 0x05804, 0x05b12, 0x05803, - 0x0696d, 0x06a9e, 0x0697c, 0x06978, 0x06afb, 0x074b2, 0x072f5, 0x073c0, - 0x07541, 0x06944, 0x074b7, 0x070d3, 0x07ba9, 0x0b0b1, 0x0d1af, 0x0e1dd, - 0x0e5e2, 0x0e1a3, 0x0eec3, 0x1612f, 0x0e961, 0x0eeda, 0x0e78e, 0x0fa48, - 0x1612c, 0x0e511, 0x0e565, 0x0e953, 0x1aa4a, 0x0e59d, 0x1d52c, 0x1a811, - 0x1cae7, 0x1abfc, 0x1d52d, 0x1cacf, 0x1cf05, 0x2c254, 0x34a72, 0x1f4ac, - 0x3976b, 0x34a71, 0x2c6d9, 0x2d873, 0x34a6a, 0x357e7, 0x3464c, 0x3e5f5, - 0x58433, 0x1f53a, 0x3500a, 0x357ea, 0x34a73, 0x3942f, 0x357e5, 0x39775, - 0x694cd, 0x39772, 0x7cba5, 0x6a3ef, 0x35483, 0x74b98, 0x5b0c1, 0x39770, - 0x3a5d7, 0x39433, 0x39434, 0x694ce, 0x580be, 0x3e5ff, 0x6a3ec, 0xb616f, - 0xd46b1, 0x6a3d1, 0x72de5, 0x74b6e, 0x72de9, 0x3e700, 0xd46b6, 0x6a3e9, - 0x74b69, 0xe5675, 0xd46b8, 0x7cbaa, 0x3a5d1, 0x0000c, 0x0003c, 0x000eb, - 0x001f1, 0x003a4, 0x006a8, 0x007d5, 0x00d43, 0x00e77, 0x016c5, 0x01cb1, - 0x02c5d, 0x03a55, 0x03a56, 0x03e51, 0x03bb5, 0x05b0a, 0x06a9f, 0x074b8, - 0x07d28, 0x0d187, 0x0d40e, 0x0d52e, 0x0d425, 0x0eae3, 0x0e1d3, 0x1612e, - 0x0e59e, 0x0eec2, 0x0e578, 0x0e51a, 0x0e579, 0x0e515, 0x0e960, 0x0d183, - 0x0d220, 0x0d2cb, 0x0e512, 0x16c3e, 0x16002, 0x16c42, 0x1cae9, 0x3461a, - 0x1d2fa, 0x1a308, 0x1a849, 0x1cf07, 0x1f38f, 0x34b65, 0x2c253, 0x1ef9e, - 0x1cbc3, 0x1cbc1, 0x2c255, 0x1f384, 0x58435, 0x2c5cd, 0x3a5f7, 0x2c252, - 0x3959c, 0x2c6d8, 0x3a5d3, 0x6ad78, 0x6a3f2, 0x7cba9, 0xb6176, 0x72deb, - 0x39764, 0x3e5f6, 0x3a5d8, 0x74a8c, 0x6a3e6, 0x694d1, 0x6ad79, 0x1a4592, - 0xe59fb, 0x7cbb3, 0x5b0cd, 0x00017, 0x000b5, 0x002c3, 0x005b7, 0x00b1c, - 0x00e5c, 0x0163f, 0x01ab2, 0x01efa, 0x0348a, 0x0396e, 0x058da, 0x06963, - 0x06a30, 0x072cd, 0x073cf, 0x07ce7, 0x0d2ca, 0x0d2d8, 0x0e764, 0x0e794, - 0x16008, 0x16167, 0x1617e, 0x1aa49, 0x1a30b, 0x1a813, 0x2c6da, 0x1a580, - 0x1cbc2, 0x0f9ca, 0x1617f, 0x1d2fe, 0x0f7fc, 0x16c40, 0x0e513, 0x0eec5, - 0x0f7c3, 0x1d508, 0x1a81e, 0x1d2fd, 0x39430, 0x35486, 0x3e5fd, 0x2c24c, - 0x2c75a, 0x34a74, 0x3a5f4, 0x3464d, 0x694ca, 0x3a5f1, 0x1d509, 0x1d5c0, - 0x34648, 0x3464e, 0x6a3d5, 0x6a3e8, 0x6a3e7, 0x5b0c3, 0x2c248, 0x1f38a, - 0x3a5f2, 0x6a3e5, 0x00029, 0x00168, 0x0058c, 0x00b67, 0x00f9d, 0x01c3d, - 0x01cbf, 0x02c20, 0x0351d, 0x03df6, 0x06af9, 0x072b5, 0x0b1d7, 0x0b0b2, - 0x0d40a, 0x0d52b, 0x0e952, 0x0e797, 0x163c3, 0x1c3a0, 0x1f386, 0x1ca21, - 0x34655, 0x2c247, 0x1f53b, 0x2c250, 0x2c24f, 0x1f385, 0x1ef5d, 0x1cf15, - 0x1caea, 0x1ab0a, 0x1cf19, 0x1f53d, 0x1d5c2, 0x1d2fb, 0x1ef58, 0x34a78, - 0x357ec, 0x1f533, 0x3a5e1, 0x694d2, 0x58482, 0x3a5ee, 0x2c6dc, 0x357eb, - 0x5b0c4, 0x39778, 0x6a3e1, 0x7cbb4, 0x3a5e1, 0x74b68, 0x3a5ef, 0x3a5d2, - 0x39424, 0x72de2, 0xe59f6, 0xe59f7, 0x3e702, 0x3e5ec, 0x1f38b, 0x0003b, - 0x001f0, 0x00777, 0x00fa8, 0x01cb2, 0x02d84, 0x03a57, 0x03dd6, 0x06917, - 0x06a11, 0x07d07, 0x0eae2, 0x0e796, 0x0f9c9, 0x0f7fb, 0x16166, 0x16160, - 0x1ab1b, 0x1abfa, 0x2d87b, 0x1d2f7, 0x39768, 0x1f38c, 0x34653, 0x34651, - 0x6a3d9, 0x35001, 0x3abbd, 0x38742, 0x39426, 0x34a76, 0x3a5ec, 0x34a75, - 0x35000, 0x35488, 0x1cf10, 0x2c6db, 0x357ed, 0x357e8, 0x357e9, 0x3a5f0, - 0x694c2, 0xb6178, 0x72df5, 0x39425, 0x3942b, 0x74b6d, 0x74b6f, 0xb6177, - 0xb6179, 0x74b6a, 0xb6172, 0x58487, 0x3e5ee, 0x3e5ed, 0x72df2, 0x72df4, - 0x7cbae, 0x6a3ca, 0x70e86, 0x34bcf, 0x6a3c8, 0x00059, 0x00384, 0x00d5b, - 0x01c38, 0x03560, 0x0395b, 0x0584e, 0x06964, 0x073cd, 0x0b1e7, 0x0e798, - 0x0e78d, 0x0fa43, 0x1a848, 0x1a32f, 0x1aa4e, 0x3464a, 0x1f4ab, 0x1f38d, - 0x3a5eb, 0x3a5d4, 0x3548a, 0x6a3c7, 0x5b0d0, 0x6a3c5, 0x7cbb0, 0x694cb, - 0x3a5e5, 0x3e5e2, 0x3942c, 0x2d872, 0x1f4ae, 0x3a5d5, 0x694d3, 0x58481, - 0x35009, 0x39774, 0x58432, 0xb616c, 0x5b0db, 0x3548b, 0xb6174, 0x1d5d95, - 0xb004c, 0x7cbb2, 0x3a5e5, 0x74a8f, 0xe59f9, 0x72df6, 0xe59fd, 0x7cbad, - 0xd427d, 0x72cff, 0x3977a, 0x5b0d9, 0xb616d, 0xb616b, 0x1a4593, 0x7cbaf, - 0x5b0da, 0x00071, 0x003eb, 0x01603, 0x02c6c, 0x03961, 0x068c8, 0x06a31, - 0x072bd, 0x0d2c2, 0x0e51b, 0x0e5e6, 0x1abfb, 0x1d2ff, 0x1cae5, 0x1ef5c, - 0x1ef5e, 0x1cf13, 0x34a6d, 0x3976d, 0xb616a, 0x3e5f2, 0x6a3c4, 0xb6169, - 0x3e5dc, 0x580b9, 0x74b99, 0x75764, 0x58434, 0x3a5d9, 0x6945a, 0x69459, - 0x3548c, 0x3a5e9, 0x69457, 0x72df1, 0x6945e, 0x6a35e, 0x3e701, 0xb6168, - 0x5b0dd, 0x3a5de, 0x6a3c2, 0xd4278, 0x6a3cc, 0x72dfd, 0xb6165, 0x16009a, - 0x7cbb1, 0xd427c, 0xb6162, 0xe765e, 0x1cecbe, 0x7cbb6, 0x69454, 0xb6160, - 0xd427a, 0x1d5d96, 0xb1d6d, 0xe59f4, 0x72de8, 0x3a5db, 0x0007a, 0x006ae, - 0x01c3c, 0x03aba, 0x058e9, 0x072cc, 0x0d2dd, 0x0d22d, 0x0eec1, 0x0eedb, - 0x1d2a2, 0x1ef5b, 0x357e2, 0x3abbf, 0x1d2f9, 0x35004, 0x3a5dc, 0x351fc, - 0x3976c, 0x6a3c6, 0x6a3cb, 0x3e5ea, 0xe59f3, 0x6a3ce, 0x69452, 0xe59f0, - 0x74b90, 0xd4279, 0xd427b, 0x7cbb5, 0x5b0c5, 0x3a5e3, 0x3a5e2, 0x000d0, - 0x00775, 0x01efe, 0x03dd5, 0x0728c, 0x07cb9, 0x0e1a2, 0x0ea85, 0x0eed8, - 0x1a30a, 0x1aa4f, 0x3a5df, 0x35008, 0x3a5e0, 0x3e5f4, 0x3e5f7, 0xb1d6c, - 0x5843e, 0x34a70, 0x72df8, 0x74b6b, 0xd427f, 0x72df0, 0x5b0bf, 0x5b0c0, - 0xd46b0, 0x72def, 0xe59f8, 0x162e64, 0xb1d6f, 0x3a5e0, 0x39427, 0x69166, - 0x6a3e2, 0x6a3e3, 0x74a8d, 0xd427e, 0x1d5d97, 0xd46b4, 0x5b0d8, 0x6a3d3, - 0x000e0, 0x00b63, 0x034cc, 0x06a33, 0x073c9, 0x0e1a0, 0x0f7fd, 0x0f9cc, - 0x1617d, 0x1caeb, 0x1f4a9, 0x3abb3, 0x69450, 0x39420, 0x39777, 0x3e5e0, - 0x6a3d4, 0x6a3ed, 0xb6166, 0xe59f1, 0xb1d6e, 0xe5676, 0x6a3ea, 0xe5674, - 0xb6163, 0xd46b7, 0x7cba6, 0xd46ba, 0x1d5d94, 0xb6164, 0x6a3f1, 0x7cba2, - 0x69451, 0x72dfa, 0xd46bb, 0x72df7, 0x74b94, 0x1cecbf, 0xe59fa, 0x16009b, - 0x6a3e4, 0x000e6, 0x00e94, 0x03876, 0x070ef, 0x0d52a, 0x16015, 0x16014, - 0x1abf9, 0x1cf17, 0x34a79, 0x34650, 0x3e705, 0x6a3d0, 0x58430, 0x74b9d, - 0x7be7e, 0x5b0be, 0x39773, 0x6a3de, 0x000fb, 0x00f7b, 0x03dd7, 0x07bd0, - 0x0e59c, 0x0f9cd, 0x1cf18, 0x1d2ff, 0x34a7a, 0x39429, 0x3500c, 0x72de0, - 0x69456, 0x7be7c, 0xd46b5, 0xd46b2, 0x6a3dd, 0x001a2, 0x0163b, 0x06913, - 0x0b016, 0x0fa42, 0x1a32d, 0x1cf06, 0x34a7c, 0x34a7d, 0xb6161, 0x35481, - 0x3e5fa, 0x7cba0, 0x7be7f, 0x7cba3, 0x7cba7, 0x5b0d3, 0x72de6, 0x6a3dc, - 0x001a9, 0x01ab4, 0x06a34, 0x0d46a, 0x16130, 0x1ef5f, 0x1f532, 0x1f536, - 0x3942e, 0x58436, 0x6a3db, 0x6945b, 0x001c9, 0x01ca0, 0x0728b, 0x0eed9, - 0x1f539, 0x1ca1d, 0x39765, 0x39766, 0x58439, 0x6945d, 0x39767, 0x001d3, - 0x01f2c, 0x07bfc, 0x16161, 0x34652, 0x3a5ed, 0x3548d, 0x58438, 0x6a3da, - 0x002c1, 0x02c5e, 0x0d335, 0x1ab1a, 0x2d874, 0x35006, 0x35484, 0x5b0cc, - 0x74b9a, 0x72df3, 0x6a3d6, 0x002da, 0x034b3, 0x0d5ae, 0x1caee, 0x2d871, - 0x357e3, 0x74b97, 0x72df9, 0x580ba, 0x5b0d4, 0x0034d, 0x0354e, 0x0f750, - 0x1cbc0, 0x3a5e7, 0x3a5e4, 0x00385, 0x03a58, 0x16c41, 0x2c5cf, 0x3e5e1, - 0x74b6c, 0xe5677, 0x6a3df, 0x00390, 0x03e50, 0x163c2, 0x2d876, 0x35482, - 0x5b0d6, 0x5843a, 0x0039f, 0x0585e, 0x1a583, 0x3500f, 0x74b93, 0x39771, - 0x003e4, 0x06912, 0x16c43, 0x357e1, 0x0058a, 0x0696f, 0x1f538, 0x5b0c9, - 0x6a3cf, 0x005b6, 0x06af8, 0x1f534, 0x58483, 0x6a3e0, 0x00695, 0x07d02, - 0x1cae8, 0x58485, 0x006a2, 0x0754a, 0x357ee, 0x3977b, 0x00748, 0x074b2, - 0x34a7b, 0x00729, 0x0b1e0, 0x34649, 0x3e5e3, 0x0073d, 0x0d2c4, 0x3e5e6, - 0x007bb, 0x0b099, 0x39762, 0x5b0ce, 0x6945f, 0x007d1, 0x0d5ab, 0x39779, - 0x007d3, 0x0d52f, 0x39763, 0x6945c, 0x00b1a, 0x0d2c5, 0x35489, 0x00d23, - 0x0eaed, 0x3e5f8, 0x00d32, 0x16016, 0x3e5fb, 0x00d41, 0x0e768, 0x3a5ed, - 0x00e1f, 0x16017, 0x58027, 0x00ead, 0x0fa07, 0x69455, 0x00e54, 0x1612b, - 0x00e55, 0x1a581, 0x00f78, 0x1a32b, 0x580bc, 0x6a3ee, 0x00f79, 0x1abfd, - 0x00f95, 0x1ab18, 0x6a3f0, 0x01637, 0x1aa4d, 0x0162d, 0x1f53c, 0x6a3f3, - 0x01a31, 0x1a810, 0x39769, 0x01a50, 0x1caef, 0x01a36, 0x1a32e, 0x01a67, - 0x1f38e, 0x01a85, 0x1ef59, 0x01aa6, 0x1ef83, 0x01d51, 0x2c012, 0x01d53, - 0x2d879, 0x01d5e, 0x35005, 0x01cba, 0x1cf04, 0x69453, 0x01d2d, 0x351ff, - 0x01f2d, 0x2d86f, 0x01f29, 0x35007, 0x02c22, 0x351fa, 0x02c03, 0x3a5ec, - 0x02c5f, 0x3a5eb, 0x02c58, 0x34a6b, 0x03469, 0x356be, 0x02c59, 0x34a6c, - 0x0346a, 0x3a5ea, 0x034bd, 0x034bf, 0x356bf, 0x0386a, 0x03ab9, 0x5843f, - 0x0386b, 0x3a5f5, 0x03a4b, 0x39421, 0x03aa4, 0x3a5e9, 0x03a5a, 0x03960, - 0x3977e, 0x03de9, 0x03958, 0x03df7, 0x039e1, 0x3e5e4, 0x0395f, 0x69458, - 0x03e91, 0x03df2, 0x39428, 0x058f2, 0x03e80, 0x6a3c3, 0x03e93, 0x694c0, - 0x058b8, 0x5b0ca, 0x0584f, 0x694c1, 0x058f1, 0x068d6, 0x06a10, 0x06ac3, - 0x06a32, 0x070d2, 0x06911, 0x074b1, 0x07494, 0x06ad4, 0x06ad6, 0x072b8, - 0x06afa, 0x074b3, 0x07540, 0x073ce, 0x0b005, 0x074b3, 0x07495, 0x074b9, - 0x0d336, 0x07bff, 0x07763, 0x073c8, 0x07d29, 0x0b622, 0x0d221, 0x0d181, - 0x0b1d1, 0x074b8, 0x0b1d0, 0x0d19b, 0x0d2c3, 0x0b172, 0x0d2dc, 0x0b623, - 0x0d5aa, 0x0d426, 0x0d182, 0x0e795, 0x0e1d1, 0x0d337, 0x0e96c, 0x0e5e4, - 0x0e514, 0x0eaee, 0x16000, 0x0e767, 0x0e1a1, 0x0e78f, 0x16004, 0x0f7c2, - 0x0e799, 0x0e5e7, 0x0e566, 0x0e769, 0x0f751, 0x0eede, 0x0fa06, 0x16005, - 0x0fa9f, 0x1a5e6, 0x0e766, 0x1636f, 0x0eedd, 0x0eec0, 0x1a309, 0x1ceca, - 0x163cd, 0x0f9cb, 0x0eedf, 0x1a582, 0x1612d, 0x0e5e5, 0x1abf8, 0x1a30c, - 0x1ca1f, 0x163cc, 0x1a35c, 0x1ca1e, 0x1aa51, 0x163ac, 0x1a84e, 0x1a53f, - 0x1cf16, 0x1d2fc, 0x1a5b3, 0x1ab19, 0x1a81f, 0x1d5c3, 0x16c3f, 0x1d5c1, - 0x1d2fc, 0x1f4aa, 0x1a812, 0x1f535, 0x1cf12, 0x1a817, 0x1617c, 0x1ab0b, - 0x1d2f8, 0x1ef82, 0x2d87a, 0x1d52f, 0x1f530, 0x1aa48, 0x35487, 0x1d2fd, - 0x1f4ad, 0x1cf11, 0x3461b, 0x35485, 0x1ca20, 0x1caed, 0x1cae6, 0x1abff, - 0x3464f, 0x34a6f, 0x1ef81, 0x3464b, 0x39d96, 0x1f383, 0x1f537, 0x1cf14, - 0x2c5ce, 0x3500e, 0x2c251, 0x1caec, 0x1f387, 0x34654, 0x357e4, 0x2d878, - 0x3500b, 0x35480, 0x3a5e8, 0x3548e, 0x34b64, 0x1f4a8, 0x35003, 0x3e5df, - 0x2d870, 0x357e6, 0x3e5f0, 0x1ef5a, 0x3a5ea, 0x1f388, 0x3e703, 0x2c24e, - 0x3a5e2, 0x351fd, 0x2c6dd, 0x3e704, 0x351fe, 0x2d875, 0x5b0c7, 0x3976a, - 0x3a5e6, 0x39423, 0x58480, 0x2c246, 0x3a5e3, 0x2d877, 0x3e5f1, 0x3abbe, - 0x58489, 0x3e5f9, 0x357e0, 0x3abbc, 0x5b0c6, 0x69167, 0x69165, 0x3e5e9, - 0x39422, 0x3976f, 0x3977d, 0x3e5de, 0x6a3c9, 0x58b98, 0x3a5f6, 0x3a5d0, - 0x58486, 0x6a3c1, 0x3e5fc, 0x5b0dc, 0x3548f, 0x3942d, 0x694c9, 0x58484, - 0x3a5e8, 0x74b9b, 0x74b96, 0x694d0, 0x58488, 0x3a5e4, 0x3942a, 0x72ec2, - 0x39776, 0x5b0d1, 0x5b0cf, 0x3a5d6, 0xe59fc, 0x5b0c8, 0x3e5e7, 0x7cbb7, - 0x70e87, 0x7cbab, 0x5b0c2, 0x694c3, 0x74a8e, 0x3e5f3, 0x6a3cd, 0x72dfe, - 0x73b2e, 0x72ec0, 0x694c5, 0x58437, 0x694c8, 0x72dff, 0x39435, 0x5843d, - 0x6a3d7, 0x72ec1, 0xd22c8, 0x694cf, 0xb6173, 0x3e5fe, 0x580bb, 0xe59f2, - 0xb616e, 0xb6175, 0x3a5da, 0x5b0bd, 0x694cc, 0x5843c, 0x694c7, 0x74b92, - 0x72ec3, 0x694c6, 0xb6170, 0x7cbac, 0xb1733, 0x7cba4, 0xb6167, 0x72de7, - 0x72de4, 0x6a3c0, 0x3e5ef, 0x162e65, 0x72de3, 0x72dfb, 0x6a35f, 0x6a3eb, -}; - -static const uint8_t coef2_huffbits[1336] = { - 11, 9, 2, 3, 4, 4, 5, 6, - 6, 7, 7, 8, 8, 8, 9, 9, - 9, 9, 10, 10, 10, 10, 11, 11, - 11, 11, 11, 11, 11, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 16, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 18, 17, 17, 17, 17, - 17, 17, 17, 18, 18, 17, 17, 18, - 17, 17, 18, 17, 18, 18, 18, 18, - 19, 18, 18, 18, 18, 18, 18, 20, - 18, 18, 18, 19, 19, 18, 19, 18, - 19, 19, 18, 19, 19, 18, 19, 19, - 19, 19, 18, 19, 19, 19, 19, 19, - 19, 19, 20, 20, 20, 19, 19, 20, - 19, 20, 19, 19, 20, 19, 19, 20, - 20, 20, 20, 19, 20, 21, 19, 3, - 5, 7, 8, 9, 9, 10, 11, 11, - 12, 12, 12, 13, 13, 13, 13, 14, - 14, 14, 14, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 16, 16, - 15, 15, 15, 15, 16, 16, 16, 16, - 17, 16, 17, 17, 16, 17, 17, 17, - 17, 17, 17, 16, 17, 17, 17, 17, - 18, 17, 17, 18, 18, 18, 18, 18, - 19, 18, 18, 18, 18, 18, 18, 19, - 19, 18, 18, 18, 18, 19, 18, 19, - 19, 19, 20, 19, 18, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 20, - 20, 19, 20, 19, 20, 19, 20, 19, - 19, 21, 20, 20, 19, 4, 7, 8, - 10, 11, 11, 12, 12, 13, 13, 14, - 14, 14, 14, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 17, - 17, 17, 17, 17, 17, 17, 16, 16, - 16, 16, 17, 17, 17, 17, 18, 18, - 18, 17, 17, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 19, 18, 18, 18, - 19, 18, 19, 19, 19, 20, 20, 20, - 19, 19, 19, 19, 19, 19, 19, 21, - 21, 20, 19, 5, 8, 10, 11, 12, - 13, 13, 13, 14, 14, 15, 15, 15, - 15, 16, 16, 16, 16, 16, 17, 17, - 17, 17, 17, 17, 17, 17, 18, 17, - 18, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 19, 18, 19, 18, - 18, 18, 18, 18, 19, 18, 17, 17, - 18, 18, 19, 19, 19, 19, 18, 18, - 18, 19, 6, 9, 11, 12, 13, 13, - 14, 14, 14, 15, 15, 16, 16, 16, - 16, 16, 16, 17, 17, 17, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 17, 18, 18, 17, 18, 18, 18, - 18, 18, 18, 19, 19, 18, 18, 18, - 19, 19, 19, 20, 19, 19, 18, 19, - 19, 20, 21, 21, 19, 19, 18, 6, - 10, 12, 13, 14, 14, 14, 15, 15, - 15, 16, 16, 17, 17, 17, 17, 17, - 17, 17, 18, 18, 19, 18, 18, 18, - 19, 18, 18, 18, 19, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 19, 20, 20, 19, 19, 19, 19, 20, - 20, 19, 20, 19, 19, 19, 20, 20, - 20, 19, 19, 18, 19, 7, 10, 12, - 13, 14, 15, 15, 15, 16, 16, 17, - 17, 17, 17, 17, 17, 18, 18, 18, - 18, 19, 18, 19, 19, 19, 20, 19, - 18, 19, 19, 18, 18, 19, 19, 19, - 18, 19, 19, 20, 19, 18, 20, 21, - 20, 20, 19, 19, 21, 20, 21, 20, - 20, 20, 19, 19, 20, 20, 21, 20, - 19, 7, 11, 13, 14, 15, 15, 15, - 16, 16, 17, 17, 17, 17, 18, 18, - 18, 18, 18, 19, 20, 19, 19, 20, - 19, 19, 19, 19, 19, 19, 19, 19, - 18, 18, 19, 20, 19, 19, 19, 20, - 19, 19, 19, 20, 19, 20, 20, 21, - 20, 20, 20, 21, 22, 20, 19, 20, - 20, 21, 20, 21, 20, 19, 8, 11, - 13, 14, 15, 16, 16, 16, 17, 17, - 17, 18, 18, 18, 18, 18, 19, 18, - 19, 19, 19, 19, 21, 19, 19, 21, - 19, 20, 20, 20, 19, 18, 18, 8, - 12, 14, 15, 16, 16, 16, 16, 17, - 17, 17, 19, 18, 18, 19, 19, 20, - 19, 18, 20, 19, 20, 20, 19, 19, - 20, 20, 21, 21, 20, 19, 19, 19, - 19, 19, 19, 20, 21, 20, 19, 19, - 8, 12, 14, 15, 16, 16, 17, 17, - 17, 18, 18, 18, 19, 19, 19, 19, - 19, 19, 20, 21, 20, 21, 19, 21, - 20, 20, 20, 20, 21, 20, 19, 20, - 19, 20, 20, 20, 19, 22, 21, 21, - 19, 9, 12, 14, 15, 16, 17, 17, - 17, 18, 18, 18, 19, 19, 19, 19, - 20, 19, 19, 19, 9, 13, 15, 16, - 17, 17, 18, 18, 18, 19, 18, 20, - 19, 20, 20, 20, 19, 9, 13, 15, - 16, 17, 17, 18, 18, 18, 20, 18, - 19, 20, 20, 20, 20, 19, 20, 19, - 9, 13, 15, 16, 17, 18, 18, 18, - 19, 19, 19, 19, 10, 14, 16, 17, - 18, 18, 19, 19, 19, 19, 19, 10, - 14, 16, 17, 18, 18, 18, 19, 19, - 10, 14, 16, 17, 18, 18, 18, 19, - 19, 20, 19, 10, 14, 16, 18, 18, - 18, 19, 20, 19, 19, 10, 14, 17, - 18, 18, 18, 10, 15, 17, 18, 19, - 19, 21, 19, 11, 15, 17, 18, 18, - 19, 19, 11, 15, 17, 18, 19, 19, - 11, 15, 17, 18, 11, 15, 18, 19, - 19, 11, 15, 18, 19, 19, 11, 16, - 18, 19, 11, 15, 18, 19, 11, 16, - 18, 12, 16, 18, 19, 12, 16, 19, - 12, 16, 19, 19, 19, 12, 16, 19, - 12, 16, 19, 19, 12, 16, 18, 12, - 16, 19, 12, 17, 19, 12, 17, 19, - 12, 17, 19, 12, 17, 19, 13, 17, - 13, 17, 13, 17, 19, 19, 13, 17, - 13, 17, 19, 13, 17, 13, 18, 19, - 13, 17, 19, 13, 18, 13, 17, 13, - 18, 13, 18, 13, 18, 13, 18, 13, - 18, 13, 18, 14, 18, 19, 14, 18, - 14, 18, 14, 18, 14, 18, 14, 19, - 14, 19, 14, 18, 14, 18, 14, 18, - 14, 19, 14, 14, 18, 14, 14, 19, - 14, 18, 14, 19, 14, 19, 14, 15, - 19, 15, 15, 15, 15, 19, 15, 19, - 15, 15, 19, 15, 15, 19, 15, 19, - 15, 19, 15, 19, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 16, - 15, 15, 15, 16, 16, 16, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 17, 16, 16, 16, 17, - 17, 16, 17, 17, 16, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 18, - 17, 17, 17, 17, 17, 17, 17, 17, - 18, 17, 17, 18, 17, 17, 17, 17, - 18, 18, 17, 17, 17, 17, 17, 17, - 17, 18, 17, 18, 18, 17, 17, 17, - 18, 18, 18, 17, 18, 17, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 17, - 18, 18, 18, 18, 19, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 19, - 18, 18, 19, 18, 18, 18, 19, 18, - 19, 18, 18, 19, 18, 18, 19, 19, - 19, 19, 19, 18, 19, 18, 19, 18, - 19, 19, 18, 18, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 18, 19, - 19, 19, 19, 19, 18, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 20, - 19, 19, 19, 19, 21, 19, 19, 20, - 19, 20, 19, 19, 19, 19, 19, 20, - 20, 20, 19, 19, 19, 20, 19, 19, - 19, 20, 20, 19, 20, 19, 19, 21, - 20, 20, 19, 19, 19, 19, 19, 19, - 20, 19, 20, 20, 20, 20, 20, 20, - 20, 19, 19, 21, 20, 20, 19, 19, -}; - -static const uint32_t coef3_huffcodes[1072] = { - 0x001b2, 0x00069, 0x00000, 0x00004, 0x00006, 0x0000e, 0x00014, 0x00019, - 0x00016, 0x0002b, 0x00030, 0x0003d, 0x0003c, 0x0005a, 0x0005f, 0x0006d, - 0x0007e, 0x0005f, 0x0007f, 0x000b6, 0x000bc, 0x000d8, 0x000f2, 0x000fe, - 0x000bc, 0x000fc, 0x00161, 0x0016e, 0x00174, 0x00176, 0x001a2, 0x001e3, - 0x001f3, 0x00174, 0x0017a, 0x001ea, 0x002a8, 0x002c4, 0x002e6, 0x00314, - 0x00346, 0x00367, 0x003e9, 0x002e5, 0x002ee, 0x003d6, 0x00555, 0x00554, - 0x00557, 0x005c3, 0x005d6, 0x006e0, 0x0062f, 0x006e2, 0x00799, 0x00789, - 0x007fa, 0x005ce, 0x007fe, 0x005ec, 0x007cc, 0x007af, 0x00aa7, 0x00b19, - 0x00b94, 0x00b85, 0x00b9f, 0x00c48, 0x00c45, 0x00dd8, 0x00c4c, 0x00c4b, - 0x00d99, 0x00d1f, 0x00dc2, 0x00f95, 0x00fa2, 0x00bb5, 0x00b9f, 0x00f5d, - 0x00bbf, 0x00f47, 0x0154a, 0x00fd5, 0x00f45, 0x00f7f, 0x0160d, 0x01889, - 0x01757, 0x01722, 0x018b3, 0x0172d, 0x01a39, 0x01a18, 0x01bb3, 0x01b30, - 0x01e63, 0x0173c, 0x01b35, 0x01723, 0x01e80, 0x01fee, 0x01761, 0x01ffc, - 0x01f7f, 0x02c7c, 0x01fa1, 0x0177b, 0x01755, 0x0175a, 0x01fa6, 0x02eab, - 0x0310a, 0x02c69, 0x03669, 0x03127, 0x03103, 0x02e43, 0x03662, 0x03165, - 0x03124, 0x0313b, 0x03111, 0x03668, 0x0343b, 0x03c52, 0x03efc, 0x02e6c, - 0x03fda, 0x03ef8, 0x02e7b, 0x03ee2, 0x03cc5, 0x03d72, 0x058c0, 0x03df8, - 0x02ea9, 0x03e7e, 0x0556d, 0x05c82, 0x03d71, 0x03e7b, 0x03c42, 0x058d7, - 0x03f4e, 0x06200, 0x03d70, 0x05cb2, 0x05c96, 0x05cb0, 0x03f45, 0x05cb1, - 0x02e6d, 0x03110, 0x02f68, 0x05c90, 0x07ca6, 0x07c88, 0x06204, 0x062c8, - 0x078a6, 0x07986, 0x079d5, 0x0b1ad, 0x07989, 0x0b079, 0x05cdd, 0x0aad4, - 0x05de8, 0x07dcd, 0x07987, 0x05d67, 0x05d99, 0x0b91d, 0x07cf1, 0x05d9b, - 0x079d7, 0x0b07b, 0x05c85, 0x05d9a, 0x07dcc, 0x07ebf, 0x07dce, 0x07dfb, - 0x07ec0, 0x07d1a, 0x07a07, 0x05c84, 0x0c471, 0x07cf2, 0x0baef, 0x0b9d2, - 0x05deb, 0x07bd6, 0x0b845, 0x05d98, 0x0b91a, 0x0bae8, 0x0c4e0, 0x0dc31, - 0x0f93d, 0x0bbce, 0x0d1d2, 0x0f7a9, 0x0d9b9, 0x0bbcb, 0x0b900, 0x0aad7, - 0x0babd, 0x0c4e1, 0x0f46f, 0x0c588, 0x0c58b, 0x160e6, 0x0bbcf, 0x0bac3, - 0x0f945, 0x0f7a3, 0x0d1c1, 0x0fb8e, 0x0f7a4, 0x0fb8c, 0x0f40c, 0x0c473, - 0x0fd72, 0x0bbcd, 0x0fffa, 0x0f940, 0x0bbc9, 0x0f7a8, 0x1a1ed, 0x0bbc5, - 0x1f26f, 0x163fd, 0x160c7, 0x1a1f5, 0x0f947, 0x163fc, 0x154b3, 0x0fff6, - 0x163f6, 0x160e9, 0x1a1f0, 0x0bab9, 0x0baba, 0x17086, 0x0b903, 0x0fd75, - 0x0f308, 0x176f3, 0x163ff, 0x0fd7d, 0x1bb78, 0x163fb, 0x188db, 0x1a1f7, - 0x154b2, 0x172fd, 0x163f4, 0x1bb73, 0x172ff, 0x0babc, 0x0f97d, 0x1a1f3, - 0x1bb6d, 0x1ffd5, 0x1a1f4, 0x1f272, 0x17380, 0x17382, 0x1ffe7, 0x0bac8, - 0x0bbc4, 0x188d3, 0x160e0, 0x0fd7b, 0x1725f, 0x172f5, 0x1bb79, 0x1fad9, - 0x1f269, 0x188d0, 0x0bac4, 0x0bac5, 0x31185, 0x188d2, 0x188cc, 0x31187, - 0x3e7fe, 0x188d1, 0x1bb6c, 0x1f268, 0x1fad2, 0x1ffd9, 0x1a1ea, 0x1bb68, - 0x1facb, 0x3fdb2, 0x1e81a, 0x188ce, 0x172fb, 0x1a1ef, 0x1face, 0x1bb70, - 0x0bac1, 0x1bb6b, 0x172f8, 0x1bb66, 0x1ffdf, 0x1bb6a, 0x1ffd7, 0x1f266, - 0x176f8, 0x37653, 0x1fa7e, 0x31182, 0x1fac8, 0x2c7e3, 0x370ee, 0x176ec, - 0x176e9, 0x2e4bc, 0x160c5, 0x3765a, 0x3ce9c, 0x17373, 0x176e8, 0x188d4, - 0x176f1, 0x176ef, 0x37659, 0x1bb7c, 0x1ffde, 0x176f2, 0x3118b, 0x2c7d4, - 0x37651, 0x5ce9f, 0x37650, 0x31191, 0x3f4f6, 0x3f4f5, 0x7a06c, 0x1fac1, - 0x5c97b, 0x2c7e0, 0x79d3a, 0x3e7fd, 0x2c7df, 0x3f4f0, 0x7a06d, 0x376c1, - 0x79d3b, 0x00004, 0x00014, 0x00059, 0x000ab, 0x000b8, 0x00177, 0x001f5, - 0x001f2, 0x00315, 0x003fc, 0x005bd, 0x0062d, 0x006e8, 0x007dd, 0x00b04, - 0x007cd, 0x00b1e, 0x00d1e, 0x00f15, 0x00f3b, 0x00f41, 0x01548, 0x018b0, - 0x0173b, 0x01884, 0x01a1c, 0x01bb4, 0x01f25, 0x017b5, 0x0176d, 0x01ef8, - 0x02e73, 0x03107, 0x03125, 0x03105, 0x02e49, 0x03ce8, 0x03ef9, 0x03e5e, - 0x02e72, 0x03471, 0x03fd9, 0x0623f, 0x078a0, 0x06867, 0x05cb3, 0x06272, - 0x068ec, 0x06e9a, 0x079d4, 0x06e98, 0x0b1aa, 0x06e1a, 0x07985, 0x068ee, - 0x06e9b, 0x05c88, 0x0b1ac, 0x07dfa, 0x05d65, 0x07cf0, 0x07cbf, 0x0c475, - 0x160eb, 0x1bb7e, 0x0f7a6, 0x1fedd, 0x160e3, 0x0fffb, 0x0fb8d, 0x0fff9, - 0x0d1c0, 0x0c58c, 0x1a1e9, 0x0bab8, 0x0f5cf, 0x0fff5, 0x376c5, 0x1a1ec, - 0x160ed, 0x1fede, 0x1fac9, 0x1a1eb, 0x1f224, 0x176ee, 0x0fd79, 0x17080, - 0x17387, 0x1bb7a, 0x1ffe9, 0x176f7, 0x17385, 0x17781, 0x2c7d5, 0x17785, - 0x1ffe3, 0x163f5, 0x1fac2, 0x3e7f9, 0x3118d, 0x3fdb1, 0x1ffe2, 0x1f226, - 0x3118a, 0x2c7d9, 0x31190, 0x3118c, 0x3f4f3, 0x1bb7f, 0x1bb72, 0x31184, - 0xb92f4, 0x3e7fb, 0x6e1d9, 0x1faca, 0x62300, 0x3fdb8, 0x3d037, 0x3e7fc, - 0x62301, 0x3f4f2, 0x1f26a, 0x0000e, 0x00063, 0x000f8, 0x001ee, 0x00377, - 0x003f7, 0x006e3, 0x005cc, 0x00b05, 0x00dd2, 0x00fd4, 0x0172e, 0x0172a, - 0x01e23, 0x01f2d, 0x01763, 0x01769, 0x0176c, 0x02e75, 0x03104, 0x02ec1, - 0x03e58, 0x0583f, 0x03f62, 0x03f44, 0x058c5, 0x0623c, 0x05cf4, 0x07bd7, - 0x05d9d, 0x0aad2, 0x05d66, 0x0b1a9, 0x0b078, 0x07cfe, 0x0b918, 0x0c46f, - 0x0b919, 0x0b847, 0x06e1b, 0x0b84b, 0x0aad8, 0x0fd74, 0x172f4, 0x17081, - 0x0f97c, 0x1f273, 0x0f7a0, 0x0fd7c, 0x172f7, 0x0fd7a, 0x1bb77, 0x172fe, - 0x1f270, 0x0fd73, 0x1bb7b, 0x1a1bc, 0x1bb7d, 0x0bbc3, 0x172f6, 0x0baeb, - 0x0fb8f, 0x3f4f4, 0x3fdb4, 0x376c8, 0x3e7fa, 0x1ffd0, 0x62303, 0xb92f5, - 0x1f261, 0x31189, 0x3fdb5, 0x2c7db, 0x376c9, 0x1fad6, 0x1fad1, 0x00015, - 0x000f0, 0x002e0, 0x0058e, 0x005d7, 0x00c4d, 0x00fa1, 0x00bdb, 0x01756, - 0x01f70, 0x02c19, 0x0313c, 0x0370f, 0x03cc0, 0x02ea8, 0x058c6, 0x058c7, - 0x02eb7, 0x058d0, 0x07d18, 0x0aa58, 0x0b848, 0x05d9e, 0x05d6c, 0x0b84c, - 0x0c589, 0x0b901, 0x163f8, 0x0bac9, 0x0b9c5, 0x0f93c, 0x188d8, 0x0bbc7, - 0x160ec, 0x0fd6f, 0x188d9, 0x160ea, 0x0f7a7, 0x0f944, 0x0baab, 0x0dc3a, - 0x188cf, 0x176fb, 0x2c7d8, 0x2c7d7, 0x1bb75, 0x5ce9e, 0x62302, 0x370ed, - 0x176f4, 0x1ffd1, 0x370ef, 0x3f4f8, 0x376c7, 0x1ffe1, 0x376c6, 0x176ff, - 0x6e1d8, 0x176f6, 0x17087, 0x0f5cd, 0x00035, 0x001a0, 0x0058b, 0x00aac, - 0x00b9a, 0x0175f, 0x01e22, 0x01e8c, 0x01fb2, 0x0310b, 0x058d1, 0x0552e, - 0x05c27, 0x0686e, 0x07ca7, 0x0c474, 0x0dc33, 0x07bf2, 0x05de9, 0x07a35, - 0x0baaa, 0x0b9eb, 0x0fb95, 0x0b9b8, 0x17381, 0x1f262, 0x188cd, 0x17088, - 0x172fa, 0x0f7a2, 0x1fad3, 0x0bac0, 0x3765c, 0x1fedf, 0x1f225, 0x1fad4, - 0x2c7da, 0x5ce9d, 0x3e7f8, 0x1e203, 0x188d7, 0x00054, 0x002c0, 0x007a1, - 0x00f78, 0x01b36, 0x01fa3, 0x0313a, 0x03436, 0x0343a, 0x07d1d, 0x07bd8, - 0x05cdf, 0x0b846, 0x0b189, 0x0d9b8, 0x0fff8, 0x0d9be, 0x0c58a, 0x05dea, - 0x0d1d3, 0x160e4, 0x1f26b, 0x188da, 0x1e202, 0x2c7d2, 0x163fe, 0x31193, - 0x17782, 0x376c2, 0x2c7d1, 0x3fdb0, 0x3765d, 0x2c7d0, 0x1fad0, 0x1e201, - 0x188dd, 0x2c7e2, 0x37657, 0x37655, 0x376c4, 0x376c0, 0x176ea, 0x0006f, - 0x003cf, 0x00dd5, 0x01f23, 0x02c61, 0x02ed0, 0x05d54, 0x0552d, 0x07883, - 0x0b1a8, 0x0b91c, 0x0babf, 0x0b902, 0x0f7aa, 0x0f7a5, 0x1a1e8, 0x1ffd6, - 0x0babe, 0x1a1bf, 0x163f3, 0x1ffd8, 0x1fad7, 0x1f275, 0x1ffdc, 0x0007d, - 0x005bc, 0x01549, 0x02a99, 0x03def, 0x06273, 0x079d6, 0x07d1b, 0x0aad3, - 0x0d0fc, 0x2c7dd, 0x188d6, 0x0bac2, 0x2c7e1, 0x1bb76, 0x1a1bd, 0x31186, - 0x0fd78, 0x1a1be, 0x31183, 0x3fdb6, 0x3f4f1, 0x37652, 0x1fad5, 0x3f4f9, - 0x3e7ff, 0x5ce9c, 0x3765b, 0x31188, 0x17372, 0x000bd, 0x0078b, 0x01f21, - 0x03c43, 0x03ded, 0x0aad6, 0x07ec1, 0x0f942, 0x05c86, 0x17089, 0x0babb, - 0x1ffe8, 0x2c7de, 0x1f26e, 0x1fac4, 0x3f4f7, 0x37656, 0x1fa7d, 0x376c3, - 0x3fdb3, 0x3118f, 0x1fac6, 0x000f8, 0x007ed, 0x01efd, 0x03e7a, 0x05c91, - 0x0aad9, 0x0baec, 0x0dc32, 0x0f46e, 0x1e200, 0x176fa, 0x3765e, 0x3fdb7, - 0x2c7d6, 0x3fdb9, 0x37654, 0x37658, 0x3118e, 0x1ffdb, 0x000f6, 0x00c43, - 0x03106, 0x068ef, 0x0b84d, 0x0b188, 0x0bbcc, 0x1f264, 0x1bb69, 0x17386, - 0x1fac0, 0x00171, 0x00f39, 0x03e41, 0x068ed, 0x0d9bc, 0x0f7a1, 0x1bb67, - 0x1ffdd, 0x176f9, 0x001b9, 0x00f7d, 0x03f63, 0x0d0fd, 0x0b9ea, 0x188dc, - 0x1fac3, 0x1a1f2, 0x31192, 0x1ffe4, 0x001f6, 0x01754, 0x06865, 0x0f309, - 0x160e5, 0x176f5, 0x3765f, 0x1facc, 0x001e9, 0x01a1a, 0x06201, 0x0f105, - 0x176f0, 0x002df, 0x01756, 0x05d6d, 0x163fa, 0x176ed, 0x00342, 0x02e40, - 0x0d0ff, 0x17082, 0x003cd, 0x02a98, 0x0fffc, 0x2c7dc, 0x1fa7f, 0x003fe, - 0x03764, 0x0fffd, 0x176fc, 0x1fac5, 0x002f7, 0x02ed1, 0x0fb97, 0x0058a, - 0x02edc, 0x0bbc8, 0x005d4, 0x0623d, 0x160e8, 0x0062e, 0x05830, 0x163f9, - 0x006eb, 0x06205, 0x1f274, 0x007de, 0x062c9, 0x1f265, 0x005c9, 0x05cde, - 0x1ffd3, 0x005d4, 0x07988, 0x007ce, 0x0b849, 0x00b1b, 0x05c89, 0x1fac7, - 0x00b93, 0x05c83, 0x00b9e, 0x0f14f, 0x00c4a, 0x0b9c7, 0x00dd4, 0x0c470, - 0x1f271, 0x00f38, 0x0fb96, 0x176eb, 0x00fa0, 0x163f7, 0x00bb2, 0x0b91b, - 0x00bbe, 0x0f102, 0x00f44, 0x0f946, 0x1facd, 0x00f79, 0x0d9bd, 0x0154d, - 0x0bbc6, 0x00fd2, 0x160e7, 0x0172b, 0x188cb, 0x0175e, 0x0fd76, 0x0175c, - 0x1bb71, 0x0189f, 0x1a1ee, 0x01f24, 0x1a1f6, 0x01ba7, 0x0bbca, 0x01f7d, - 0x0ffff, 0x01f2e, 0x1bb65, 0x01bb5, 0x172f9, 0x01fef, 0x1f26c, 0x01f3e, - 0x0fd77, 0x01762, 0x1bb6e, 0x01ef9, 0x172fc, 0x01fa0, 0x02ab7, 0x02e4a, - 0x1f267, 0x01fb3, 0x1ffda, 0x02e42, 0x03101, 0x17780, 0x0313d, 0x03475, - 0x17784, 0x03126, 0x1facf, 0x03c51, 0x17783, 0x03e40, 0x1ffe5, 0x03663, - 0x1ffe0, 0x03e8f, 0x1f26d, 0x0343c, 0x03cc1, 0x176fd, 0x03e45, 0x02ec0, - 0x03f61, 0x03dee, 0x03fd8, 0x0583e, 0x02e45, 0x03e59, 0x03d02, 0x05ce8, - 0x05568, 0x176fe, 0x02f69, 0x1fad8, 0x058c1, 0x05c83, 0x1ffe6, 0x06271, - 0x06e1c, 0x062c7, 0x068e1, 0x0552f, 0x06864, 0x06866, 0x06e99, 0x05cbc, - 0x07ca5, 0x078a1, 0x05c82, 0x07dcf, 0x0623b, 0x0623e, 0x068e8, 0x07a36, - 0x05d9c, 0x0b077, 0x07cf3, 0x07a34, 0x07ca4, 0x07d19, 0x079d2, 0x07d1c, - 0x07bd9, 0x0b84a, 0x0fb94, 0x0aad5, 0x0dc30, 0x07bf3, 0x0baee, 0x0b07a, - 0x0c472, 0x0b91e, 0x0d9ba, 0x05d9f, 0x0d0fe, 0x0b9c6, 0x05c87, 0x0f14e, - 0x0baed, 0x0b92e, 0x0f103, 0x0b9c4, 0x0fb91, 0x0d9bb, 0x0b1ab, 0x0c58d, - 0x0fffe, 0x0f93b, 0x0f941, 0x0baea, 0x0b91f, 0x0f5cc, 0x0d9bf, 0x0f943, - 0x0f104, 0x1f260, 0x0fb92, 0x0f93f, 0x0f3a6, 0x0bac7, 0x0f7ab, 0x0bac6, - 0x17383, 0x0fd6d, 0x0bae9, 0x0fd6e, 0x1e74f, 0x188ca, 0x1f227, 0x0fb93, - 0x0fb90, 0x0fff7, 0x17085, 0x17083, 0x160e1, 0x17084, 0x0f93e, 0x160e2, - 0x160c6, 0x1a1f1, 0x1bb6f, 0x17384, 0x0fd70, 0x1f263, 0x188d5, 0x173a6, - 0x0f5ce, 0x163f2, 0x0fd71, 0x1ffd2, 0x160c4, 0x1ffd4, 0x2c7d3, 0x1bb74, -}; - -static const uint8_t coef3_huffbits[1072] = { - 9, 7, 2, 3, 4, 4, 5, 5, - 6, 6, 6, 6, 7, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 12, 11, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, - 13, 14, 13, 14, 14, 13, 14, 13, - 13, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 15, - 14, 14, 15, 14, 14, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 14, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 14, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 16, 15, 16, 16, 16, - 16, 15, 15, 16, 16, 16, 16, 16, - 15, 16, 16, 16, 15, 16, 15, 15, - 16, 15, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 17, 16, 17, 16, 17, 17, 16, - 17, 16, 17, 16, 16, 17, 17, 17, - 16, 17, 16, 16, 17, 16, 17, 16, - 17, 17, 16, 16, 17, 17, 17, 17, - 17, 17, 17, 17, 16, 17, 17, 16, - 17, 17, 17, 17, 17, 17, 17, 17, - 16, 18, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 16, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 18, - 17, 17, 17, 17, 18, 17, 17, 18, - 19, 17, 17, 17, 18, 17, 17, 17, - 18, 18, 18, 17, 17, 17, 18, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 17, 18, 18, 18, 18, 17, - 18, 18, 18, 17, 17, 18, 18, 18, - 18, 19, 18, 18, 19, 19, 20, 18, - 19, 18, 19, 19, 18, 19, 20, 18, - 19, 4, 6, 7, 8, 9, 9, 9, - 10, 10, 10, 11, 11, 11, 11, 12, - 12, 12, 12, 12, 12, 13, 13, 13, - 13, 13, 13, 13, 13, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 16, 15, 15, 15, - 15, 16, 16, 15, 16, 16, 15, 16, - 17, 17, 17, 17, 17, 16, 16, 16, - 16, 16, 17, 17, 17, 16, 18, 17, - 17, 17, 18, 17, 17, 18, 17, 17, - 17, 17, 17, 18, 17, 18, 18, 18, - 17, 17, 18, 19, 18, 18, 17, 17, - 18, 18, 18, 18, 19, 17, 17, 18, - 20, 19, 19, 18, 19, 18, 19, 19, - 19, 19, 17, 5, 7, 9, 10, 10, - 11, 11, 12, 12, 12, 13, 13, 13, - 13, 13, 14, 14, 14, 14, 14, 15, - 14, 15, 15, 15, 15, 15, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 15, 16, 16, 17, 17, 17, - 16, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 16, - 16, 19, 18, 18, 19, 17, 19, 20, - 17, 18, 18, 18, 18, 18, 18, 6, - 8, 10, 11, 12, 12, 12, 13, 13, - 13, 14, 14, 14, 14, 15, 15, 15, - 15, 15, 15, 16, 16, 16, 16, 16, - 16, 17, 17, 17, 16, 16, 17, 17, - 17, 17, 17, 17, 17, 16, 16, 16, - 17, 18, 18, 18, 17, 19, 19, 18, - 18, 17, 18, 19, 18, 17, 18, 18, - 19, 18, 17, 17, 6, 9, 11, 12, - 13, 13, 13, 14, 14, 14, 15, 15, - 15, 15, 15, 16, 16, 16, 16, 16, - 16, 17, 16, 17, 17, 17, 17, 17, - 17, 17, 18, 17, 18, 17, 17, 18, - 18, 19, 19, 17, 17, 7, 10, 12, - 13, 13, 14, 14, 14, 14, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 17, 17, 17, 17, 18, 17, 18, - 18, 18, 18, 18, 18, 18, 18, 17, - 17, 18, 18, 18, 18, 18, 18, 7, - 10, 12, 13, 14, 15, 15, 15, 15, - 16, 16, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 18, 17, 17, 8, - 11, 13, 14, 15, 15, 15, 15, 16, - 16, 18, 17, 17, 18, 17, 17, 18, - 17, 17, 18, 18, 19, 18, 18, 19, - 19, 19, 18, 18, 18, 8, 11, 13, - 14, 15, 16, 16, 16, 16, 17, 17, - 17, 18, 17, 18, 19, 18, 18, 18, - 18, 18, 18, 8, 12, 14, 15, 15, - 16, 16, 16, 17, 17, 18, 18, 18, - 18, 18, 18, 18, 18, 17, 9, 12, - 14, 15, 16, 16, 17, 17, 17, 17, - 18, 9, 12, 14, 15, 16, 17, 17, - 17, 18, 9, 13, 15, 16, 17, 17, - 18, 17, 18, 17, 9, 13, 15, 16, - 17, 18, 18, 18, 10, 13, 15, 16, - 18, 10, 14, 16, 17, 18, 10, 14, - 16, 17, 10, 14, 16, 18, 18, 10, - 14, 16, 18, 18, 11, 15, 16, 11, - 15, 17, 11, 15, 17, 11, 15, 17, - 11, 15, 17, 11, 15, 17, 12, 16, - 17, 12, 15, 12, 16, 12, 16, 18, - 12, 16, 12, 16, 12, 16, 12, 16, - 17, 12, 16, 18, 12, 17, 13, 16, - 13, 16, 13, 16, 18, 13, 16, 13, - 17, 13, 17, 13, 17, 13, 17, 13, - 17, 13, 17, 13, 17, 13, 17, 13, - 16, 13, 17, 13, 17, 13, 17, 14, - 17, 14, 17, 14, 17, 14, 14, 14, - 17, 14, 17, 14, 14, 18, 14, 14, - 18, 14, 18, 14, 18, 14, 17, 14, - 17, 14, 17, 14, 14, 18, 14, 15, - 15, 15, 14, 15, 15, 14, 15, 15, - 15, 18, 15, 18, 15, 15, 17, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 16, 15, 15, 15, 15, 16, - 16, 16, 16, 16, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 17, 16, 16, - 16, 17, 16, 16, 16, 17, 17, 17, - 17, 17, 16, 17, 17, 17, 17, 16, - 16, 16, 17, 17, 17, 17, 16, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 18, 17, -}; - -static const uint32_t coef4_huffcodes[476] = { - 0x00f01, 0x0001e, 0x00000, 0x00004, 0x00006, 0x0000d, 0x0000a, 0x00017, - 0x0001d, 0x00017, 0x0002c, 0x00031, 0x00039, 0x0003e, 0x00039, 0x0005a, - 0x00066, 0x00070, 0x0007b, 0x00070, 0x00077, 0x000af, 0x000c9, 0x000f2, - 0x000f4, 0x000b2, 0x000e3, 0x0015b, 0x0015d, 0x00181, 0x0019d, 0x001e3, - 0x001c5, 0x002b5, 0x002db, 0x00338, 0x003c3, 0x003cc, 0x003f0, 0x002cd, - 0x003fa, 0x003a1, 0x005b4, 0x00657, 0x007ab, 0x0074d, 0x0074c, 0x00ac1, - 0x00ac5, 0x0076b, 0x00ca8, 0x00f04, 0x00f00, 0x00fe3, 0x00f3c, 0x00f10, - 0x00f39, 0x00fe6, 0x00e26, 0x00e90, 0x016c5, 0x01827, 0x01954, 0x015c5, - 0x01958, 0x01f8a, 0x01c4a, 0x02b0f, 0x02b41, 0x02b0e, 0x033c6, 0x03050, - 0x01c4f, 0x02d88, 0x0305c, 0x03c18, 0x02b4f, 0x02cc2, 0x03a47, 0x05680, - 0x0569d, 0x06442, 0x06443, 0x06446, 0x0656e, 0x06444, 0x07120, 0x0748a, - 0x0c1ba, 0x07e22, 0x07aa6, 0x07f25, 0x07aa7, 0x07e20, 0x0c11b, 0x0c118, - 0x07aa5, 0x0ad0a, 0x0f389, 0x19ebb, 0x0caad, 0x0fe42, 0x0fe40, 0x16c34, - 0x2b4e5, 0x33d65, 0x16c30, 0x1e7ae, 0x1e25c, 0x18370, 0x1e703, 0x19eba, - 0x16c37, 0x0e234, 0x16c6e, 0x00004, 0x0002a, 0x00061, 0x00075, 0x000cb, - 0x000ff, 0x00190, 0x001eb, 0x001d1, 0x002b9, 0x00307, 0x00339, 0x0033f, - 0x003fb, 0x003b4, 0x0060c, 0x00679, 0x00645, 0x0067d, 0x0078a, 0x007e3, - 0x00749, 0x00ac4, 0x00ad2, 0x00ae3, 0x00c10, 0x00c16, 0x00ad1, 0x00cf4, - 0x00fe2, 0x01586, 0x00e9d, 0x019f1, 0x01664, 0x01e26, 0x01d38, 0x02b4d, - 0x033c5, 0x01fc2, 0x01fc3, 0x01d28, 0x03c1d, 0x0598e, 0x0f094, 0x07aa4, - 0x0ad38, 0x0ac0c, 0x0c11a, 0x079ea, 0x0c881, 0x0fe44, 0x0b635, 0x0ac0d, - 0x0b61e, 0x05987, 0x07121, 0x0f382, 0x0f387, 0x0e237, 0x0fe47, 0x0f383, - 0x0f091, 0x0f385, 0x0e233, 0x182ee, 0x19eb8, 0x1663e, 0x0f093, 0x00014, - 0x00058, 0x00159, 0x00167, 0x00300, 0x003d4, 0x005b5, 0x0079d, 0x0076a, - 0x00b67, 0x00b60, 0x00f05, 0x00cf0, 0x00f17, 0x00e95, 0x01822, 0x01913, - 0x016c2, 0x0182f, 0x01959, 0x01fcb, 0x01e27, 0x01c40, 0x033c7, 0x01e7b, - 0x01c49, 0x02d89, 0x01e23, 0x01660, 0x03f12, 0x02cc6, 0x033e1, 0x05b34, - 0x0609a, 0x06569, 0x07488, 0x07e21, 0x0cf5f, 0x0712c, 0x0389d, 0x067cf, - 0x07f28, 0x1663f, 0x33d67, 0x1663d, 0x1e25d, 0x3c1ab, 0x15c44, 0x16c36, - 0x0001f, 0x000ec, 0x00323, 0x005b2, 0x0079f, 0x00ac2, 0x00f16, 0x00e9e, - 0x01956, 0x01e0f, 0x019ea, 0x01666, 0x02b89, 0x02b02, 0x02d8c, 0x03c1b, - 0x03c19, 0x032b5, 0x03f9c, 0x02ccf, 0x03897, 0x05b35, 0x0ad02, 0x07f29, - 0x06441, 0x03884, 0x07888, 0x0784e, 0x06568, 0x0c1bb, 0x05986, 0x067cc, - 0x0fe49, 0x0fe48, 0x0c1bc, 0x0fe41, 0x18371, 0x1663c, 0x0e231, 0x0711e, - 0x0ad09, 0x0f092, 0x0002d, 0x001db, 0x00781, 0x00c1a, 0x00f55, 0x01580, - 0x01ea8, 0x02d9b, 0x032af, 0x03f16, 0x03c1c, 0x07834, 0x03c45, 0x0389c, - 0x067ce, 0x06445, 0x0c1b9, 0x07889, 0x07f3a, 0x0784f, 0x07f2b, 0x0ad0b, - 0x0f090, 0x0c11d, 0x0e94e, 0x0711f, 0x0e9f1, 0x0f38e, 0x079e9, 0x0ad03, - 0x0f09b, 0x0caae, 0x0fe46, 0x2b4e6, 0x0e9f0, 0x19eb6, 0x67ac1, 0x67ac0, - 0x33d66, 0x0f388, 0x00071, 0x003a0, 0x00ca9, 0x01829, 0x01d39, 0x02b43, - 0x02cc4, 0x06554, 0x0f09a, 0x0b61f, 0x067cd, 0x0711c, 0x0b636, 0x07f2a, - 0x0b634, 0x0c11f, 0x0cf5e, 0x0b61d, 0x0f06b, 0x0caab, 0x0c1be, 0x0e94c, - 0x0f099, 0x182ed, 0x0e94f, 0x0c119, 0x0e232, 0x2b4e4, 0x0f38a, 0x19eb4, - 0x1e25f, 0x0e94d, 0x000b7, 0x00785, 0x016cc, 0x03051, 0x033c4, 0x0656f, - 0x03891, 0x0711d, 0x0caaf, 0x0f097, 0x07489, 0x0f098, 0x0c880, 0x0caaa, - 0x0f386, 0x19eb7, 0x16c6f, 0x0f384, 0x182e8, 0x182e9, 0x0e230, 0x1e700, - 0x33d62, 0x33d63, 0x33d64, 0x16c33, 0x0e216, 0x000fd, 0x00c15, 0x01665, - 0x03c4a, 0x07f3b, 0x07896, 0x0c11c, 0x0e215, 0x16c32, 0x0f38b, 0x0f38d, - 0x182ea, 0x1e701, 0x712df, 0x15c46, 0x00194, 0x00fe0, 0x03f13, 0x0748b, - 0x0f096, 0x0cf80, 0x1e25e, 0xe25bd, 0x33d61, 0x16c31, 0x001f9, 0x01912, - 0x05710, 0x0f3d0, 0x0c1bf, 0x00301, 0x01e24, 0x0ad08, 0x003cd, 0x01c41, - 0x0c1bd, 0x00563, 0x03a52, 0x0f3d1, 0x00570, 0x02cce, 0x0e217, 0x0067b, - 0x0655d, 0x0074b, 0x06447, 0x00c12, 0x074fb, 0x00f08, 0x0b61c, 0x00e22, - 0x0fe43, 0x016c7, 0x01836, 0x019f2, 0x01c43, 0x01d3f, 0x01fcf, 0x02b4c, - 0x0304c, 0x032b6, 0x03a46, 0x05607, 0x03f17, 0x02cc5, 0x0609b, 0x0655c, - 0x07e23, 0x067c1, 0x07f26, 0x07f27, 0x0f095, 0x0e9f3, 0x0cf81, 0x0c11e, - 0x0caac, 0x0f38f, 0x0e9f2, 0x074fa, 0x0e236, 0x0fe45, 0x1c428, 0x0e235, - 0x182ef, 0x19eb5, 0x0f3d6, 0x182ec, 0x16c35, 0x0f38c, 0x2b4e7, 0x15c47, - 0xe25bc, 0x1e702, 0x1c4b6, 0x0e25a, 0x3c1aa, 0x15c45, 0x1c429, 0x19eb9, - 0x1e7af, 0x182eb, 0x1e0d4, 0x3896e, -}; - -static const uint8_t coef4_huffbits[476] = { - 12, 6, 2, 3, 4, 4, 5, 5, - 5, 6, 6, 6, 6, 6, 7, 7, - 7, 7, 7, 8, 8, 8, 8, 8, - 8, 9, 9, 9, 9, 9, 9, 9, - 10, 10, 10, 10, 10, 10, 10, 11, - 10, 11, 11, 11, 11, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 13, 13, 13, 13, 13, 13, - 13, 13, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 16, 16, - 16, 15, 15, 15, 15, 15, 16, 16, - 15, 16, 16, 17, 16, 16, 16, 17, - 18, 18, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 4, 6, 7, 8, 8, - 8, 9, 9, 10, 10, 10, 10, 10, - 10, 11, 11, 11, 11, 11, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 13, 13, 13, 14, 13, 14, 14, - 14, 13, 13, 14, 14, 16, 16, 15, - 16, 16, 16, 15, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 17, 16, 16, - 16, 16, 17, 17, 17, 18, 16, 5, - 8, 9, 10, 10, 10, 11, 11, 12, - 12, 12, 12, 12, 12, 13, 13, 13, - 13, 13, 13, 13, 13, 14, 14, 13, - 14, 14, 13, 14, 14, 15, 14, 15, - 15, 15, 16, 15, 16, 16, 15, 15, - 15, 18, 18, 18, 17, 18, 17, 17, - 6, 9, 10, 11, 11, 12, 12, 13, - 13, 13, 13, 14, 14, 14, 14, 14, - 14, 14, 14, 15, 15, 15, 16, 15, - 15, 15, 15, 15, 15, 16, 16, 15, - 16, 16, 16, 16, 17, 18, 17, 16, - 16, 16, 7, 10, 11, 12, 12, 13, - 13, 14, 14, 14, 14, 15, 14, 15, - 15, 15, 16, 15, 15, 15, 15, 16, - 16, 16, 17, 16, 17, 16, 15, 16, - 16, 16, 16, 18, 17, 17, 19, 19, - 18, 16, 7, 11, 12, 13, 14, 14, - 15, 15, 16, 16, 15, 16, 16, 15, - 16, 16, 16, 16, 16, 16, 16, 17, - 16, 17, 17, 16, 17, 18, 16, 17, - 17, 17, 8, 11, 13, 14, 14, 15, - 15, 16, 16, 16, 16, 16, 16, 16, - 16, 17, 17, 16, 17, 17, 17, 17, - 18, 18, 18, 17, 17, 8, 12, 14, - 14, 15, 15, 16, 17, 17, 16, 16, - 17, 17, 20, 17, 9, 12, 14, 16, - 16, 16, 17, 21, 18, 17, 9, 13, - 15, 16, 16, 10, 13, 16, 10, 14, - 16, 11, 15, 16, 11, 15, 17, 11, - 15, 12, 15, 12, 16, 12, 16, 13, - 16, 13, 13, 13, 14, 14, 13, 14, - 14, 14, 15, 15, 14, 15, 15, 15, - 15, 15, 15, 15, 16, 17, 16, 16, - 16, 16, 17, 16, 17, 16, 18, 17, - 17, 17, 16, 17, 17, 16, 18, 17, - 21, 17, 18, 17, 18, 17, 18, 17, - 17, 17, 17, 19, -}; - -static const uint32_t coef5_huffcodes[435] = { - 0x00347, 0x0000b, 0x00001, 0x00001, 0x0000c, 0x00004, 0x00010, 0x00015, - 0x0001f, 0x0000b, 0x00023, 0x00026, 0x00029, 0x00035, 0x00037, 0x00001, - 0x00015, 0x0001a, 0x0001d, 0x0001c, 0x0001e, 0x0004e, 0x00049, 0x00051, - 0x00078, 0x00004, 0x00000, 0x00008, 0x0000d, 0x0007b, 0x00005, 0x00032, - 0x00095, 0x00091, 0x00096, 0x000a1, 0x000d9, 0x00003, 0x00019, 0x00061, - 0x00066, 0x00060, 0x00017, 0x0000e, 0x00063, 0x001a0, 0x001b7, 0x001e6, - 0x001e7, 0x001b6, 0x00018, 0x001e8, 0x00038, 0x00031, 0x00005, 0x0003d, - 0x00027, 0x001ea, 0x0001a, 0x000c5, 0x000f9, 0x000ff, 0x000db, 0x00250, - 0x000fc, 0x0025c, 0x00008, 0x00075, 0x003d7, 0x003d3, 0x001b0, 0x0007c, - 0x003ca, 0x00036, 0x00189, 0x004a6, 0x004a2, 0x004fb, 0x000c0, 0x0007f, - 0x0009a, 0x00311, 0x0006e, 0x0009b, 0x0068c, 0x006c0, 0x00484, 0x00012, - 0x000c3, 0x0094f, 0x00979, 0x009f9, 0x00d09, 0x00da6, 0x00da8, 0x00901, - 0x000c1, 0x00373, 0x00d08, 0x009fa, 0x00d8b, 0x00d85, 0x00d86, 0x000df, - 0x006e2, 0x000ce, 0x00f24, 0x009fe, 0x001f7, 0x007c1, 0x000cf, 0x009fc, - 0x009ff, 0x00d89, 0x00da9, 0x009fd, 0x001f8, 0x01a36, 0x0128c, 0x0129d, - 0x01a37, 0x00196, 0x003ea, 0x00f8b, 0x00d93, 0x01e45, 0x01e58, 0x01e4b, - 0x01e59, 0x013f1, 0x00309, 0x00265, 0x00308, 0x0243a, 0x027e1, 0x00f89, - 0x00324, 0x03cbc, 0x03c86, 0x03695, 0x0243c, 0x0243b, 0x0243e, 0x01e4a, - 0x003a5, 0x03468, 0x03428, 0x03c84, 0x027e0, 0x025e2, 0x01880, 0x00197, - 0x00325, 0x03cb7, 0x0791e, 0x007ec, 0x06c75, 0x004c8, 0x04bc7, 0x004c6, - 0x00983, 0x0481e, 0x01b53, 0x0251b, 0x01b58, 0x00984, 0x04fa8, 0x03cbb, - 0x00f8a, 0x00322, 0x0346a, 0x0243d, 0x00326, 0x03469, 0x0481f, 0x0481d, - 0x00746, 0x09032, 0x01b50, 0x01d13, 0x0d8e4, 0x0481b, 0x06c74, 0x0796b, - 0x07969, 0x00985, 0x0d8e3, 0x00986, 0x00fa2, 0x01301, 0x06c7c, 0x00987, - 0x03cb8, 0x0f4af, 0x00e88, 0x1b1c0, 0x00fce, 0x033eb, 0x03f6a, 0x03f69, - 0x00fcf, 0x0791f, 0x004c9, 0x04871, 0x00fcd, 0x00982, 0x00fcc, 0x00fa3, - 0x01d12, 0x0796c, 0x01b47, 0x00321, 0x0796a, 0x0d8e2, 0x04872, 0x04873, - 0x0000e, 0x00014, 0x0000a, 0x000a0, 0x00012, 0x0007d, 0x001a2, 0x0003b, - 0x0025f, 0x000dd, 0x0027c, 0x00343, 0x00368, 0x0036b, 0x0003e, 0x001fa, - 0x00485, 0x001b3, 0x0007f, 0x001b1, 0x0019e, 0x004ba, 0x007ad, 0x00339, - 0x00066, 0x007a4, 0x00793, 0x006c6, 0x0007e, 0x000f1, 0x00372, 0x009fb, - 0x00d83, 0x00d8a, 0x00947, 0x009f4, 0x001d0, 0x01b09, 0x01b4b, 0x007ec, - 0x003e1, 0x000ca, 0x003ec, 0x02539, 0x04fa9, 0x01b57, 0x03429, 0x03d2a, - 0x00d97, 0x003a7, 0x00dc0, 0x00d96, 0x00dc1, 0x007eb, 0x03cba, 0x00c43, - 0x00c41, 0x01b52, 0x007ef, 0x00323, 0x03cb9, 0x03c83, 0x007d0, 0x007ed, - 0x06c7f, 0x09033, 0x03f6c, 0x36383, 0x1e95d, 0x06c78, 0x00747, 0x01b51, - 0x00022, 0x00016, 0x00039, 0x00252, 0x00079, 0x00486, 0x00338, 0x00369, - 0x00d88, 0x00026, 0x00d87, 0x00f4b, 0x00d82, 0x00027, 0x001e1, 0x01a15, - 0x007c7, 0x012f0, 0x001e0, 0x006d0, 0x01a16, 0x01e44, 0x01e5f, 0x03690, - 0x00d90, 0x00c42, 0x00daf, 0x00d92, 0x00f80, 0x00cfb, 0x0342f, 0x0487f, - 0x01b46, 0x07968, 0x00d95, 0x00d91, 0x01b55, 0x03f68, 0x04bc6, 0x03cbd, - 0x00f81, 0x00320, 0x00069, 0x000fe, 0x006d5, 0x0033f, 0x000de, 0x007c6, - 0x01e40, 0x00d94, 0x00f88, 0x03c8e, 0x03694, 0x00dae, 0x00dad, 0x00267, - 0x003a6, 0x00327, 0x0487e, 0x007ee, 0x00749, 0x004c7, 0x03692, 0x01b56, - 0x00fd1, 0x07a56, 0x06c77, 0x09031, 0x00748, 0x06c7a, 0x0796d, 0x033ea, - 0x06c76, 0x00fd0, 0x36382, 0x1e417, 0x00745, 0x04faf, 0x0d8e1, 0x03f6b, - 0x1e95c, 0x04fad, 0x0009e, 0x004bd, 0x0067c, 0x01b08, 0x003eb, 0x01b45, - 0x03691, 0x0d8e5, 0x07904, 0x00981, 0x007ea, 0x019f4, 0x06c7d, 0x04fab, - 0x04fac, 0x06c7e, 0x01300, 0x06c7b, 0x0006f, 0x003f7, 0x03c85, 0x004c4, - 0x0001e, 0x006e1, 0x03693, 0x01b44, 0x00241, 0x01e46, 0x0019d, 0x00266, - 0x004bb, 0x02538, 0x007ac, 0x01b54, 0x00902, 0x04870, 0x00da7, 0x00900, - 0x00185, 0x06c79, 0x006e3, 0x003e9, 0x01e94, 0x003ed, 0x003f2, 0x0342e, - 0x0346b, 0x0251a, 0x004c5, 0x01881, 0x0481c, 0x01b59, 0x03c87, 0x04fae, - 0x007e9, 0x03f6d, 0x0f20a, 0x09030, 0x04faa, 0x0d8e6, 0x03f6f, 0x0481a, - 0x03f6e, 0x1e416, 0x0d8e7, -}; - -static const uint8_t coef5_huffbits[435] = { - 10, 4, 2, 4, 4, 5, 5, 5, - 5, 6, 6, 6, 6, 6, 6, 7, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 10, 9, 10, 10, 10, 10, - 10, 9, 10, 10, 10, 10, 10, 10, - 10, 10, 11, 11, 10, 10, 11, 11, - 10, 11, 11, 11, 11, 11, 12, 12, - 12, 12, 12, 12, 11, 11, 11, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 13, - 13, 13, 12, 12, 13, 13, 13, 12, - 12, 12, 12, 12, 13, 13, 13, 13, - 13, 14, 14, 14, 14, 13, 13, 13, - 13, 13, 14, 14, 14, 14, 14, 14, - 15, 14, 14, 14, 14, 14, 14, 13, - 14, 14, 14, 14, 14, 14, 15, 14, - 15, 14, 15, 15, 15, 15, 15, 15, - 16, 15, 15, 14, 15, 16, 15, 14, - 14, 15, 14, 14, 15, 14, 15, 15, - 15, 16, 15, 17, 16, 15, 15, 15, - 15, 16, 16, 16, 16, 17, 15, 16, - 14, 16, 16, 17, 16, 16, 16, 16, - 16, 15, 15, 15, 16, 16, 16, 16, - 17, 15, 15, 15, 15, 16, 15, 15, - 4, 7, 8, 8, 9, 9, 9, 10, - 10, 10, 10, 10, 10, 10, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 12, - 12, 11, 11, 11, 12, 12, 12, 12, - 12, 12, 12, 12, 13, 13, 13, 13, - 12, 13, 14, 14, 15, 15, 14, 14, - 14, 14, 14, 14, 14, 15, 14, 14, - 14, 15, 15, 15, 14, 14, 15, 15, - 15, 16, 16, 18, 17, 15, 15, 15, - 6, 9, 10, 10, 11, 11, 12, 12, - 12, 13, 12, 12, 12, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 14, - 14, 14, 14, 14, 14, 14, 14, 15, - 15, 15, 14, 14, 15, 16, 15, 14, - 14, 15, 7, 10, 11, 12, 13, 13, - 13, 14, 14, 14, 14, 14, 14, 14, - 14, 15, 15, 15, 15, 15, 14, 15, - 16, 15, 15, 16, 15, 15, 15, 16, - 15, 16, 18, 17, 15, 15, 16, 16, - 17, 15, 8, 11, 13, 13, 14, 15, - 14, 16, 15, 16, 15, 15, 15, 15, - 15, 15, 17, 15, 9, 12, 14, 15, - 10, 13, 14, 15, 10, 13, 11, 14, - 11, 14, 11, 15, 12, 15, 12, 12, - 13, 15, 13, 14, 13, 14, 14, 14, - 14, 14, 15, 15, 15, 15, 14, 15, - 15, 16, 16, 16, 15, 16, 16, 15, - 16, 17, 16, -}; - -static const uint16_t levels0[60] = { -317, 92, 62, 60, 19, 17, 10, 7, - 6, 5, 5, 3, 3, 3, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static const uint16_t levels1[40] = { -311, 91, 61, 28, 10, 6, 5, 2, - 2, 2, 2, 2, 2, 2, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static const uint16_t levels2[340] = { -181,110, 78, 63, 61, 62, 60, 61, - 33, 41, 41, 19, 17, 19, 12, 11, - 9, 11, 10, 6, 8, 7, 6, 4, - 5, 5, 4, 4, 3, 4, 3, 5, - 3, 4, 3, 3, 3, 3, 3, 3, - 2, 2, 4, 2, 3, 2, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, - 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 2, 1, 2, 2, - 2, 2, 1, 2, 1, 1, 1, 2, - 2, 1, 2, 1, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static const uint16_t levels3[180] = { -351,122, 76, 61, 41, 42, 24, 30, - 22, 19, 11, 9, 10, 8, 5, 5, - 4, 5, 5, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 3, 2, 2, 2, - 3, 3, 2, 2, 2, 3, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 1, - 2, 2, 1, 2, 1, 2, 2, 2, - 2, 2, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, - 2, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, -}; - -static const uint16_t levels4[70] = { -113, 68, 49, 42, 40, 32, 27, 15, - 10, 5, 3, 3, 3, 3, 2, 2, - 2, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, -}; - -static const uint16_t levels5[40] = { -214, 72, 42, 40, 18, 4, 4, 2, - 2, 2, 2, 2, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, -}; - -static const CoefVLCTable coef_vlcs[6] = { - { - sizeof(coef0_huffbits), coef0_huffcodes, coef0_huffbits, levels0, - }, - { - sizeof(coef1_huffbits), coef1_huffcodes, coef1_huffbits, levels1, - }, - { - sizeof(coef2_huffbits), coef2_huffcodes, coef2_huffbits, levels2, - }, - { - sizeof(coef3_huffbits), coef3_huffcodes, coef3_huffbits, levels3, - }, - { - sizeof(coef4_huffbits), coef4_huffcodes, coef4_huffbits, levels4, - }, - { - sizeof(coef5_huffbits), coef5_huffcodes, coef5_huffbits, levels5, - }, -}; - -/*table of the values of 10^(index*.05)*/ -const fixed64 pow_table[] = - { 0x199a, 0x1cb9, 0x203a, 0x2429, 0x2893, 0x2d86, 0x3314, 0x3950, 0x404e, - 0x4827, 0x50f4, 0x5ad5, 0x65ea, 0x725a, 0x804e, 0x8ff6, 0xa186, 0xb53c, - 0xcb59, 0xe429, 0x10000LL,0x11f3dLL,0x14249LL,0x1699cLL,0x195bcLL, - 0x1c73dLL,0x1fec9LL,0x23d1dLL,0x2830bLL,0x2d182LL, 0x3298bLL,0x38c53LL, - 0x3fb28LL,0x47783LL,0x5030aLL,0x59f98LL,0x64f40LL,0x71457LL,0x7f17bLL, - 0x8e99aLL,0xa0000LL,0xb385eLL,0xc96d9LL,0xe2019LL,0xfd954LL,0x11c865LL, - 0x13f3dfLL,0x166320LL,0x191e6eLL,0x1c2f10LL,0x1f9f6eLL,0x237b39LL, - 0x27cf8bLL,0x2cab1aLL,0x321e65LL,0x383bf0LL,0x3f1882LL,0x46cb6aLL, - 0x4f6eceLL,0x592006LL,0x640000LL,0x7033acLL,0x7de47eLL,0x8d40f6LL, - 0x9e7d44LL,0xb1d3f4LL,0xc786b7LL,0xdfdf43LL,0xfb304bLL,0x119d69aLL, - 0x13c3a4eLL,0x162d03aLL,0x18e1b70LL,0x1beaf00LL,0x1f52feeLL, - 0x2325760LL,0x276f514LL,0x2c3f220LL,0x31a5408LL,0x37b403cLL,0x3e80000LL, - 0x46204b8LL,0x4eaece8LL,0x58489a0LL,0x630e4a8LL,0x6f24788LL,0x7cb4328LL, - 0x8beb8a0LL,0x9cfe2f0LL,0xb026200LL,0xc5a4710LL,0xddc2240LL,0xf8d1260LL, - 0x1172d600LL,0x1393df60LL,0x15f769c0LL,0x18a592c0LL,0x1ba77540LL, - 0x1f074840LL,0x22d08280LL,0x27100000LL,0x2bd42f40LL,0x312d4100LL, - 0x372d6000LL,0x3de8ee80LL,0x4576cb80LL,0x4df09f80LL,0x57733600LL, - 0x621edd80LL,0x6e17d480LL,0x7b86c700LL,0x8a995700LL,0x9b82b800LL, - 0xae7c5c00LL,0xc3c6b900LL,0xdbaa2200LL,0xf677bc00LL,0x1148a9400LL, - 0x13648d200LL,0x15c251800LL,0x186a00000LL,0x1b649d800LL,0x1ebc48a00LL, - 0x227c5c000LL,0x26b195000LL,0x2b6a3f000LL,0x30b663c00LL,0x36a801c00LL, - 0x3d534a400LL,0x44cee4800LL,0x4d343c800LL,0x569fd6000LL,0x6131b2800LL, - 0x6d0db9800LL,0x7a5c33800LL,0x894a55000LL,0x9a0ad6000LL,0xacd69d000LL, - 0xc1ed84000LL,0xd9972f000LL,0xf42400000LL,0x111ee28000LL,0x1335ad6000LL, - 0x158db98000LL,0x182efd4000LL,0x1b22676000LL,0x1e71fe6000LL, - 0x2229014000LL,0x26540e8000LL,0x2b014f0000LL,0x3040a5c000LL, - 0x3623e60000LL,0x3cbf0fc000LL,0x4428940000LL,0x4c79a08000LL, - 0x55ce758000LL,0x6046c58000LL,0x6c06220000LL,0x7934728000LL, - 0x87fe7d0000LL,0x9896800000LL,0xab34d90000LL,0xc018c60000LL, - 0xd7893f0000LL,0xf1d5e40000LL,0x10f580a0000LL,0x13073f00000LL, - 0x1559a0c0000LL,0x17f48900000LL,0x1ae0d160000LL,0x1e286780000LL, - 0x21d66fc0000LL,0x25f769c0000LL,0x2a995c80000LL,0x2fcc0440000LL, - 0x35a10940000LL,0x3c2c3b80000LL,0x4383d500000LL,0x4bc0c780000LL, - 0x54ff0e80000LL,0x5f5e1000000LL,0x6b010780000LL,0x780f7c00000LL, - 0x86b5c800000LL,0x9725ae00000LL,0xa9970600000LL,0xbe487500000LL, - 0xd5804700000LL,0xef8d5a00000LL,0x10cc82e00000LL,0x12d940c00000LL, - 0x152605c00000LL,0x17baa2200000LL,0x1a9fd9c00000LL,0x1ddf82a00000LL, - 0x2184a5c00000LL,0x259ba5400000LL,0x2a3265400000LL,0x2f587cc00000LL, - 0x351f69000000LL,0x3b9aca000000LL,0x42e0a4800000LL,0x4b09ad800000LL, - 0x54319d000000LL,0x5e778d000000LL,0x69fe64000000LL,0x76ed49800000LL, - 0x85702c000000LL,0x95b858000000LL,0xa7fd1c000000LL,0xbc7c87000000LL, - 0xd37c3a000000LL,0xed4a55000000LL,0x10a3e82000000LL,0x12abb1a000000LL, - 0x14f2e7a000000LL,0x1781474000000LL,0x1a5f7f4000000LL,0x1d974de000000LL, - 0x2133a18000000LL - }; - -/* 10^(index/16). We'll need to accomidate negative indicies too. - The algorithm sort of implies that there should be 128 values starting at -60, - however this has not been confirmed. More values may be needed. -*/ -const fixed32 pow_10_to_yover16[] = -{ - /*60 negative indicies (-60 to -1)*/ - 0xc, 0xd, 0x10, 0x12, 0x15, 0x18, 0x1c, 0x20, 0x25, 0x2b, 0x31, 0x39, 0x42, - 0x4c, 0x57, 0x65, 0x75, 0x87, 0x9b, 0xb3, 0xcf, 0xef, 0x114, 0x13f, 0x171, - 0x1aa, 0x1eb, 0x238, 0x28f, 0x2f5, 0x36a, 0x3f1, 0x48d, 0x542, 0x612, 0x703, - 0x818, 0x959, 0xacc, 0xc77, 0xe65, 0x10a0, 0x1333, 0x162b, 0x199a, 0x1d90, - 0x2223, 0x276c, 0x2d86, 0x3492, 0x3cb5, 0x461b, 0x50f4, 0x5d7c, 0x6bf4, - 0x7caa, 0x8ff6, 0xa63e, 0xbff9, 0xddb0, - /*non-negative indicies (0-68)*/ - 0x10000, 0x127a0, 0x15562, 0x18a39, 0x1c73d, 0x20db4, 0x25f12, 0x2bd09, - 0x3298b, 0x3a6d9, 0x4378b, 0x4dea3, 0x59f98, 0x67e6b, 0x77fbb, 0x8a8de, - 0xa0000, 0xb8c3e, 0xd55d1, 0xf6636, 0x11c865, 0x148906, 0x17b6b7, 0x1b625b, - 0x1f9f6e, 0x248475, 0x2a2b6e, 0x30b25e, 0x383bf0, 0x40f02b, 0x4afd4b, - 0x5698b0, 0x640000, 0x737a6b, 0x855a26, 0x99fe1e, 0xb1d3f4, 0xcd5a3e, - 0xed232b, 0x111d78b, 0x13c3a4f, 0x16d2c94, 0x1a5b24e, 0x1e6f7b0, 0x2325761, - 0x28961b3, 0x2ede4eb, 0x361f6de, 0x3e80000, 0x482c830, 0x535857d, 0x603ed31, - 0x6f24787, 0x8058668, 0x9435fab, 0xab26b6d, 0xc5a4715, 0xe43bdc4, - 0x1078f70c, 0x1305acdd, 0x15f769cb, 0x195dd0fa, 0x1d4af12d, 0x21d3a4ab, - 0x27100000, 0x2d1bd1e1, 0x341736de, 0x3c2743e8, 0x4576cb4a -}; - -const fixed32 pow_a_table[] = -{ - 0x1004,0x1008,0x100c,0x1010,0x1014,0x1018,0x101c,0x1021,0x1025,0x1029,0x102d, - 0x1031,0x1036,0x103a,0x103e,0x1043,0x1047,0x104b,0x1050,0x1054,0x1059,0x105d, - 0x1062,0x1066,0x106b,0x106f,0x1074,0x1078,0x107d,0x1082,0x1086,0x108b,0x1090, - 0x1095,0x1099,0x109e,0x10a3,0x10a8,0x10ad,0x10b2,0x10b7,0x10bc,0x10c1,0x10c6, - 0x10cb,0x10d0,0x10d5,0x10da,0x10df,0x10e5,0x10ea,0x10ef,0x10f5,0x10fa,0x10ff, - 0x1105,0x110a,0x1110,0x1115,0x111b,0x1120,0x1126,0x112c,0x1131,0x1137,0x113d, - 0x1143,0x1149,0x114f,0x1155,0x115a,0x1161,0x1167,0x116d,0x1173,0x1179,0x117f, - 0x1186,0x118c,0x1192,0x1199,0x119f,0x11a6,0x11ac,0x11b3,0x11b9,0x11c0,0x11c7, - 0x11ce,0x11d4,0x11db,0x11e2,0x11e9,0x11f0,0x11f8,0x11ff,0x1206,0x120d,0x1215, - 0x121c,0x1223,0x122b,0x1233,0x123a,0x1242,0x124a,0x1251,0x1259,0x1261,0x1269, - 0x1271,0x127a,0x1282,0x128a,0x1293,0x129b,0x12a4,0x12ac,0x12b5,0x12be,0x12c7, - 0x12d0,0x12d9,0x12e2,0x12eb,0x12f4,0x12fe,0x1307 -}; - - -/* 32.32 unsigned fixed format */ -/* This is a table of exponent values for an IEEE SP float. Theres never anything less then about index 115 - * making the size of this table fairly ridiculous. - */ - - -const fixed64 lsp_pow_e_table[] = -{ - 0xb504f30000000000LL, 0x9837f00000000000LL, 0x8000000000000000LL, 0x6ba27e8000000000LL, 0x5a82798000000000LL, - 0x4c1bf80000000000LL, 0x4000000000000000LL, 0x35d13f4000000000LL, 0x2d413cc000000000LL, 0x260dfc0000000000LL, - 0x2000000000000000LL, 0x1ae89fa000000000LL, 0x16a09e6000000000LL, 0x1306fe0000000000LL, 0x1000000000000000LL, - 0xd744fd000000000LL, 0xb504f3000000000LL, 0x9837f0000000000LL, 0x800000000000000LL, 0x6ba27e800000000LL, - 0x5a8279800000000LL, 0x4c1bf8000000000LL, 0x400000000000000LL, 0x35d13f400000000LL, 0x2d413cc00000000LL, - 0x260dfc000000000LL, 0x200000000000000LL, 0x1ae89fa00000000LL, 0x16a09e600000000LL, 0x1306fe000000000LL, - 0x100000000000000LL, 0xd744fd00000000LL, 0xb504f300000000LL, 0x9837f000000000LL, 0x80000000000000LL, - 0x6ba27e80000000LL, 0x5a827980000000LL, 0x4c1bf800000000LL, 0x40000000000000LL, 0x35d13f40000000LL, - 0x2d413cc0000000LL, 0x260dfc00000000LL, 0x20000000000000LL, 0x1ae89fa0000000LL, 0x16a09e60000000LL, - 0x1306fe00000000LL, 0x10000000000000LL, 0xd744fd0000000LL, 0xb504f30000000LL, 0x9837f00000000LL, - 0x8000000000000LL, 0x6ba27e8000000LL, 0x5a82798000000LL, 0x4c1bf80000000LL, 0x4000000000000LL, - 0x35d13f4000000LL, 0x2d413cc000000LL, 0x260dfc0000000LL, 0x2000000000000LL, 0x1ae89fa000000LL, - 0x16a09e6000000LL, 0x1306fe0000000LL, 0x1000000000000LL, 0xd744fd000000LL, 0xb504f3000000LL, - 0x9837f0000000LL, 0x800000000000LL, 0x6ba27e800000LL, 0x5a8279800000LL, 0x4c1bf8000000LL, - 0x400000000000LL, 0x35d13f400000LL, 0x2d413cc00000LL, 0x260dfc000000LL, 0x200000000000LL, - 0x1ae89fa00000LL, 0x16a09e600000LL, 0x1306fe000000LL, 0x100000000000LL, 0xd744fd00000LL, - 0xb504f300000LL, 0x9837f000000LL, 0x80000000000LL, 0x6ba27e80000LL, 0x5a827980000LL, - 0x4c1bf800000LL, 0x40000000000LL, 0x35d13f40000LL, 0x2d413cc0000LL, 0x260dfc00000LL, - 0x20000000000LL, 0x1ae89fa0000LL, 0x16a09e60000LL, 0x1306fe00000LL, 0x10000000000LL, - 0xd744fd0000LL, 0xb504f30000LL, 0x9837f00000LL, 0x8000000000LL, 0x6ba27e8000LL, - 0x5a82798000LL, 0x4c1bf80000LL, 0x4000000000LL, 0x35d13f4000LL, 0x2d413cc000LL, - 0x260dfc0000LL, 0x2000000000LL, 0x1ae89fa000LL, 0x16a09e6000LL, 0x1306fe0000LL, - 0x1000000000LL, 0xd744fd000LL, 0xb504f3000LL, 0x9837f0000LL, 0x800000000LL, - 0x6ba27e800LL, 0x5a8279800LL, 0x4c1bf8000LL, 0x400000000LL, 0x35d13f400LL, - 0x2d413cc00LL, 0x260dfc000LL, 0x200000000LL, 0x1ae89fa00LL, 0x16a09e600LL, - 0x1306fe000LL, 0x100000000LL, 0xd744fd00LL, 0xb504f300LL, 0x9837f000LL, - 0x80000000LL, 0x6ba27e80LL, 0x5a827980LL, 0x4c1bf800LL, 0x40000000LL, - 0x35d13f40LL, 0x2d413cc0LL, 0x260dfc00LL, 0x20000000LL, 0x1ae89fa0LL, - 0x16a09e60LL, 0x1306fe00LL, 0x10000000LL, 0xd744fd0LL, 0xb504f30LL, - 0x9837f00LL, 0x8000000LL, 0x6ba27e8LL, 0x5a82798LL, 0x4c1bf80LL, - 0x4000000LL, 0x35d13f4LL, 0x2d413ccLL, 0x260dfc0LL, 0x2000000LL, - 0x1ae89faLL, 0x16a09e6LL, 0x1306fe0LL, 0x1000000LL, 0xd744fdLL, - 0xb504f3LL, 0x9837f0LL, 0x800000LL, 0x6ba27eLL, 0x5a8279LL, - 0x4c1bf8LL, 0x400000LL, 0x35d13fLL, 0x2d413cLL, 0x260dfcLL, - 0x200000LL, 0x1ae89fLL, 0x16a09eLL, 0x1306feLL, 0x100000LL, - 0xd744fLL, 0xb504fLL, 0x9837fLL, 0x80000LL, 0x6ba27LL, - 0x5a827LL, 0x4c1bfLL, 0x40000LL, 0x35d13LL, 0x2d413LL, - 0x260dfLL, 0x20000LL, 0x1ae89LL, 0x16a09LL, 0x1306fLL, - 0x10000LL, 0xd744LL, 0xb504LL, 0x9837LL, 0x8000LL, - 0x6ba2LL, 0x5a82LL, 0x4c1bLL, 0x4000LL, 0x35d1LL, - 0x2d41LL, 0x260dLL, 0x2000LL, 0x1ae8LL, 0x16a0LL, - 0x1306LL, 0x1000LL, 0xd74LL, 0xb50LL, 0x983LL, - 0x800LL, 0x6baLL, 0x5a8LL, 0x4c1LL, 0x400LL, - 0x35dLL, 0x2d4LL, 0x260LL, 0x200LL, 0x1aeLL, - 0x16aLL, 0x130LL, 0x100LL, 0xd7LL, 0xb5LL, - 0x98LL, 0x80LL, 0x6bLL, 0x5aLL, 0x4cLL, - 0x40LL, 0x35LL, 0x2dLL, 0x26LL, 0x20LL, - 0x1aLL, 0x16LL, 0x13LL, 0x10LL, 0xdLL, - 0xbLL, 0x9LL, 0x8LL, 0x6LL, 0x5LL, - 0x4LL, 0x4LL, 0x3LL, 0x2LL, 0x2LL, - 0x2LL, 0x1LL, 0x1LL, 0x1LL, 0x1LL, - 0x0LL -}; - -/* table of exp noise values multiplied by 16 in order to reduce rounding error */ -fixed32 noisetable_exp[] = -{ - 0x5, 0xfffffa2e, 0xc2c, 0xb47, 0xffffaebe, 0xfffffa63, 0xfffff7ff, 0x16bd, - 0xffffe704, 0xffffe34e, 0x71ee, 0x396e, 0xffff8bfd, 0x3b4, 0x562f, 0xffffc362, - 0x5327, 0xffffae19, 0x6cb4, 0x26b0, 0x87c4, 0x21dc, 0x8017, 0x1db0, - 0xffffe49e, 0xffffb162, 0xffffc808, 0xffffafea, 0xfffffe80, 0xfffffeb8, 0xffff8b6e, 0xffffc7a1, - 0x3f46, 0x5e8, 0x374f, 0xffff8fba, 0x87fd, 0x21e7, 0xffff9198, 0x78a0, - 0x7f7c, 0x864f, 0xffffca94, 0x42a7, 0xfffffcd6, 0xffffb916, 0x247a, 0x5679, - 0x8d9f, 0xffffb350, 0xffff9592, 0xffffcf73, 0x552d, 0xffffeb8c, 0x8622, 0xffff8091, - 0x238, 0x3ee8, 0x5c2f, 0x6e25, 0xffffe5cb, 0x86a1, 0xffffa8ca, 0xfe2, - 0x5dac, 0x2da2, 0x5ad1, 0xffffa94f, 0x729, 0xfffffdc0, 0xffff825c, 0x8bcd, - 0xffff7d05, 0xffff7d9e, 0xffffb5b6, 0x58a3, 0xffff8a3f, 0xffffd9c0, 0xffff8142, 0x596f, - 0x78aa, 0x2694, 0x78f5, 0xffff8a84, 0x43b3, 0x498a, 0xffffdfe5, 0xffffbba9, - 0xffff7228, 0xffff72c9, 0xfffff174, 0xffff9a76, 0x64d5, 0x221c, 0x88dd, 0xffffd319, - 0xfffffe14, 0xfffff99f, 0xffff8ba4, 0x6e34, 0x6cc, 0x3208, 0xfffffb14, 0x6670, - 0xffffd5ff, 0xffffa502, 0x641d, 0xffff75b6, 0xec2, 0xffffedf2, 0xffffb925, 0xffffe271, - 0xffffb727, 0xffff7450, 0xfffff421, 0x89e7, 0xfffff635, 0xffffa841, 0xffffda00, 0xffffc94e, - 0xef9, 0x28cc, 0xffffd477, 0xffff82b9, 0x2a7, 0xffff7540, 0x24c2, 0x4349, - 0xffffdf34, 0xdf7, 0x323d, 0xffffbce7, 0x29c5, 0x4700, 0x10b0, 0x1eb6, - 0x1172, 0x84be, 0xffffcee4, 0xffffe7bd, 0x1166, 0xffff7df0, 0xffffe115, 0x2383, - 0x23a0, 0x784a, 0x6f8e, 0xffff9043, 0x2b66, 0xffffc79e, 0xffff8966, 0xffffbfac, - 0x5fb1, 0xffffb183, 0x3602, 0x3d19, 0xffff7df4, 0x3ffe, 0xffffc919, 0x5ac7, - 0xffffa3e8, 0xfffff2ea, 0x47b9, 0xffffe344, 0x12f0, 0xffffc4e8, 0xfffff3fc, 0xffffcacd, - 0xffffd23b, 0x893a, 0x5e82, 0xffff8d36, 0x50e0, 0x49a6, 0x29dd, 0x16fa, - 0x451d, 0x8315, 0xffffe455, 0x749, 0x8624, 0x2fe5, 0x3ab5, 0xffffb4f1, - 0x72d, 0xffffccdf, 0x2b05, 0xffffa816, 0xffff9570, 0xffffd2e7, 0xffffa6ac, 0x2fc2, - 0xae4, 0x4c93, 0xfffffce1, 0xffffdb9f, 0x8102, 0x6bb1, 0xffffd5bf, 0xffff80e0, - 0xffffd70e, 0x568f, 0xc12, 0xffff9823, 0x700c, 0xffffa1aa, 0xffffa86c, 0xffffd303, - 0xffffbe7a, 0x38c9, 0xffff9f18, 0xffffcd7a, 0xffff8d75, 0x6955, 0xffffe70a, 0xffffbf49, - 0xffffc423, 0x31f, 0xffffe44a, 0x118a, 0xffffebfa, 0xffffedec, 0xffffee42, 0xffffd865, - 0xffff9b30, 0xffff8759, 0xffff827c, 0xffffbc26, 0xfffffb02, 0xffff8bee, 0xffffe6c2, 0x72f3, - 0xffffc2c9, 0xffff74ff, 0x2434, 0x1eb4, 0x11c9, 0x61c1, 0xffffa964, 0x89a3, - 0x6a43, 0x3d7f, 0xffffd09f, 0x14d8, 0x37bc, 0xfffffc31, 0xffffdb03, 0xfffff4e1, - 0x5547, 0xffffdc87, 0xffff929a, 0x73cc, 0x246f, 0x194e, 0xffffb4ce, 0x86b5, - 0x2f57, 0x7f05, 0x252b, 0xffff9b05, 0x5b7a, 0x164, 0x57cf, 0x7f86, - 0x5421, 0xffffa478, 0xffffbbda, 0x1b3c, 0xfffff4cb, 0xffffda7e, 0x5d8e, 0x1957, - 0xffffb3a7, 0x1979, 0xffff8ddd, 0xffffd7b9, 0xfffff028, 0xffff8c90, 0x476a, 0x6be6, - 0x419e, 0xfffffd2d, 0x8294, 0xffffc931, 0xffffe1ab, 0xffffdd4f, 0x46f0, 0x1930, - 0x4e5e, 0x8429, 0xffffde0a, 0xffff8e69, 0x2972, 0x387f, 0x3dd8, 0xffffbcc6, - 0x121b, 0x6d3d, 0x1fa4, 0xffffa3ea, 0xffffbbef, 0xffffcbd2, 0xffffbe04, 0xffffb424, - 0xffff7533, 0x70cd, 0x2370, 0x4822, 0xffff756e, 0xffffbe8c, 0x4131, 0x1ead, - 0x47de, 0xffffed53, 0xffff917e, 0x5f93, 0xffffe264, 0xffffde05, 0xffff9dc3, 0xffffc1d9, - 0xffff9b25, 0x3ade, 0xfffff9b7, 0xffffac80, 0x239e, 0xffffb980, 0xffffc9a4, 0x788c, - 0xffffbb6d, 0x3bb7, 0x6483, 0xffffeac0, 0x25ea, 0xffffbdfc, 0x333d, 0x8c0d, - 0x6d9a, 0xffffafe8, 0xffff8a74, 0x6067, 0xffff8642, 0x1a64, 0xfffff921, 0x3f3b, - 0xae4, 0x5112, 0x43a4, 0x1573, 0xffffc977, 0xffffa3b4, 0x21be, 0xffff96df, - 0xfffff035, 0x473b, 0xffff8d26, 0xb75, 0xffffecdc, 0x4455, 0x47d5, 0xffff7581, - 0xeca, 0xffffb3fe, 0xffff9f6a, 0xffffea15, 0xffffb9c3, 0x5516, 0xffffb654, 0x7f91, - 0x80b, 0xffff96b7, 0x2b60, 0x36b7, 0xffffc581, 0x285b, 0xffffa002, 0xffffc7e5, - 0x4965, 0xffff94d4, 0xffff764b, 0x1cd2, 0x5599, 0xffffd272, 0xffffcbfb, 0xffffae6d, - 0xffffd496, 0x3183, 0xffffe4f5, 0xffffa59f, 0x43df, 0x4569, 0xffffb185, 0x1d56, - 0xffff933a, 0xffff7a2c, 0x38d0, 0xffffb815, 0x5203, 0xfffffd89, 0xffff93ea, 0xffffa4dd, - 0x1f13, 0xffffad7d, 0xffffff4f, 0xffffe13c, 0xffffd60a, 0x8c88, 0x8276, 0xffffeaaf, - 0xffff8a66, 0xffff7888, 0xffff91e9, 0x8bdf, 0xdcf, 0xfffff282, 0xffffe91b, 0x1eb1, - 0x6fc, 0xffff81f6, 0x1617, 0xffffad02, 0xffffafaf, 0x60d5, 0x6f2b, 0x4e8b, - 0x2347, 0x3257, 0x29cf, 0x86c4, 0x75b3, 0x7745, 0xfffffcc7, 0x49cd, - 0x558f, 0xffff7c7a, 0x52e1, 0xffff7626, 0x7690, 0xffffb357, 0xffff7dbf, 0xffffa1ee, - 0xffffa874, 0xffff846f, 0xffffab72, 0x5cef, 0xffffb0cf, 0xffff8c24, 0xffff8e10, 0xffffe200, - 0x2a45, 0xfffff883, 0x5155, 0x37c9, 0xad6, 0x1ed9, 0x79e2, 0x1f4c, - 0x45f8, 0x48ec, 0xffffa331, 0x34a1, 0xffffc7b0, 0x2eb5, 0x5dc, 0x4cdd, - 0x4e5c, 0xffffa7c7, 0x3b08, 0x2776, 0x2e1a, 0x788d, 0x162b, 0x1fa7, - 0x466c, 0x5ca2, 0xfffff3ac, 0xffffa62f, 0xfffffd4c, 0x5f48, 0x779, 0x2a5e, - 0xffffe14e, 0x196, 0xffffaba1, 0x404c, 0xffffdc5b, 0x238f, 0x274, 0xffffa5c6, - 0xffff9e2b, 0x6201, 0xfffff195, 0xfffff3b0, 0x2285, 0xffffc7f0, 0xffffdff4, 0xffffc43d, - 0xffffac57, 0xffffb7a6, 0xffffe88c, 0xffffd3ac, 0xffffbb5c, 0x2cbd, 0x44d6, 0x5e30, - 0xffffeb53, 0x6d8b, 0xffff7f8b, 0xffff99a3, 0xffff7a4e, 0xffffbc82, 0x6a49, 0xfffff220, - 0xffffeaca, 0x4146, 0x8d72, 0xffffdcb7, 0xffffe2f3, 0xfffff736, 0x557f, 0x13fd, - 0x66a, 0x5d9, 0x29ee, 0xffffda1e, 0xd38, 0xffffe70f, 0xffffbbd7, 0xffffe1ee, - 0x4a0d, 0x502e, 0xffff8c37, 0xffffaccc, 0xffffdd0b, 0xffff7401, 0x3a89, 0x73b4, - 0x71b7, 0x5b43, 0xffff9baf, 0x4d76, 0x25f, 0x7f97, 0xffffcb71, 0x6b4c, - 0xffffe999, 0x3fd5, 0xffffd40b, 0x3f0d, 0xffffc17b, 0x3de9, 0x87f7, 0x6446, - 0x5be, 0xffffd88a, 0x7d05, 0xfffffe16, 0x467e, 0x1454, 0xffffca4e, 0xffffa047, - 0xffff92ac, 0xffffddc9, 0x72a9, 0xffffc902, 0x3605, 0xe47, 0x280c, 0x7662, - 0x609d, 0xffffae0a, 0x78e0, 0xffffa02a, 0x1c87, 0xfffff91b, 0xffff7792, 0xffff745e, - 0xffff8097, 0xffff8583, 0xffffe7e4, 0x61a5, 0x36a8, 0x7fe7, 0xffffaecc, 0xffff90f7, - 0x5ad9, 0x7e2f, 0xffffffca, 0x75c7, 0x7134, 0xffffd7fe, 0x3c22, 0x314c, - 0x7c97, 0x2068, 0xffff7926, 0x3e7c, 0x6926, 0x67f9, 0x3e28, 0x7c65, - 0x76b9, 0x25cf, 0x1039, 0xffffdf97, 0x8779, 0xffffe8fd, 0xffff9f74, 0x770a, - 0x8a50, 0xffffd241, 0xffffddee, 0x5aab, 0xffffc97f, 0x4572, 0x3276, 0xffffe7ec, - 0xffff8cc2, 0x6331, 0xfffffedf, 0x3b86, 0x3038, 0xffffd628, 0x2645, 0xffff737c, - 0x72fe, 0xffff8474, 0x23fb, 0x78f, 0x194c, 0x95a, 0xffff91d0, 0xffff8014, - 0x56e9, 0x2efe, 0xffffae5b, 0x614, 0xffffca3d, 0xffffd77e, 0x73e1, 0x35f7, - 0x71f3, 0xffff9279, 0xffffe6f3, 0x404b, 0x548d, 0x32a3, 0xc11, 0x637a, - 0xffff7605, 0x2ba8, 0xffff8f35, 0x8157, 0x423f, 0xffff9711, 0xffffb980, 0xffffb4b1, - 0x3494, 0xffffc9dd, 0x6c43, 0x563f, 0x52c, 0xffff9680, 0x8b7a, 0xffffcf49, - 0xffffa40b, 0x6daf, 0xffff840e, 0x29cd, 0xffffbf5c, 0x68b7, 0xffffedf3, 0xffffe329, - 0xfffff634, 0x8619, 0x33bc, 0x28b4, 0x5ed8, 0xffffcfbb, 0x883a, 0xfffffdf6, - 0xffffb980, 0x7bac, 0xfffffd6d, 0x418f, 0x4a25, 0xffffbed3, 0x4272, 0xffffef42, - 0x800f, 0x78e3, 0x82c8, 0x24e1, 0xffffcfa3, 0xffffb385, 0x86b, 0x645b, - 0x38aa, 0x6a22, 0xffffc21b, 0x60f0, 0x9b6, 0x912, 0x7621, 0xffff94cc, - 0xffffd5c9, 0xfffffdb5, 0xffffd93a, 0x2a11, 0xffff8b3d, 0xffffc0d2, 0xffffa00f, 0xffffe965, - 0xfffffa0f, 0xffffbfa9, 0x5e78, 0xffff925b, 0xffffeac8, 0xffffd5af, 0xffffba37, 0x395a, - 0xffffdc75, 0xfffffdf2, 0xffff7c7b, 0xffff89a3, 0x3766, 0xffffe8a9, 0x7118, 0x399e, - 0xffff7ff5, 0xffffac9a, 0xffff7d74, 0xffffa5d2, 0x4c27, 0x787f, 0x586, 0x7ce4, - 0xffffb38e, 0xffffb93d, 0x240d, 0x5a90, 0xffffb448, 0xffff8e29, 0xffffbc06, 0x3bf3, - 0xffffda90, 0xffffb78d, 0xffffc747, 0xffffa5c0, 0xffffe2dd, 0x7fbd, 0x8946, 0xffff8d50, - 0x2451, 0x18f9, 0xffffc1d4, 0xffffb689, 0xffffc37b, 0xffffbe2f, 0xffffbe9e, 0x8117, - 0x7050, 0xfffff504, 0x2b9, 0x464f, 0x298d, 0x2367, 0xffffe8c3, 0x79f1, - 0x4e38, 0x5cc8, 0x2928, 0xffffb486, 0x7cd6, 0xffffdbd9, 0xfffff110, 0xffffeff7, - 0x19b8, 0xffffeb99, 0xffff847c, 0xffff7612, 0xffffd542, 0x2966, 0xffff8ce2, 0x38fe, - 0xffffdeaa, 0x5238, 0x67c4, 0xffffa5e7, 0x4e6d, 0xffffd82e, 0x5973, 0x351b, - 0x74e8, 0xffffafcd, 0x66dd, 0x20e4, 0x609d, 0xffffade3, 0x509f, 0xffffa21f, - 0x2cce, 0x54c2, 0x1953, 0x85ce, 0x6bee, 0x3222, 0x6ff6, 0x3773, - 0x5a64, 0xffffe40f, 0xffffc6df, 0x3556, 0x80a9, 0xffff76c5, 0x495b, 0x1ae4, - 0xffffca33, 0x31f2, 0x833e, 0x89c3, 0x5f43, 0xffffbee7, 0x3ab2, 0x87af, - 0x4c74, 0xffff810b, 0xffffbed0, 0x6795, 0xffff785c, 0xffffbc0b, 0x520e, 0x4348, - 0xe03, 0x4541, 0x2557, 0xffff9110, 0x4044, 0x1947, 0x4dab, 0xcbe, - 0x3f72, 0x4507, 0xffffa362, 0xffffc20b, 0x6c1b, 0x27c7, 0xffff9bf2, 0x6506, - 0xffff89cc, 0x5c3e, 0x4509, 0x409a, 0xffff98db, 0x1674, 0xffff9324, 0x7328, - 0xffff99cf, 0xcd8, 0x730a, 0x14b9, 0x672d, 0xffffd620, 0x1dd8, 0x3bec, - 0xffff94b6, 0xffffb689, 0x7dfd, 0x3ffd, 0xffff9cb6, 0x3560, 0xffffbaf8, 0xffff8604, - 0x8795, 0xffff7aec, 0x66a5, 0x6a0b, 0x564b, 0xffff8d00, 0xffffed20, 0x11b8, - 0xffffdc27, 0x595d, 0xffffddf0, 0xfffffc70, 0xffffd5bf, 0x6714, 0xffffaf69, 0xdb2, - 0x3786, 0xffffbf9d, 0x7ca7, 0x5a53, 0xffff7c6a, 0xffff8465, 0xffffe4c6, 0xffffa238, - 0xffff7f9b, 0x6887, 0x3838, 0x7115, 0x5bce, 0xeae, 0x47c, 0xffffd54a, - 0xffffb9d5, 0x6183, 0x9c3, 0xbd5, 0xffffe217, 0x8237, 0x51d7, 0x52fe, - 0x6424, 0xffffb192, 0xffff7ebb, 0xffffd373, 0xffff9cf7, 0x390b, 0xffffa473, 0x8953, - 0xffff90c9, 0x594a, 0xc6e, 0x32ba, 0xffffae73, 0x86c7, 0xffffd7a0, 0xffffa82e, - 0x8d66, 0xffffabcf, 0xffff84d0, 0x3a84, 0xffffe8bd, 0x4948, 0x3f2a, 0xfffff4e5, - 0xffffb0bd, 0x4961, 0xffffd95b, 0xffffd96c, 0xffffce34, 0x57ff, 0xffffdf08, 0x2330, - 0xffffa8c7, 0x24cb, 0x740a, 0xffffdbcf, 0xffffad36, 0x306f, 0xffffa30b, 0xffffc488, - 0xffff8022, 0x464a, 0x6f00, 0xffffb419, 0xffff8450, 0x2ddb, 0x2731, 0x63fd, - 0x2946, 0x5c28, 0xffffb064, 0xffffb277, 0x1e0f, 0x6d71, 0xffff7ff3, 0xfffffb02, - 0xf2a, 0xffffd69c, 0x638, 0xffffe8ff, 0xffffbd7e, 0xffffb26f, 0xffffe153, 0xffff9879, - 0xffff849c, 0x1f73, 0xffff9b21, 0x2bb1, 0xffffa95b, 0xffffd582, 0xffffdbfa, 0xd2c, - 0xffffa86f, 0x2ab3, 0xffff9d78, 0x1074, 0xffffbcb5, 0x3990, 0xffffe869, 0xffffb422, - 0x2dc8, 0xffffca25, 0xffffcfe8, 0xaf1, 0xffff82c8, 0x36a, 0x2f4e, 0xfffffdcd, - 0x77fa, 0xffffad4f, 0xffffa54a, 0x50b9, 0x6eab, 0x5178, 0x8982, 0xffffe4dd, - 0xffff9a82, 0x45a2, 0x784e, 0xffffbd6e, 0x5019, 0xffffcc5c, 0x8009, 0x5d96, - 0xffffac8d, 0xffff8ec9, 0x4c, 0x4222, 0xfffffa7f, 0x3227, 0x67ea, 0xffffe679, - 0x3dc8, 0xffffb5b5, 0x1424, 0x3e4a, 0xfffff175, 0xffffaf4b, 0x4657, 0x1374, - 0xffff7233, 0x7190, 0x332, 0xaf0, 0x68c0, 0xffff85ad, 0xffffd0af, 0x2b1, - 0xffff8d54, 0x1f99, 0xffffe8d5, 0xffffc30b, 0x2877, 0xffff9d40, 0xffff8852, 0xffffb01a, - 0x4b32, 0x3279, 0xffff9099, 0x5f4f, 0xffffe08c, 0xffff9fe0, 0xffff9ecc, 0xfffff557, - 0xfffffc25, 0xffffa719, 0xffff920a, 0x62ac, 0xfffff11d, 0x152d, 0xfffff5d6, 0x5223, - 0xfffff438, 0xffff73f3, 0x34e1, 0x49a9, 0x6a73, 0x2ad3, 0x1f51, 0x824, - 0x1bc9, 0x5170, 0x552d, 0x52b5, 0xfffff12a, 0xffffec44, 0x7924, 0x5294, - 0xb63, 0x822f, 0xffff9afd, 0x7e29, 0x2d91, 0x42ad, 0xfffff589, 0xfffff6e9, - 0x2792, 0x4269, 0xffff9639, 0xffff726f, 0x4074, 0xffffa179, 0x8a6b, 0xffffb431, - 0x850f, 0xffff903f, 0x6b22, 0x738, 0x16a0, 0xffff917f, 0x8a5a, 0xb61, - 0xffffcce6, 0x6369, 0xffffb671, 0x66c0, 0x68e6, 0x41aa, 0x2fc3, 0x2382, - 0xffffabd5, 0x62c, 0x5041, 0xffff9903, 0x846b, 0x86f6, 0x8111, 0x15c, - 0x62ed, 0xfffff411, 0x517c, 0xffffbb6d, 0x8256, 0x141e, 0xfffffd31, 0x8777, - 0xffffabbe, 0x4eb5, 0xffffbae4, 0x75a2, 0x2bfc, 0xffff799f, 0x26bd, 0x2296, - 0x7b36, 0xffffddc6, 0x7517, 0x155a, 0x16b1, 0x25b4, 0xfffff8ce, 0x54e9, - 0xffffeb3c, 0x7e5e, 0xffffa981, 0xfffffdbb, 0x87f7, 0xfffff4fe, 0x5657, 0x2add, - 0x5113, 0x7bff, 0xffffbcec, 0x37fb, 0x59a3, 0xffffd989, 0xffff9ac8, 0xffff8e9e, - 0x5ea9, 0x1bbf, 0x8ca1, 0xffff7365, 0x4d65, 0x874c, 0x4119, 0x63ee, - 0xffff91ea, 0x8074, 0x8a3c, 0xffff74b0, 0xffffb940, 0x3c7a, 0x50f, 0xffffe11e, - 0x6c76, 0x5731, 0xf34, 0xffff8ace, 0xffffdb12, 0x4cb2, 0xffffa624, 0x8999, - 0xffff94e3, 0x469e, 0x4101, 0xffffe271, 0x850d, 0xffff95cf, 0xffff93fa, 0x3357, - 0x8fe, 0xffff9b75, 0xffffbd9b, 0x6a34, 0x1db7, 0xb19, 0xffffee5f, 0xffffc9c1, - 0x763, 0xffff9c09, 0x26a7, 0xffffb6c5, 0xf48, 0xe3e, 0x854f, 0xfffffa24, - 0xffffb689, 0x34bc, 0xffff7a74, 0xffff7240, 0x5849, 0xfffffa7f, 0xffffbd17, 0x17e4, - 0x8e6, 0xfffff805, 0xffffd6d6, 0xffffecd0, 0xffff8b9c, 0xffffed0b, 0x198e, 0x5422, - 0x8549, 0x8dc7, 0xffffb649, 0x1cb6, 0x5ba9, 0xffffc4f6, 0x7b31, 0xffff8611, - 0x62a9, 0xc49, 0xffff7b22, 0xffffd5f0, 0xffff9fce, 0x3f16, 0xffff72a8, 0xffff9a53, - 0xffffa401, 0xffff9f41, 0x53b8, 0xffffca3e, 0x86a2, 0xffffa27c, 0xffffb022, 0x7c4, - 0x3425, 0x344e, 0xffffcb0a, 0x6d47, 0x63b3, 0x677c, 0x4077, 0x72b, - 0x5a90, 0x4348, 0xffff8b9d, 0xffffbcef, 0xffff8e3f, 0x58fa, 0xffffe0a8, 0xffffaf0c, - 0x4698, 0x3da0, 0xffffd44c, 0xffffe85d, 0x455f, 0x5746, 0x5168, 0xfffff3ad, - 0xffffd7bb, 0x56b0, 0xffff7845, 0xffff8d1d, 0x8fa, 0xffffe8c1, 0xffffb00f, 0x6f65, - 0xffffb97c, 0x83b9, 0x4e67, 0x5e2a, 0x787f, 0x8d66, 0x397e, 0x7e75, - 0x4789, 0x7be7, 0x8a38, 0x7ce2, 0xffff9005, 0x3391, 0x873d, 0x5ade, - 0x71e5, 0xffffb84e, 0x4718, 0x438, 0x8700, 0xffffdf0d, 0xfffffed4, 0x88, - 0xfffff494, 0xffffab9a, 0x6c68, 0xffffece3, 0xffff9e05, 0x5590, 0xffffeda6, 0x491d, - 0x7376, 0x6e88, 0x75df, 0xffffd5a8, 0x88b7, 0xffffe707, 0x356d, 0xffff9881, - 0xffffef0f, 0xffffa40f, 0xffff8f5e, 0x3b0f, 0x3da, 0xfffff8d1, 0x6809, 0x83dd, - 0x876d, 0x3c44, 0xffffe878, 0x3faf, 0x78f, 0xffff7a85, 0xffffc78b, 0xffffd711, - 0xffff9d6b, 0x79c8, 0xd65, 0xffffe3e3, 0x478, 0x7129, 0xffff7dda, 0xffffab18, - 0xffffcd44, 0xffff7cfc, 0x723a, 0x5c3, 0x3737, 0x3451, 0x650a, 0xffffa327, - 0xfd9, 0xffff7bae, 0x1f5b, 0x2978, 0x8c99, 0x4cd4, 0xffffb3d6, 0x4036, - 0x2a0e, 0x35ea, 0x50b, 0xffff9518, 0xffff85c1, 0xffffcdc6, 0xffffdc56, 0xffff8d75, - 0xffff90f3, 0x11cb, 0xffffa7dd, 0xffff884c, 0xffffc35a, 0xffffc3cf, 0xffffad4a, 0xffffc75a, - 0xffffa170, 0x8adb, 0x7441, 0xffffe8d1, 0x42b4, 0xffffe1ad, 0xffffdd4a, 0xffff98bf, - 0x4cc2, 0xffff8b07, 0x334c, 0x5e4d, 0xffffb14a, 0xffff9c04, 0xffffb744, 0xffffa616, - 0x187d, 0x495a, 0xffffb1c3, 0x524d, 0xffffc04b, 0x6110, 0x6dff, 0x55b8, - 0x8de1, 0x3394, 0x886f, 0xc21, 0xffff995f, 0xd71, 0xffff90e8, 0xffff983a, - 0xffff92d8, 0xffffcce2, 0xffff90e7, 0xffff94ff, 0x4e0b, 0xffff9334, 0xffffeacb, 0xffff8f75, - 0x48aa, 0x7631, 0xfffffbf9, 0xffffd3e0, 0x6850, 0xffffa651, 0xffff8745, 0xffffe780, - 0xfffff596, 0xfffffed5, 0x3b41, 0x55cd, 0x5a08, 0xffffa0cf, 0xffff75a0, 0xe58, - 0xffffff64, 0x6763, 0xffff8c5f, 0x69b7, 0x453b, 0xffffba78, 0x7554, 0x4fba, - 0x6031, 0x1ed6, 0x30a2, 0x3c52, 0xfffffc1a, 0xffffecfe, 0xffffa280, 0xffff9d76, - 0xffffa66c, 0xffff8dc0, 0xffffaa2b, 0xffffbc38, 0x1cd9, 0xfffff3fa, 0x7078, 0xfffffecb, - 0x800e, 0xfffffa73, 0xffff9a9f, 0xffffb5c5, 0xffffda01, 0x68c8, 0x7787, 0xffffe959, - 0xffffc008, 0x357a, 0x37fb, 0xffff9b65, 0x4df5, 0x8ad5, 0x53aa, 0xffffcc5a, - 0xffff74a9, 0xffffed23, 0x4c8e, 0xffffbd47, 0xb95, 0x774c, 0x5109, 0xffffd8ef, - 0x4095, 0xffffad7a, 0x8a82, 0x2d80, 0xffff8d9a, 0xd43, 0x6bf9, 0x223, - 0x3eed, 0xffffc475, 0x3854, 0xffffa438, 0x1ac0, 0x990, 0x50f8, 0xfffffce9, - 0xffff72ab, 0x41f2, 0x845e, 0xffffef06, 0x7241, 0xffffcf1a, 0x7888, 0x5bf5, - 0xffffc6a5, 0xffffdbe1, 0x1573, 0x65ba, 0x1f5a, 0xffff9e88, 0xffffef80, 0x580c, - 0xffff8254, 0x5da1, 0xffff7a42, 0x220e, 0xffff7947, 0xffff7a6b, 0xffffaa90, 0x7b4, - 0xfffff0e5, 0xf4, 0xd7c, 0x3754, 0xffffa34c, 0x4314, 0x4e93, 0x5f33, - 0xffffd600, 0x150b, 0xffff867a, 0x5eee, 0x54fd, 0x630d, 0xfffff8e2, 0xffffdd08, - 0xffffdd29, 0xffff7350, 0xffffbc1a, 0x1429, 0xffffda45, 0x3e79, 0xffffca86, 0x1523, - 0x620c, 0xa9e, 0xfffffdb9, 0xffffb00f, 0xffff82bf, 0xfffffb63, 0xffff78de, 0x25ad, - 0x54ac, 0x3831, 0x66b6, 0x696e, 0x4e31, 0xffff81c0, 0xffff854a, 0xa8e, - 0x8ce6, 0x52dd, 0xffffa6c6, 0xffffe575, 0xffff9907, 0xffff9743, 0x2156, 0xffff8199, - 0x76ea, 0x7361, 0x8d23, 0xfffffa98, 0xfffffb0d, 0xffffa7b3, 0x12e3, 0x4239, - 0x4aeb, 0x7461, 0xe02, 0x987, 0x68b5, 0xfffffc95, 0x7ac, 0x7238, - 0xfffff148, 0xfffff26d, 0x58f4, 0x50b3, 0xffff869d, 0xffff8582, 0x5d94, 0x30fd, - 0x1e62, 0x83ab, 0xfffffa33, 0xffffb49d, 0x18e9, 0x4781, 0x6d8, 0x7bab, - 0x1aef, 0x2ca6, 0x81a9, 0x2f34, 0x248d, 0xffff9a23, 0xffffdd8a, 0xffffd9a2, - 0xfffffba7, 0x754, 0xffffdbe5, 0x28cc, 0xffff9659, 0x2219, 0x6bea, 0xffffe7ad, - 0xffff856e, 0xffffd3c1, 0x14ff, 0x350, 0x42f3, 0xffffd69d, 0xffffb4b5, 0xffffccd7, - 0x6500, 0x2fb6, 0xffff95b5, 0xffffe293, 0x5baa, 0xffffc45a, 0xffffda2f, 0xffff8de6, - 0xffff87ec, 0x5f0e, 0xffffca76, 0xffffac52, 0xfffff9a4, 0xffff9e0d, 0x771a, 0xd62, - 0x32f3, 0x8367, 0xffff982d, 0x240a, 0x20d, 0xfffff430, 0xffffba8d, 0xffffb810, - 0xffffcfd1, 0x8044, 0xffffcba1, 0xffff9772, 0xffffee63, 0xfffffd51, 0xfffff324, 0x101e, - 0xffffe7c7, 0xfffffb15, 0xffffc5eb, 0x8585, 0x427, 0xffffcdbf, 0xffffcc26, 0x21fb, - 0xffff7c96, 0xffff7705, 0xffffb428, 0xffffa3f8, 0x3906, 0x5787, 0xffffd8af, 0xffffd7d1, - 0xffff77d7, 0x5504, 0xffff73a1, 0x116e, 0x32d8, 0x16f2, 0x5c09, 0xfffff98c, - 0x7350, 0x6462, 0xffffada1, 0x3f1b, 0x6378, 0xffff81e0, 0x2dd3, 0xfffff52a, - 0x8142, 0x89e0, 0xffff9fc6, 0xffff7bf1, 0xffffd116, 0xffffebf0, 0xd84, 0x1669, - 0xffff9bca, 0x5050, 0x6f8a, 0x2c50, 0x8590, 0x32fd, 0x6abf, 0x6af0, - 0xffffa4de, 0x2042, 0xffff9f0b, 0x726, 0xffffcb98, 0x12a1, 0x497b, 0xffffa677, - 0xfffff6f1, 0x2433, 0xffffebc9, 0xffffd8cd, 0x2939, 0x2438, 0xffff79b3, 0xffff9226, - 0xffff9ca1, 0x4884, 0x6fe7, 0x2f89, 0x812a, 0xffffa72e, 0xffffb33c, 0xffff815e, - 0xffff8866, 0x3b83, 0xfffff5b5, 0x3fb2, 0x8221, 0xffffd486, 0x2665, 0xffffa540, - 0x5ce5, 0x893c, 0x4b34, 0x1b5d, 0xffff8b00, 0x8b56, 0xffffb3ab, 0xfffff0d7, - 0x353f, 0x63ce, 0xffff9b0b, 0xffff9689, 0xfffffe5a, 0x50c5, 0x3f3d, 0x1917, - 0x3045, 0xffffdb17, 0x2f69, 0x7ecc, 0xffff7f93, 0xffffa392, 0x9ed, 0xffff94dc, - 0x11e, 0xffffdcb5, 0xffff934b, 0xfffff44a, 0xffffd194, 0xffffe03b, 0x5841, 0xffffd49a, - 0x26f3, 0xfffffc5a, 0x8d0e, 0x6441, 0x2fc5, 0xffffed7a, 0xffffe739, 0xffffd2ff, - 0xffffb541, 0xffff8f9e, 0x807, 0xffff8e7d, 0xffff85b9, 0xffff8fc7, 0x778a, 0x8451, - 0xffffa75f, 0xffffe5b1, 0x2aeb, 0x7fe6, 0xffffc2b3, 0x8534, 0x268a, 0x6711, - 0xffff8cf8, 0xffffd800, 0xffff7913, 0x7c1b, 0x4e76, 0xffffde5d, 0x1545, 0xfffff355, - 0xffffc1bb, 0x398c, 0xffff798a, 0xffffdc27, 0x40ed, 0xfffff8fc, 0xfffff918, 0x7ef5, - 0x5182, 0x8369, 0x47af, 0xffffd6d5, 0xffff7e09, 0xffffa12e, 0x5363, 0xffffce2c, - 0xffffdc79, 0xfffff095, 0xffff7760, 0x4905, 0xffffd192, 0xffff9ca8, 0x39dc, 0xffffd67b, - 0x680, 0xffffb5a4, 0xffffd7d7, 0xffffb5a5, 0x7fcd, 0x7305, 0xffff8e3b, 0x179d, - 0xffffebf4, 0xffffad3c, 0xffff791f, 0xffffb513, 0x7d2e, 0x361f, 0x1a0f, 0xffffd336, - 0xffff7531, 0xffff73ec, 0x8acc, 0x85bf, 0xffff8a29, 0xd3c, 0x392, 0x4482, - 0x7272, 0xffff8403, 0x7d3e, 0xfffff055, 0x6ae2, 0xffffc5b3, 0x74ac, 0x30f6, - 0xfffff4bd, 0x19ba, 0xffffc488, 0xffffeec2, 0x877, 0xa9d, 0xfc1, 0x57a0, - 0x4879, 0x175a, 0xffffa0c0, 0x533, 0x8765, 0x2d23, 0x7ae9, 0x1d9e, - 0x16b2, 0x58c4, 0xffffe64f, 0xffff79ba, 0x68cd, 0x5c30, 0xffffb8e0, 0xffffc5d1, - 0xfffff04f, 0x5fec, 0x19ca, 0xffff8c02, 0x15ab, 0x8897, 0xffffebeb, 0x70d7, - 0x1662, 0x8c83, 0x8bc8, 0x21c8, 0xffffa728, 0x6513, 0xffff92f4, 0xffffadb2, - 0x7a29, 0xffffe450, 0x2136, 0xffffc6db, 0x26e, 0x8221, 0x3097, 0x5883, - 0xffffa134, 0x8284, 0xffffa6d9, 0x1c76, 0xffff8524, 0x164e, 0xffffa415, 0xffff841e, - 0x309d, 0xffffd4e1, 0xffff99a3, 0x4e11, 0xffff90a2, 0x51bf, 0xffffec39, 0xffff9073, - 0xe4e, 0xffff7a6a, 0x26b0, 0x64e4, 0x1a95, 0xffffeed3, 0x8049, 0x67b0, - 0x23e0, 0xffffb836, 0xf72, 0x2c0f, 0xffffacff, 0xffffa183, 0x87b8, 0xffff7e3a, - 0xffffef41, 0xffff796e, 0xfffffd33, 0x4c73, 0xffffd590, 0xffffdfac, 0xfffff5fb, 0xffff9594, - 0xffffba62, 0xffffa2d2, 0x496a, 0x1501, 0xffff9a7a, 0xffffc542, 0xffff8a89, 0xffffdda6, - 0xffff7f5e, 0xffffbf34, 0xffffe1e1, 0xffffb26c, 0xffffe9c3, 0x67cc, 0xffffb506, 0x6416, - 0x454, 0x3724, 0xffff9c3d, 0x2f27, 0x45cb, 0x670f, 0xffff7969, 0xffffdc9e, - 0xffff87e1, 0x1948, 0xfffffe4e, 0x1fdd, 0xffffe119, 0x5c64, 0xffffc383, 0x1062, - 0x6828, 0x6dd8, 0x2238, 0x12d5, 0xffffd611, 0xffff8739, 0x137a, 0x52c6, - 0x441c, 0xffffc74c, 0xffffee23, 0x583a, 0xffffd369, 0x3c68, 0xffff99a0, 0xffffb914, - 0xffffbe62, 0xffffcd86, 0x1438, 0xffffe64d, 0x53da, 0x2358, 0x89f6, 0x6e04, - 0x459f, 0xffffb2a5, 0xffffdaf4, 0xfffface2, 0x6673, 0xfffff8df, 0x594d, 0xffffeedd, - 0xffffa520, 0xffff8687, 0x70b0, 0x5dba, 0xffffe645, 0x3bbc, 0xffff8028, 0xffffea28, - 0xffffc7ba, 0x36ca, 0x7c40, 0x34ce, 0xffff7a62, 0x10bf, 0x5ee1, 0xffff98ab, - 0x10be, 0x3b49, 0x8c53, 0x8386, 0xffff7a09, 0xffff7a77, 0xffff7acd, 0x2cc4, - 0xffff93aa, 0x574, 0xffffc3ed, 0x2586, 0xffffeca4, 0x750e, 0xffffb075, 0x6308, - 0x67ac, 0xffffc8a3, 0x49c1, 0xfffff006, 0x89c9, 0x4f36, 0x3909, 0xffffd5d0, - 0xffffe4c1, 0xffff7a19, 0xffff8552, 0x7a2b, 0xffff9d63, 0x88e9, 0xfffffde4, 0x190a, - 0xffff826f, 0xffffecd9, 0x1983, 0xffffe551, 0xffff92e2, 0x2c5c, 0xffffd03c, 0x4adf, - 0x6865, 0xffff7e20, 0xffffea03, 0x841d, 0x4e37, 0x3d59, 0x3171, 0x673a, - 0x1afc, 0xffffa098, 0xffffde36, 0xfffffbbd, 0x47a5, 0x65be, 0x3738, 0x2beb, - 0x3e11, 0x6cff, 0x8da8, 0x22a6, 0xffffdf4a, 0x1151, 0xffffc349, 0x3485, - 0xffffee00, 0xffff864e, 0x865, 0x5989, 0x4145, 0xffff8999, 0xffff835e, 0xffffc2ad, - 0x2f00, 0xffffdc98, 0x7dfe, 0xffffc2fe, 0x1234, 0xfffff5da, 0xffffd55c, 0x119e, - 0xffff7dc3, 0xffffb27e, 0x7aae, 0xffff7b34, 0xffffde8e, 0x797, 0xffffab7e, 0xffffe6ce, - 0x7685, 0x600f, 0x7285, 0x6045, 0xffffe2f4, 0x69e7, 0xffffdfd8, 0x14a, - 0xffffda78, 0xffffabc0, 0x89c3, 0xffffbeac, 0xc37, 0x6df4, 0xffffe0d2, 0xffffc632, - 0xffffa62e, 0xffff8d46, 0xffff78fa, 0x3003, 0xfffff74e, 0x42a9, 0xffffe8d6, 0xffff7863, - 0x6a8e, 0xffff8696, 0x1844, 0xffffa06f, 0xd36, 0xffffd8d8, 0xffffe27c, 0x387e, - 0x30fb, 0xfffff762, 0x808a, 0x2d5b, 0x6717, 0xffffff14, 0x845b, 0xffff9586, - 0x68b, 0xffffe56f, 0xffff96b9, 0x6295, 0xffffb26c, 0x2a02, 0xfffffd8b, 0x6b98, - 0xffff8ca4, 0x501a, 0x5f44, 0xffffa9ac, 0xffffa063, 0xffff9030, 0xffff80d2, 0xffffcd8c, - 0x4c8c, 0xffffc0f8, 0x397, 0x819c, 0x767c, 0x7d99, 0xfffff123, 0x1b50, - 0x2c29, 0xffffd70f, 0xffffcca8, 0xffffa017, 0xfffff2b7, 0xffff74f0, 0xffffa9ed, 0x233b, - 0x1516, 0xffffbb9f, 0xffff97bc, 0x23c4, 0xfffff299, 0x7db1, 0xa52, 0xffff9161, - 0xffff8541, 0xffff75a7, 0xe20, 0x7dd3, 0xffffcc27, 0xffff9e5e, 0xffffe9ee, 0xb6e, - 0xffffe271, 0xffffe9e6, 0x6d72, 0xfffffd38, 0xffffa167, 0x6246, 0x83b, 0xffffa571, - 0xaeb, 0xffff8759, 0xffffa37f, 0xffffea7c, 0x6061, 0x8b6c, 0xffffb904, 0xffff88ea, - 0xffffa8f7, 0xffffd266, 0xffffa1bf, 0x343a, 0x6f9c, 0xffffd56b, 0x37ef, 0xffff8566, - 0x4eb7, 0xffffd9b3, 0xffffd22e, 0x8af7, 0x1d78, 0xfffff575, 0x391e, 0x4836, - 0xffffeaf1, 0xffff89a2, 0x6ac6, 0x611f, 0x8458, 0x2af6, 0x588f, 0x8e5, - 0x8bf6, 0xffffac56, 0x35d8, 0x6e0, 0x371b, 0xffff7743, 0xffffc693, 0x146c, - 0xffff80e3, 0xffffb207, 0xffffe58c, 0xffff8e50, 0xffffb07b, 0xfffff121, 0xffff9b54, 0x5dd4, - 0x700d, 0xffffe8a8, 0xffffdc38, 0xffffe745, 0x3734, 0x1db6, 0xffff8353, 0xffff7e3b, - 0x8eb, 0x6019, 0x2c5c, 0xffff8bd0, 0x8a7f, 0x7bc1, 0xfffff710, 0x4002, - 0x3650, 0xffffce4a, 0xffff7cce, 0xb70, 0x359a, 0x3013, 0x362, 0xffffa441, - 0x5b8e, 0xfffffe99, 0xffff7813, 0x7fdf, 0xffff8fc1, 0x5912, 0xffff8122, 0xfffff92a, - 0xffff8c22, 0x46a0, 0x5d05, 0xffffc4c0, 0xffffbc37, 0xffff9f62, 0x3103, 0xfffffb57, - 0xffffdf3b, 0xffffbde0, 0xffffe2fd, 0xffffcb24, 0x7291, 0xffffc112, 0x305d, 0x60f4, - 0xffffc8ae, 0xffff7574, 0xffffe0d9, 0xe58, 0xfffffeba, 0x66e, 0xffff8463, 0x8643, - 0xffffa427, 0x405e, 0xffffa5f5, 0xffffcb8f, 0xffffb04c, 0xffff79aa, 0x1a22, 0xffff896c, - 0xffff7d81, 0x7bda, 0x6989, 0x3996, 0x870e, 0x3a69, 0x3b4a, 0xffff9e08, - 0x2c97, 0x7ebd, 0xffffbf71, 0x1973, 0xffffdf6b, 0xffffbad9, 0x196a, 0x81e8, - 0x1c4, 0x61c5, 0x76e9, 0x25c5, 0x5131, 0xffff9e6e, 0xffff9637, 0xffff7d1a, - 0x5111, 0xffffff97, 0xffff8424, 0xffffbf3b, 0xffffb4f9, 0x2eaf, 0x7b44, 0x409e, - 0xffffe706, 0x1099, 0x328c, 0x401c, 0x2e7, 0x5b34, 0xffffd2f2, 0xffff9853, - 0xffff7804, 0xfffff344, 0xfffff283, 0x8ce9, 0xffff8fc2, 0xfffff155, 0xffffe2fe, 0xffff9d35, - 0x846f, 0xffffe3cf, 0x53f2, 0x67e4, 0xffffb405, 0xffff9c2a, 0x69a7, 0xfffff279, - 0xffffcd7b, 0xffffe05c, 0x5f40, 0x7110, 0x5c7d, 0xffffc8b4, 0xffffb97c, 0xfffffd3e, - 0x6b8f, 0xffffa8f4, 0xffffe8d7, 0xffffee7e, 0xa4e, 0xffff8a06, 0x4499, 0x65, - 0xffff9c0e, 0xffffdb63, 0xffff9123, 0x1fdb, 0x424a, 0xffffecca, 0xffffbde3, 0xb4, - 0xffffd7b7, 0xffffbb82, 0xffffa8bb, 0xffffcf0c, 0x1c1, 0xffff87e5, 0xfffff7cc, 0xffffc4dd, - 0xfffff3f1, 0x86c6, 0x3063, 0xffffbf8c, 0x2ddf, 0x7a9, 0x3d41, 0xfffff150, - 0xffff9224, 0xffffe905, 0xffffbd32, 0x76c2, 0x4021, 0xffff86cd, 0xffff895a, 0xffffd092, - 0x3b93, 0xffffbf5b, 0xffffe7f1, 0x44e, 0x7e09, 0x514f, 0xffffdae2, 0xffff8ae4, - 0xffffd626, 0x8cf6, 0xffffc1e5, 0xffff8d3e, 0xffffc16c, 0x5b5, 0xffff8d48, 0x264a, - 0x6750, 0x5f3f, 0x442e, 0xfffff88b, 0xffffe7d2, 0x73ce, 0xffffffac, 0x3302, - 0x5125, 0x590c, 0xffffe068, 0xffffb765, 0x473d, 0xffffd9cc, 0x9ae, 0x3ae0, - 0xffffdd98, 0x4346, 0xbe1, 0x506e, 0xffffe5dd, 0xffff8b4d, 0x6ac3, 0x89a1, - 0x229b, 0xffffa8bf, 0xffffb463, 0xffffb8aa, 0xffffb1bb, 0xffff8205, 0x76ba, 0x1117, - 0xffffae9e, 0xddf, 0xffffaf93, 0x1661, 0x490b, 0xffff798e, 0x4d5f, 0xffffbca8, - 0x13c4, 0x814a, 0x8340, 0xfffffe42, 0xffffc27f, 0xb42, 0xffffbeae, 0x39a3, - 0x5caa, 0xffffd38d, 0x2dba, 0xfffffe91, 0x5451, 0x768d, 0x827a, 0xffffbf93, - 0x5ff2, 0xffffeaa2, 0xffffb0fc, 0x677a, 0xffff758a, 0xffffbcc6, 0xffff9166, 0xffff9b70, - 0xffffa468, 0x36bf, 0xffffbf31, 0x2f3d, 0xffffd890, 0xfffff4af, 0x3b4b, 0xffffc047, - 0xffff98b3, 0xffffea02, 0xffff9ed7, 0x45b0, 0x8c73, 0xffffa371, 0xfffff4fa, 0xffffe309, - 0x3fce, 0x3020, 0x7e45, 0x40bb, 0x506c, 0x63a1, 0x52cd, 0xffff7a93, - 0x3108, 0xffffbf0a, 0xffffe87a, 0xffff782f, 0xffffcb8e, 0x3e37, 0x619a, 0xfffff75a, - 0xffffeb8a, 0x621f, 0xffff87fb, 0x594b, 0x70ee, 0x519c, 0xfffffa39, 0x540b, - 0xffff9ea8, 0x5321, 0xffff9ba2, 0xffff8804, 0x1049, 0x6249, 0xffffc186, 0x6915, - 0x45ba, 0xffffc569, 0x1275, 0x1141, 0xffff7d0c, 0xfffff6a0, 0xc88, 0xffffd0cf, - 0x5493, 0xffffca10, 0x8ba5, 0x5479, 0x56a5, 0xffff72c4, 0xffffc49a, 0x1f28, - 0x26e2, 0x1842, 0x5690, 0xffff8ee0, 0xffff7d53, 0x1896, 0xffffbaf2, 0x724a, - 0xffffc881, 0x2913, 0xffff8e93, 0x1318, 0x288c, 0xffff985d, 0x70ef, 0xffffaa46, - 0x114b, 0x5357, 0x36e9, 0xffff8651, 0xffffb4bb, 0xffffd3a5, 0xffffe071, 0xffffbc9d, - 0x6d70, 0xffff93f4, 0xffff939a, 0xffffbf01, 0xffff9dd5, 0x3632, 0x22dd, 0x290a, - 0xfffff94e, 0xfffffd3f, 0x240b, 0x1dd7, 0xfffff422, 0xffffedb5, 0xffffae3f, 0x3131, - 0xffffb91a, 0xff0, 0xffffa875, 0xffffc56b, 0x7819, 0x2174, 0xfffffc53, 0xfffff477, - 0x6134, 0x4655, 0x94, 0xffffd1ee, 0xffff7e80, 0xffff82ef, 0xffffff54, 0x7000, - 0x1e7c, 0xffffc0d0, 0x84a4, 0x5a2, 0xffff7ba9, 0xffffd915, 0xffff757e, 0x2b2b, - 0x2182, 0xffff9958, 0x3d0d, 0xffffe4af, 0x5c62, 0x7512, 0x4e8, 0xffffa6ed, - 0x2f28, 0xffff8ff9, 0x1a0f, 0xffffd103, 0xffff85f6, 0x69f7, 0xffffb04f, 0x41fe, - 0xffffbc7e, 0x427b, 0xffffa03e, 0xffffee6f, 0xffff9910, 0xffffa897, 0xffff7e20, 0xffffc977, - 0x266c, 0xffffd8e3, 0x3c0a, 0x22b0, 0xffff92ff, 0x1b5d, 0x24f4, 0x3bb7, - 0x425b, 0xffff90a5, 0xffffb687, 0x156d, 0x58ef, 0x1b16, 0xffffd3e1, 0x582, - 0xffffb1b1, 0x691d, 0xfffff853, 0x4c0a, 0x4887, 0xfffffa27, 0xffffbdae, 0xffff8d31, - 0xfffffdb2, 0xffffd009, 0x6287, 0xfffff1ff, 0xffffa748, 0xffffccdf, 0xffffa977, 0x16dd, - 0x281e, 0x8047, 0x66a, 0x2c5a, 0xffff86b5, 0x854a, 0x2a5a, 0x70dd, - 0xfffffeb6, 0x873f, 0xffffdd1a, 0xffffaa65, 0xffff8ca8, 0xffff83da, 0x67c9, 0x4745, - 0x1b41, 0xffffebf0, 0xffff740b, 0x30d7, 0x2afa, 0xffff761e, 0x5539, 0x23e9, - 0xffffabd8, 0xffff931a, 0x408b, 0xfffff2cb, 0x67dc, 0xffff7807, 0xffff964a, 0x5288, - 0xffffc66d, 0x2366, 0x148e, 0x38cb, 0x157f, 0xffff8346, 0xffffb678, 0xffffc4f2, - 0x1549, 0xffffcdb8, 0xffffc5b7, 0xffffd59b, 0xffffd217, 0x6f4e, 0xffffb9ba, 0x8263, - 0xfffff2df, 0xffffd860, 0xffffd9d7, 0xffff9597, 0xffffec05, 0xffff81f3, 0x8be0, 0xffffe4a7, - 0xffff85a4, 0x2fc4, 0x86e9, 0x701, 0x61d3, 0x69ff, 0xffff7563, 0xffff76ce, - 0xffffc010, 0x822f, 0xffff7b66, 0x5e31, 0xffffc663, 0xfffff119, 0x15f0, 0x85d0, - 0x28f1, 0x3fd6, 0xffffa127, 0xffff9166, 0xffffb044, 0x2e04, 0x322c, 0xffffb132, - 0xfffff73e, 0xffffb6b0, 0x3ea8, 0xffffac4d, 0x4a5b, 0xffffa5e8, 0xffff7697, 0x16e, - 0x49ca, 0x1272, 0x4a93, 0x44ce, 0x53e2, 0xfffff35b, 0xffff778a, 0xffffd189, - 0xffffb7e4, 0x90c, 0xffff8795, 0xffff96e2, 0x73ed, 0x3b2c, 0x5db2, 0xffff761f, - 0xffffdc8b, 0x4a06, 0xffffa033, 0xfc9, 0xffffe5e2, 0x7fed, 0xffffca3a, 0x218d, - 0xffffcb3d, 0x2af8, 0xffffb770, 0x8b27, 0xffffcd03, 0x8615, 0xffff7dd4, 0xffff7494, - 0x7f51, 0xffffdf3d, 0xffffbc52, 0xffffa686, 0xffffe0e6, 0xffffd409, 0xffffcd88, 0x5d0f, - 0x6c9c, 0x77ed, 0x69e2, 0x30b8, 0xffff894c, 0xffffe9c1, 0xffffa2b0, 0xffffff92, - 0xffffeecb, 0xffff7486, 0xfffff3a4, 0x4b1a, 0x15cf, 0xffffd171, 0xffffce83, 0xffffb1f3, - 0x2d8f, 0xffffa1a2, 0xffff90d0, 0x10a2, 0x4e89, 0xffff730e, 0xffffb689, 0x8bf3, - 0xffffc917, 0x3a3c, 0x28c6, 0x7a05, 0xffffc793, 0xffff944b, 0xffff8c4f, 0x13b6, - 0x6540, 0x3b3c, 0x1b68, 0xa31, 0xfffffce2, 0xffffa0f0, 0x4d63, 0xa6, - 0x290, 0xffff7f48, 0xffffb06c, 0x5986, 0xffffe2e9, 0xffffe281, 0x6fd1, 0xffff9467, - 0xffffa53c, 0xffffda9c, 0xfffffb90, 0x8a9b, 0x55f2, 0x646f, 0x517f, 0xa33, - 0x1a6, 0xffff8fda, 0xffff890b, 0xffff81f3, 0xffffaac7, 0xffffd83a, 0x7f, 0x2782, - 0x6083, 0xfffff711, 0xffffe8c7, 0x5553, 0x55b7, 0x4d1, 0x56e4, 0xffff8f89, - 0xffffbab6, 0xfffff28b, 0x232b, 0x5139, 0xbe4, 0x3b5e, 0xffffa73f, 0xffffdf16, - 0xcce, 0x5e29, 0xca2, 0xffffd78f, 0xffff861d, 0xffff8ef5, 0x63a9, 0x3d30, - 0xffffb006, 0xffffa007, 0x4596, 0x2801, 0x4936, 0x2816, 0x3f0a, 0xffff92c9, - 0x145, 0x4f85, 0x2c8, 0xc72, 0x36a8, 0xffff81cf, 0xffffeffc, 0xffffde3f, - 0xffffd5f2, 0x5692, 0x60d4, 0x4861, 0x339d, 0x6449, 0xffffdd43, 0xffff8c56, - 0xffffeb4d, 0xffff98b3, 0xfffff4cf, 0x455a, 0xffffb995, 0xffffce66, 0x1dce, 0x1f3e, - 0xffff92ea, 0xfffff303, 0x5783, 0x4aae, 0x29e6, 0xc20, 0x78b9, 0xffff878d, - 0x637, 0xffffb102, 0xffff7e5e, 0x6193, 0x5e68, 0xffffd7d8, 0x654c, 0xffffe71d, - 0xfffff721, 0x339e, 0xffff7e57, 0x5529, 0xfffffcf2, 0xffffe584, 0x26cf, 0xffffce2b, - 0xffffff6b, 0x6600, 0xffffe4e1, 0xffffb27a, 0xffff7760, 0xffff8f2d, 0xffffb0b8, 0xffffc68b, - 0x6907, 0x1110, 0xffffef9b, 0x27, 0xb8d, 0x2872, 0xffffc27e, 0x1bfd, - 0x123a, 0xffffdb77, 0xffffa828, 0x4f0a, 0x6fd6, 0xffff7358, 0xffffafee, 0xffffc050, - 0xffffc121, 0x2dc7, 0xffffe42c, 0x8dbf, 0x2698, 0x7efd, 0xffff98d6, 0xffff9eea, - 0xffffec08, 0x16a3, 0xd9f, 0x6ccb, 0xffff7e32, 0xffff7561, 0x6907, 0x651b, - 0xffff9d8d, 0xffff826f, 0x5a7e, 0x7a70, 0xffff9108, 0x54c, 0x84d0, 0x4a6e, - 0xffffc829, 0x5726, 0xffff9518, 0xffffeb06, 0xdcf, 0x143d, 0x385a, 0xffff8005, - 0xfffff2a7, 0xffffcd4e, 0xffff8b6d, 0xffffec7a, 0x536b, 0xffff8148, 0xffff7ff7, 0x3098, - 0x6fd7, 0x6a8c, 0xffff83fd, 0x52ca, 0x8cc1, 0x251c, 0x3fd6, 0xffffd96c, - 0x26de, 0x710, 0xffff9146, 0xffff9808, 0xffff790a, 0x46c7, 0xffff9cf3, 0x290d, - 0xffffe6b9, 0xffff9078, 0xffff75f7, 0x678a, 0xfffff708, 0x26f2, 0xfffff7aa, 0x583f, - 0x2e8f, 0xffffb64c, 0xffffc0bc, 0xffffa35b, 0x264a, 0xffffc82c, 0xcfc, 0x7d89, - 0x11e0, 0xffffce25, 0xffff9499, 0xffff7aa5, 0xe3c, 0xac7, 0x81c5, 0x7159, - 0x8c01, 0xb5c, 0xfffffc6c, 0xffffa6c9, 0x8249, 0x7524, 0xffff735e, 0xffffce06, - 0x10c7, 0x6334, 0xffff7b8d, 0xffffa314, 0xffffce5d, 0x4f8f, 0x3a7e, 0x277f, - 0x17b8, 0x8cd8, 0xffff9909, 0xffffc891, 0x5de9, 0xffffc012, 0x54d6, 0xffff8015, - 0xffff90d5, 0x15d, 0x703e, 0x3236, 0xffffdd2d, 0xffffca7a, 0x43c6, 0xb61, - 0x6fd2, 0x336c, 0xffff9509, 0xffffa109, 0x17f4, 0x18a4, 0x38d9, 0x6b5e, - 0xffffe932, 0x1fee, 0xffffd6a5, 0xffffeb7f, 0x5284, 0x1655, 0x15c9, 0x1fc6, - 0x6cd5, 0xffffa187, 0x60f5, 0x7248, 0xffff814d, 0xd14, 0x884e, 0xffff8616, - 0xffffab6c, 0x8c75, 0x1005, 0x57fc, 0xffff9c74, 0x84f, 0xffffb6a1, 0xffffd988, - 0xffff7530, 0x782, 0xffffa7be, 0xffff9cf5, 0x1497, 0xffffd560, 0xffffe680, 0xffffdf92, - 0x2ead, 0x8694, 0xffff9c30, 0x3b22, 0xa82, 0x1f5d, 0xffffba52, 0x5743, - 0xffffb4ee, 0xffffd01e, 0x119a, 0xffff7eff, 0x86da, 0x3771, 0xffffbc56, 0xffff89e1, - 0x483, 0xffffdbd8, 0xffffc090, 0x225, 0xac3, 0x4c86, 0x26f7, 0xfffff1fa, - 0xffff76a6, 0x2bb6, 0x6553, 0xffffb0ba, 0x1b0e, 0x4f6f, 0xffffc8f3, 0x787f, - 0x8416, 0x392, 0x18cd, 0xffff8c51, 0xffffb50d, 0xfffff2e8, 0x74bb, 0xffffc84a, - 0xffffca8d, 0xffff8508, 0xfffff79a, 0x5867, 0xffffbde9, 0xffffc76c, 0x5966, 0xffffa1a3, - 0x3ef6, 0xffffaf76, 0xffffb2a6, 0x62b4, 0xffffaf21, 0x1f61, 0xffff8de2, 0x6ae4, - 0x1711, 0x2848, 0xffffc6e4, 0xfffff285, 0xffffce37, 0xfffff33d, 0x10fa, 0x14a2, - 0x8c4b, 0x56d5, 0x6170, 0x2ce9, 0x10d8, 0x350e, 0x3e1e, 0xffffa4e0, - 0x5090, 0x8035, 0x43bb, 0xffffc129, 0x1cdb, 0x7cf4, 0x5897, 0xffffe38a, - 0xfffffda4, 0xffff8f8f, 0x1711, 0x73fe, 0x641b, 0x24f7, 0x53da, 0x3e9d, - 0xffffdd78, 0xffff857b, 0x34e7, 0x7881, 0xffffecc8, 0x80b8, 0xffffd388, 0xffffe600, - 0xffffea29, 0xffffecc9, 0xffff8b09, 0xfffffb67, 0xffffa4ea, 0x6e11, 0x631b, 0x332, - 0xffffcdfd, 0x1236, 0xaf1, 0x720, 0x2ab7, 0xffffa89c, 0xffffeab4, 0x65c1, - 0xffffff40, 0x203b, 0x2c2, 0x4c30, 0xffff94df, 0xffffe58b, 0x71fa, 0xffff8350, - 0xffff888f, 0x33d, 0xffffa878, 0x3d07, 0x199c, 0x644b, 0x5d3d, 0x2c5, - 0x783b, 0x855d, 0xfffffe0f, 0x29cf, 0x4bcf, 0x2631, 0xfffff8a4, 0xffffdd94, - 0x1d61, 0xfffffafc, 0xffff7e05, 0x24a0, 0xffff8a5a, 0x262a, 0x5c5b, 0x229f, - 0xffffe6a8, 0xffffcde6, 0xffffa684, 0x178, 0x37cf, 0x534, 0x190a, 0x86d9, - 0xffffd70b, 0xdf9, 0x8a0d, 0x7218, 0xfffff793, 0x420e, 0xffffa733, 0x811f, - 0xffffa1b0, 0x8cfc, 0xffffb39f, 0xffffb277, 0x8c8d, 0x188, 0x4b59, 0x660c, - 0xffffc5c1, 0xffffc2c9, 0xffffe996, 0x2fd7, 0x1650, 0x6209, 0xffffa6a9, 0x4c28, - 0x7291, 0x587e, 0x4ef5, 0xffffaa02, 0xffffb81c, 0xc34, 0xffff79d4, 0xbe0, - 0x6bc9, 0x49c7, 0xffffb6eb, 0x120a, 0x455f, 0xffffa242, 0x19e1, 0x5b62, - 0x5cec, 0xffff8be5, 0xfffff857, 0xffffc764, 0xa02, 0xffff8856, 0x702c, 0xffff7b18, - 0xffff85d1, 0xdb3, 0x6296, 0x3ef2, 0x55a0, 0xffffe47a, 0x3213, 0xffffdcb1, - 0x2a00, 0x2c6d, 0xfffff530, 0x77d2, 0xfffff051, 0xffff82cc, 0xffffe0f7, 0x603e, - 0xffffcdcf, 0x3ee8, 0xffff9788, 0x4ee3, 0xffff8a08, 0x44d7, 0xffffae63, 0xffffa7bc, - 0x151e, 0x5de1, 0xffffe129, 0x7ec1, 0xffff82e1, 0x7a8a, 0xffff7c0f, 0x866a, - 0x1c48, 0x63fd, 0xfffffdf7, 0x681d, 0xffffeb26, 0x6d6c, 0xfffff7b5, 0x63e, - 0xffffcbab, 0xffffedcd, 0xffffe5d6, 0x4967, 0x834b, 0x28eb, 0x6365, 0x7e4b, - 0xffffd7aa, 0xffff759e, 0x5cad, 0x22f6, 0xffffa019, 0xffff7a60, 0xffffb158, 0xffff9830, - 0xffff88fa, 0x5381, 0xffff9edf, 0xffffb70e, 0xffffb5e0, 0x28b9, 0xffffd778, 0x4aa9, - 0x1029, 0x4de8, 0x85a, 0xffffa5af, 0xffff9598, 0x694a, 0x442f, 0xffffc325, - 0x1646, 0x40b4, 0x51b0, 0x50c4, 0xfffff810, 0x6afc, 0x1611, 0x7c33, - 0x2c36, 0xffffadd9, 0xffffff75, 0xffffa472, 0x2a6f, 0x1ea3, 0x5389, 0x42ec, - 0xffff7734, 0x10df, 0x7e19, 0xffffbe25, 0x45dc, 0x52d1, 0xffff7b84, 0xfffff9d9, - 0x202c, 0x6f8c, 0xffff96b0, 0x4581, 0x13a9, 0x7c2c, 0x2c73, 0x456a, - 0xffff90d7, 0xffff918e, 0x4daf, 0xffff883f, 0x292d, 0xffffd140, 0x4599, 0x7022, - 0x6e51, 0x6fd8, 0xffffcc81, 0x55a, 0xffffb012, 0xffff8234, 0xffff8e12, 0xffff866e, - 0xffff82ab, 0x3a12, 0x77f1, 0xffff8e5c, 0xffffb9db, 0x8114, 0xffffb4d1, 0xffffaa27, - 0xffffef2b, 0x512b, 0xfffff599, 0x2614, 0xffffec61, 0x2e53, 0xffffe14a, 0x8762, - 0x15ea, 0xffffa04a, 0xa9c, 0x3db3, 0xffff9da7, 0x1ba7, 0x6f1, 0x7046, - 0x40d8, 0x2807, 0xfffff498, 0x4003, 0xb8b, 0x80d9, 0xffffc968, 0xffffb091, - 0x6a11, 0x575d, 0xffffbd30, 0x59b7, 0xffffec68, 0x3bc3, 0xffff9852, 0x8d97, - 0x3bdd, 0xffff7b05, 0x3a08, 0x796a, 0xffffde73, 0x23d7, 0xffff937c, 0xffff8364, - 0x2c86, 0xfffff529, 0xffffb941, 0x4f9f, 0x300a, 0xffffb69a, 0xffff8ae2, 0xffff76f4, - 0x6281, 0xffff7a7f, 0xffff8cae, 0x6a9b, 0xffffc3e3, 0x6b24, 0x1a7f, 0xffffbbaa, - 0xffff9898, 0xfffff100, 0xffff9a77, 0xfffffeb5, 0x8062, 0x26f6, 0x72a6, 0x82a8, - 0xffff8d48, 0xffffad0b, 0xffff78ed, 0x39d9, 0xffff8cbd, 0xffffe4fb, 0xffff73d3, 0xffff8749, - 0xffff7787, 0x186d, 0xffff8a66, 0xffffd430, 0x675d, 0x6208, 0x1e0a, 0xffffd207, - 0x7627, 0x272d, 0xffffe162, 0xffff7f78, 0xffff97cd, 0xffffe52f, 0xffff9648, 0xffffbde7, - 0x4a2, 0xffffab13, 0x408e, 0xffffaf5a, 0xfffffccf, 0xffffcaee, 0x3ce9, 0xffff9f86, - 0xffffbdf6, 0x6f7d, 0x1ac0, 0xffff7d8f, 0xffffb5f4, 0x15d5, 0xffffb317, 0xffff8d69, - 0xffffd179, 0xffff9256, 0xffffaed4, 0xfffffd69, 0xffffe67c, 0x8a5d, 0xffffb985, 0x7bd5, - 0x1eaa, 0xffff7ea6, 0x7a6, 0xffffcc73, 0x45fe, 0xffff9312, 0xffff8963, 0xffffcd75, - 0x3534, 0x29af, 0xffffa890, 0xffff81d1, 0x3c3a, 0xffffcbc4, 0x43ba, 0x320c, - 0x70c6, 0x2ec5, 0x189d, 0xffff768f, 0xfffffcf4, 0x3ea8, 0x8212, 0xffffabef, - 0xffffc162, 0x22d4, 0x5755, 0xffffc5a0, 0x87f4, 0xffffb7da, 0xffffa9f3, 0x6eb4, - 0x1abc, 0x5caf, 0x3043, 0x4be4, 0x557b, 0x18e5, 0x2499, 0x7f, - 0xffffcd2d, 0xffffd93e, 0x3af4, 0xffff8c49, 0xffffc5a9, 0xffffb1ba, 0xffff9c0c, 0x18ba, - 0x2cbe, 0xffff8efc, 0xffffa34b, 0x3b05, 0x49d, 0xffffe7b4, 0xffffd9de, 0xfffff909, - 0x5f8, 0x3651, 0xffff7d02, 0x5eda, 0xffffb6f3, 0xffffaa6d, 0x201e, 0xffffc0d0, - 0xd3c, 0x11dd, 0x8c01, 0xfffff81f, 0x84fb, 0xffffe312, 0x7cdc, 0x6d33, - 0xffff8b40, 0x79af, 0xfffff0d5, 0xffffe4ee, 0x73a8, 0x20e6, 0xffff927f, 0x8592, - 0xffffb092, 0x5012, 0x76b, 0xffffa971, 0x8ba1, 0xffffb512, 0x22f3, 0x8ae3, - 0x4217, 0x70e6, 0xffff8854, 0xffffa794, 0x69dd, 0xffffea58, 0x30f6, 0xffffa42d, - 0xffff9908, 0x5e1e, 0x2fd4, 0x329, 0x775a, 0xffff95b2, 0xffffa71e, 0xde7, - 0x2e22, 0x776e, 0x16d4, 0xffff8616, 0xffffb167, 0xffff85b5, 0x57da, 0x72eb, - 0xffffbaf7, 0xffffc299, 0x59ef, 0xfae, 0x1907, 0x4adb, 0x7242, 0x5bd3, - 0x189e, 0x5ad4, 0xffff8e3c, 0xffffedaa, 0xbe0, 0xffffffdc, 0xd45, 0x2ef8, - 0xffff7cd2, 0xffffaddd, 0x685a, 0x832e, 0xffffcf75, 0xffffd4dd, 0xbd6, 0x149f, - 0x3cdb, 0x7691, 0xffffc1e2, 0xffffa1c4, 0x7548, 0xffffa014, 0xffffe53b, 0xfffff6f1, - 0xffffeecb, 0xffffa681, 0xffffafc8, 0x6811, 0x875b, 0x1578, 0xffffdcbe, 0xffff8206, - 0x483f, 0xffff7c5c, 0xffffbf83, 0x2b71, 0x7789, 0xffff733b, 0xffffe5d4, 0x5b88, - 0x7751, 0xffffc109, 0x4a86, 0x7284, 0x67d8, 0x28d4, 0xffffa41e, 0xffff7baf, - 0x761d, 0xffffff5a, 0x3e9e, 0x4e25, 0x2a7a, 0xfffff846, 0xffff873f, 0x43a9, - 0xffffeeea, 0xffff840b, 0x716f, 0xffffacf0, 0x5da3, 0xffffb902, 0xffffaf05, 0x4b57, - 0x73da, 0xffff956d, 0x4cf1, 0x7716, 0x33dd, 0x464, 0xffffeb6c, 0x4007, - 0xfffff3b4, 0x1fe3, 0x721, 0xffffe758, 0xffffabb3, 0x19d8, 0xffffbc97, 0xffff751d, - 0x7cc7, 0xffffb5e3, 0xffff8625, 0x8590, 0xffff8fb2, 0x168b, 0x8a88, 0x5368, - 0x7a0a, 0xffffff50, 0xffff7c26, 0x2c26, 0x5a95, 0xffffd991, 0x19e2, 0xffff7a6d, - 0x3e4b, 0x2e49, 0x4b7a, 0xffffcaf0, 0xffffff91, 0x1fc2, 0x4ed5, 0xfffff2a5, - 0xffffcc85, 0x52ac, 0xffffcef3, 0x13ae, 0xffff7590, 0x4c03, 0x860a, 0x1715, - 0xfffff3b6, 0x3e42, 0xec, 0x5e30, 0x7f7b, 0xffff8325, 0xffffcc59, 0x3c5a, - 0x1730, 0xffff84b9, 0x543c, 0xffffc431, 0x210c, 0xffffff67, 0x3247, 0x78fa, - 0x6646, 0xffffb35a, 0xffffebe6, 0x74d8, 0xffff7d83, 0x696b, 0x2502, 0xffff898c, - 0xffffa4a3, 0xffffe1a7, 0xffffd2c6, 0xfffff1db, 0x8425, 0x4794, 0xfffff992, 0x5bec, - 0xffff999e, 0x4e2, 0xffffa80f, 0xffffee33, 0x6505, 0xfffffe03, 0xffffb529, 0x14ad, - 0xffff8511, 0xffffd437, 0xffffd6f4, 0xffffa716, 0x6fbe, 0xffffb2c5, 0x28fb, 0x9a7, - 0xffff72d3, 0xffffe490, 0x7ad4, 0x534e, 0x883e, 0x69a3, 0xffff9ebc, 0x36c1, - 0x3ac1, 0x8cc2, 0x4363, 0xffff980d, 0x42a1, 0xffff94ce, 0x7fa5, 0x59d0, - 0x2d35, 0xffffaddc, 0xffffc82e, 0x679d, 0xffffff04, 0xfffff390, 0x75c1, 0xfffff28e, - 0xffff8261, 0x7609, 0x6cc6, 0xffffeb00, 0xffffcdb1, 0xffff97c2, 0x2ec8, 0x7a4d, - 0x5a53, 0x4a2b, 0xfffff160, 0xffff7c7e, 0x8af1, 0xffffa8aa, 0x8a2, 0xffffd8c4, - 0x15e7, 0xffffa490, 0x35bb, 0x3846, 0x8b8f, 0xfffff39f, 0x115f, 0x26ed, - 0x3580, 0xffffdd48, 0xffff763b, 0xffffa8ec, 0xc2d, 0x7e4, 0x73c, 0xffffec28, - 0xffffb1ff, 0xffffd69c, 0xecc, 0xffff8a47, 0x1570, 0x5278, 0x7478, 0xffffa96c, - 0x87f7, 0x6c6d, 0xffff9c2a, 0x3e44, 0x4451, 0xffffe66f, 0x77a7, 0xffffa196, - 0xfffff4c8, 0x4d8, 0xffffda98, 0xffffb107, 0xffffe5f6, 0xffffd073, 0xfffffb60, 0xffffd970, - 0x7134, 0x1b66, 0xfffffed6, 0xfffffffb, 0x2f5d, 0xffffc33f, 0xffffb63a, 0x17aa, - 0xffffb6c7, 0xffffb5dd, 0x9a7, 0xffffb6ee, 0xffffce02, 0x4f50, 0xefc, 0xffffe4de, - 0xffff9e9b, 0xffffd397, 0xffffabfb, 0x771d, 0x7313, 0xffff8f5d, 0xbc, 0xffffa767, - 0xffff7a43, 0x1a04, 0x7e99, 0x5029, 0x2c61, 0xffffcf61, 0x6e6f, 0xffff8786, - 0x832e, 0xfffff079, 0x76f0, 0x6720, 0xb72, 0xffffc9bb, 0xffffb384, 0x8b40, - 0x4f6f, 0xffff9c0e, 0xffff7248, 0x8721, 0xffffb61c, 0x3264, 0x4af3, 0x26fa, - 0xffff78cb, 0x3f99, 0x519b, 0x3d38, 0xffff9e3c, 0x6363, 0xfffff082, 0x61, - 0x80e3, 0x882c, 0x1ad9, 0xfffff42c, 0xffffe5d7, 0xffff78aa, 0x7f81, 0x6333, - 0xe4b, 0x99, 0xfffff37c, 0xffffd8b0, 0x5f1f, 0xffffa399, 0x2fe4, 0x413f, - 0x2fb, 0x2d48, 0xffff9550, 0xffffd960, 0x8c72, 0xffff83f3, 0x3d50, 0x85ec, - 0xffffb965, 0x1cdd, 0xffff8626, 0xffffa6c0, 0xffffa058, 0xffffb314, 0x77c1, 0xffffa6dc, - 0x73d6, 0xffffbbbb, 0xfffffbf9, 0xffffcf13, 0xffffd10c, 0x8c3e, 0x5f5c, 0x4af5, - 0xffffd141, 0xffffd407, 0xffffc119, 0xffff86b0, 0xffffb16c, 0xfffff4f1, 0x404a, 0x6bab, - 0xffff9021, 0xffffd5f5, 0xffff87b0, 0xfffffb85, 0xffffbc33, 0x3ef, 0x16dd, 0xfffffc0a, - 0x346, 0xf7b, 0xffffb212, 0xffffe5b9, 0x1c45, 0x5a37, 0xffff8f95, 0xffffccda, - 0x11d2, 0xffff74a0, 0x52c1, 0xfffff70b, 0xffff90dd, 0x5ab1, 0x3ecb, 0x70d0, - 0x8ac4, 0xedb, 0x1091, 0xffff874d, 0xffffdce4, 0x4603, 0x157f, 0x4db, - 0xffffb596, 0x5604, 0xffff7a31, 0xffffe7e6, 0x3bc2, 0x1ec0, 0x861, 0xffffbb57, - 0xfffff94b, 0xffff9fb4, 0xffffea52, 0xfffff479, 0xffff9909, 0xffffa95f, 0xffffa074, 0x8889, - 0x198b, 0x56f4, 0x3423, 0x8241, 0xffffe3ff, 0xffff881a, 0x4e97, 0xffffcf1b, - 0xffffa603, 0x3957, 0xfffff6d5, 0xfffff0b2, 0x8464, 0x1f13, 0xffffe04e, 0x3ed2, - 0x1636, 0x19df, 0xffff9d9c, 0xffffb4af, 0xffff764e, 0x787f, 0x42a6, 0xffffda01, - 0x5a29, 0x8d78, 0x5fae, 0xffffe92e, 0xfffff130, 0x7c51, 0xffffbf50, 0xffffb867, - 0x2ddf, 0xffffb349, 0xffffd0e9, 0x6b0b, 0x6d50, 0xffffd468, 0xffffa3b0, 0xffff97d8, - 0x1960, 0xffffdbbb, 0xffffa4af, 0xffffbd37, 0x2ef3, 0x2437, 0xffffd17e, 0x13e5, - 0x54e0, 0xffffc59f, 0x22bb, 0xffff780f, 0x6239, 0xffff7d96, 0xffffda9d, 0x6e34, - 0xfffface6, 0x295a, 0x2719, 0xffffda03, 0xffffabc0, 0x23a3, 0x1cf2, 0xffffaa50, - 0xfffff1aa, 0x6565, 0x75b1, 0xffffc795, 0xffffb3d6, 0xffffac07, 0xffff8ab8, 0xffffe135, - 0x6be2, 0xffff9a21, 0x66be, 0x1ede, 0xffff9b45, 0xffffddb2, 0x19d9, 0xffff9a42, - 0x1470, 0xfffffd5c, 0x1e7e, 0x6407, 0x6ab4, 0x9cd, 0x1ce7, 0x7246, - 0xffffcc0e, 0x334a, 0x8d32, 0xffffdd26, 0xffff876d, 0x5f42, 0xffffce4d, 0x746f, - 0x23a2, 0xffffbddd, 0x1b98, 0xffffc9e3, 0xffff921c, 0xffffb30e, 0x3477, 0xffffa587, - 0x4067, 0x18a0, 0x361e, 0xffd, 0xffff880f, 0xffffef9a, 0xffffce51, 0x3ed, - 0x139b, 0x4957, 0xffffc1b0, 0x5718, 0x4e72, 0x898c, 0x1e76, 0xfffffc63, - 0x5a7e, 0x3388, 0xffff8b15, 0x8c3, 0x42ed, 0xffff9b9a, 0x1fff, 0xfffff544, - 0x66a4, 0xffff7c9f, 0xf3d, 0x8823, 0xffffab00, 0x8d96, 0xffff9a08, 0x16d3, - 0x55a3, 0xffffc3a3, 0x5f6e, 0xffffa6c2, 0xffff982e, 0xffffe233, 0x3b85, 0x4b3b, - 0xfffff53f, 0x31d2, 0x58f0, 0x8345, 0xffffb052, 0x8516, 0x1013, 0x3e91, - 0xffffdf3d, 0xffffb256, 0xffff8937, 0x7307, 0x6544, 0xffff9898, 0x26fc, 0x7aaa, - 0x5d8c, 0x45c4, 0x8168, 0xffffe0d2, 0xffffa15f, 0xffff8c32, 0x23e2, 0x2f6d, - 0x4e73, 0x5b19, 0xfffff7a0, 0x1530, 0x8a57, 0x5994, 0x7668, 0x8658, - 0x7810, 0x5ae5, 0xffffdd59, 0xffffe2e3, 0x6ade, 0xffff84ab, 0x2286, 0x3324, - 0x34d6, 0x6fa3, 0xffff9c8c, 0x1649, 0xffff9152, 0xffffde80, 0x140c, 0xffffe31f, - 0xffffab3a, 0x85b6, 0x870d, 0x21cd, 0x33ee, 0xffff8aa8, 0xffffcb20, 0x584, - 0xffffcdb5, 0x4b6c, 0x4b54, 0x559c, 0xffffc9b9, 0xffffc227, 0xffff93ec, 0xffffaf9c, - 0x2314, 0x4cd1, 0xffff9b8a, 0xffffa7f7, 0xffffe946, 0x6412, 0x8698, 0xfffff049, - 0xffffe24f, 0xffffbc02, 0xfffff5dc, 0x248b, 0xffffa1a1, 0xfffff591, 0x17f8, 0x7c7f, - 0x2a38, 0xffffc4b7, 0x50f4, 0x4567, 0xffffe9b3, 0x1139, 0xffffdc63, 0xffffaf43, - 0xffff921e, 0x38b5, 0x6f7c, 0x7e35, 0x4cb7, 0xffffdbdb, 0xfffffc86, 0x14e0, - 0xffffb500, 0xffff8fd7, 0xffffc44e, 0xffffe8ae, 0x615, 0x73de, 0x513c, 0xffff8c2d, - 0xffffa65e, 0x733b, 0xffffaa1a, 0xffff9823, 0x390f, 0x81e5, 0x6388, 0x2547, - 0x618c, 0xffffc2b5, 0xfe5, 0x61cf, 0xffff8162, 0xffff8c51, 0x8872, 0x5eae, - 0x5a61, 0xffffab35, 0xffff790b, 0xffff894f, 0xffff7e7f, 0x2ef3, 0xffffa954, 0xffff94a3, - 0xffffec89, 0xffffe3e7, 0x886c, 0xffff9f5c, 0x6429, 0x5828, 0xffffb33b, 0x38d4, - 0x3fb6, 0xffffe5df, 0x5e4, 0xffffa316, 0xffffdea1, 0xffffefe5, 0xbb0, 0xf7c, - 0xfffff415, 0x7f2, 0xfffff4ab, 0x8d31, 0xffffb9b1, 0xffffbbdd, 0xffffc868, 0xfffff245, - 0xffff91ae, 0x62db, 0xffffd076, 0xffffc4c5, 0x5575, 0x43af, 0xffffe6f3, 0x7cc1, - 0x6c8b, 0xffffb56c, 0xffffe101, 0xfffffe07, 0xffff8a88, 0xffff9931, 0xfffff933, 0xffffd4bd, - 0x355e, 0xffffd3df, 0x1e2d, 0x5b90, 0x6ce5, 0xffffff81, 0x5d0e, 0x514b, - 0xffffa086, 0x1caf, 0x300d, 0xffffc1e2, 0x357c, 0x2820, 0x4be, 0xffff9c0b, - 0x2e68, 0xffffb03b, 0x8ab1, 0x2aed, 0x3cc8, 0xffffa250, 0xffffca57, 0xffff8fe0, - 0xffffbc0e, 0xffffa87c, 0x3681, 0xffffff03, 0x6f96, 0xfffff6e8, 0x3818, 0xffff91eb, - 0x460a, 0xffffc57c, 0x23bf, 0xffffa010, 0x6ae0, 0x38fa, 0x6c95, 0xffffe509, - 0x2594, 0xffff892e, 0xffffd6fd, 0x4dbf, 0xffff7bca, 0x595b, 0x5265, 0xffff722c, - 0xffff9bbe, 0x6f1b, 0xffffa0d6, 0xffffb61d, 0xfffff32c, 0xac6, 0xffff8448, 0x37b3, - 0xffffb59c, 0x6132, 0xffff820a, 0xffffb87e, 0x7e80, 0xffffddb7, 0xffff84db, 0xffff868b, - 0x1498, 0x5ece, 0x4761, 0xffffbe71, 0xffff7b6f, 0x2492, 0x6b0e, 0xfffffcba, - 0xa45, 0xd5d, 0x361d, 0xf45, 0x82fe, 0xffffd7cf, 0xffffc64e, 0xffff8ad6, - 0xffffb43b, 0xfffff00e, 0xffff7b5b, 0xffff9858, 0x3756, 0xffffe97b, 0x6167, 0x52b9, - 0xfffffc14, 0x4bf6, 0x2c11, 0x5c7b, 0x75fc, 0xfffff1b7, 0x47f4, 0xffffc8ca, - 0x5fbc, 0xc3f, 0xffff9e06, 0xffffb109, 0xffff791e, 0x6661, 0x8942, 0xffff92b4, - 0xd4f, 0x15a8, 0x625d, 0x3878, 0xffff9a70, 0x636b, 0xffffad1a, 0xfffffc36, - 0x1abe, 0xfffff303, 0x4b0a, 0xffffe7cc, 0xffff904c, 0xffffe288, 0x5acd, 0xfffff71e, - 0x3252, 0xce1, 0x2db2, 0xffffc97a, 0xfffff8e7, 0xffffbb28, 0x7a7d, 0x6ed5, - 0xffffae7d, 0x8dbe, 0xffff744e, 0xffff8e03, 0x6cb, 0x86a7, 0xffffdc22, 0xffffd8fb, - 0xffffd18d, 0x4626, 0x8c87, 0xffffc3ae, 0xffffb882, 0x689a, 0x3791, 0xffffc0a0, - 0x7223, 0x3c, 0x8fe, 0xffff9ecf, 0xffffd89a, 0xffff7e2d, 0xffffa145, 0x56e7, - 0xfffffb34, 0x480c, 0xffffb7b6, 0x4d54, 0xffffc5f6, 0xffffde25, 0x4d3e, 0x7302, - 0xffffdb67, 0x4fb7, 0xfffffb02, 0x8765, 0xffffab7b, 0xda7, 0xffffb04f, 0xffffc9e5, - 0x15b6, 0x2718, 0xffffc98c, 0xffffe2eb, 0x8011, 0x8b74, 0x7aa7, 0xa1a, - 0x5d48, 0xffff9ffa, 0x1d7, 0xffffef63, 0xffff9746, 0x7c5b, 0xffff816e, 0x6c68, - 0x156f, 0x85b8, 0x16bc, 0xffffc689, 0xffff8006, 0xffffe2ec, 0xfffff102, 0xffffeb7d, - 0x8956, 0xfffff640, 0x4713, 0x7bad, 0x41bb, 0xffff9f79, 0x3691, 0xffff7b9d, - 0x7ca6, 0x5c98, 0x81e4, 0xffff9084, 0x7825, 0x543a, 0xffff8b4b, 0xffffd2f9, - 0xffff7f0a, 0xffff7655, 0x665e, 0xffffd3df, 0xffff8b05, 0x2da3, 0x2c10, 0x4dcf, - 0x23e0, 0x4e27, 0x5fb6, 0x82f3, 0xffffe5cb, 0x6d98, 0xffff9691, 0xa4a, - 0x3f51, 0x2573, 0x894c, 0xffff8107, 0x5091, 0xffffe034, 0x83db, 0x2029, - 0xffff8d63, 0x6ee6, 0xffff92d2, 0xfffffe7e, 0x5f72, 0x6704, 0xffffd1f6, 0x4d40, - 0xffffb1f6, 0x2766, 0x4b84, 0x7e47, 0x728a, 0x51f7, 0xffff9a48, 0x1149, - 0xffffc964, 0x456f, 0xffffa797, 0x6112, 0xffff7e4c, 0xffffea92, 0x8a8b, 0xffffc9bf, - 0xffffbc0c, 0x6591, 0xffffd69c, 0xffffe54f, 0xffff7adb, 0x581b, 0xffffad1f, 0xffff9607, - 0x3e51, 0xffffe644, 0x80a4, 0x272e, 0xffffd8d5, 0x4c15, 0x639a, 0x7345, - 0xffff7d10, 0x1f97, 0xffffe213, 0xffffcd19, 0xffffb907, 0x7196, 0x348c, 0xffffcd02, - 0xffffc4b0, 0xfffff3d3, 0x56d5, 0xffff7712, 0x2415, 0x19c9, 0xffffaa34, 0x5be0, - 0xffffbe3d, 0x3edb, 0xffff7ba6, 0xffff8704, 0xffff9b22, 0xffff7398, 0x1ad2, 0x2b12, - 0xfffffa9e, 0x82a0, 0x289f, 0x20c1, 0xffffa302, 0xffff8bac, 0x5528, 0x5b36, - 0xffff9f0e, 0x300, 0x76ab, 0xe31, 0x54dc, 0x14c2, 0xfffff3f7, 0xffff9727, - 0xffffb8a1, 0xfffffd6c, 0x668c, 0x12ce, 0x5e2b, 0x837f, 0x79d9, 0xffff9f2c, - 0xffffe8c0, 0x5569, 0xffffa931, 0xffff9828, 0x5447, 0xe70, 0xffffc612, 0xffffbdc8, - 0xffff8100, 0xffff948f, 0xffffd762, 0x165, 0x7caf, 0xffffe5ba, 0xffffd76a, 0x1b3f, - 0xffffbace, 0x75b9, 0x266, 0x3be3, 0xffffb139, 0xffffdf94, 0x2528, 0xffff85e5, - 0x63ec, 0xffffea79, 0x784, 0x12c5, 0xffffcf6d, 0xffff941e, 0xffffd6c0, 0xffffe17c, - 0xffffde73, 0x317d, 0xffff7430, 0x2eea, 0x2d4d, 0xffff7937, 0xfffffb7c, 0xffff802d, - 0xffff902a, 0xfffff7d6, 0xffffbdb7, 0xffffdf44, 0xffffd10a, 0xffffc6a9, 0x36fe, 0xffffc98c, - 0xffff732c, 0xffffe42e, 0xffffd1e4, 0x6c5e, 0xffffa8ab, 0x7624, 0xffffdd12, 0xffffaf68, - 0x4d98, 0x5f15, 0x865d, 0xffff8d23, 0x5266, 0x276c, 0x295e, 0x1d29, - 0x5e0b, 0x772f, 0x2942, 0x459e, 0xffffe4eb, 0xffff73dd, 0xffffd004, 0xffff886f, - 0xffffcaf9, 0x18e0, 0xc66, 0xffffd08d, 0xffff7a9f, 0xffffd290, 0x88d8, 0xffff7c4b, - 0xffff86dd, 0xe4c, 0x15ef, 0xffff99f5, 0xffffde0e, 0x44db, 0x6855, 0x29de, - 0x3458, 0xffffc7a8, 0xffffdc32, 0xffffb3ec, 0x6e1b, 0xffff8dfd, 0x86a6, 0x685d, - 0xffffee8d, 0xffff92e9, 0xffffc182, 0xfffff271, 0x39d5, 0xffff86a2, 0xffff7472, 0xffffecba, - 0xffffd44d, 0xffff7fef, 0xffffd860, 0xffffeb6d, 0x3822, 0xffff91b2, 0xffffe1ea, 0x657f, - 0xffff98be, 0x7c56, 0xffffe379, 0x1286, 0xfffff440, 0xffffefd4, 0xffffc00c, 0xffffef9d, - 0xffffbb0a, 0xffffe423, 0x717a, 0xffff8177, 0xffffc56c, 0xffff87c0, 0x389, 0xffffbd6f, - 0x6a85, 0x6072, 0xffff8991, 0x6768, 0xffffb310, 0x55a0, 0x3566, 0xffffa763, - 0x6ad8, 0xffffecf0, 0x6e47, 0x460f, 0xffff74c3, 0xffffa827, 0xffff8ed2, 0x63a8, - 0x6785, 0xffff9ab6, 0x8721, 0xffffb48d, 0xffff8e1d, 0x1b24, 0x4cad, 0x32a8, - 0xffffa063, 0x3cc6, 0x3f51, 0x27c7, 0x32e2, 0xffff9cf7, 0xffffeca9, 0x6a39, - 0x58fa, 0x305d, 0xffffb237, 0xffff8301, 0x2b29, 0x4d40, 0xbfb, 0xffffea6f, - 0x15a1, 0xffffcc4f, 0xffffc735, 0xffffdaca, 0x26e5, 0xffff9e2f, 0xffffc05a, 0xffff8cf2, - 0x7a37, 0x4531, 0xfffffa02, 0xffffb210, 0x8633, 0x4f0f, 0x754, 0xffffed54, - 0xffff8740, 0x59d2, 0xffff767e, 0xffff855a, 0x3d85, 0x71b9, 0x72cd, 0x4d3b, - 0x78a1, 0xffffa6c1, 0x6c3e, 0xffff9317, 0x2926, 0x119a, 0x44d2, 0xffffb033, - 0xffff935e, 0xffffc224, 0x4ba1, 0xffffdba2, 0xffffb9b7, 0x17e4, 0xffff8b75, 0x2f37, - 0xffff73b2, 0xffffcc5c, 0xffff88bc, 0x213a, 0x47b0, 0x13d5, 0x3ca1, 0x51a7, - 0x2e56, 0xffffc38a, 0x7f7a, 0xffffe80b, 0xffff8832, 0x7270, 0xffff8f10, 0xffff7ca1, - 0x6c56, 0x8390, 0xffffb0bf, 0xffff9200, 0x6bbb, 0x46c8, 0xfffff4db, 0x2ab3, - 0xffffa2c1, 0x7288, 0xfffff4a6, 0x5ec3, 0x7c3, 0xffff81af, 0x3cc2, 0x28f7, - 0x4a58, 0xfffff026, 0x7ff0, 0xfffffc62, 0xffff9148, 0xd8f, 0x185, 0x59f4, - 0x1caa, 0x39dd, 0x3787, 0x4a31, 0xffffed74, 0x4336, 0xffffa9ea, 0x4646, - 0xffffd6f7, 0x175a, 0xffffe833, 0xffff95e8, 0xffff79ef, 0x7509, 0x68b8, 0x5445, - 0xffffe6a9, 0x49e4, 0xee4, 0x5e83, 0xffff9812, 0xffff9b80, 0xffffcd5b, 0xffff905e, - 0x6959, 0x38cf, 0xffffbce0, 0x758b, 0x3d88, 0xffffc47d, 0xffff86ca, 0x1c6a, - 0x10f2, 0x2934, 0xffffeb47, 0xffffa621, 0xfffff453, 0x8822, 0xffffd84d, 0x88a8, - 0xffff7738, 0x2211, 0x278b, 0xffffb4fd, 0x4a25, 0x24a1, 0xffff9982, 0x4316, - 0x1f4, 0xffffec51, 0xffffaf4d, 0xfffff10f, 0x452d, 0xffffed98, 0xffff89e2, 0xffff9770, - 0xffff7393, 0x2e9a, 0xffffa805, 0x870c, 0xffffb79d, 0xffffdcb9, 0x190f, 0xffffaf36, - 0xffffae0b, 0x35a8, 0xffffcb81, 0x49b6, 0x5b81, 0xffffad9f, 0x4b00, 0x59f6, - 0xbcf, 0x2bf6, 0xffff83b9, 0x56a, 0x478b, 0xfffff9a6, 0xffffefb1, 0xd52, - 0xffff977e, 0xfffffde7, 0x2281, 0x486b, 0xffff7a45, 0x38, 0xffffa31e, 0x545b, - 0x5f67, 0x759e, 0x7227, 0x4710, 0xffffda15, 0xffffde83, 0xffffb16f, 0x445a, - 0xffffb2a9, 0xffffe77a, 0x8ff, 0x136f, 0xffffaa07, 0xffff739c, 0x16f8, 0xffffd05a, - 0x1bc1, 0xffffbd49, 0x6534, 0xffff8187, 0x30d6, 0xffff7c5a, 0x8038, 0xffffc927, - 0x81d3, 0x6e7, 0x7d71, 0x5eed, 0x2dbc, 0x7779, 0x49d9, 0xffffa59c, - 0xffff7c2e, 0xffff7a46, 0x1461, 0xffffcbc6, 0x47cd, 0x6df4, 0xffff9c8b, 0xffffba56, - 0xffffc1aa, 0xffffe2c4, 0xffffb8b3, 0x354f, 0xffffba6f, 0x7e32, 0x88d2, 0x1dda, - 0x65c3, 0xffff7a23, 0xffffa941, 0x772d, 0xffffa8e4, 0x6cac, 0x6006, 0xffff8cc0, - 0x2c22, 0xffff8f93, 0xffffd510, 0x4ac1, 0xffffcac2, 0xffffbfc5, 0xffff772e, 0xffffd90e, - 0xffffc04b, 0x1858, 0xffffdb53, 0x4730, 0xffff87ca, 0xfffff776, 0xb2b, 0x5f04, - 0xffff7deb, 0xffffafc4, 0x273c, 0xffffa9ad, 0x2f96, 0x1df3, 0xffff99ab, 0x3ccb, - 0x8cb2, 0x69c, 0xffffb855, 0xffffa904, 0x8a40, 0x1b30, 0xffffbfe7, 0x8a23, - 0x70f8, 0x57da, 0xffff75fe, 0x2214, 0x2be1, 0xffff990b, 0xffff9394, 0xffffe908, - 0xffffb2c4, 0xffffa067, 0xfffff7c6, 0xffff97cd, 0xffff7498, 0x3af8, 0x1241, 0x10e3, - 0xffffa621, 0xfffff296, 0x698e, 0xffffa28b, 0xffff9084, 0x12cf, 0xffffb1f9, 0x4359, - 0x336c, 0xffffcf1e, 0xffffa763, 0x80bf, 0x4019, 0x47d5, 0xffffec7a, 0xffff83f6, - 0xffffd75a, 0xffffb050, 0xffff9104, 0xfffffb14, 0xffffd821, 0xffff8b8d, 0xffffb3fd, 0xffffebb6, - 0x124e, 0xffffd263, 0xffff7eab, 0xb78, 0xffffb115, 0xffffa4e5, 0xffffe296, 0x1f8, - 0xffffdd28, 0x3378, 0xffff9498, 0x3617, 0xffffb7c3, 0xffffe507, 0xffffe6ae, 0x47b2, - 0x18a5, 0xffff77c3, 0xffffa734, 0xffffc105, 0xffff8925, 0x7add, 0xfffffab0, 0xffffe3ec, - 0x39d4, 0x74ba, 0x56ea, 0xffffebec, 0xffff8e36, 0x3b63, 0x931, 0xfffff745, - 0x81c5, 0x368d, 0xffffbca4, 0xffff80b1, 0xffffe01f, 0xfffff52c, 0xffffacf4, 0x486f, - 0xffffc5e0, 0xfffffaae, 0x10d4, 0x5ea8, 0x4832, 0x38b4, 0x6894, 0x6002, - 0xffffdf3b, 0xffffa4a1, 0xffffe890, 0xffffb7b1, 0x3fee, 0x3c88, 0x1b52, 0xffff8883, - 0x1f6c, 0xfffff5ac, 0xffffc0cb, 0xac9, 0xcd4, 0x14f7, 0xffffa823, 0x21e2, - 0xffff8831, 0x5526, 0xffffc6a1, 0x4551, 0xffffa492, 0xffff9837, 0xffffa222, 0xffffde9d, - 0x1efc, 0xffffec4e, 0xffffd75b, 0x3268, 0xffffc8d6, 0xffff7a3f, 0x4c9b, 0xffff86a0, - 0x45e3, 0xffffddfb, 0xffff806b, 0x7aef, 0xffffcfa4, 0x30ef, 0x7f2b, 0xffffa3bf, - 0x46d7, 0xfffff316, 0x3720, 0x6dd9, 0xffffdb02, 0xffffbc61, 0xffffdd72, 0x81b9, - 0x1bf4, 0xffffb670, 0xffffcd6c, 0x37d8, 0xffffbd23, 0x4df6, 0xfffff2eb, 0xfffff687, - 0x8b59, 0xffff909b, 0x34cd, 0xffffc786, 0x143b, 0x8570, 0xffffc38e, 0x965, - 0xffffd3a1, 0xffffac12, 0xffffbb63, 0xffffe93f, 0x12d2, 0xffffe053, 0x3b2b, 0x4bcd, - 0x52f2, 0xfffff538, 0xffffb301, 0xf71, 0xffffb774, 0xffffd5ba, 0xffffbe11, 0x1121, - 0xffffa83d, 0x1a5a, 0x1ce, 0x8a49, 0xffffccb0, 0x82d2, 0xffffb440, 0xffff8a82, - 0xffff91fe, 0xffff8bad, 0x3e1d, 0x5005, 0xffffb167, 0xffff8f02, 0x1a0b, 0xffffc6d1, - 0x6303, 0xffffb2fe, 0xffffae6b, 0x507c, 0xffff907f, 0xffffeecd, 0xffff801b, 0x7b03, - 0xffffe69a, 0xffff8454, 0xffff8110, 0x2195, 0x60df, 0xffffe944, 0xffff7ac8, 0x21d, - 0x798, 0xffffed4d, 0xffff78b9, 0x36fa, 0xffff7616, 0xffffbf0e, 0x32c0, 0xffffcc92, - 0x294d, 0x819b, 0x2413, 0xffffaa63, 0x7ae7, 0xffff72bb, 0x6505, 0xfffff0e8, - 0x7b0f, 0xffff7b00, 0xffff8a4b, 0xffff8f23, 0x2336, 0xffffe49d, 0xffff9a9c, 0x478d, - 0xffffc085, 0x6059, 0xffffd216, 0xffff9e9b, 0x5e49, 0xffff7f3e, 0x6038, 0x6ad9, - 0xffffc10b, 0xffffd364, 0xffff7ecc, 0x6fef, 0xffff7809, 0xffffc298, 0x835f, 0xffffb70d, - 0xffffbc76, 0xffffc2fa, 0x1779, 0x247d, 0xffffdbe8, 0xffffb8de, 0xffffb96f, 0xffff81ff, - 0xffffbea1, 0xffffa830, 0xffff7fcd, 0xfffff310, 0x51fe, 0x65dd, 0xffff9f9f, 0xffffc799, - 0xffff8390, 0xffffd9da, 0xffffbb03, 0xffffb886, 0x6e67, 0x5799, 0x677b, 0x45ad, - 0xffff934b, 0x70b5, 0x44d0, 0x2f7e, 0xffff7568, 0x15b2, 0xffffbb0d, 0x7bf6, - 0x2605, 0x2b90, 0x4916, 0xffff9cd0, 0xffffaef8, 0xffffe9ab, 0x7fbe, 0xffffac1a, - 0x846, 0xffffc2d1, 0xffffbfba, 0x7699, 0xffffbfb5, 0xffffdef6, 0xffffbfed, 0x2d29, - 0xffffee6e, 0xffffb0c7, 0x8879, 0x8584, 0x3415, 0xffffc2e9, 0xffffc15a, 0xffffa8c4, - 0x3d0c, 0x31ab, 0xffffc3e1, 0xffff8bd4, 0x2ce5, 0x409c, 0x4243, 0xfffff9ce, - 0xffffecff, 0x27c6, 0xffffcddf, 0x6137, 0xffff96f2, 0xffff8d64, 0xffff9537, 0x8566, - 0xffffdf03, 0x6ef9, 0x7ada, 0x1413, 0x46e4, 0xfd7, 0x2c50, 0x7295, - 0xffff8827, 0x8938, 0x3392, 0xffffe413, 0x6e09, 0xffff811b, 0xffffba76, 0xffffc622, - 0x4554, 0xffffba5e, 0x6476, 0xffffb6f3, 0x2589, 0xffffcb99, 0x121a, 0x7e6d, - 0xffffd01a, 0x5bb5, 0xfffff271, 0x5031, 0x528d, 0x63f7, 0x7e28, 0xffffec61, - 0x18e, 0x1915, 0xffffaa49, 0xfffffd82, 0x6e94, 0x80c3, 0xfffff9b9, 0xffff9231, - 0x2b46, 0xffffb3c1, 0x8ef, 0x220e, 0xffffa349, 0x3649, 0x8397, 0xffff981d, - 0x6ad9, 0xffffaee7, 0x1fa9, 0xffffab33, 0x1e07, 0x7698, 0x7732, 0xffffe853, - 0xffff7232, 0x4f9f, 0xffffcbbf, 0xffff7feb, 0x68ce, 0xffffbdf9, 0x17d4, 0x2ee8, - 0x12c4, 0x8112, 0xffffb67d, 0x4914, 0xffffd9a2, 0xffff9e22, 0x74c8, 0xffffd9d8, - 0x5ed2, 0xc27, 0x3957, 0x39ca, 0xffffae61, 0x4edd, 0x15d8, 0x50b9, - 0x5077, 0xffff9787, 0x421a, 0xffff7ec0, 0xffffb93c, 0xffff922c, 0x867f, 0x855c, - 0xffff91fc, 0xffff8bc5, 0xffff8a93, 0x3e3f, 0xffff7c92, 0x772f, 0xffffaedc, 0x474e, - 0xffffb582, 0x135b, 0xffffb468, 0xfffff11d, 0x6298, 0x43bd, 0xffff9698, 0x43e1, - 0xffffc5a7, 0xfffffed5, 0xffffd9be, 0x4176, 0x322d, 0x6eef, 0xffffbdda, 0xffffce75, - 0xffff990d, 0x1857, 0xffffe0bc, 0x639e, 0xffffb5de, 0xfffffa1b, 0x70c8, 0x3404, - 0xffffd256, 0xffffd016, 0x7b8b, 0x69ad, 0x843c, 0xffffe02d, 0xffff7409, 0x4bc2, - 0xffffa87d, 0xffff7408, 0xffffd4d3, 0x27a2, 0xffff74a7, 0xffffc225, 0xffffc7a1, 0xffffcaa1, - 0x3a52, 0x2fe3, 0x36c3, 0x4f3c, 0xffffb5b5, 0x1ec0, 0xffffac64, 0x5f2c, - 0x1f24, 0xffff9dbf, 0x482e, 0x384b, 0xffffb6ca, 0x1acf, 0x66d6, 0x2652, - 0xffffd61d, 0xffff88fc, 0xffff7bed, 0x1862, 0xffffcf25, 0xffffb8e2, 0xffff9823, 0x526f, - 0xffff8e92, 0x6309, 0x4888, 0xffffe6f9, 0x631, 0xffffd94a, 0x1cd3, 0xffffa01b, - 0x43d8, 0x2793, 0x6557, 0x794b, 0x1383, 0x269, 0x1240, 0xffffe15c, - 0x69c5, 0xffffe7b1, 0x8d62, 0x2ecc, 0x7ab3, 0xffff7c8a, 0xffff7d9c, 0x7270, - 0x5c06, 0x7667, 0x1006, 0x7c60, 0x53af, 0xffff8990, 0x4bf4, 0x7183, - 0x2675, 0x30f1, 0x2478, 0x6124, 0xffff8265, 0x116e, 0xffffab22, 0xffffda7e, - 0xffff8517, 0x89fc, 0xffff7a6e, 0xffffb9f7, 0xffffd29e, 0xffffa22b, 0x461, 0xffff8708, - 0x1bcb, 0x7e6d, 0xffffc54a, 0x5d4d, 0x88a1, 0xffffdf3b, 0x1d91, 0x12b6, - 0xffffeb16, 0xffffe8ea, 0x30f0, 0xffff7427, 0xffff7d09, 0xfffff64e, 0xffff8896, 0xffffa354, - 0xfffff72e, 0xffff81d9, 0xffff996c, 0xffff74a4, 0xffffc3cf, 0xfffff2d2, 0xffffbf2c, 0xffff741d, - 0xffffd89c, 0xffffc38a, 0xffffde7d, 0x5f1c, 0xffffb1bb, 0xffffa21f, 0xffffb38e, 0x8236, - 0xfffff3ed, 0xffffce5d, 0x585e, 0xffffbe23, 0xffff8372, 0xffffaf4d, 0x3fcf, 0x3927, - 0x5dda, 0xffffa074, 0xf76, 0x6969, 0x4196, 0x875e, 0xffffb681, 0x35bc, - 0xffffbf70, 0x15af, 0xfffff405, 0x8b2a, 0x6d4c, 0x218d, 0x89bc, 0xffff9efe, - 0xffffc56b, 0xffff942b, 0xffff8aa0, 0x4739, 0x6f8f, 0xffff8a85, 0x6c68, 0xffff958c, - 0xffff9507, 0xffff9771, 0x3fb7, 0xffff8354, 0x6186, 0xffff90d7, 0x1520, 0xffffe018, - 0x3b58, 0x411d, 0xffffdc5f, 0x1ecd, 0xc86, 0xffffa92a, 0xffffeaa6, 0x73a, - 0x3def, 0x58de, 0x4933, 0x675d, 0x5e3, 0x25e2, 0x3eb, 0x714d, - 0xa3a, 0xffff8420, 0xffffcb78, 0xffff887a, 0xffff7747, 0xffffff76, 0x280b, 0x2abd, - 0xffffbdcd, 0x7dc1, 0xffffac20, 0xffffc30a, 0xffff7238, 0x27f3, 0xffffce4b, 0x398d, - 0x4244, 0x3750, 0xffffc875, 0xffffc657, 0xffff9c8c, 0x3779, 0x55ce, 0x49d2, - 0xfffff9b4, 0xffffd3a7, 0xffffade9, 0x3b41, 0x681f, 0xffff8812, 0xffff7a5a, 0xffffc989, - 0x49e6, 0x3783, 0xffffb5f4, 0x70ba, 0xffffbf48, 0x8933, 0x3314, 0x2047, - 0x111e, 0xffffd1e0, 0xffffea38, 0xffff779e, 0xffffabe9, 0xffffe109, 0xffff9c1c, 0x3fdd, - 0x157b, 0x2726, 0x480, 0xffff7635, 0xffffb05d, 0xffff82de, 0xcec, 0xfffff7d9, - 0xffffb171, 0x45f9, 0x8a9f, 0x1d04, 0x1b06, 0x80b, 0x39a9, 0xfffff58c, - 0x274c, 0x1abd, 0xffff7ae0, 0xffffc2a1, 0xffffce98, 0xffff9427, 0xffffa278, 0xffff8c58, - 0x31d6, 0x6f95, 0xef0, 0xffffd311, 0xffff95a0, 0x7c0b, 0xffffaf59, 0x934, - 0x73b3, 0xffff98df, 0xffffa574, 0x6069, 0xffffead8, 0x671f, 0x5c9f, 0x4354, - 0x23dc, 0x1c3f, 0xffffbc97, 0x22d2, 0xffffdd4e, 0x1239, 0x3af3, 0xffffefad, - 0x6121, 0xffffd1e6, 0x66da, 0xffffcc0a, 0x63ea, 0xfffffc17, 0xffffc2d6, 0xffffa0f2, - 0xffffc2d3, 0xffffa772, 0x4b13, 0xffffcfba, 0xffffee11, 0x6561, 0x38cc, 0xffffabbe, - 0xffffe3f2, 0x4c6b, 0xfffff7ef, 0x6373, 0xffffeed8, 0x34cf, 0x59d9, 0x2699, - 0xffffd7fa, 0xfffffa92, 0xffffac49, 0x62d7, 0x6daa, 0x4ab3, 0xffffaf00, 0xffffce18, - 0xffff7e6c, 0x118, 0x72fe, 0xffff874a, 0x645, 0x2d6f, 0xffffa91f, 0x7443, - 0xffff82ca, 0x553f, 0xffffb391, 0xffff83c6, 0x581a, 0x4124, 0x4d68, 0x5981, - 0x40c2, 0xffff925c, 0x10e3, 0xffff957f, 0x7b13, 0xffff9008, 0x3563, 0xffffb7d3, - 0xffff8c80, 0x8508, 0x8a7e, 0xffffd76b, 0x5321, 0x39bb, 0xffffe271, 0xffffa6fa, - 0x758e, 0x3092, 0xffffd014, 0x2666, 0xffff745f, 0xffffb06f, 0xffff861c, 0xffffe4c9, - 0x306f, 0xffffc98f, 0xffff950b, 0x2139, 0x7698, 0xffff9796, 0x1df5, 0xfffff0f9, - 0x112c, 0x467a, 0x211b, 0x4469, 0x168f, 0x38b7, 0x2007, 0x2908, - 0x24, 0x280e, 0x5051, 0xffffb28f, 0x4c68, 0x836a, 0xffffea37, 0xffff9080, - 0xffff95e1, 0xffffe897, 0xffffcabd, 0xffff87dc, 0x88c2, 0x4507, 0xffff8a98, 0x405f, - 0x52c8, 0xffffc450, 0x204a, 0xffff8690, 0xffffec68, 0x28a5, 0xffffdb3c, 0xffffa42c, - 0x13e2, 0xffffb958, 0x595d, 0x4eae, 0xffff8001, 0xffff7f70, 0x4a8c, 0x748b, - 0xffffb9ea, 0xffff87ba, 0x4a61, 0xa72, 0xfffffc5b, 0xffff9428, 0xfffff71c, 0xffffa0d7, - 0xffffd5c7, 0xffffcd3f, 0xffff77eb, 0xfffff986, 0xffff92c6, 0x57a0, 0xffffe759, 0x815c, - 0xffff8cb3, 0xffffcdc4, 0x6a3f, 0x1a8, 0xffff7840, 0x60bd, 0xffffb606, 0xffff8946, - 0xffffebc2, 0xffffaae5, 0xffffce9d, 0xffffca7c, 0xffff761c, 0x3ffb, 0xffffc9e6, 0xffff94b5, - 0xffff7888, 0x63fc, 0xffff8da1, 0xffffd969, 0x21b0, 0x47be, 0x39e9, 0xffffee2b, - 0xffffbc45, 0x82a2, 0x243d, 0x75bc, 0xffff88cf, 0x8c54, 0xffffb154, 0xffffa214, - 0xffffb8bb, 0x8a04, 0xffff87de, 0x8cd6, 0xffffd8d3, 0xffffc81e, 0xffffdf1c, 0xffffb674, - 0x5782, 0xffffa361, 0xffffcd7b, 0xffffe9d7, 0xffff9bbf, 0xffffcae9, 0xffffeab3, 0xffffd75e, - 0xfffffab2, 0xd68, 0x8288, 0x5177, 0x5f43, 0xffffeebd, 0xffffc78f, 0xffff72d2, - 0x812, 0x752a, 0xffffc8ce, 0xfffff6d2, 0xdb9, 0x6b64, 0x3527, 0xfffff063, - 0x79be, 0x6579, 0xffffe19c, 0x226f, 0xffff9529, 0x1eb8, 0x8747, 0x41e2, - 0xffffde27, 0x46e7, 0x86bf, 0xffffa714, 0xffff93c7, 0xffffe02a, 0xffffc1e6, 0x36de, - 0xffffc76e, 0x43ed, 0x65a, 0x6cf4, 0x57f3, 0x4916, 0xffffecae, 0x7ca7, - 0x5c09, 0x48f0, 0xffffb23e, 0xffffaecc, 0xffffa88b, 0xffff7d10, 0x87c4, 0x669f, - 0x56c2, 0x43d, 0x8c6b, 0xfffff478, 0x87cb, 0xffffd0f4, 0xffffa7a1, 0x25e7, - 0x5a3d, 0x1df, 0xfffff384, 0x3438, 0x1ce8, 0x800, 0xffff8048, 0xffffad8a, - 0xffff9d72, 0xffff73f5, 0x818d, 0x420a, 0xffffae9d, 0xffffc332, 0xffffbe39, 0xffffce52, - 0x5b09, 0xffff8635, 0x1157, 0xffffb3d7, 0x33d1, 0xffff8149, 0xffffbe1d, 0xffffff1d, - 0xe7c, 0xa66, 0xffff8167, 0x191d, 0x1beb, 0xffff82ec, 0xffffa8a3, 0xffff78af, - 0x52ca, 0xffff7862, 0x7c41, 0x8b97, 0xffffbe29, 0xffffcaac, 0x7279, 0x893c, - 0x3b70, 0x7947, 0xffffed3c, 0xffffe6e8, 0x3dcb, 0x1d01, 0x88cf, 0xffffb5ae, - 0xffffa7ef, 0xffffece8, 0xfffffb0a, 0x1c20, 0x3691, 0x4f, 0x40aa, 0xffffebe0, - 0x5fa0, 0x38, 0x44dd, 0xffff8ab5, 0x2c13, 0xffffd8b8, 0xffff9f3d, 0x8815, - 0x8683, 0x6a60, 0x1a12, 0xffffa788, 0x5215, 0xffffcc46, 0xffff75bd, 0xffff8c9d, - 0x2871, 0xffff889e, 0xffff9608, 0x8d91, 0x8c85, 0xffffc2ee, 0x458b, 0x48e7, - 0x1d47, 0xffffe974, 0xffffa020, 0xffffe1fd, 0x6f80, 0x8264, 0x885, 0x4317, - 0xffffd135, 0x89c9, 0xffffb412, 0xffff7b42, 0x5b21, 0x5a98, 0xffffbc39, 0x16c0, - 0xffff7c6e, 0x286b, 0x1996, 0xffffd5e6, 0x5fb3, 0xffff950f, 0xe62, 0x215d, - 0x2328, 0xffff7dc1, 0xffffacb9, 0x1483, 0x3da9, 0x74e7, 0x410e, 0x8253, - 0x4216, 0x1ff1, 0x4d3a, 0x3771, 0x817a, 0xffff73f2, 0x624e, 0xffffff16, - 0x3dc5, 0x1384, 0x377c, 0xf2, 0x4bf2, 0xffff74f7, 0x3060, 0x728d, - 0x2aee, 0x7273, 0xffff8fbf, 0x1106, 0xffff89df, 0xffffc920, 0x3582, 0x25fd, - 0xffffce73, 0xffffe0f1, 0x6219, 0xffffadc3, 0xfe9, 0xffff837f, 0xffff9048, 0x781f, - 0xffffb93b, 0x189f, 0xfffffb71, 0x16d2, 0xf5e, 0xffffb0bf, 0x62f8, 0x51e2, - 0x2c58, 0x5d59, 0xffffc837, 0x161a, 0xffffa164, 0x39c, 0x10a3, 0xffff79f8, - 0xfffffd31, 0xffffb4e3, 0xffffc92d, 0x6f16, 0xffffab27, 0xfffff0ba, 0x1be7, 0xffffb0a9, - 0xffffe906, 0x3a70, 0xffffaf42, 0x8b55, 0xffffa625, 0xffffca7e, 0xffff7fdb, 0x4078, - 0x5d41, 0x7798, 0xfffff767, 0xffff964e, 0xffffd7df, 0xffffa537, 0x3b4a, 0x35d0, - 0x5ba2, 0xffffd3b1, 0xffffb2e2, 0xffffd0e7, 0x3602, 0x72f1, 0xffff8dcc, 0xffff7ade, - 0xffffb1ee, 0xffffafa9, 0xffffdad2, 0xffffea6a, 0x6667, 0xffff941e, 0xfffff259, 0xfffff365, - 0x15be, 0x1280, 0xfffffcab, 0x8bb6, 0xffffbf10, 0xffffb64d, 0x408f, 0xfffff18a, - 0xffff9956, 0xffffa946, 0x71e3, 0xffffe7e8, 0xffff7ddc, 0xfffff570, 0x1c0f, 0xffffc10d, - 0x6e81, 0x367d, 0x2846, 0x635e, 0xffff74fc, 0x4b36, 0xfffff47b, 0x8b6b, - 0x7d7, 0xffffeb07, 0xfffff577, 0xffffb507, 0x42a5, 0x733c, 0xffffe9a2, 0xffffe885, - 0xfffff77a, 0xd37, 0x5f47, 0xffffc515, 0xfffffd88, 0xffffeb05, 0xffffcb7f, 0xffffa183, - 0x63df, 0x896f, 0x7fd9, 0x5f5, 0xffffc008, 0x29ac, 0x360e, 0x259d, - 0x7d1, 0xfffff226, 0x3d55, 0xffffabfd, 0x54b4, 0x3085, 0x59a1, 0x8a1e, - 0xffff85f4, 0xffffef3e, 0x49e5, 0xffffe51a, 0xfffffe96, 0xffffdea7, 0x328a, 0xffffa638, - 0x4ced, 0xffffb2d8, 0xffffec06, 0x854b, 0x46a, 0xfffff0e7, 0x8922, 0x8266, - 0x280a, 0x68a6, 0x5210, 0x6a2, 0x4142, 0xffffca2d, 0xffff9e3b, 0x5dd5, - 0xffffe648, 0xffffaac4, 0x22d9, 0xfffff89e, 0x4059, 0xffffab1f, 0xffffd230, 0xffff8d23, - 0x6cf, 0x6067, 0xffffed0e, 0xffff74f8, 0x58ee, 0xffff964e, 0xffffe204, 0x5e81, - 0xffff9d1e, 0xffffa77a, 0xffffef8a, 0xffff8f01, 0xffff7694, 0x6c0b, 0x7293, 0x72b2, - 0xffffa48b, 0xffffeb04, 0x1953, 0x1d, 0xffff888f, 0xffff7b0a, 0xffffa134, 0x7fe3, - 0xffffacc2, 0x471, 0x999, 0x4397, 0xfffff6a0, 0x7af2, 0xffffaac9, 0xffffe255, - 0x1170, 0xffffaaec, 0x2b92, 0xffff96a5, 0xffffd8b4, 0x3e4a, 0x44b0, 0xffffefdf, - 0xffffc299, 0xffff7360, 0xffff7ec4, 0x4be8, 0x2e91, 0xffffc8dc, 0xffffb89a, 0xffff8894, - 0xffff9818, 0xffffb4a1, 0x669, 0x892, 0x8c52, 0xffffe05d, 0x6fc3, 0xffff861c, - 0x19f4, 0x876d, 0x2260, 0xffff873f, 0x363e, 0xfffff093, 0x1434, 0x840b, - 0x648b, 0xffff8ebb, 0x1a62, 0x604e, 0x5874, 0x4304, 0x6f7e, 0xffff8c56, - 0x603b, 0xffffbaa1, 0xffffe654, 0xffff7ea9, 0xffff9791, 0xffffc749, 0xffffa7d9, 0x11e6, - 0xffffa58d, 0x6995, 0x4a1c, 0x362e, 0xffff9be4, 0x8266, 0x304, 0xffffbe5c, - 0xffffb4e6, 0xffffa022, 0xffff821f, 0x1170, 0xffff8639, 0xffffcbf0, 0x2364, 0x6c9a, - 0xffff8726, 0xffff9417, 0xffffea48, 0xffffb072, 0x5f33, 0x4896, 0xffff7762, 0x65e9, - 0xfffffd0a, 0x57f, 0x3b2c, 0xffff751d, 0xffff8c1f, 0xffffef92, 0x7117, 0xffffed28, - 0x8b9f, 0x764b, 0xfffff95d, 0xffff8346, 0xffffada7, 0xffffcd90, 0xffffa794, 0x22f6, - 0x5821, 0x2a57, 0xffff7575, 0xffffc0a9, 0xffffc11c, 0xffff954c, 0x921, 0xffffb22e, - 0x6fa4, 0x5f18, 0xffffcc0d, 0xffffd4eb, 0xffff8fd0, 0xffffd740, 0xffffc4d2, 0x5b17, - 0x7391, 0xffffdc3a, 0xffff923d, 0x4572, 0xffffaf19, 0xffffc9fb, 0xd70, 0x4c5d, - 0xffffb57d, 0x7eda, 0x60ce, 0x3db6, 0x6478, 0xffff81ca, 0xffff8e3f, 0xffffae43, - 0x8aad, 0xffff76a0, 0x2d2d, 0xffffc6ed, 0x89c4, 0xfffff0bd, 0xfffff634, 0xffff86cc, - 0x8934, 0x5c28, 0xfffff07a, 0xffffc810, 0xffffc4d5, 0xffff931a, 0x6cc1, 0xffff820d, - 0x4ad9, 0xffffe2ec, 0x5400, 0xffffce27, 0xffffa35b, 0xfffffa9a, 0xffffc984, 0x29db, - 0x198b, 0xb84, 0xffff7987, 0x43fc, 0x475f, 0x432d, 0xffffe7cc, 0xffff9245, - 0xffffef67, 0x60c2, 0xffffa260, 0x3a6a, 0x6739, 0x6685, 0x1b66, 0xa0, - 0xffff76b4, 0x2f5f, 0x8857, 0xffffa00d, 0xffff8549, 0x203e, 0x841f, 0x28a6, - 0x4193, 0xffffa1d6, 0x798f, 0x5d16, 0x279b, 0x9b1, 0xffffd61c, 0xffff9bce, - 0x3ecd, 0xffffc062, 0xffffac02, 0xffffac45, 0x150e, 0x7e22, 0xffffc92e, 0xffffe529, - 0x60da, 0x3950, 0x3d86, 0x1575, 0x182f, 0x7ee7, 0xffff8da9, 0x1a01, - 0x2e85, 0x7cd5, 0xffff8cc0, 0xffff730f, 0xffff8fe1, 0xffffeb15, 0x3bb7, 0x2d60, - 0xfffffaa0, 0xffffbd0f, 0x33b2, 0xffffd0be, 0xffffc2df, 0xffff7f81, 0x6400, 0xffffd43b, - 0xffffc823, 0x418c, 0xd2f, 0xffffa895, 0x8c3c, 0xffffbaeb, 0x7f05, 0xffffa145, - 0x660d, 0xffffa464, 0xfffff7ba, 0x8a12, 0x5b5a, 0xffffc222, 0xffff999e, 0xffffe91a, - 0x1bd9, 0xffffb0f5, 0x8202, 0x7319, 0xffff877a, 0xffff97b7, 0xffffc451, 0xffffa669, - 0x34b1, 0xffffbcda, 0xffffb333, 0x76fa, 0x4fb3, 0x1bfa, 0x8822, 0xffffcd78, - 0xffff7440, 0xfffffb6c, 0xffffb200, 0x4f19, 0x33ed, 0xffffb977, 0x26b, 0xfffff89d, - 0xffffa1de, 0x61ec, 0x1d9c, 0xffff76c0, 0xffffb7c1, 0xfffff027, 0x700c, 0xffff841a, - 0xfffffd62, 0xffff8baf, 0x4562, 0x7eab, 0x2ac8, 0xffffca3d, 0x6a8c, 0xffffc5c5, - 0xffff76cf, 0x454e, 0x44b2, 0x2e49, 0x551c, 0x4b86, 0x734c, 0xffff9db0, - 0x1d8, 0xffff9219, 0xffffe716, 0xffff7e4f, 0xffffcad7, 0x208, 0xffffa001, 0xffffe587, - 0xffffeed7, 0xffffc27b, 0xffffc41d, 0x4531, 0x7ee, 0xffff755f, 0xa10, 0x1d02, - 0xffff75fe, 0xffff9543, 0x237f, 0xffffabf2, 0xd2, 0xae9, 0x2785, 0xffff85c8, - 0xffff9b84, 0xffffc2d6, 0xffffe149, 0x28ae, 0xffff75f9, 0xffff9667, 0x5647, 0x76e9, - 0xfffff7f3, 0xffffa9ae, 0xffffc163, 0xffff8412, 0xfaf, 0x1cde, 0xffff888f, 0xffff7e2f, - 0xffffd400, 0xffff8602, 0x37de, 0xffffb80c, 0xffffd2e9, 0x11ba, 0xffffb448, 0xffff9253, - 0x603a, 0x71c9, 0x4d23, 0x48c7, 0xffffc84d, 0xffffe1fb, 0x47db, 0x1877, - 0x45af, 0xfffff561, 0xffffd599, 0x7c57, 0xffff8cd4, 0xffffbc8b, 0x61db, 0x37a0, - 0x1544, 0xffffca6a, 0x8d85, 0x768f, 0xffff897a, 0xffff923c, 0xffffecde, 0xfffff499, - 0x100c, 0x5097, 0x8dd1, 0x1d2c, 0xffffd766, 0x31a3, 0xffff9f7e, 0x31e8, - 0x2744, 0x8dad, 0xffffd73e, 0x33ab, 0x3fed, 0xfffff38c, 0xffffe07f, 0x7827, - 0xfffffc55, 0x6531, 0x526b, 0x2399, 0x3c8c, 0x4633, 0xffffaafa, 0x11da, - 0xfffffca9, 0xffff7c90, 0x4499, 0x3445, 0x12c4, 0x2210, 0xffffe1e1, 0x431b, - 0x45da, 0xffff72cf, 0xffffdae7, 0x6ee7, 0xffffb843, 0x7930, 0xfffffc7c, 0xffffda3e, - 0xffff89d1, 0x8d06, 0xe73, 0xffff82c9, 0xffffeeb8, 0xffffc7dc, 0x3e13, 0xffff9f2f, - 0xffff7e2a, 0xffff7eaf, 0x6cb0, 0x5077, 0xc26, 0xffff9fcb, 0xffff7e45, 0x1bc3, - 0x6cd7, 0x800e, 0x333f, 0xffffef38, 0x3294, 0x38c5, 0xffff9860, 0x7fe2, - 0x1846, 0xffffc870, 0x8798, 0xffffa794, 0x3433, 0x70a5, 0xffffe031, 0xffffbd5a, - 0x626c, 0xfffff816, 0x7b1, 0x83fc, 0xffff9362, 0x306, 0x7587, 0xffffdb69, - 0xffff89e4, 0x1da2, 0x5532, 0xfffffd49, 0xffffba57, 0xffff8941, 0xc84, 0x6b89, - 0xffffecd4, 0x2578, 0x8a3e, 0xffffbd94, 0xffff8bc6, 0x7a73, 0x5cfc, 0xffffa543, - 0x4605, 0xffffbde5, 0x8cfe, 0x150b, 0xffffd23e, 0xffffa042, 0xffff7b69, 0xfffff168, - 0x1c44, 0xffff72f5, 0xfffff3c2, 0xfffff9ed, 0xffffeca1, 0x2d48, 0xffff9bce, 0x272b, - 0xffffc260, 0xffff929d, 0x3cb9, 0x5c11, 0x5d4, 0xffff8ad7, 0x6aa9, 0xfffffb80, - 0x572b, 0x2cbd, 0x5e8a, 0xffffb586, 0xfffff8e7, 0x6f5b, 0x28ce, 0x11a, - 0x71f5, 0xfffff744, 0x1be2, 0xffff95cd, 0x6cef, 0xffffc7f6, 0x1ac3, 0x8c96, - 0xffff760f, 0xffffa1ba, 0x370, 0x3277, 0xffff817a, 0xffffcee6, 0x195e, 0xffff7ccb, - 0xffffca7b, 0xffff9d90, 0x540e, 0x6725, 0xffff75a3, 0x48a5, 0xffffada6, 0xfffffdad, - 0x32e4, 0x1e1e, 0xffffe0eb, 0xffffed3c, 0xfd, 0xffff9fbf, 0x4878, 0x8dbc, - 0x3ef3, 0xfffffcd0, 0x80e5, 0x77b5, 0x8b4b, 0x7003, 0xffffb759, 0x8938, - 0x4a57, 0xca9, 0x6783, 0x27ee, 0x2c7a, 0xffff8bf7, 0xffffe754, 0x2a23, - 0x60ea, 0xffffc6bc, 0xffffb024, 0x34b2, 0xffffe44f, 0x2f16, 0x3df3, 0x883c, - 0x3eb1, 0xffff81dd, 0x5e00, 0x7ae1, 0x62bc, 0xffffcb8d, 0xffffd0eb, 0x457f, - 0x6bb3, 0x72a2, 0xffffb521, 0xffff7d69, 0xffffd032, 0x4d2, 0xffff9dcb, 0xfffffd7d, - 0x44d, 0x3c01, 0x34ed, 0xfffff07f, 0x74a6, 0x894, 0x524d, 0xdb3, - 0xcb3, 0xffff9661, 0xffff9d9a, 0xffffdae6, 0xffffd8df, 0xffffe241, 0x14a9, 0xffff79ad, - 0x1d71, 0x17e9, 0xffffcee6, 0x58cc, 0xffffa52b, 0x7b08, 0xec7, 0x5a66, - 0xffff7f3c, 0xffffc522, 0x210d, 0x109c, 0x162d, 0x4654, 0xfffffee4, 0x1b68, - 0x7e7b, 0xffffb804, 0xffff9c77, 0xffffa259, 0xfffffcdc, 0xffffb126, 0x6f3e, 0x597e, - 0xffff8c8b, 0xffffb09a, 0x4d39, 0x8bc3, 0x1208, 0x63f, 0x7e6a, 0x3bb1, - 0x8dd9, 0x4cac, 0xffff803c, 0xffff9d29, 0xffffa2d6, 0x1a9a, 0x16fe, 0xffffc6c9, - 0x6ff1, 0xffffb441, 0xffffbdc5, 0xfcd, 0xffffe445, 0xffffa0f3, 0xffffef93, 0xffffdd4e, - 0x3fe8, 0x40a2, 0xffffeac0, 0x6f7d, 0xffff83d1, 0x459e, 0x6eee, 0x7da, - 0xffff9f26, 0xffff9da6, 0xffffb81c, 0x25c8, 0x32a6, 0x2351, 0xffff7450, 0xffff90f0, - 0x16ee, 0xffffa868, 0xffffa2cb, 0xffff79fc, 0xfffffe99, 0x6a31, 0x1a59, 0xffffbca9, - 0xffff8d29, 0xffffc840, 0xffffd7e8, 0xffff9128, 0xfffff92c, 0xffffd49d, 0xffffa0a4, 0x7533, - 0x748, 0x4245, 0x34bc, 0x366c, 0xffffc838, 0x3265, 0x8226, 0x4aca, - 0xffffe761, 0x19e, 0x46bb, 0xffffdafa, 0xffffdd98, 0xffffc1b8, 0x7aa8, 0xffffc744, - 0xffff7766, 0xffffeb0c, 0x675b, 0x573, 0x5b52, 0xffffd638, 0x49a1, 0x5235, - 0xffffcd48, 0xffff8960, 0xffff8468, 0xffffc6b1, 0xfffff7c1, 0x6995, 0x5eb4, 0xffffc196, - 0xffff7779, 0x6104, 0xffff8f5b, 0x2928, 0x6cf0, 0x1b93, 0xffffbdd9, 0x1ca5, - 0x81b, 0x64c3, 0xfffff230, 0xffffc185, 0xffffd191, 0xffff858e, 0x6eb8, 0xffffd904, - 0x89ca, 0xffff8102, 0xffffc709, 0x39e2, 0x5bde, 0x1e9e, 0xffffb9c8, 0x81c2, - 0xffffb753, 0xffff9bba, 0xfe5, 0xffffaabf, 0xffff82e0, 0xffffcc44, 0x22e0, 0x1053, - 0x6b07, 0x2522, 0x6316, 0x5ddf, 0xfffff8fe, 0xffff896b, 0x8a7d, 0xffff9398, - 0xffffa42f, 0x4f57, 0x71a, 0xffffef95, 0xffffb170, 0x12e9, 0xffff8147, 0xffffdc5c, - 0xffff9d76, 0x2a39, 0x2a4a, 0x2d76, 0xffffa31c, 0xffffafcf, 0xffffb76e, 0x617c, - 0xa00, 0xffff878f, 0xffff737a, 0x6f54, 0x7516, 0xffffbc9a, 0x39c8, 0x5bbe, - 0x4d20, 0x32b6, 0xffff8d2f, 0xffffcee7, 0x46ef, 0x3bdb, 0xffffc557, 0xffffe1a6, - 0xffff7a54, 0x6572, 0xffff9a6d, 0x7b59, 0x3be8, 0xffffd635, 0x1acd, 0xffffe77a, - 0xffffa8c9, 0x531c, 0xffff8a3a, 0xfffff65d, 0xb96, 0x49b8, 0x735b, 0x791, - 0x682b, 0xfffff0f6, 0x179e, 0xfffff2ef, 0x3992, 0xffffc2d8, 0xffffb85c, 0xffff9e2d, - 0xffffdc7a, 0x1202, 0xffff761e, 0xffffae43, 0xffffddc9, 0xffff8377, 0xffffd6dc, 0x124, - 0x493d, 0x2f55, 0xfffff8c8, 0x5f25, 0xfffff800, 0xffff738a, 0x3465, 0x1089, - 0x4ea3, 0xffff83ec, 0x4f50, 0xffffaac4, 0x1c54, 0x58c5, 0xffffe6ab, 0xffff8a2e, - 0x74b2, 0x6032, 0xfffff56b, 0x836c, 0xffff8f09, 0x8316, 0xffffeb3e, 0x257c, - 0xffffd7c8, 0x671f, 0x4eab, 0x1220, 0xffff7c40, 0x3c05, 0xffffd400, 0x841, - 0xffff7c1a, 0x5119, 0x371c, 0xffffb126, 0xffffa46d, 0xffff8f00, 0xfffffed8, 0x6db7, - 0x1608, 0xffff7c99, 0x72a6, 0x7cad, 0xffff7831, 0x810d, 0x79d5, 0x1b55, - 0xffffd273, 0x5d84, 0x5983, 0xffffff4a, 0x5005, 0x69bf, 0xffffe75f, 0xffffd029, - 0xffffe1e8, 0xffff9e76, 0xff2, 0xfffff4d4, 0xffffe108, 0xffffb618, 0xffffed8b, 0xd27, - 0x94d, 0x52ff, 0x8634, 0xffffa360, 0xffffffe3, 0xffffb0d8, 0xffffaaee, 0xfffff959, - 0xffffbdaf, 0xffffc563, 0x2506, 0x4a98, 0xfffff9bb, 0x4ad2, 0x25f4, 0xffff9987, - 0x5bf9, 0x8d03, 0x58d7, 0xffff988b, 0xffffe7b6, 0x1aeb, 0xffffdd88, 0xffffd037, - 0xffff9db8, 0xffff77f7, 0x693, 0x8863, 0xffff9329, 0xffffb19f, 0x5447, 0x2606, - 0x77dd, 0xffffbd47, 0xfffffb00, 0x4c00, 0xffff9169, 0x7d2a, 0x8548, 0xffffe574, - 0x44b, 0xffffe68c, 0xffff9738, 0x4689, 0x27f6, 0x5a2c, 0x37a7, 0x529d, - 0xffff7c73, 0x76f2, 0x242f, 0x8134, 0x30a8, 0x3ab2, 0xfffffe83, 0x3bd5, - 0xffffc9ed, 0xffff7be3, 0x6356, 0xffffab4b, 0x6d2d, 0xffffb6dc, 0x1d24, 0x6908, - 0x6aa6, 0x4fe3, 0xffffe221, 0xffff8985, 0x3389, 0x6062, 0x8700, 0x4834, - 0x8cba, 0x842c, 0x15dd, 0x86ac, 0xffffa5c2, 0x375c, 0xffffc3e1, 0x2517, - 0x2a44, 0xffffa391, 0xffffec55, 0xffff7bec, 0xffffb1e1, 0x5156, 0x7b17, 0xd57, - 0x962, 0x4e52, 0x3b2e, 0xffffab67, 0xffffda44, 0x69e8, 0xffff78ec, 0xffffd084, - 0xffff8488, 0x773a, 0x6c60, 0xffffa9c9, 0x6d4a, 0xfffffe96, 0xffffe0e0, 0x1bef, - 0xffffde02, 0xaae, 0xffff9a10, 0x557, 0x4da9, 0x867c, 0x1741, 0x42f8, - 0xffffd09b, 0xffffd2d1, 0xffffe212, 0xfffff266, 0x45ed, 0xffffe717, 0x6837, 0x76c1, - 0xfffffef7, 0x5baf, 0xffffbee3, 0xffff830d, 0xffffb4fa, 0x372b, 0xffffb440, 0xffff8e7e, - 0xffffa00d, 0xffffbb90, 0xffff92d7, 0xffffa723, 0xffffe18b, 0xfffffbe0, 0xffffdf88, 0xffff76d1, - 0xffffd2af, 0x3a01, 0x8c46, 0xfffff48e, 0xffff8ada, 0xffffb3f4, 0x46ba, 0xffffa696, - 0x4a04, 0x8cf1, 0x362f, 0xffffc320, 0x73d2, 0xffffa00f, 0xfffff6ad, 0x7269, - 0x695e, 0x4812, 0x3b16, 0x6442, 0xffffa02b, 0xffffc2c0, 0xffffe410, 0xffffb923, - 0x6012, 0xffffdcd3, 0xffffbdfe, 0xffff97be, 0x6ad6, 0xffffe081, 0xffff97e9, 0xffff8adf, - 0xd9e, 0xffff7e8f, 0xffffc9c6, 0x6a7e, 0x53b9, 0xffff7fb5, 0x8314, 0xffff81f5, - 0x1d86, 0x3e5d, 0xfffffd9d, 0x201e, 0xffffde6d, 0x2055, 0x7317, 0x167c, - 0xffffcfa0, 0xffff9bbc, 0xffffa8e0, 0x2d83, 0x5a8d, 0xffffb0bd, 0x3926, 0x669f, - 0x4b9e, 0x6345, 0x2c7, 0xffff91c9, 0xffff745a, 0x5091, 0x56a3, 0x6e45, - 0x31ac, 0xffff9847, 0xffffbb04, 0x617c, 0x1374, 0x8dd7, 0xffffe142, 0xffffeb42, - 0x9d4, 0xffff8b2d, 0x84fc, 0x3b6, 0x604a, 0xffffd453, 0xffffd691, 0xffff7927, - 0xc47, 0x169d, 0x70bb, 0x10d4, 0x6b25, 0xffff8965, 0xffffc874, 0xffff7571, - 0x2165, 0xffffbb50, 0xffff7623, 0xffffab6f, 0xfffff47a, 0xffffb87b, 0x14d1, 0xffffff82, - 0xffffe1b8, 0xf6b, 0xffff74f4, 0xffffefb6, 0xffff88c0, 0x2eec, 0xffffade2, 0xffffdcd2, - 0xffffb1cc, 0x334f, 0xffffc569, 0xffff8414, 0x8070, 0x7bfa, 0x8992, 0xffffcc6d, - 0xffffa65a, 0x251f, 0x8bbf, 0x2463, 0xffff74d2, 0xfffff0cf, 0xffffde9a, 0x4f4a, - 0xffff8446, 0xffffa4e2, 0x808a, 0xfffffadd, 0x723e, 0xffffd82d, 0x1f14, 0x8c71, - 0xffffdc75, 0x6c3c, 0x4435, 0x472f, 0xffff7252, 0x22e5, 0x19c0, 0x88aa, - 0xffffd423, 0xffff8758, 0x2758, 0xffffd33d, 0xffffe1bb, 0x83b3, 0x8535, 0xaa5, - 0x7864, 0x6b59, 0x2ab7, 0x7e5b, 0x6df6, 0x6f3e, 0xffff908a, 0xffffb6d4, - 0x4eca, 0xffffa83f, 0xffffff3f, 0xffff7a6a, 0xffff74aa, 0x37e9, 0xffff8a5e, 0xfffff391, - 0xffffc4c1, 0x36fb, 0x21e2, 0x623d, 0xffff7306, 0xfffff202, 0x39cb, 0xffffcd47, - 0x13b6, 0x630e, 0xffffa3e6, 0xffffeb86, 0x5eb8, 0xffff73c0, 0xfffffa42, 0x49fb, - 0xffffed95, 0x718f, 0xffff7e6a, 0x1914, 0xffffa5e9, 0x8cf1, 0x2ae3, 0xfffff9e8, - 0xffffec23, 0x697d, 0x5ab9, 0x77f0, 0xfffff222, 0x5ff0, 0xffffa34d, 0x82bc, - 0x5950, 0x13c1, 0x5a9b, 0x570c, 0x4992, 0x405c, 0x3ecd, 0xfffff886, - 0x1362, 0x1704, 0xffff87b3, 0xffffe31c, 0x7e6c, 0x27e7, 0x355a, 0xffff84c4, - 0xffffe078, 0xffffc000, 0xffffd37a, 0x2690, 0x130d, 0xffffd22b, 0xffffa6c1, 0x12dd, - 0x36db, 0x5507, 0xffff8c14, 0xffffb616, 0x71ab, 0xffffd884, 0xffff7ed4, 0x1871, - 0x212a, 0xffff8acf, 0x353, 0x3bca, 0x7cfc, 0xffff7a5d, 0x5990, 0x4bb, - 0xffff7606, 0x6328, 0x386, 0xffffd02b, 0xffffe3b6, 0xfffff0bb, 0x4b6f, 0x8dc, - 0xfffff3ea, 0x169c, 0x3ed8, 0xffffa125, 0x3c69, 0xfffffedb, 0x6c9b, 0x17de, - 0xffffb5f8, 0xef6, 0xfffffbc6, 0xffff82b9, 0xffff7a4e, 0x6193, 0x6994, 0xffffe6b5, - 0xffffdb01, 0x5c14, 0x68a8, 0x26a4, 0xffffb021, 0x7bcc, 0xffff9f05, 0x814, - 0x162c, 0xffffb3e7, 0x2c53, 0xffffc8e1, 0x6920, 0xffff7254, 0x6d49, 0xffffb4c2, - 0xffffcaca, 0xffffe1cd, 0xffffd576, 0xffffbad8, 0xffffc4db, 0xffff7f6b, 0x758b, 0x1f19, - 0x4407, 0x3b61, 0xffffa2ea, 0xfffff403, 0x26b, 0x6789, 0x5ca7, 0x3b3, - 0x458b, 0xffffd823, 0xffff83b7, 0x2dc6, 0xffffbd8d, 0xffff7964, 0x77a3, 0x18bd, - 0x7ada, 0xffffc92e, 0x32e2, 0xffffe36a, 0xffff79db, 0x6ca2, 0xffffafdb, 0xffffba78, - 0x23cb, 0xffffc5ad, 0xffffe3f4, 0x89d5, 0x86ee, 0x13ca, 0xfffff25b, 0x3ebb, - 0x680d, 0x628a, 0xffffce21, 0x44c, 0xffff7532, 0xffff72a6, 0xffff88d5, 0x8599, - 0xffffe7cf, 0xffffbeed, 0xffffbcf5, 0x675c, 0x481d, 0x6ac3, 0xffffc0ae, 0x4ce4, - 0x46ef, 0x2b3f, 0x47fd, 0x35f4, 0xc48, 0x3038, 0x7b9b, 0x302d, - 0xffff85f4, 0x6652, 0xffff7f44, 0xffffec9b, 0xffffedd2, 0x2863, 0x2faa, 0x8cf1, - 0xffffc4e8, 0xcb3, 0xffff925c, 0xffffc9c0, 0xffffad2f, 0x5eb1, 0x5697, 0x66bd, - 0xffff8080, 0xffff98b1, 0x2955, 0xffffcdbd, 0xffffd6d8, 0xffff84a6, 0xffffe29c, 0xffff9edd, - 0x391f, 0x625c, 0xffff8094, 0xffffbad3, 0xffff8b97, 0x7d06, 0xffffadce, 0x1036, - 0xffffcbd0, 0x3027, 0xfffff405, 0x3104, 0xffffd411, 0x614d, 0x426b, 0x410, - 0x3524, 0xffffddf3, 0x3c3b, 0x7663, 0x4d40, 0x7c3e, 0xffffa330, 0xffffbd4a, - 0xffffce53, 0x989, 0xffffddc9, 0xffff92ed, 0x4449, 0xffffa2d2, 0xfffff261, 0x5c84, - 0xfffff447, 0xfffff6c6, 0x4520, 0xffffa40d, 0xffffd253, 0xffffbf75, 0xffffaeea, 0x8c96, - 0xffff7c66, 0xffffc745, 0x572b, 0x5167, 0xffffdc8a, 0x46cc, 0x5b66, 0xffffd61c, - 0x3fc6, 0x7a63, 0xffffc4d8, 0xffffe8b4, 0xffffdc6a, 0x6f63, 0xffffd716, 0xffffbb46, - 0x7426, 0xffff7dde, 0x26f1, 0xffffcd18, 0x1776, 0x4d89, 0x20c5, 0x6457, - 0x371c, 0xffff8c94, 0xffff72e4, 0x7cc, 0x835b, 0xffffb776, 0xffff93e1, 0xffff83cd, - 0x7241, 0xffffcfc4, 0xffffbda6, 0x63f0, 0xffffaa19, 0x7cf5, 0xffff8f8d, 0x1942, - 0xffff87ae, 0x4e6d, 0xffff78d5, 0x6e8c, 0x3539, 0xffffc063, 0x73c, 0x76dc, - 0xfffff8ff, 0xffffb5a1, 0x19bf, 0xffff7694, 0xf15, 0xfffff136, 0xffff82b9, 0xffffcc83, - 0xffff88a4, 0xffffc7e0, 0xffff7256, 0xffffe068, 0x25b4, 0xffffed48, 0xffff8d7d, 0x5f8c, - 0x1892, 0xffffd1e5, 0xffff7417, 0x7ecc, 0xfffffb74, 0x8c0c, 0x4758, 0xffffc7d7, - 0xffffe764, 0xfffffe29, 0xffff88fa, 0xffffe66d, 0xffffdeb4, 0x2f2d, 0x646b, 0xffffce8c, - 0x3769, 0x3912, 0xffffe6fb, 0xffffc166, 0xffffce02, 0x4dc7, 0x80b5, 0xffffc70d, - 0xffffc36a, 0x30ea, 0x7441, 0x5fe4, 0xffff7812, 0xffffe92e, 0xffffcc86, 0xffffe27b, - 0x49e2, 0x71c0, 0xffffab47, 0xffff9c51, 0x7377, 0xfffffc50, 0x7be0, 0x13e0, - 0xffffe5f2, 0x2db1, 0x2610, 0xffff8258, 0xffff978f, 0x282b, 0x395, 0x1031, - 0xffffb66c, 0xffff749b, 0xffffbf6f, 0xffffa7e1, 0x12f1, 0xffffcfa7, 0xfffff7fd, 0x6a21, - 0x8a4d, 0x4ff5, 0x71be, 0x8096, 0x5502, 0x4f40, 0x81c5, 0x5a75, - 0xffff8d39, 0x1bc0, 0xffff7827, 0xa59, 0xffff9929, 0x8db3, 0x5df1, 0xfffff7b2, - 0x420a, 0x6544, 0x6509, 0x7451, 0x1e7f, 0x4f76, 0x315a, 0x3620, - 0x5091, 0x4403, 0xffffd3e4, 0x5c0c, 0x80c2, 0x36c4, 0x5107, 0xffff943d, - 0x6452, 0xffffad40, 0xffff9b98, 0x58ab, 0x27b3, 0xffff8be9, 0xffffa656, 0xffffa5f8, - 0xffffbd22, 0xffff73fd, 0x2758, 0xffffa764, 0x62ed, 0xffff90c5, 0x1e51, 0xffff897b, - 0xffff82b3, 0x2d25, 0x76ad, 0xffff7f02, 0xfffffa89, 0x2d4f, 0x2ab, 0x5685, - 0x8ce1, 0xfffff7de, 0x5522, 0xffffbc64, 0xffff9e79, 0xffffef8b, 0xffff84f0, 0xffff933c, - 0x102e, 0x8bc, 0x5a44, 0xfffffe4f, 0xffffaed9, 0x7aee, 0xffffa2ae, 0x12e0, - 0x7c7b, 0x3a66, 0xffffb1f5, 0xffffa575, 0x3bf3, 0xffffe14f, 0xffffedca, 0xfffffb3d, - 0xffff8279, 0x296b, 0x8bc7, 0xc1b, 0xffffea63, 0x65cd, 0xffffa851, 0x878f, - 0xe37, 0x501a, 0x581c, 0x16c3, 0x6279, 0xffff9e12, 0xfffffc2c, 0x7d4c, - 0x4c95, 0xffffced3, 0xffff8b07, 0xffff87b0, 0xffffa928, 0x6ce2, 0xffff8bc1, 0xffff7fab, - 0x5249, 0xffffbf8f, 0x8074, 0x1ab9, 0xffffe2ed, 0xffffebbb, 0xfffffd25, 0x474f, - 0xffffe439, 0xffffe258, 0xffffb947, 0xfffffa1b, 0xffff90ea, 0x8134, 0x6eed, 0xffffc392, - 0xffff934a, 0xffffb921, 0xd9a, 0x6581, 0x37f2, 0xffffe672, 0xffffafd9, 0x30eb, - 0xffffa08e, 0xffffa39d, 0xffff9657, 0x26d0, 0xffffb97f, 0x5df, 0xffff9257, 0x3a34, - 0xfffffd43, 0xffffc367, 0x8bf0, 0x186, 0x1692, 0x5420, 0x7d2c, 0x83dd, - 0x4ad1, 0xfffffc05, 0x67a4, 0x7b06, 0xffffacd2, 0x7c2, 0x4f9a, 0x586a, - 0xffffdacd, 0xfffff2e4, 0xffffa666, 0xffffa2f2, 0xffffdd98, 0x50ec, 0xffffec94, 0xffffe01d, - 0xffffe6a5, 0x2b32, 0xffff9128, 0xffffba30, 0xffff82ba, 0xffffe9fc, 0xffffe738, 0x20fa, - 0x3c1b, 0xffffce2f, 0x533, 0x8bdf, 0x79be, 0xffff86e9, 0x82cf, 0xffffab3e, - 0x591d, 0xfffffeb2, 0xffff7424, 0x8932, 0xffffe0f9, 0xffff9d92, 0xffff7b20, 0x2495, - 0x879d, 0x85a3, 0x6f1f, 0x1cf2, 0x1220, 0x65c2, 0xffffc751, 0xffffa10f, - 0xffffa5df, 0xffffd1fd, 0xffffac41, 0xffff73d2, 0xffffc38e, 0xffffa17a, 0xffff9f58, 0x6600, - 0xffff95d8, 0x8400, 0x38dc, 0xffff9844, 0xffff9378, 0x5fdc, 0x3ed8, 0xb4b, - 0xffffb1fd, 0xffff72a1, 0x6313, 0x3acb, 0xffffd03c, 0xffffe6bb, 0x59f7, 0x5a17, - 0x20c2, 0xffffddc9, 0x60e0, 0xffffb1ff, 0x7867, 0xffffad34, 0x8cb0, 0xffff89ed, - 0xffff9cf1, 0x57ed, 0x186b, 0x85bb, 0x1ed9, 0xffffd073, 0x755, 0x39d, - 0xffffe507, 0x5144, 0x3bdd, 0xffff748f, 0x5a22, 0x2f8c, 0xffffe210, 0xffff8285, - 0x2ffa, 0x17c1, 0x11b5, 0xffffa5ff, 0x3950, 0x6b7f, 0xffffc962, 0xfffff345, - 0x80c6, 0xffffbb45, 0xffffac73, 0xffff941e, 0xffff9774, 0xffffe733, 0x35cb, 0xffffb0e4, - 0x8a90, 0x296d, 0xffffea99, 0xffffb292, 0x3778, 0xffffff27, 0x3422, 0x2bd4, - 0xffffb0ac, 0xffffda12, 0x3f00, 0x36ed, 0x38ec, 0xffff9a13, 0xffff9d40, 0x5ec5, - 0x5a1b, 0x5a7d, 0xffffccab, 0xfffffcd1, 0xffffa33b, 0xffff9848, 0x31d8, 0x2224, - 0x2eb0, 0xffffa658, 0xffff9e76, 0xffffd97a, 0x65a8, 0xffff8029, 0xf42, 0x2c21 -}; - diff --git a/bsp/stm32_radio/libwma/wmadec.h b/bsp/stm32_radio/libwma/wmadec.h deleted file mode 100644 index c0295b08ae..0000000000 --- a/bsp/stm32_radio/libwma/wmadec.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - * WMA compatible decoder - * Copyright (c) 2002 The FFmpeg Project. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _WMADEC_H -#define _WMADEC_H - -#include "asf.h" -#include "wmabitstream.h" /* For GetBitContext */ -#include "types.h" - -//#define TRACE -/* size of blocks */ -#define BLOCK_MIN_BITS 7 -#define BLOCK_MAX_BITS 11 -#define BLOCK_MAX_SIZE (1 << BLOCK_MAX_BITS) - -#define BLOCK_NB_SIZES (BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1) - -/* XXX: find exact max size */ -#define HIGH_BAND_MAX_SIZE 16 - -#define NB_LSP_COEFS 10 - -/* XXX: is it a suitable value ? */ -#define MAX_CODED_SUPERFRAME_SIZE 16384 - -#define M_PI 3.14159265358979323846 - -#define M_PI_F 0x3243f // in fixed 32 format -#define TWO_M_PI_F 0x6487f //in fixed 32 - -#define MAX_CHANNELS 2 - -#define NOISE_TAB_SIZE 8192 - -#define LSP_POW_BITS 7 - -/*define IRAM for targets with 48k/80k IRAM split*/ -#ifndef IBSS_ATTR_WMA_LARGE_IRAM -#if (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) -/* PP5022/24 and MCF5250 have 128KB of IRAM, but only PP5022+ have 80KB allocated for codecs */ -#define IBSS_ATTR_WMA_LARGE_IRAM IBSS_ATTR -#else -/* other PP's and MCF5249 have 96KB of IRAM */ -#define IBSS_ATTR_WMA_LARGE_IRAM -#endif -#endif - -typedef struct WMADecodeContext -{ - GetBitContext gb; - - int nb_block_sizes; /* number of block sizes */ - - int sample_rate; - int nb_channels; - int bit_rate; - int version; /* 1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2) */ - int block_align; - int use_bit_reservoir; - int use_variable_block_len; - int use_exp_vlc; /* exponent coding: 0 = lsp, 1 = vlc + delta */ - int use_noise_coding; /* true if perceptual noise is added */ - int byte_offset_bits; - VLC exp_vlc; - int exponent_sizes[BLOCK_NB_SIZES]; - uint16_t exponent_bands[BLOCK_NB_SIZES][25]; - int high_band_start[BLOCK_NB_SIZES]; /* index of first coef in high band */ - int coefs_start; /* first coded coef */ - int coefs_end[BLOCK_NB_SIZES]; /* max number of coded coefficients */ - int exponent_high_sizes[BLOCK_NB_SIZES]; - int exponent_high_bands[BLOCK_NB_SIZES][HIGH_BAND_MAX_SIZE]; - VLC hgain_vlc; - - /* coded values in high bands */ - int high_band_coded[MAX_CHANNELS][HIGH_BAND_MAX_SIZE]; - int high_band_values[MAX_CHANNELS][HIGH_BAND_MAX_SIZE]; - - /* there are two possible tables for spectral coefficients */ - VLC coef_vlc[2]; - uint16_t *run_table[2]; - uint16_t *level_table[2]; - /* frame info */ - int frame_len; /* frame length in samples */ - int frame_len_bits; /* frame_len = 1 << frame_len_bits */ - - /* block info */ - int reset_block_lengths; - int block_len_bits; /* log2 of current block length */ - int next_block_len_bits; /* log2 of next block length */ - int prev_block_len_bits; /* log2 of prev block length */ - int block_len; /* block length in samples */ - int block_num; /* block number in current frame */ - int block_pos; /* current position in frame */ - uint8_t ms_stereo; /* true if mid/side stereo mode */ - uint8_t channel_coded[MAX_CHANNELS]; /* true if channel is coded */ - int exponents_bsize[MAX_CHANNELS]; // log2 ratio frame/exp. length - fixed32 exponents[MAX_CHANNELS][BLOCK_MAX_SIZE]; - fixed32 max_exponent[MAX_CHANNELS]; - int16_t coefs1[MAX_CHANNELS][BLOCK_MAX_SIZE]; - fixed32 (*coefs)[MAX_CHANNELS][BLOCK_MAX_SIZE]; - fixed32 *windows[BLOCK_NB_SIZES]; - /* output buffer for one frame and the last for IMDCT windowing */ - fixed32 (*frame_out)[MAX_CHANNELS][BLOCK_MAX_SIZE*2]; - - /* last frame info */ - uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + 4]; /* padding added */ - int last_bitoffset; - int last_superframe_len; - fixed32 *noise_table; - int noise_index; - fixed32 noise_mult; /* XXX: suppress that and integrate it in the noise array */ - /* lsp_to_curve tables */ - fixed32 lsp_cos_table[BLOCK_MAX_SIZE]; - fixed64 lsp_pow_e_table[256]; - fixed32 lsp_pow_m_table1[(1 << LSP_POW_BITS)]; - fixed32 lsp_pow_m_table2[(1 << LSP_POW_BITS)]; - - /* State of current superframe decoding */ - int bit_offset; - int nb_frames; - int current_frame; - -#ifdef TRACE - int frame_count; -#endif -} WMADecodeContext; - -int wma_decode_init(WMADecodeContext* s, asf_waveformatex_t *wfx); -int wma_decode_superframe_init(WMADecodeContext* s, const uint8_t *buf, int buf_size); -int wma_decode_superframe_frame(WMADecodeContext* s, int32_t *samples, const uint8_t *buf, int buf_size); - -#endif diff --git a/bsp/stm32_radio/libwma/wmadeci.c b/bsp/stm32_radio/libwma/wmadeci.c deleted file mode 100644 index 1f0758b377..0000000000 --- a/bsp/stm32_radio/libwma/wmadeci.c +++ /dev/null @@ -1,1586 +0,0 @@ -/* - * WMA compatible decoder - * Copyright (c) 2002 The FFmpeg Project. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** - * @file wmadec.c - * WMA compatible decoder. - */ - -//#include -#include "codeclib.h" -#include "asf.h" -#include "wmadec.h" -#include "wmafixed.h" -#include "wmabitstream.h" - -#define VLCBITS 7 /*7 is the lowest without glitching*/ -#define VLCMAX ((22+VLCBITS-1)/VLCBITS) - -#define EXPVLCBITS 7 -#define EXPMAX ((19+EXPVLCBITS-1)/EXPVLCBITS) - -#define HGAINVLCBITS 9 -#define HGAINMAX ((13+HGAINVLCBITS-1)/HGAINVLCBITS) - -typedef struct CoefVLCTable -{ - int n; /* total number of codes */ - const uint32_t *huffcodes; /* VLC bit values */ - const uint8_t *huffbits; /* VLC bit size */ - const uint16_t *levels; /* table to build run/level tables */ -} CoefVLCTable; - -static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len); - -fixed32 coefsarray[MAX_CHANNELS][BLOCK_MAX_SIZE] ; -/*decode and window into IRAM on targets with at least 80KB of codec IRAM*/ -fixed32 frame_out_buf[MAX_CHANNELS][BLOCK_MAX_SIZE * 2] ; - -//static variables that replace malloced stuff -fixed32 stat0[2048], stat1[1024], stat2[512], stat3[256], stat4[128]; //these are the MDCT reconstruction windows - -uint16_t *runtabarray[2], *levtabarray[2]; //these are VLC lookup tables - -uint16_t runtab0[1336], runtab1[1336], levtab0[1336], levtab1[1336]; //these could be made smaller since only one can be 1336 - -#define VLCBUF1SIZE 4598 -#define VLCBUF2SIZE 3574 -#define VLCBUF3SIZE 360 -#define VLCBUF4SIZE 540 - -/*putting these in IRAM actually makes PP slower*/ - -VLC_TYPE vlcbuf1[VLCBUF1SIZE][2]; -VLC_TYPE vlcbuf2[VLCBUF2SIZE][2]; -VLC_TYPE vlcbuf3[VLCBUF3SIZE][2]; -VLC_TYPE vlcbuf4[VLCBUF4SIZE][2]; - -#include "wmadata.h" - -/* - * Helper functions for wma_window. - * - * - */ - -#ifdef CPU_ARM -static inline -void vector_fmul_add_add(fixed32 *dst, const fixed32 *data, - const fixed32 *window, int n) -{ - /* Block sizes are always power of two */ - asm volatile ( - "0:" - "ldmia %[d]!, {r0, r1};" - "ldmia %[w]!, {r4, r5};" - /* consume the first data and window value so we can use those - * registers again */ - "smull r8, r9, r0, r4;" - "ldmia %[dst], {r0, r4};" - "add r0, r0, r9, lsl #1;" /* *dst=*dst+(r9<<1)*/ - "smull r8, r9, r1, r5;" - "add r1, r4, r9, lsl #1;" - "stmia %[dst]!, {r0, r1};" - "subs %[n], %[n], #2;" - "bne 0b;" - : [d] "+r" (data), [w] "+r" (window), [dst] "+r" (dst), [n] "+r" (n) - : : "r0", "r1", "r4", "r5", "r8", "r9", "memory", "cc"); -} - -static inline -void vector_fmul_reverse(fixed32 *dst, const fixed32 *src0, const fixed32 *src1, - int len) -{ - /* Block sizes are always power of two */ - asm volatile ( - "add %[s1], %[s1], %[n], lsl #2;" - "0:" - "ldmia %[s0]!, {r0, r1};" - "ldmdb %[s1]!, {r4, r5};" - "smull r8, r9, r0, r5;" - "mov r0, r9, lsl #1;" - "smull r8, r9, r1, r4;" - "mov r1, r9, lsl #1;" - "stmia %[dst]!, {r0, r1};" - "subs %[n], %[n], #2;" - "bne 0b;" - : [s0] "+r" (src0), [s1] "+r" (src1), [dst] "+r" (dst), [n] "+r" (len) - : : "r0", "r1", "r4", "r5", "r8", "r9", "memory", "cc"); -} - -#elif defined(CPU_COLDFIRE) - -static inline -void vector_fmul_add_add(fixed32 *dst, const fixed32 *data, - const fixed32 *window, int n) -{ - /* Block sizes are always power of two. Smallest block is always way bigger - * than four too.*/ - asm volatile ( - "0:" - "movem.l (%[d]), %%d0-%%d3;" - "movem.l (%[w]), %%d4-%%d5/%%a0-%%a1;" - "mac.l %%d0, %%d4, %%acc0;" - "mac.l %%d1, %%d5, %%acc1;" - "mac.l %%d2, %%a0, %%acc2;" - "mac.l %%d3, %%a1, %%acc3;" - "lea.l (16, %[d]), %[d];" - "lea.l (16, %[w]), %[w];" - "movclr.l %%acc0, %%d0;" - "movclr.l %%acc1, %%d1;" - "movclr.l %%acc2, %%d2;" - "movclr.l %%acc3, %%d3;" - "movem.l (%[dst]), %%d4-%%d5/%%a0-%%a1;" - "add.l %%d4, %%d0;" - "add.l %%d5, %%d1;" - "add.l %%a0, %%d2;" - "add.l %%a1, %%d3;" - "movem.l %%d0-%%d3, (%[dst]);" - "lea.l (16, %[dst]), %[dst];" - "subq.l #4, %[n];" - "jne 0b;" - : [d] "+a" (data), [w] "+a" (window), [dst] "+a" (dst), [n] "+d" (n) - : : "d0", "d1", "d2", "d3", "d4", "d5", "a0", "a1", "memory", "cc"); -} - -static inline -void vector_fmul_reverse(fixed32 *dst, const fixed32 *src0, const fixed32 *src1, - int len) -{ - /* Block sizes are always power of two. Smallest block is always way bigger - * than four too.*/ - asm volatile ( - "lea.l (-16, %[s1], %[n]*4), %[s1];" - "0:" - "movem.l (%[s0]), %%d0-%%d3;" - "movem.l (%[s1]), %%d4-%%d5/%%a0-%%a1;" - "mac.l %%d0, %%a1, %%acc0;" - "mac.l %%d1, %%a0, %%acc1;" - "mac.l %%d2, %%d5, %%acc2;" - "mac.l %%d3, %%d4, %%acc3;" - "lea.l (16, %[s0]), %[s0];" - "lea.l (-16, %[s1]), %[s1];" - "movclr.l %%acc0, %%d0;" - "movclr.l %%acc1, %%d1;" - "movclr.l %%acc2, %%d2;" - "movclr.l %%acc3, %%d3;" - "movem.l %%d0-%%d3, (%[dst]);" - "lea.l (16, %[dst]), %[dst];" - "subq.l #4, %[n];" - "jne 0b;" - : [s0] "+a" (src0), [s1] "+a" (src1), [dst] "+a" (dst), [n] "+d" (len) - : : "d0", "d1", "d2", "d3", "d4", "d5", "a0", "a1", "memory", "cc"); -} - -#else - -static inline void vector_fmul_add_add(fixed32 *dst, const fixed32 *src0, const fixed32 *src1, int len){ - int i; - for(i=0; ioutput; - int block_len, bsize, n; - - /* left part */ - /*previous block was larger, so we'll use the size of the current block to set the window size*/ - if (s->block_len_bits <= s->prev_block_len_bits) { - block_len = s->block_len; - bsize = s->frame_len_bits - s->block_len_bits; - - vector_fmul_add_add(out, in, s->windows[bsize], block_len); - - } else { - /*previous block was smaller or the same size, so use it's size to set the window length*/ - block_len = 1 << s->prev_block_len_bits; - /*find the middle of the two overlapped blocks, this will be the first overlapped sample*/ - n = (s->block_len - block_len) / 2; - bsize = s->frame_len_bits - s->prev_block_len_bits; - - vector_fmul_add_add(out+n, in+n, s->windows[bsize], block_len); - - memcpy(out+n+block_len, in+n+block_len, n*sizeof(fixed32)); - } - /* Advance to the end of the current block and prepare to window it for the next block. - * Since the window function needs to be reversed, we do it backwards starting with the - * last sample and moving towards the first - */ - out += s->block_len; - in += s->block_len; - - /* right part */ - if (s->block_len_bits <= s->next_block_len_bits) { - block_len = s->block_len; - bsize = s->frame_len_bits - s->block_len_bits; - - vector_fmul_reverse(out, in, s->windows[bsize], block_len); - - } else { - block_len = 1 << s->next_block_len_bits; - n = (s->block_len - block_len) / 2; - bsize = s->frame_len_bits - s->next_block_len_bits; - - memcpy(out, in, n*sizeof(fixed32)); - - vector_fmul_reverse(out+n, in+n, s->windows[bsize], block_len); - - memset(out+n+block_len, 0, n*sizeof(fixed32)); - } - } - - -/* XXX: use same run/length optimization as mpeg decoders */ -static void init_coef_vlc(VLC *vlc, - uint16_t **prun_table, uint16_t **plevel_table, - const CoefVLCTable *vlc_table, int tab) -{ - int n = vlc_table->n; - const uint8_t *table_bits = vlc_table->huffbits; - const uint32_t *table_codes = vlc_table->huffcodes; - const uint16_t *levels_table = vlc_table->levels; - uint16_t *run_table, *level_table; - const uint16_t *p; - int i, l, j, level; - - init_vlc(vlc, VLCBITS, n, table_bits, 1, 1, table_codes, 4, 4, 0); - - run_table = runtabarray[tab]; - level_table= levtabarray[tab]; - - p = levels_table; - i = 2; - level = 1; - while (i < n) - { - l = *p++; - for(j=0;jmono*/ - s->channel_coded[0]=0; - s->channel_coded[1]=0; - s->ms_stereo=0; - - s->sample_rate = wfx->rate; - s->nb_channels = wfx->channels; - s->bit_rate = wfx->bitrate; - s->block_align = wfx->blockalign; - - s->coefs = &coefsarray; - s->frame_out = &frame_out_buf; - - if (wfx->codec_id == ASF_CODEC_ID_WMAV1) { - s->version = 1; - } else if (wfx->codec_id == ASF_CODEC_ID_WMAV2 ) { - s->version = 2; - } else { - /*one of those other wma flavors that don't have GPLed decoders */ - return -1; - } - - /* extract flag infos */ - flags1 = 0; - flags2 = 0; - extradata = wfx->data; - if (s->version == 1 && wfx->datalen >= 4) { - flags1 = extradata[0] | (extradata[1] << 8); - flags2 = extradata[2] | (extradata[3] << 8); - }else if (s->version == 2 && wfx->datalen >= 6){ - flags1 = extradata[0] | (extradata[1] << 8) | - (extradata[2] << 16) | (extradata[3] << 24); - flags2 = extradata[4] | (extradata[5] << 8); - } - s->use_exp_vlc = flags2 & 0x0001; - s->use_bit_reservoir = flags2 & 0x0002; - s->use_variable_block_len = flags2 & 0x0004; - - /* compute MDCT block size */ - if (s->sample_rate <= 16000){ - s->frame_len_bits = 9; - }else if (s->sample_rate <= 22050 || - (s->sample_rate <= 32000 && s->version == 1)){ - s->frame_len_bits = 10; - }else{ - s->frame_len_bits = 11; - } - s->frame_len = 1 << s->frame_len_bits; - if (s->use_variable_block_len) - { - int nb_max, nb; - nb = ((flags2 >> 3) & 3) + 1; - if ((s->bit_rate / s->nb_channels) >= 32000) - { - nb += 2; - } - nb_max = s->frame_len_bits - BLOCK_MIN_BITS; //max is 11-7 - if (nb > nb_max) - nb = nb_max; - s->nb_block_sizes = nb + 1; - } - else - { - s->nb_block_sizes = 1; - } - - /* init rate dependant parameters */ - s->use_noise_coding = 1; - high_freq = itofix64(s->sample_rate) >> 1; - - /* if version 2, then the rates are normalized */ - sample_rate1 = s->sample_rate; - if (s->version == 2) - { - if (sample_rate1 >= 44100) - sample_rate1 = 44100; - else if (sample_rate1 >= 22050) - sample_rate1 = 22050; - else if (sample_rate1 >= 16000) - sample_rate1 = 16000; - else if (sample_rate1 >= 11025) - sample_rate1 = 11025; - else if (sample_rate1 >= 8000) - sample_rate1 = 8000; - } - - { - fixed64 tmp, tmp2; - fixed64 tim, tmpi; - - tmp = itofix64(s->bit_rate); - tmp2 = itofix64(s->nb_channels * s->sample_rate); - bps = fixdiv64(tmp, tmp2); - tim = bps * s->frame_len; - tmpi = fixdiv64(tim,itofix64(8)); - s->byte_offset_bits = av_log2(fixtoi64(tmpi+0x8000)) + 2; - } - - /* compute high frequency value and choose if noise coding should - be activated */ - bps1 = bps; - if (s->nb_channels == 2) - bps1 = fixmul32(bps,0x1999a); - if (sample_rate1 == 44100) - { - if (bps1 >= 0x9c29) - s->use_noise_coding = 0; - else - high_freq = fixmul32(high_freq,0x6666); - } - else if (sample_rate1 == 22050) - { - if (bps1 >= 0x128f6) - s->use_noise_coding = 0; - else if (bps1 >= 0xb852) - high_freq = fixmul32(high_freq,0xb333); - else - high_freq = fixmul32(high_freq,0x999a); - } - else if (sample_rate1 == 16000) - { - if (bps > 0x8000) - high_freq = fixmul32(high_freq,0x8000); - else - high_freq = fixmul32(high_freq,0x4ccd); - } - else if (sample_rate1 == 11025) - { - high_freq = fixmul32(high_freq,0xb333); - } - else if (sample_rate1 == 8000) - { - if (bps <= 0xa000) - { - high_freq = fixmul32(high_freq,0x8000); - } - else if (bps > 0xc000) - { - s->use_noise_coding = 0; - } - else - { - high_freq = fixmul32(high_freq,0xa666); - } - } - else - { - if (bps >= 0xcccd) - { - high_freq = fixmul32(high_freq,0xc000); - } - else if (bps >= 0x999a) - { - high_freq = fixmul32(high_freq,0x999a); - } - else - { - high_freq = fixmul32(high_freq,0x8000); - } - } - - /* compute the scale factor band sizes for each MDCT block size */ - { - int a, b, pos, lpos, k, block_len, i, j, n; - const uint8_t *table; - - fixed32 tmp1, tmp2; - - if (s->version == 1) - { - s->coefs_start = 3; - } - else - { - s->coefs_start = 0; - } - for(k = 0; k < s->nb_block_sizes; ++k) - { - block_len = s->frame_len >> k; - - if (s->version == 1) - { - lpos = 0; - for(i=0;i<25;++i) - { - a = wma_critical_freqs[i]; - b = s->sample_rate; - pos = ((block_len * 2 * a) + (b >> 1)) / b; - if (pos > block_len) - pos = block_len; - s->exponent_bands[0][i] = pos - lpos; - if (pos >= block_len) - { - ++i; - break; - } - lpos = pos; - } - s->exponent_sizes[0] = i; - } - else - { - /* hardcoded tables */ - table = NULL; - a = s->frame_len_bits - BLOCK_MIN_BITS - k; - if (a < 3) - { - if (s->sample_rate >= 44100) - table = exponent_band_44100[a]; - else if (s->sample_rate >= 32000) - table = exponent_band_32000[a]; - else if (s->sample_rate >= 22050) - table = exponent_band_22050[a]; - } - if (table) - { - n = *table++; - for(i=0;iexponent_bands[k][i] = table[i]; - s->exponent_sizes[k] = n; - } - else - { - j = 0; - lpos = 0; - for(i=0;i<25;++i) - { - a = wma_critical_freqs[i]; - b = s->sample_rate; - pos = ((block_len * 2 * a) + (b << 1)) / (4 * b); - pos <<= 2; - if (pos > block_len) - pos = block_len; - if (pos > lpos) - s->exponent_bands[k][j++] = pos - lpos; - if (pos >= block_len) - break; - lpos = pos; - } - s->exponent_sizes[k] = j; - } - } - - /* max number of coefs */ - s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k; - /* high freq computation */ - - tmp1 = high_freq*2; /* high_freq is a fixed32!*/ - tmp2 = itofix32(s->sample_rate>>1); - s->high_band_start[k] = fixtoi32( fixdiv32(tmp1, tmp2) * (block_len>>1) +0x8000); - - /* - s->high_band_start[k] = (int)((block_len * 2 * high_freq) / - s->sample_rate + 0.5);*/ - - n = s->exponent_sizes[k]; - j = 0; - pos = 0; - for(i=0;iexponent_bands[k][i]; - end = pos; - if (start < s->high_band_start[k]) - start = s->high_band_start[k]; - if (end > s->coefs_end[k]) - end = s->coefs_end[k]; - if (end > start) - s->exponent_high_bands[k][j++] = end - start; - } - s->exponent_high_sizes[k] = j; - } - } - - /*Not using the ffmpeg IMDCT anymore*/ - - /* mdct_init_global(); - - for(i = 0; i < s->nb_block_sizes; ++i) - { - ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1); - - } - */ - - /*ffmpeg uses malloc to only allocate as many window sizes as needed. However, we're really only interested in the worst case memory usage. - * In the worst case you can have 5 window sizes, 128 doubling up 2048 - * Smaller windows are handled differently. - * Since we don't have malloc, just statically allocate this - */ - temp[0] = stat0; - temp[1] = stat1; - temp[2] = stat2; - temp[3] = stat3; - temp[4] = stat4; - - /* init MDCT windows : simple sinus window */ - for(i = 0; i < s->nb_block_sizes; i++) - { - int n, j; - fixed32 alpha; - n = 1 << (s->frame_len_bits - i); - //window = av_malloc(sizeof(fixed32) * n); - window = temp[i]; - - //fixed32 n2 = itofix32(n<<1); //2x the window length - //alpha = fixdiv32(M_PI_F, n2); //PI / (2x Window length) == PI<<(s->frame_len_bits - i+1) - - //alpha = M_PI_F>>(s->frame_len_bits - i+1); - alpha = (1<<15)>>(s->frame_len_bits - i+1); /* this calculates 0.5/(2*n) */ - for(j=0;jwindows[i] = window; - } - - s->reset_block_lengths = 1; - - if (s->use_noise_coding) - { - /* init the noise generator */ - if (s->use_exp_vlc) - { - s->noise_mult = 0x51f; - s->noise_table = noisetable_exp; - } - else - { - s->noise_mult = 0xa3d; - /* LSP values are simply 2x the EXP values */ - for (i=0;inoise_table = noisetable_exp; - } - - s->hgain_vlc.table = vlcbuf4; - s->hgain_vlc.table_allocated = VLCBUF4SIZE; - init_vlc(&s->hgain_vlc, HGAINVLCBITS, sizeof(hgain_huffbits), - hgain_huffbits, 1, 1, - hgain_huffcodes, 2, 2, 0); - } - - if (s->use_exp_vlc) - { - - s->exp_vlc.table = vlcbuf3; - s->exp_vlc.table_allocated = VLCBUF3SIZE; - - init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(scale_huffbits), - scale_huffbits, 1, 1, - scale_huffcodes, 4, 4, 0); - } - else - { - wma_lsp_to_curve_init(s, s->frame_len); - } - - /* choose the VLC tables for the coefficients */ - coef_vlc_table = 2; - if (s->sample_rate >= 32000) - { - if (bps1 < 0xb852) - coef_vlc_table = 0; - else if (bps1 < 0x128f6) - coef_vlc_table = 1; - } - - runtabarray[0] = runtab0; runtabarray[1] = runtab1; - levtabarray[0] = levtab0; levtabarray[1] = levtab1; - - s->coef_vlc[0].table = vlcbuf1; - s->coef_vlc[0].table_allocated = VLCBUF1SIZE; - s->coef_vlc[1].table = vlcbuf2; - s->coef_vlc[1].table_allocated = VLCBUF2SIZE; - - - init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0], - &coef_vlcs[coef_vlc_table * 2], 0); - init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1], - &coef_vlcs[coef_vlc_table * 2 + 1], 1); - - s->last_superframe_len = 0; - s->last_bitoffset = 0; - - return 0; -} - - -/* compute x^-0.25 with an exponent and mantissa table. We use linear - interpolation to reduce the mantissa table size at a small speed - expense (linear interpolation approximately doubles the number of - bits of precision). */ -static inline fixed32 pow_m1_4(WMADecodeContext *s, fixed32 x) -{ - union { - float f; - unsigned int v; - } u, t; - unsigned int e, m; - fixed32 a, b; - - u.f = fixtof64(x); - e = u.v >> 23; - m = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1); - /* build interpolation scale: 1 <= t < 2. */ - t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23); - a = s->lsp_pow_m_table1[m]; - b = s->lsp_pow_m_table2[m]; - - /* lsp_pow_e_table contains 32.32 format */ - /* TODO: Since we're unlikely have value that cover the whole - * IEEE754 range, we probably don't need to have all possible exponents */ - - return (lsp_pow_e_table[e] * (a + fixmul32(b, ftofix32(t.f))) >>32); -} - -static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len) -{ - fixed32 a, b, temp, temp2; - int i, ix = 0; - - // wdel = fixdiv32(M_PI_F, itofix32(frame_len)); - temp = fixdiv32(itofix32(1), itofix32(frame_len)); - for (i=0; ilsp_cos_table[i] = temp2>>3; - - } - /* NOTE: these two tables are needed to avoid two operations in - pow_m1_4 */ - b = itofix32(1); - - /*double check this later*/ - for(i=(1 << LSP_POW_BITS) - 1;i>=0;i--) - { - // m = (1 << LSP_POW_BITS) + i; - a = pow_a_table[ix++]<<4; - s->lsp_pow_m_table1[i] = 2 * a - b; - s->lsp_pow_m_table2[i] = b - a; - b = a; - } - -} - -/* NOTE: We use the same code as Vorbis here */ -/* XXX: optimize it further with SSE/3Dnow */ -static void wma_lsp_to_curve(WMADecodeContext *s, - fixed32 *out, - fixed32 *val_max_ptr, - int n, - fixed32 *lsp) -{ - int i, j; - fixed32 p, q, w, v, val_max, temp, temp2; - - val_max = 0; - for(i=0;ilsp_cos_table[i]; - - for (j=1;j>9; /* p/q end up as 16.16 */ - v = pow_m1_4(s, v); - if (v > val_max) - val_max = v; - out[i] = v; - } - - *val_max_ptr = val_max; -} - -/* decode exponents coded with LSP coefficients (same idea as Vorbis) */ -static void decode_exp_lsp(WMADecodeContext *s, int ch) -{ - fixed32 lsp_coefs[NB_LSP_COEFS]; - int val, i; - - for (i = 0; i < NB_LSP_COEFS; ++i) - { - if (i == 0 || i >= 8) - val = get_bits(&s->gb, 3); - else - val = get_bits(&s->gb, 4); - lsp_coefs[i] = lsp_codebook[i][val]; - } - - wma_lsp_to_curve(s, - s->exponents[ch], - &s->max_exponent[ch], - s->block_len, - lsp_coefs); -} - -/* decode exponents coded with VLC codes */ -static int decode_exp_vlc(WMADecodeContext *s, int ch) -{ - int last_exp, n, code; - const uint16_t *ptr, *band_ptr; - fixed32 v, max_scale; - fixed32 *q,*q_end; - - /*accommodate the 60 negative indices */ - const fixed32 *pow_10_to_yover16_ptr = &pow_10_to_yover16[61]; - - band_ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits]; - ptr = band_ptr; - q = s->exponents[ch]; - q_end = q + s->block_len; - max_scale = 0; - - - if (s->version == 1) //wmav1 only - { - last_exp = get_bits(&s->gb, 5) + 10; - /* XXX: use a table */ - v = pow_10_to_yover16_ptr[last_exp]; - max_scale = v; - n = *ptr++; - do - { - *q++ = v; - } - while (--n); - } else { - last_exp = 36; - } - - while (q < q_end) - { - code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX); - if (code < 0) - { - return -1; - } - /* NOTE: this offset is the same as MPEG4 AAC ! */ - last_exp += code - 60; - /* XXX: use a table */ - v = pow_10_to_yover16_ptr[last_exp]; - if (v > max_scale) - { - max_scale = v; - } - n = *ptr++; - do - { - *q++ = v; - - } - while (--n); - } - - s->max_exponent[ch] = max_scale; - return 0; -} - -/* return 0 if OK. return 1 if last block of frame. return -1 if - unrecorrable error. */ -static int wma_decode_block(WMADecodeContext *s, int32_t *scratch_buffer) -{ - int n, v, a, ch, code, bsize; - int coef_nb_bits, total_gain; - int nb_coefs[MAX_CHANNELS]; - fixed32 mdct_norm; - - /*DEBUGF("***decode_block: %d (%d samples of %d in frame)\n", s->block_num, s->block_len, s->frame_len);*/ - - /* compute current block length */ - if (s->use_variable_block_len) - { - n = av_log2(s->nb_block_sizes - 1) + 1; - - if (s->reset_block_lengths) - { - s->reset_block_lengths = 0; - v = get_bits(&s->gb, n); - if (v >= s->nb_block_sizes) - { - return -2; - } - s->prev_block_len_bits = s->frame_len_bits - v; - v = get_bits(&s->gb, n); - if (v >= s->nb_block_sizes) - { - return -3; - } - s->block_len_bits = s->frame_len_bits - v; - } - else - { - /* update block lengths */ - s->prev_block_len_bits = s->block_len_bits; - s->block_len_bits = s->next_block_len_bits; - } - v = get_bits(&s->gb, n); - - if (v >= s->nb_block_sizes) - { - // rb->splash(HZ*4, "v was %d", v); //5, 7 - return -4; //this is it - } - else{ - //rb->splash(HZ, "passed v block (%d)!", v); - } - s->next_block_len_bits = s->frame_len_bits - v; - } - else - { - /* fixed block len */ - s->next_block_len_bits = s->frame_len_bits; - s->prev_block_len_bits = s->frame_len_bits; - s->block_len_bits = s->frame_len_bits; - } - /* now check if the block length is coherent with the frame length */ - s->block_len = 1 << s->block_len_bits; - - if ((s->block_pos + s->block_len) > s->frame_len) - { - return -5; //oddly 32k sample from tracker fails here - } - - if (s->nb_channels == 2) - { - s->ms_stereo = get_bits1(&s->gb); - } - v = 0; - for (ch = 0; ch < s->nb_channels; ++ch) - { - a = get_bits1(&s->gb); - s->channel_coded[ch] = a; - v |= a; - } - /* if no channel coded, no need to go further */ - /* XXX: fix potential framing problems */ - if (!v) - { - goto next; - } - - bsize = s->frame_len_bits - s->block_len_bits; - - /* read total gain and extract corresponding number of bits for - coef escape coding */ - total_gain = 1; - for(;;) - { - a = get_bits(&s->gb, 7); - total_gain += a; - if (a != 127) - { - break; - } - } - - if (total_gain < 15) - coef_nb_bits = 13; - else if (total_gain < 32) - coef_nb_bits = 12; - else if (total_gain < 40) - coef_nb_bits = 11; - else if (total_gain < 45) - coef_nb_bits = 10; - else - coef_nb_bits = 9; - - /* compute number of coefficients */ - n = s->coefs_end[bsize] - s->coefs_start; - - for(ch = 0; ch < s->nb_channels; ++ch) - { - nb_coefs[ch] = n; - } - /* complex coding */ - if (s->use_noise_coding) - { - - for(ch = 0; ch < s->nb_channels; ++ch) - { - if (s->channel_coded[ch]) - { - int i, n, a; - n = s->exponent_high_sizes[bsize]; - for(i=0;igb); - s->high_band_coded[ch][i] = a; - /* if noise coding, the coefficients are not transmitted */ - if (a) - nb_coefs[ch] -= s->exponent_high_bands[bsize][i]; - } - } - } - for(ch = 0; ch < s->nb_channels; ++ch) - { - if (s->channel_coded[ch]) - { - int i, n, val, code; - - n = s->exponent_high_sizes[bsize]; - val = (int)0x80000000; - for(i=0;ihigh_band_coded[ch][i]) - { - if (val == (int)0x80000000) - { - val = get_bits(&s->gb, 7) - 19; - } - else - { - //code = get_vlc(&s->gb, &s->hgain_vlc); - code = get_vlc2(&s->gb, s->hgain_vlc.table, HGAINVLCBITS, HGAINMAX); - if (code < 0) - { - return -6; - } - val += code - 18; - } - s->high_band_values[ch][i] = val; - } - } - } - } - } - - /* exponents can be reused in short blocks. */ - if ((s->block_len_bits == s->frame_len_bits) || get_bits1(&s->gb)) - { - for(ch = 0; ch < s->nb_channels; ++ch) - { - if (s->channel_coded[ch]) - { - if (s->use_exp_vlc) - { - if (decode_exp_vlc(s, ch) < 0) - { - return -7; - } - } - else - { - decode_exp_lsp(s, ch); - } - s->exponents_bsize[ch] = bsize; - } - } - } - - /* parse spectral coefficients : just RLE encoding */ - for(ch = 0; ch < s->nb_channels; ++ch) - { - if (s->channel_coded[ch]) - { - VLC *coef_vlc; - int level, run, sign, tindex; - int16_t *ptr, *eptr; - const int16_t *level_table, *run_table; - - /* special VLC tables are used for ms stereo because - there is potentially less energy there */ - tindex = (ch == 1 && s->ms_stereo); - coef_vlc = &s->coef_vlc[tindex]; - run_table = s->run_table[tindex]; - level_table = s->level_table[tindex]; - /* XXX: optimize */ - ptr = &s->coefs1[ch][0]; - eptr = ptr + nb_coefs[ch]; - memset(ptr, 0, s->block_len * sizeof(int16_t)); - - for(;;) - { - code = get_vlc2(&s->gb, coef_vlc->table, VLCBITS, VLCMAX); - //code = get_vlc(&s->gb, coef_vlc); - if (code < 0) - { - return -8; - } - if (code == 1) - { - /* EOB */ - break; - } - else if (code == 0) - { - /* escape */ - level = get_bits(&s->gb, coef_nb_bits); - /* NOTE: this is rather suboptimal. reading - block_len_bits would be better */ - run = get_bits(&s->gb, s->frame_len_bits); - } - else - { - /* normal code */ - run = run_table[code]; - level = level_table[code]; - } - sign = get_bits1(&s->gb); - if (!sign) - level = -level; - ptr += run; - if (ptr >= eptr) - { - break; - } - *ptr++ = level; - - - /* NOTE: EOB can be omitted */ - if (ptr >= eptr) - break; - } - } - if (s->version == 1 && s->nb_channels >= 2) - { - align_get_bits(&s->gb); - } - } - - { - int n4 = s->block_len >> 1; - - - mdct_norm = 0x10000>>(s->block_len_bits-1); - - if (s->version == 1) - { - mdct_norm *= fixtoi32(fixsqrt32(itofix32(n4))); - } - } - - - /* finally compute the MDCT coefficients */ - for(ch = 0; ch < s->nb_channels; ++ch) - { - if (s->channel_coded[ch]) - { - int16_t *coefs1; - fixed32 *exponents; - fixed32 *coefs, atemp; - fixed64 mult; - fixed64 mult1; - fixed32 noise, temp1, temp2, mult2; - int i, j, n, n1, last_high_band, esize; - fixed32 exp_power[HIGH_BAND_MAX_SIZE]; - - //total_gain, coefs1, mdctnorm are lossless - - coefs1 = s->coefs1[ch]; - exponents = s->exponents[ch]; - esize = s->exponents_bsize[ch]; - coefs = (*(s->coefs))[ch]; - n=0; - - /* - * The calculation of coefs has a shift right by 2 built in. This - * prepares samples for the Tremor IMDCT which uses a slightly - * different fixed format then the ffmpeg one. If the old ffmpeg - * imdct is used, each shift storing into coefs should be reduced - * by 1. - * See SVN logs for details. - */ - - - if (s->use_noise_coding) - { - /*TODO: mult should be converted to 32 bit to speed up noise coding*/ - - mult = fixdiv64(pow_table[total_gain+20],Fixed32To64(s->max_exponent[ch])); - mult = mult* mdct_norm; - mult1 = mult; - - /* very low freqs : noise */ - for(i = 0;i < s->coefs_start; ++i) - { - *coefs++ = fixmul32( (fixmul32(s->noise_table[s->noise_index], - exponents[i<>esize])>>4),Fixed32From64(mult1)) >>2; - s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1); - } - - n1 = s->exponent_high_sizes[bsize]; - - /* compute power of high bands */ - exponents = s->exponents[ch] +(s->high_band_start[bsize]<exponent_high_bands[s->frame_len_bits - - s->block_len_bits][j]; - if (s->high_band_coded[ch][j]) - { - fixed32 e2, v; - e2 = 0; - for(i = 0;i < n; ++i) - { - /*v is normalized later on so its fixed format is irrelevant*/ - v = exponents[i<>esize]>>4; - e2 += fixmul32(v, v)>>3; - } - exp_power[j] = e2/n; /*n is an int...*/ - last_high_band = j; - } - exponents += n<exponents[ch] + (s->coefs_start<high_band_start[bsize] - - s->coefs_start; - } - else - { - n = s->exponent_high_bands[s->frame_len_bits - - s->block_len_bits][j]; - } - if (j >= 0 && s->high_band_coded[ch][j]) - { - /* use noise with specified power */ - fixed32 tmp = fixdiv32(exp_power[j],exp_power[last_high_band]); - - /*mult1 is 48.16, pow_table is 48.16*/ - mult1 = fixmul32(fixsqrt32(tmp), - pow_table[s->high_band_values[ch][j]+20]) >> 16; - - /*this step has a fairly high degree of error for some reason*/ - mult1 = fixdiv64(mult1,fixmul32(s->max_exponent[ch],s->noise_mult)); - mult1 = mult1*mdct_norm>>PRECISION; - for(i = 0;i < n; ++i) - { - noise = s->noise_table[s->noise_index]; - s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1); - *coefs++ = fixmul32((fixmul32(exponents[i<>esize],noise)>>4), - Fixed32From64(mult1)) >>2; - - } - exponents += n<noise_table[s->noise_index]; - s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1); - - /*don't forget to renormalize the noise*/ - temp1 = (((int32_t)*coefs1++)<<16) + (noise>>4); - temp2 = fixmul32(exponents[i<>esize], mult>>18); - *coefs++ = fixmul32(temp1, temp2); - } - exponents += n<block_len - s->coefs_end[bsize]; - mult2 = fixmul32(mult>>16,exponents[((-1<>esize]) ; - for (i = 0; i < n; ++i) - { - /*renormalize the noise product and then reduce to 14.18 precison*/ - *coefs++ = fixmul32(s->noise_table[s->noise_index],mult2) >>6; - - s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1); - } - } - else - { - /*Noise coding not used, simply convert from exp to fixed representation*/ - - fixed32 mult3 = (fixed32)(fixdiv64(pow_table[total_gain+20], - Fixed32To64(s->max_exponent[ch]))); - mult3 = fixmul32(mult3, mdct_norm); - - /*zero the first 3 coefficients for WMA V1, does nothing otherwise*/ - for(i=0; icoefs_start; i++) - *coefs++=0; - - n = nb_coefs[ch]; - - /* XXX: optimize more, unrolling this loop in asm - might be a good idea */ - - for(i = 0;i < n; ++i) - { - /*ffmpeg imdct needs 15.17, while tremor 14.18*/ - atemp = (coefs1[i] * mult3)>>2; - *coefs++=fixmul32(atemp,exponents[i<>esize]); - } - n = s->block_len - s->coefs_end[bsize]; - memset(coefs, 0, n*sizeof(fixed32)); - } - } - } - - - - if (s->ms_stereo && s->channel_coded[1]) - { - fixed32 a, b; - int i; - fixed32 (*coefs)[MAX_CHANNELS][BLOCK_MAX_SIZE] = (s->coefs); - - /* nominal case for ms stereo: we do it before mdct */ - /* no need to optimize this case because it should almost - never happen */ - if (!s->channel_coded[0]) - { - memset((*(s->coefs))[0], 0, sizeof(fixed32) * s->block_len); - s->channel_coded[0] = 1; - } - - for(i = 0; i < s->block_len; ++i) - { - a = (*coefs)[0][i]; - b = (*coefs)[1][i]; - (*coefs)[0][i] = a + b; - (*coefs)[1][i] = a - b; - } - } - - for(ch = 0; ch < s->nb_channels; ++ch) - { - if (s->channel_coded[ch]) - { - int n4, index; - - n4 = s->block_len >>1; - - /*faster IMDCT from Vorbis*/ - mdct_backward( (1 << (s->block_len_bits+1)), (int32_t*)(*(s->coefs))[ch], (int32_t*)scratch_buffer); - - /*slower but more easily understood IMDCT from FFMPEG*/ - //ff_imdct_calc(&s->mdct_ctx[bsize], - // output, - // (*(s->coefs))[ch]); - - - /* add in the frame */ - index = (s->frame_len / 2) + s->block_pos - n4; - wma_window(s, scratch_buffer, &((*s->frame_out)[ch][index])); - - /* specific fast case for ms-stereo : add to second - channel if it is not coded */ - if (s->ms_stereo && !s->channel_coded[1]) - { - wma_window(s, scratch_buffer, &((*s->frame_out)[1][index])); - } - } - } -next: - /* update block number */ - ++s->block_num; - s->block_pos += s->block_len; - if (s->block_pos >= s->frame_len) - { - return 1; - } - else - { - return 0; - } -} - -/* decode a frame of frame_len samples */ -static int wma_decode_frame(WMADecodeContext *s, int32_t *samples) -{ - int ret, i, n, ch, incr; - int32_t *ptr; - fixed32 *iptr; - - /* read each block */ - s->block_num = 0; - s->block_pos = 0; - - - for(;;) - { - ret = wma_decode_block(s, samples); - if (ret < 0) - { - DEBUGF("wma_decode_block failed with code %d\n", ret); - return -1; - } - if (ret) - { - break; - } - } - - /* return frame with full 30-bit precision */ - n = s->frame_len; - incr = s->nb_channels; - for(ch = 0; ch < s->nb_channels; ++ch) - { - ptr = samples + ch; - iptr = &((*s->frame_out)[ch][0]); - - for (i=0;iframe_out)[ch][0]), &((*s->frame_out)[ch][s->frame_len]), - s->frame_len * sizeof(fixed32)); - } - - return 0; -} - -/* Initialise the superframe decoding */ - -int wma_decode_superframe_init(WMADecodeContext* s, - const uint8_t *buf, /*input*/ - int buf_size) -{ - if (buf_size==0) - { - s->last_superframe_len = 0; - return 0; - } - - s->current_frame = 0; - - init_get_bits(&s->gb, buf, buf_size*8); - - if (s->use_bit_reservoir) - { - /* read super frame header */ - skip_bits(&s->gb, 4); /* super frame index */ - s->nb_frames = get_bits(&s->gb, 4); - - if (s->last_superframe_len == 0) - s->nb_frames --; - else if (s->nb_frames == 0) - s->nb_frames++; - - s->bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3); - } else { - s->nb_frames = 1; - } - - return 1; -} - - -/* Decode a single frame in the current superframe - return -1 if - there was a decoding error, or the number of samples decoded. -*/ -int wma_decode_superframe_frame(WMADecodeContext* s, - int32_t* samples, /*output*/ - const uint8_t *buf, /*input*/ - int buf_size) -{ - int pos, len; - uint8_t *q; - int done = 0; - if ((s->use_bit_reservoir) && (s->current_frame == 0)) - { - if (s->last_superframe_len > 0) - { - /* add s->bit_offset bits to last frame */ - if ((s->last_superframe_len + ((s->bit_offset + 7) >> 3)) > - MAX_CODED_SUPERFRAME_SIZE) - { - DEBUGF("superframe size too large error\n"); - goto fail; - } - q = s->last_superframe + s->last_superframe_len; - len = s->bit_offset; - while (len > 7) - { - *q++ = (get_bits)(&s->gb, 8); - len -= 8; - } - if (len > 0) - { - *q++ = (get_bits)(&s->gb, len) << (8 - len); - } - - /* XXX: s->bit_offset bits into last frame */ - init_get_bits(&s->gb, s->last_superframe, MAX_CODED_SUPERFRAME_SIZE*8); - /* skip unused bits */ - if (s->last_bitoffset > 0) - skip_bits(&s->gb, s->last_bitoffset); - - /* this frame is stored in the last superframe and in the - current one */ - if (wma_decode_frame(s, samples) < 0) - { - goto fail; - } - done = 1; - } - - /* read each frame starting from s->bit_offset */ - pos = s->bit_offset + 4 + 4 + s->byte_offset_bits + 3; - init_get_bits(&s->gb, buf + (pos >> 3), (MAX_CODED_SUPERFRAME_SIZE - (pos >> 3))*8); - len = pos & 7; - if (len > 0) - skip_bits(&s->gb, len); - - s->reset_block_lengths = 1; - } - - /* If we haven't decoded a frame yet, do it now */ - if (!done) - { - if (wma_decode_frame(s, samples) < 0) - { - goto fail; - } - } - - s->current_frame++; - - if ((s->use_bit_reservoir) && (s->current_frame == s->nb_frames)) - { - /* we copy the end of the frame in the last frame buffer */ - pos = get_bits_count(&s->gb) + ((s->bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7); - s->last_bitoffset = pos & 7; - pos >>= 3; - len = buf_size - pos; - if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) - { - DEBUGF("superframe size too large error after decoding\n"); - goto fail; - } - s->last_superframe_len = len; - memcpy(s->last_superframe, buf + pos, len); - } - - return s->frame_len; - -fail: - /* when error, we reset the bit reservoir */ - - s->last_superframe_len = 0; - return -1; -} diff --git a/bsp/stm32_radio/libwma/wmafixed.c b/bsp/stm32_radio/libwma/wmafixed.c deleted file mode 100644 index e68aaa0e7b..0000000000 --- a/bsp/stm32_radio/libwma/wmafixed.c +++ /dev/null @@ -1,231 +0,0 @@ -/**************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * - * Copyright (C) 2007 Michael Giacomelli - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "wmadec.h" -#include "wmafixed.h" -// #include - -fixed64 IntTo64(int x){ - fixed64 res = 0; - unsigned char *p = (unsigned char *)&res; - -#ifdef ROCKBOX_BIG_ENDIAN - p[5] = x & 0xff; - p[4] = (x & 0xff00)>>8; - p[3] = (x & 0xff0000)>>16; - p[2] = (x & 0xff000000)>>24; -#else - p[2] = x & 0xff; - p[3] = (x & 0xff00)>>8; - p[4] = (x & 0xff0000)>>16; - p[5] = (x & 0xff000000)>>24; -#endif - return res; -} - -int IntFrom64(fixed64 x) -{ - int res = 0; - unsigned char *p = (unsigned char *)&x; - -#ifdef ROCKBOX_BIG_ENDIAN - res = p[5] | (p[4]<<8) | (p[3]<<16) | (p[2]<<24); -#else - res = p[2] | (p[3]<<8) | (p[4]<<16) | (p[5]<<24); -#endif - return res; -} - -fixed32 Fixed32From64(fixed64 x) -{ - return x & 0xFFFFFFFF; -} - -fixed64 Fixed32To64(fixed32 x) -{ - return (fixed64)x; -} - -/* - Not performance senstitive code here -*/ -fixed64 fixmul64byfixed(fixed64 x, fixed32 y) -{ - //return x * y; - return (x * y); - // return (fixed64) fixmul32(Fixed32From64(x),y); -} - -fixed32 fixdiv32(fixed32 x, fixed32 y) -{ - fixed64 temp; - - if(x == 0) - return 0; - if(y == 0) - return 0x7fffffff; - temp = x; - temp <<= PRECISION; - return (fixed32)(temp / y); -} - -fixed64 fixdiv64(fixed64 x, fixed64 y) -{ - fixed64 temp; - - if(x == 0) - return 0; - if(y == 0) - return 0x07ffffffffffffffLL; - temp = x; - temp <<= PRECISION64; - return (fixed64)(temp / y); -} - -fixed32 fixsqrt32(fixed32 x) -{ - unsigned long r = 0, s, v = (unsigned long)x; - -#define STEP(k) s = r + (1 << k * 2); r >>= 1; \ - if (s <= v) { v -= s; r |= (1 << k * 2); } - - STEP(15); - STEP(14); - STEP(13); - STEP(12); - STEP(11); - STEP(10); - STEP(9); - STEP(8); - STEP(7); - STEP(6); - STEP(5); - STEP(4); - STEP(3); - STEP(2); - STEP(1); - STEP(0); - - return (fixed32)(r << (PRECISION / 2)); -} - -/* Inverse gain of circular cordic rotation in s0.31 format. */ -static const long cordic_circular_gain = 0xb2458939; /* 0.607252929 */ - -/* Table of values of atan(2^-i) in 0.32 format fractions of pi where pi = 0xffffffff / 2 */ -static const unsigned long atan_table[] = { - 0x1fffffff, /* +0.785398163 (or pi/4) */ - 0x12e4051d, /* +0.463647609 */ - 0x09fb385b, /* +0.244978663 */ - 0x051111d4, /* +0.124354995 */ - 0x028b0d43, /* +0.062418810 */ - 0x0145d7e1, /* +0.031239833 */ - 0x00a2f61e, /* +0.015623729 */ - 0x00517c55, /* +0.007812341 */ - 0x0028be53, /* +0.003906230 */ - 0x00145f2e, /* +0.001953123 */ - 0x000a2f98, /* +0.000976562 */ - 0x000517cc, /* +0.000488281 */ - 0x00028be6, /* +0.000244141 */ - 0x000145f3, /* +0.000122070 */ - 0x0000a2f9, /* +0.000061035 */ - 0x0000517c, /* +0.000030518 */ - 0x000028be, /* +0.000015259 */ - 0x0000145f, /* +0.000007629 */ - 0x00000a2f, /* +0.000003815 */ - 0x00000517, /* +0.000001907 */ - 0x0000028b, /* +0.000000954 */ - 0x00000145, /* +0.000000477 */ - 0x000000a2, /* +0.000000238 */ - 0x00000051, /* +0.000000119 */ - 0x00000028, /* +0.000000060 */ - 0x00000014, /* +0.000000030 */ - 0x0000000a, /* +0.000000015 */ - 0x00000005, /* +0.000000007 */ - 0x00000002, /* +0.000000004 */ - 0x00000001, /* +0.000000002 */ - 0x00000000, /* +0.000000001 */ - 0x00000000, /* +0.000000000 */ -}; - - -/* - Below here functions do not use standard fixed precision! -*/ - -/** - * Implements sin and cos using CORDIC rotation. - * - * @param phase has range from 0 to 0xffffffff, representing 0 and - * 2*pi respectively. - * @param cos return address for cos - * @return sin of phase, value is a signed value from LONG_MIN to LONG_MAX, - * representing -1 and 1 respectively. - * - * Gives at least 24 bits precision (last 2-8 bits or so are probably off) - */ -long fsincos(unsigned long phase, fixed32 *cos) -{ - int32_t x, x1, y, y1; - unsigned long z, z1; - int i; - - /* Setup initial vector */ - x = cordic_circular_gain; - y = 0; - z = phase; - - /* The phase has to be somewhere between 0..pi for this to work right */ - if (z < 0xffffffff / 4) { - /* z in first quadrant, z += pi/2 to correct */ - x = -x; - z += 0xffffffff / 4; - } else if (z < 3 * (0xffffffff / 4)) { - /* z in third quadrant, z -= pi/2 to correct */ - z -= 0xffffffff / 4; - } else { - /* z in fourth quadrant, z -= 3pi/2 to correct */ - x = -x; - z -= 3 * (0xffffffff / 4); - } - - /* Each iteration adds roughly 1-bit of extra precision */ - for (i = 0; i < 31; i++) { - x1 = x >> i; - y1 = y >> i; - z1 = atan_table[i]; - - /* Decided which direction to rotate vector. Pivot point is pi/2 */ - if (z >= 0xffffffff / 4) { - x -= y1; - y += x1; - z -= z1; - } else { - x += y1; - y -= x1; - z += z1; - } - } - - if (cos) - *cos = x; - - return y; -} diff --git a/bsp/stm32_radio/libwma/wmafixed.h b/bsp/stm32_radio/libwma/wmafixed.h deleted file mode 100644 index fb31cf8bfa..0000000000 --- a/bsp/stm32_radio/libwma/wmafixed.h +++ /dev/null @@ -1,144 +0,0 @@ -/**************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * - * Copyright (C) 2007 Michael Giacomelli - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -/* fixed precision code. We use a combination of Sign 15.16 and Sign.31 - precision here. - - The WMA decoder does not always follow this convention, and occasionally - renormalizes values to other formats in order to maximize precision. - However, only the two precisions above are provided in this file. - -*/ - -#include "types.h" - -#define PRECISION 16 -#define PRECISION64 16 - - -#define fixtof64(x) (float)((float)(x) / (float)(1 << PRECISION64)) //does not work on int64_t! -#define ftofix32(x) ((fixed32)((x) * (float)(1 << PRECISION) + ((x) < 0 ? -0.5 : 0.5))) -#define itofix64(x) (IntTo64(x)) -#define itofix32(x) ((x) << PRECISION) -#define fixtoi32(x) ((x) >> PRECISION) -#define fixtoi64(x) (IntFrom64(x)) - - -/*fixed functions*/ - -fixed64 IntTo64(int x); -int IntFrom64(fixed64 x); -fixed32 Fixed32From64(fixed64 x); -fixed64 Fixed32To64(fixed32 x); -fixed64 fixmul64byfixed(fixed64 x, fixed32 y); -fixed32 fixdiv32(fixed32 x, fixed32 y); -fixed64 fixdiv64(fixed64 x, fixed64 y); -fixed32 fixsqrt32(fixed32 x); -long fsincos(unsigned long phase, fixed32 *cos); - -#ifdef CPU_ARM - -/*Sign-15.16 format */ - -#define fixmul32(x, y) \ - ({ int32_t __hi; \ - uint32_t __lo; \ - int32_t __result; \ - asm ("smull %0, %1, %3, %4\n\t" \ - "movs %0, %0, lsr %5\n\t" \ - "adc %2, %0, %1, lsl %6" \ - : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ - : "%r" (x), "r" (y), \ - "M" (PRECISION), "M" (32 - PRECISION) \ - : "cc"); \ - __result; \ - }) - -#define fixmul32b(x, y) \ - ({ int32_t __hi; \ - uint32_t __lo; \ - int32_t __result; \ - asm ("smull %0, %1, %3, %4\n\t" \ - "movs %2, %1, lsl #1" \ - : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ - : "%r" (x), "r" (y) \ - : "cc"); \ - __result; \ - }) - -#elif defined(CPU_COLDFIRE) - -static inline int32_t fixmul32(int32_t x, int32_t y) -{ -#if PRECISION != 16 -#warning Coldfire fixmul32() only works for PRECISION == 16 -#endif - int32_t t1; - asm ( - "mac.l %[x], %[y], %%acc0 \n" /* multiply */ - "mulu.l %[y], %[x] \n" /* get lower half, avoid emac stall */ - "movclr.l %%acc0, %[t1] \n" /* get higher half */ - "lsr.l #1, %[t1] \n" - "move.w %[t1], %[x] \n" - "swap %[x] \n" - : [t1] "=&d" (t1), [x] "+d" (x) - : [y] "d" (y) - ); - return x; -} - -static inline int32_t fixmul32b(int32_t x, int32_t y) -{ - asm ( - "mac.l %[x], %[y], %%acc0 \n" /* multiply */ - "movclr.l %%acc0, %[x] \n" /* get higher half */ - : [x] "+d" (x) - : [y] "d" (y) - ); - return x; -} - -#else - -static inline fixed32 fixmul32(fixed32 x, fixed32 y) -{ - fixed64 temp; - temp = x; - temp *= y; - - temp >>= PRECISION; - - return (fixed32)temp; -} - -static inline fixed32 fixmul32b(fixed32 x, fixed32 y) -{ - fixed64 temp; - - temp = x; - temp *= y; - - temp >>= 31; //16+31-16 = 31 bits - - return (fixed32)temp; -} - -#endif - diff --git a/bsp/stm32_radio/mp3.c b/bsp/stm32_radio/mp3.c deleted file mode 100644 index a9ac94fef8..0000000000 --- a/bsp/stm32_radio/mp3.c +++ /dev/null @@ -1,626 +0,0 @@ -#include -#include -#include -#include - -#include "board.h" -#include "netbuffer.h" -#include "player_ui.h" -#include "player_bg.h" -#include "codec.h" - -#define MP3_AUDIO_BUF_SZ (5 * 1024) -#ifndef MIN -#define MIN(x, y) ((x) < (y)? (x) : (y)) -#endif - -rt_uint8_t mp3_fd_buffer[MP3_AUDIO_BUF_SZ]; -int current_sample_rate = 0; - -struct mp3_decoder -{ - /* mp3 information */ - HMP3Decoder decoder; - MP3FrameInfo frame_info; - rt_uint32_t frames; - - /* mp3 file descriptor */ - rt_size_t (*fetch_data)(void* parameter, rt_uint8_t *buffer, rt_size_t length); - void* fetch_parameter; - - /* mp3 read session */ - rt_uint8_t *read_buffer, *read_ptr; - rt_int32_t read_offset; - rt_uint32_t bytes_left, bytes_left_before_decoding; - - /* audio device */ - rt_device_t snd_device; -}; - -static rt_err_t mp3_decoder_tx_done(rt_device_t dev, void *buffer) -{ - /* release memory block */ - sbuf_release(buffer); - - return RT_EOK; -} - -void mp3_decoder_init(struct mp3_decoder* decoder) -{ - RT_ASSERT(decoder != RT_NULL); - - /* init read session */ - decoder->read_ptr = RT_NULL; - decoder->bytes_left_before_decoding = decoder->bytes_left = 0; - decoder->frames = 0; - - // decoder->read_buffer = rt_malloc(MP3_AUDIO_BUF_SZ); - decoder->read_buffer = &mp3_fd_buffer[0]; - if (decoder->read_buffer == RT_NULL) return; - - decoder->decoder = MP3InitDecoder(); - - /* open audio device */ - decoder->snd_device = rt_device_find("snd"); - if (decoder->snd_device != RT_NULL) - { - /* set tx complete call back function */ - rt_device_set_tx_complete(decoder->snd_device, mp3_decoder_tx_done); - rt_device_open(decoder->snd_device, RT_DEVICE_OFLAG_WRONLY); - } -} - -void mp3_decoder_detach(struct mp3_decoder* decoder) -{ - RT_ASSERT(decoder != RT_NULL); - - /* close audio device */ - if (decoder->snd_device != RT_NULL) - rt_device_close(decoder->snd_device); - - /* release mp3 decoder */ - MP3FreeDecoder(decoder->decoder); -} - -struct mp3_decoder* mp3_decoder_create() -{ - struct mp3_decoder* decoder; - - /* allocate object */ - decoder = (struct mp3_decoder*) rt_malloc (sizeof(struct mp3_decoder)); - if (decoder != RT_NULL) - { - mp3_decoder_init(decoder); - } - - return decoder; -} - -void mp3_decoder_delete(struct mp3_decoder* decoder) -{ - RT_ASSERT(decoder != RT_NULL); - - /* de-init mp3 decoder object */ - mp3_decoder_detach(decoder); - /* release this object */ - rt_free(decoder); -} - -rt_uint32_t current_offset = 0; -static rt_int32_t mp3_decoder_fill_buffer(struct mp3_decoder* decoder) -{ - rt_size_t bytes_read; - rt_size_t bytes_to_read; - - // rt_kprintf("left: %d. refilling inbuffer...\n", decoder->bytes_left); - if (decoder->bytes_left > 0) - { - // better: move unused rest of buffer to the start - rt_memmove(decoder->read_buffer, decoder->read_ptr, decoder->bytes_left); - } - - bytes_to_read = (MP3_AUDIO_BUF_SZ - decoder->bytes_left) & ~(512 - 1); - - bytes_read = decoder->fetch_data(decoder->fetch_parameter, - (rt_uint8_t *)(decoder->read_buffer + decoder->bytes_left), - bytes_to_read); - - if (bytes_read != 0) - { - decoder->read_ptr = decoder->read_buffer; - decoder->read_offset = 0; - decoder->bytes_left = decoder->bytes_left + bytes_read; - return 0; - } - else - { - rt_kprintf("can't read more data\n"); - return -1; - } -} - -int mp3_decoder_run(struct mp3_decoder* decoder) -{ - int err; - rt_uint16_t* buffer; - rt_uint32_t delta; - - RT_ASSERT(decoder != RT_NULL); - - if (player_is_playing() != RT_TRUE) return -1; - - if ((decoder->read_ptr == RT_NULL) || decoder->bytes_left < 2*MAINBUF_SIZE) - { - if(mp3_decoder_fill_buffer(decoder) != 0) - return -1; - } - - // rt_kprintf("read offset: 0x%08x\n", decoder->read_ptr - decoder->read_buffer); - decoder->read_offset = MP3FindSyncWord(decoder->read_ptr, decoder->bytes_left); - if (decoder->read_offset < 0) - { - /* discard this data */ - rt_kprintf("outof sync, byte left: %d\n", decoder->bytes_left); - - decoder->bytes_left = 0; - return 0; - } - - decoder->read_ptr += decoder->read_offset; - delta = decoder->read_offset; - decoder->bytes_left -= decoder->read_offset; - if (decoder->bytes_left < 1024) - { - /* fill more data */ - if(mp3_decoder_fill_buffer(decoder) != 0) - return -1; - } - - /* get a decoder buffer */ - buffer = (rt_uint16_t*)sbuf_alloc(); - decoder->bytes_left_before_decoding = decoder->bytes_left; - - err = MP3Decode(decoder->decoder, &decoder->read_ptr, - (int*)&decoder->bytes_left, (short*)buffer, 0); - delta += (decoder->bytes_left_before_decoding - decoder->bytes_left); - - current_offset += delta; - if (player_get_mode() != PLAYER_PLAY_RADIO) - player_set_position(current_offset); - - // rt_kprintf("bytes left after decode: %d\n", decoder->bytes_left); - - decoder->frames++; - - if (err != ERR_MP3_NONE) - { - switch (err) - { - case ERR_MP3_INDATA_UNDERFLOW: - rt_kprintf("ERR_MP3_INDATA_UNDERFLOW\n"); - decoder->bytes_left = 0; - if(mp3_decoder_fill_buffer(decoder) != 0) - { - /* release this memory block */ - sbuf_release(buffer); - return -1; - } - break; - - case ERR_MP3_MAINDATA_UNDERFLOW: - /* do nothing - next call to decode will provide more mainData */ - rt_kprintf("ERR_MP3_MAINDATA_UNDERFLOW\n"); - break; - - default: - rt_kprintf("unknown error: %d, left: %d\n", err, decoder->bytes_left); - - // skip this frame - if (decoder->bytes_left > 0) - { - decoder->bytes_left --; - decoder->read_ptr ++; - } - else - { - // TODO - RT_ASSERT(0); - } - break; - } - - /* release this memory block */ - sbuf_release(buffer); - } - else - { - int outputSamps; - /* no error */ - MP3GetLastFrameInfo(decoder->decoder, &decoder->frame_info); - - /* set sample rate */ - if (decoder->frame_info.samprate != current_sample_rate) - { - current_sample_rate = decoder->frame_info.samprate; - rt_device_control(decoder->snd_device, CODEC_CMD_SAMPLERATE, ¤t_sample_rate); - } - - /* write to sound device */ - outputSamps = decoder->frame_info.outputSamps; - if (outputSamps > 0) - { - if (decoder->frame_info.nChans == 1) - { - int i; - for (i = outputSamps - 1; i >= 0; i--) - { - buffer[i * 2] = buffer[i]; - buffer[i * 2 + 1] = buffer[i]; - } - outputSamps *= 2; - } - - rt_device_write(decoder->snd_device, 0, buffer, outputSamps * sizeof(rt_uint16_t)); - } - else - { - /* no output */ - sbuf_release(buffer); - } - } - - return 0; -} - -static int mp3_parse_id3v1(int fd, struct tag_info *info) -{ - lseek(fd, -128, SEEK_END); - read(fd, (char *) mp3_fd_buffer, 128); - - /* ID3v1 */ - if (strncmp("TAG", (char *) mp3_fd_buffer, 3) == 0) - { - strncpy(info->title, (char *) mp3_fd_buffer + 3, MIN(30, sizeof(info->title) - 1)); - strncpy(info->artist, (char *) mp3_fd_buffer + 3 + 30, MIN(30, sizeof(info->artist) - 1)); - return 0; - } - return -1; -} - -static int mp3_parse_id3v2(int fd, struct tag_info *info) -{ - rt_uint32_t p = 0; - - lseek(fd, 0, SEEK_SET); - read(fd, (char *) mp3_fd_buffer, sizeof(mp3_fd_buffer)); - - if (strncmp("ID3", (char *) mp3_fd_buffer, 3) == 0) - { - rt_uint32_t tag_size, frame_size, i; - rt_uint8_t version_major; - int frame_header_size; - - tag_size = ((rt_uint32_t) mp3_fd_buffer[6] << 21) | ((rt_uint32_t) mp3_fd_buffer[7] << 14) | ((rt_uint16_t) mp3_fd_buffer[8] << 7) | mp3_fd_buffer[9]; - info->data_start = tag_size; - version_major = mp3_fd_buffer[3]; - if (version_major >= 3) - { - frame_header_size = 10; - } - else - { - frame_header_size = 6; - } - i = p = 10; - - // iterate through frames - while (p < tag_size) - { - if (version_major >= 3) - { - frame_size = ((rt_uint32_t) mp3_fd_buffer[i + 4] << 24) | ((rt_uint32_t) mp3_fd_buffer[i + 5] << 16) | ((rt_uint16_t) mp3_fd_buffer[i + 6] << 8) | mp3_fd_buffer[i + 7]; - } - else - { - frame_size = ((rt_uint32_t) mp3_fd_buffer[i + 3] << 14) | ((rt_uint16_t) mp3_fd_buffer[i + 4] << 7) | mp3_fd_buffer[i + 5]; - } - if (i + frame_size + frame_header_size + frame_header_size >= sizeof(mp3_fd_buffer)) - { - if (frame_size + frame_header_size > sizeof(mp3_fd_buffer)) - { - lseek(fd, p + frame_size + frame_header_size, SEEK_CUR); - read(fd, (char *) mp3_fd_buffer, sizeof(mp3_fd_buffer)); - p += frame_size + frame_header_size; - i = 0; - continue; - } - else - { - int r = sizeof(mp3_fd_buffer) - i; - memmove(mp3_fd_buffer, mp3_fd_buffer + i, r); - read(fd, (char *) mp3_fd_buffer + r, i); - i = 0; - } - } - - if (strncmp("TT2", (char *) mp3_fd_buffer + i, 3) == 0 || strncmp("TIT2", (char *) mp3_fd_buffer + i, 4) == 0) - { - strncpy(info->title, (char *) mp3_fd_buffer + i + frame_header_size + 1, MIN(frame_size - 1, sizeof(info->title) - 1)); - } - else if (strncmp("TP1", (char *) mp3_fd_buffer + i, 3) == 0 || strncmp("TPE1", (char *) mp3_fd_buffer + i, 4) == 0) - { - strncpy(info->artist, (char *) mp3_fd_buffer + i + frame_header_size + 1, MIN(frame_size - 1, sizeof(info->artist) - 1)); - } - - p += frame_size + frame_header_size; - i += frame_size + frame_header_size; - } - - return 0; - } - - return -1; -} - -/* get mp3 information */ -void mp3_get_info(const char* filename, struct tag_info* info) -{ - int fd; - rt_size_t bytes_read; - int sync_word; - HMP3Decoder decoder; - MP3FrameInfo frame_info; - - if (filename == RT_NULL || info == RT_NULL) return; - - fd = open(filename, O_RDONLY, 0); - if (fd < 0) return; /* can't read file */ - - /* init decoder */ - decoder = MP3InitDecoder(); - - info->data_start = 0; - - /* - * TODO - Add UTF-8 support and fix this. - * - * ID3 v2 is generally useless here, because it - * uses UTF-8 encoding, which we can't handle right now. - * But parsing v2 first is nesessary in order to - * find the correct MP3 frame header location, - * in case of the ID3 v2 tag should be there. - */ -// if (mp3_parse_id3v2(fd, info) < 0) -// { -// // ID3 v2 is not available. Fall back to ID3 v1. -// mp3_parse_id3v1(fd, info); -// } - mp3_parse_id3v2(fd, info); - mp3_parse_id3v1(fd, info); - - lseek(fd, info->data_start, SEEK_SET); - bytes_read = read(fd, (char *) mp3_fd_buffer, sizeof(mp3_fd_buffer)); - - /* get frame information */ - sync_word = MP3FindSyncWord(mp3_fd_buffer, bytes_read); - if (sync_word >= 0) - { - rt_uint32_t p; - short samples_per_frame; - - /* get frame information */ - MP3GetNextFrameInfo(decoder, &frame_info, &mp3_fd_buffer[sync_word]); - - // Try to locate the Xing VBR header. - if (frame_info.version == MPEG1) - { - p = frame_info.nChans == 2 ? 32 : 17; - samples_per_frame = 1152; - } - else - { - p = frame_info.nChans == 2 ? 17 : 9; - samples_per_frame = 576; - } - p += sync_word + 4; - - if (strncmp("Xing", (char *) mp3_fd_buffer + p, 4) == 0 || strncmp("Info", (char *) mp3_fd_buffer + p, 4) == 0) - { - // VBR - if (mp3_fd_buffer[p + 7] & 1 == 1) /* Checks if the frames field exists */ - { - rt_uint32_t frames = ((rt_uint32_t) mp3_fd_buffer[p + 8] << 24) | ((rt_uint32_t) mp3_fd_buffer[p + 9] << 16) | ((rt_uint32_t) mp3_fd_buffer[p + 10] << 8) | (rt_uint32_t) mp3_fd_buffer[p + 11]; - info->duration = frames * samples_per_frame / frame_info.samprate; - info->bit_rate = lseek(fd, 0, SEEK_END) * 8 / info->duration; - } - else - { - // Calculate as CBR - info->duration = lseek(fd, 0, SEEK_END) / (frame_info.bitrate / 8); /* second */ - info->bit_rate = frame_info.bitrate; - } - } - /* - * There're two other rarely used VBR header standards: VBRI & MLLT. - * I can't find any sample with these headers. So I just ignored them. :) - */ - else - { - // CBR - info->duration = lseek(fd, 0, SEEK_END) / (frame_info.bitrate / 8); /* second */ - info->bit_rate = frame_info.bitrate; - } - info->sampling = frame_info.samprate; - } - - /* set current position */ - info->position = 0; - - /* release mp3 decoder */ - MP3FreeDecoder(decoder); - - /* close file */ - close(fd); -} - -#include -rt_size_t fd_fetch(void* parameter, rt_uint8_t *buffer, rt_size_t length) -{ - int fd = (int)parameter; - int read_bytes; - - read_bytes = read(fd, (char*)buffer, length); - if (read_bytes <= 0) return 0; - - return read_bytes; -} - -void mp3(char* filename) -{ - int fd; - struct mp3_decoder* decoder; - extern rt_bool_t is_playing; - - is_playing = RT_TRUE; - fd = open(filename, O_RDONLY, 0); - if (fd >= 0) - { - decoder = mp3_decoder_create(); - if (decoder != RT_NULL) - { - decoder->fetch_data = fd_fetch; - decoder->fetch_parameter = (void*)fd; - - current_offset = 0; - while (mp3_decoder_run(decoder) != -1); - - /* delete decoder object */ - mp3_decoder_delete(decoder); - } - close(fd); - } - is_playing = RT_FALSE; -} -FINSH_FUNCTION_EXPORT(mp3, mp3 decode test); - -#if STM32_EXT_SRAM -/* http mp3 */ -#include "http.h" -static rt_size_t http_fetch(rt_uint8_t* ptr, rt_size_t len, void* parameter) -{ - struct http_session* session = (struct http_session*)parameter; - RT_ASSERT(session != RT_NULL); - - return http_session_read(session, ptr, len); -} - -static void http_close(void* parameter) -{ - struct http_session* session = (struct http_session*)parameter; - RT_ASSERT(session != RT_NULL); - - http_session_close(session); -} - -rt_size_t http_data_fetch(void* parameter, rt_uint8_t *buffer, rt_size_t length) -{ - return net_buf_read(buffer, length); -} - -void http_mp3(char* url) -{ - struct http_session* session; - struct mp3_decoder* decoder; - extern rt_bool_t is_playing; - - is_playing = RT_TRUE; - - session = http_session_open(url); - if (session != RT_NULL) - { - /* start a job to netbuf worker */ - if (net_buf_start_job(http_fetch, http_close, (void*)session) == 0) - { - decoder = mp3_decoder_create(); - if (decoder != RT_NULL) - { - decoder->fetch_data = http_data_fetch; - decoder->fetch_parameter = RT_NULL; - - current_offset = 0; - while (mp3_decoder_run(decoder) != -1); - - /* delete decoder object */ - mp3_decoder_delete(decoder); - } - session = RT_NULL; - } - else - { - /* start job failed, close session */ - http_session_close(session); - } - } -} -FINSH_FUNCTION_EXPORT(http_mp3, http mp3 decode test); - -/* ice mp3 */ -static rt_size_t ice_fetch(rt_uint8_t* ptr, rt_size_t len, void* parameter) -{ - struct shoutcast_session* session = (struct shoutcast_session*)parameter; - RT_ASSERT(session != RT_NULL); - - return shoutcast_session_read(session, ptr, len); -} - -static void ice_close(void* parameter) -{ - struct shoutcast_session* session = (struct shoutcast_session*)parameter; - RT_ASSERT(session != RT_NULL); - - shoutcast_session_close(session); -} - -rt_size_t ice_data_fetch(void* parameter, rt_uint8_t *buffer, rt_size_t length) -{ - return net_buf_read(buffer, length); -} - -void ice_mp3(char* url) -{ - struct shoutcast_session* session; - struct mp3_decoder* decoder; - extern rt_bool_t is_playing; - - is_playing = RT_TRUE; - - session = shoutcast_session_open(url); - if (session != RT_NULL) - { - /* start a job to netbuf worker */ - if (net_buf_start_job(ice_fetch, ice_close, (void*)session) == 0) - { - decoder = mp3_decoder_create(); - if (decoder != RT_NULL) - { - decoder->fetch_data = ice_data_fetch; - decoder->fetch_parameter = RT_NULL; - - current_offset = 0; - while (mp3_decoder_run(decoder) != -1); - - /* delete decoder object */ - mp3_decoder_delete(decoder); - } - session = RT_NULL; - } - else - { - /* start a job failed, close session */ - shoutcast_session_close(session); - } - } -} -FINSH_FUNCTION_EXPORT(ice_mp3, shoutcast mp3 decode test); - -#endif diff --git a/bsp/stm32_radio/mp3.h b/bsp/stm32_radio/mp3.h deleted file mode 100644 index c15011983f..0000000000 --- a/bsp/stm32_radio/mp3.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __MP3_H__ -#define __MP3_H__ - -#include "player_ui.h" - -void mp3_get_info(const char* filename, struct tag_info* info); - -void mp3(char* filename); -void http_mp3(char* url); -void ice_mp3(char* url); - -#endif diff --git a/bsp/stm32_radio/mp3/mp3dec.c b/bsp/stm32_radio/mp3/mp3dec.c deleted file mode 100644 index 9dfef6198d..0000000000 --- a/bsp/stm32_radio/mp3/mp3dec.c +++ /dev/null @@ -1,417 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * mp3dec.c - platform-independent top level MP3 decoder API - **************************************************************************************/ - -#include "string.h" // J.Sz. 21/04/2006 -// #include "hlxclib/string.h" /* for memmove, memcpy (can replace with different implementations if desired) */ -#include "mp3common.h" /* includes mp3dec.h (public API) and internal, platform-independent API */ - -/************************************************************************************** - * Function: MP3InitDecoder - * - * Description: allocate memory for platform-specific data - * clear all the user-accessible fields - * - * Inputs: none - * - * Outputs: none - * - * Return: handle to mp3 decoder instance, 0 if malloc fails - **************************************************************************************/ -HMP3Decoder MP3InitDecoder(void) -{ - MP3DecInfo *mp3DecInfo; - - mp3DecInfo = AllocateBuffers(); - - return (HMP3Decoder)mp3DecInfo; -} - -/************************************************************************************** - * Function: MP3FreeDecoder - * - * Description: free platform-specific data allocated by InitMP3Decoder - * zero out the contents of MP3DecInfo struct - * - * Inputs: valid MP3 decoder instance pointer (HMP3Decoder) - * - * Outputs: none - * - * Return: none - **************************************************************************************/ -void MP3FreeDecoder(HMP3Decoder hMP3Decoder) -{ - MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; - - if (!mp3DecInfo) - return; - - FreeBuffers(mp3DecInfo); -} - -/************************************************************************************** - * Function: MP3FindSyncWord - * - * Description: locate the next byte-alinged sync word in the raw mp3 stream - * - * Inputs: buffer to search for sync word - * max number of bytes to search in buffer - * - * Outputs: none - * - * Return: offset to first sync word (bytes from start of buf) - * -1 if sync not found after searching nBytes - **************************************************************************************/ -int MP3FindSyncWord(unsigned char *buf, int nBytes) -{ - int i; - - /* find byte-aligned syncword - need 12 (MPEG 1,2) or 11 (MPEG 2.5) matching bits */ - for (i = 0; i < nBytes - 1; i++) { - if ( (buf[i+0] & SYNCWORDH) == SYNCWORDH && (buf[i+1] & SYNCWORDL) == SYNCWORDL ) - return i; - } - - return -1; -} - -/************************************************************************************** - * Function: MP3FindFreeSync - * - * Description: figure out number of bytes between adjacent sync words in "free" mode - * - * Inputs: buffer to search for next sync word - * the 4-byte frame header starting at the current sync word - * max number of bytes to search in buffer - * - * Outputs: none - * - * Return: offset to next sync word, minus any pad byte (i.e. nSlots) - * -1 if sync not found after searching nBytes - * - * Notes: this checks that the first 22 bits of the next frame header are the - * same as the current frame header, but it's still not foolproof - * (could accidentally find a sequence in the bitstream which - * appears to match but is not actually the next frame header) - * this could be made more error-resilient by checking several frames - * in a row and verifying that nSlots is the same in each case - * since free mode requires CBR (see spec) we generally only call - * this function once (first frame) then store the result (nSlots) - * and just use it from then on - **************************************************************************************/ -static int MP3FindFreeSync(unsigned char *buf, unsigned char firstFH[4], int nBytes) -{ - int offset = 0; - unsigned char *bufPtr = buf; - - /* loop until we either: - * - run out of nBytes (FindMP3SyncWord() returns -1) - * - find the next valid frame header (sync word, version, layer, CRC flag, bitrate, and sample rate - * in next header must match current header) - */ - while (1) { - offset = MP3FindSyncWord(bufPtr, nBytes); - bufPtr += offset; - if (offset < 0) { - return -1; - } else if ( (bufPtr[0] == firstFH[0]) && (bufPtr[1] == firstFH[1]) && ((bufPtr[2] & 0xfc) == (firstFH[2] & 0xfc)) ) { - /* want to return number of bytes per frame, NOT counting the padding byte, so subtract one if padFlag == 1 */ - if ((firstFH[2] >> 1) & 0x01) - bufPtr--; - return bufPtr - buf; - } - bufPtr += 3; - nBytes -= (offset + 3); - }; - - // return -1; Removed KJ -} - -/************************************************************************************** - * Function: MP3GetLastFrameInfo - * - * Description: get info about last MP3 frame decoded (number of sampled decoded, - * sample rate, bitrate, etc.) - * - * Inputs: valid MP3 decoder instance pointer (HMP3Decoder) - * pointer to MP3FrameInfo struct - * - * Outputs: filled-in MP3FrameInfo struct - * - * Return: none - * - * Notes: call this right after calling MP3Decode - **************************************************************************************/ -void MP3GetLastFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo) -{ - MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; - - if (!mp3DecInfo || mp3DecInfo->layer != 3) { - mp3FrameInfo->bitrate = 0; - mp3FrameInfo->nChans = 0; - mp3FrameInfo->samprate = 0; - mp3FrameInfo->bitsPerSample = 0; - mp3FrameInfo->outputSamps = 0; - mp3FrameInfo->layer = 0; - mp3FrameInfo->version = 0; - } else { - mp3FrameInfo->bitrate = mp3DecInfo->bitrate; - mp3FrameInfo->nChans = mp3DecInfo->nChans; - mp3FrameInfo->samprate = mp3DecInfo->samprate; - mp3FrameInfo->bitsPerSample = 16; - mp3FrameInfo->outputSamps = mp3DecInfo->nChans * (int)samplesPerFrameTab[mp3DecInfo->version][mp3DecInfo->layer - 1]; - mp3FrameInfo->layer = mp3DecInfo->layer; - mp3FrameInfo->version = mp3DecInfo->version; - } -} - -/************************************************************************************** - * Function: MP3GetNextFrameInfo - * - * Description: parse MP3 frame header - * - * Inputs: valid MP3 decoder instance pointer (HMP3Decoder) - * pointer to MP3FrameInfo struct - * pointer to buffer containing valid MP3 frame header (located using - * MP3FindSyncWord(), above) - * - * Outputs: filled-in MP3FrameInfo struct - * - * Return: error code, defined in mp3dec.h (0 means no error, < 0 means error) - **************************************************************************************/ -int MP3GetNextFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo, unsigned char *buf) -{ - MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; - - if (!mp3DecInfo) - return ERR_MP3_NULL_POINTER; - - if (UnpackFrameHeader(mp3DecInfo, buf) == -1 || mp3DecInfo->layer != 3) - return ERR_MP3_INVALID_FRAMEHEADER; - - MP3GetLastFrameInfo(mp3DecInfo, mp3FrameInfo); - - return ERR_MP3_NONE; -} - -/************************************************************************************** - * Function: MP3ClearBadFrame - * - * Description: zero out pcm buffer if error decoding MP3 frame - * - * Inputs: mp3DecInfo struct with correct frame size parameters filled in - * pointer pcm output buffer - * - * Outputs: zeroed out pcm buffer - * - * Return: none - **************************************************************************************/ -static void MP3ClearBadFrame(MP3DecInfo *mp3DecInfo, short *outbuf) -{ - int i; - - if (!mp3DecInfo) - return; - - for (i = 0; i < mp3DecInfo->nGrans * mp3DecInfo->nGranSamps * mp3DecInfo->nChans; i++) - outbuf[i] = 0; -} - -/************************************************************************************** - * Function: MP3Decode - * - * Description: decode one frame of MP3 data - * - * Inputs: valid MP3 decoder instance pointer (HMP3Decoder) - * double pointer to buffer of MP3 data (containing headers + mainData) - * number of valid bytes remaining in inbuf - * pointer to outbuf, big enough to hold one frame of decoded PCM samples - * flag indicating whether MP3 data is normal MPEG format (useSize = 0) - * or reformatted as "self-contained" frames (useSize = 1) - * - * Outputs: PCM data in outbuf, interleaved LRLRLR... if stereo - * number of output samples = nGrans * nGranSamps * nChans - * updated inbuf pointer, updated bytesLeft - * - * Return: error code, defined in mp3dec.h (0 means no error, < 0 means error) - * - * Notes: switching useSize on and off between frames in the same stream - * is not supported (bit reservoir is not maintained if useSize on) - **************************************************************************************/ -int MP3Decode(HMP3Decoder hMP3Decoder, unsigned char **inbuf, int *bytesLeft, short *outbuf, int useSize) -{ - int offset, bitOffset, mainBits, gr, ch, fhBytes, siBytes, freeFrameBytes; - int prevBitOffset, sfBlockBits, huffBlockBits; - unsigned char *mainPtr; - MP3DecInfo *mp3DecInfo = (MP3DecInfo *)hMP3Decoder; - - if (!mp3DecInfo) - return ERR_MP3_NULL_POINTER; - - /* unpack frame header */ - fhBytes = UnpackFrameHeader(mp3DecInfo, *inbuf); - if (fhBytes < 0) - return ERR_MP3_INVALID_FRAMEHEADER; /* don't clear outbuf since we don't know size (failed to parse header) */ - *inbuf += fhBytes; - - /* unpack side info */ - siBytes = UnpackSideInfo(mp3DecInfo, *inbuf); - if (siBytes < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_SIDEINFO; - } - *inbuf += siBytes; - *bytesLeft -= (fhBytes + siBytes); - - /* if free mode, need to calculate bitrate and nSlots manually, based on frame size */ - if (mp3DecInfo->bitrate == 0 || mp3DecInfo->freeBitrateFlag) { - if (!mp3DecInfo->freeBitrateFlag) { - /* first time through, need to scan for next sync word and figure out frame size */ - mp3DecInfo->freeBitrateFlag = 1; - mp3DecInfo->freeBitrateSlots = MP3FindFreeSync(*inbuf, *inbuf - fhBytes - siBytes, *bytesLeft); - if (mp3DecInfo->freeBitrateSlots < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_FREE_BITRATE_SYNC; - } - freeFrameBytes = mp3DecInfo->freeBitrateSlots + fhBytes + siBytes; - mp3DecInfo->bitrate = (freeFrameBytes * mp3DecInfo->samprate * 8) / (mp3DecInfo->nGrans * mp3DecInfo->nGranSamps); - } - mp3DecInfo->nSlots = mp3DecInfo->freeBitrateSlots + CheckPadBit(mp3DecInfo); /* add pad byte, if required */ - } - - /* useSize != 0 means we're getting reformatted (RTP) packets (see RFC 3119) - * - calling function assembles "self-contained" MP3 frames by shifting any main_data - * from the bit reservoir (in previous frames) to AFTER the sync word and side info - * - calling function should set mainDataBegin to 0, and tell us exactly how large this - * frame is (in bytesLeft) - */ - if (useSize) { - mp3DecInfo->nSlots = *bytesLeft; - if (mp3DecInfo->mainDataBegin != 0 || mp3DecInfo->nSlots <= 0) { - /* error - non self-contained frame, or missing frame (size <= 0), could do loss concealment here */ - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_FRAMEHEADER; - } - - /* can operate in-place on reformatted frames */ - mp3DecInfo->mainDataBytes = mp3DecInfo->nSlots; - mainPtr = *inbuf; - *inbuf += mp3DecInfo->nSlots; - *bytesLeft -= (mp3DecInfo->nSlots); - } else { - /* out of data - assume last or truncated frame */ - if (mp3DecInfo->nSlots > *bytesLeft) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INDATA_UNDERFLOW; - } - /* fill main data buffer with enough new data for this frame */ - if (mp3DecInfo->mainDataBytes >= mp3DecInfo->mainDataBegin) { - /* adequate "old" main data available (i.e. bit reservoir) */ - memmove(mp3DecInfo->mainBuf, mp3DecInfo->mainBuf + mp3DecInfo->mainDataBytes - mp3DecInfo->mainDataBegin, mp3DecInfo->mainDataBegin); - memcpy(mp3DecInfo->mainBuf + mp3DecInfo->mainDataBegin, *inbuf, mp3DecInfo->nSlots); - - mp3DecInfo->mainDataBytes = mp3DecInfo->mainDataBegin + mp3DecInfo->nSlots; - *inbuf += mp3DecInfo->nSlots; - *bytesLeft -= (mp3DecInfo->nSlots); - mainPtr = mp3DecInfo->mainBuf; - } else { - /* not enough data in bit reservoir from previous frames (perhaps starting in middle of file) */ - memcpy(mp3DecInfo->mainBuf + mp3DecInfo->mainDataBytes, *inbuf, mp3DecInfo->nSlots); - mp3DecInfo->mainDataBytes += mp3DecInfo->nSlots; - *inbuf += mp3DecInfo->nSlots; - *bytesLeft -= (mp3DecInfo->nSlots); - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_MAINDATA_UNDERFLOW; - } - } - bitOffset = 0; - mainBits = mp3DecInfo->mainDataBytes * 8; - - /* decode one complete frame */ - for (gr = 0; gr < mp3DecInfo->nGrans; gr++) { - for (ch = 0; ch < mp3DecInfo->nChans; ch++) { - /* unpack scale factors and compute size of scale factor block */ - prevBitOffset = bitOffset; - offset = UnpackScaleFactors(mp3DecInfo, mainPtr, &bitOffset, mainBits, gr, ch); - - sfBlockBits = 8*offset - prevBitOffset + bitOffset; - huffBlockBits = mp3DecInfo->part23Length[gr][ch] - sfBlockBits; - mainPtr += offset; - mainBits -= sfBlockBits; - - if (offset < 0 || mainBits < huffBlockBits) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_SCALEFACT; - } - - /* decode Huffman code words */ - prevBitOffset = bitOffset; - offset = DecodeHuffman(mp3DecInfo, mainPtr, &bitOffset, huffBlockBits, gr, ch); - if (offset < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_HUFFCODES; - } - - mainPtr += offset; - mainBits -= (8*offset - prevBitOffset + bitOffset); - } - /* dequantize coefficients, decode stereo, reorder short blocks */ - if (Dequantize(mp3DecInfo, gr) < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_DEQUANTIZE; - } - - /* alias reduction, inverse MDCT, overlap-add, frequency inversion */ - for (ch = 0; ch < mp3DecInfo->nChans; ch++) - if (IMDCT(mp3DecInfo, gr, ch) < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_IMDCT; - } - - /* subband transform - if stereo, interleaves pcm LRLRLR */ - if (Subband(mp3DecInfo, outbuf + gr*mp3DecInfo->nGranSamps*mp3DecInfo->nChans) < 0) { - MP3ClearBadFrame(mp3DecInfo, outbuf); - return ERR_MP3_INVALID_SUBBAND; - } - } - return ERR_MP3_NONE; -} diff --git a/bsp/stm32_radio/mp3/mp3tabs.c b/bsp/stm32_radio/mp3/mp3tabs.c deleted file mode 100644 index e4899c74e7..0000000000 --- a/bsp/stm32_radio/mp3/mp3tabs.c +++ /dev/null @@ -1,181 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * mp3tabs.c - platform-independent tables for MP3 decoder (global, read-only) - **************************************************************************************/ - -#include "mp3common.h" - -/* indexing = [version][samplerate index] - * sample rate of frame (Hz) - */ -const int samplerateTab[3][3] = { - {44100, 48000, 32000}, /* MPEG-1 */ - {22050, 24000, 16000}, /* MPEG-2 */ - {11025, 12000, 8000}, /* MPEG-2.5 */ -}; - -/* indexing = [version][layer][bitrate index] - * bitrate (kbps) of frame - * - bitrate index == 0 is "free" mode (bitrate determined on the fly by - * counting bits between successive sync words) - */ -const short bitrateTab[3][3][15] = { - { - /* MPEG-1 */ - { 0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448}, /* Layer 1 */ - { 0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384}, /* Layer 2 */ - { 0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320}, /* Layer 3 */ - }, - { - /* MPEG-2 */ - { 0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256}, /* Layer 1 */ - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 2 */ - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 3 */ - }, - { - /* MPEG-2.5 */ - { 0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256}, /* Layer 1 */ - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 2 */ - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, /* Layer 3 */ - }, -}; - -/* indexing = [version][layer] - * number of samples in one frame (per channel) - */ -const short samplesPerFrameTab[3][3] = { - {384, 1152, 1152 }, /* MPEG1 */ - {384, 1152, 576 }, /* MPEG2 */ - {384, 1152, 576 }, /* MPEG2.5 */ -}; - -/* layers 1, 2, 3 */ -const short bitsPerSlotTab[3] = {32, 8, 8}; - -/* indexing = [version][mono/stereo] - * number of bytes in side info section of bitstream - */ -const short sideBytesTab[3][2] = { - {17, 32}, /* MPEG-1: mono, stereo */ - { 9, 17}, /* MPEG-2: mono, stereo */ - { 9, 17}, /* MPEG-2.5: mono, stereo */ -}; - -/* indexing = [version][sampleRate][bitRate] - * for layer3, nSlots = floor(samps/frame * bitRate / sampleRate / 8) - * - add one pad slot if necessary - */ -const short slotTab[3][3][15] = { - { - /* MPEG-1 */ - { 0, 104, 130, 156, 182, 208, 261, 313, 365, 417, 522, 626, 731, 835,1044 }, /* 44 kHz */ - { 0, 96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960 }, /* 48 kHz */ - { 0, 144, 180, 216, 252, 288, 360, 432, 504, 576, 720, 864,1008,1152,1440 }, /* 32 kHz */ - }, - { - /* MPEG-2 */ - { 0, 26, 52, 78, 104, 130, 156, 182, 208, 261, 313, 365, 417, 470, 522 }, /* 22 kHz */ - { 0, 24, 48, 72, 96, 120, 144, 168, 192, 240, 288, 336, 384, 432, 480 }, /* 24 kHz */ - { 0, 36, 72, 108, 144, 180, 216, 252, 288, 360, 432, 504, 576, 648, 720 }, /* 16 kHz */ - }, - { - /* MPEG-2.5 */ - { 0, 52, 104, 156, 208, 261, 313, 365, 417, 522, 626, 731, 835, 940,1044 }, /* 11 kHz */ - { 0, 48, 96, 144, 192, 240, 288, 336, 384, 480, 576, 672, 768, 864, 960 }, /* 12 kHz */ - { 0, 72, 144, 216, 288, 360, 432, 504, 576, 720, 864,1008,1152,1296,1440 }, /* 8 kHz */ - }, -}; - -/* indexing = [version][sampleRate][long (.l) or short (.s) block] - * sfBandTable[v][s].l[cb] = index of first bin in critical band cb (long blocks) - * sfBandTable[v][s].s[cb] = index of first bin in critical band cb (short blocks) - */ -const SFBandTable sfBandTable[3][3] = { - { - /* MPEG-1 (44, 48, 32 kHz) */ - { - { 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90,110,134,162,196,238,288,342,418,576 }, - { 0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84,106,136,192 } - }, - { - { 0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88,106,128,156,190,230,276,330,384,576 }, - { 0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80,100,126,192 } - }, - { - { 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82,102,126,156,194,240,296,364,448,550,576 }, - { 0, 4, 8, 12, 16, 22, 30, 42, 58, 78,104,138,180,192 } - } - }, - - { - /* MPEG-2 (22, 24, 16 kHz) */ - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 }, - { 0, 4, 8, 12, 18, 24, 32, 42, 56, 74,100,132,174,192 } - }, - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,114,136,162,194,232,278,332,394,464,540,576 }, - { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,136,180,192 } - }, - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 }, - { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,134,174,192 } - }, - }, - - { - /* MPEG-2.5 (11, 12, 8 kHz) */ - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 }, - { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,134,174,192 } - }, - { - { 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96,116,140,168,200,238,284,336,396,464,522,576 }, - { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80,104,134,174,192 } - }, - { - { 0, 12, 24, 36, 48, 60, 72, 88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576 }, - { 0, 8, 16, 24, 36, 52, 72, 96,124,160,162,164,166,192 } - }, - }, -}; - - diff --git a/bsp/stm32_radio/mp3/pub/LICENSE.txt b/bsp/stm32_radio/mp3/pub/LICENSE.txt deleted file mode 100644 index 12e5372a9f..0000000000 --- a/bsp/stm32_radio/mp3/pub/LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ - Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. - - The contents of this directory, and (except where otherwise - indicated) the directories included within this directory, are - subject to the current version of the RealNetworks Public Source - License (the "RPSL") available at RPSL.txt in this directory, unless - you have licensed the directory under the current version of the - RealNetworks Community Source License (the "RCSL") available at - RCSL.txt in this directory, in which case the RCSL will apply. You - may also obtain the license terms directly from RealNetworks. You - may not use the files in this directory except in compliance with the - RPSL or, if you have a valid RCSL with RealNetworks applicable to - this directory, the RCSL. Please see the applicable RPSL or RCSL for - the rights, obligations and limitations governing use of the contents - of the directory. - - This directory is part of the Helix DNA Technology. RealNetworks is - the developer of the Original Code and owns the copyrights in the - portions it created. - - This directory, and the directories included with this directory, are - distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY - OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY - DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - QUIET ENJOYMENT OR NON-INFRINGEMENT. - - Technology Compatibility Kit Test Suite(s) Location: - http://www.helixcommunity.org/content/tck - diff --git a/bsp/stm32_radio/mp3/pub/RCSL.txt b/bsp/stm32_radio/mp3/pub/RCSL.txt deleted file mode 100644 index a809759a32..0000000000 --- a/bsp/stm32_radio/mp3/pub/RCSL.txt +++ /dev/null @@ -1,948 +0,0 @@ -The RCSL is made up of a base agreement and a few Attachments. - -For Research and Development use, you agree to the terms of the -RCSL R&D License (base RCSL and Attachments A, B, and C) - -For Commercial Use (either distribution or internal commercial -deployment) of the Helix DNA with or without support for RealNetworks' -RealAudio and RealVideo Add-on Technology, you agree to the -terms of the same RCSL R&D license -and execute one or more additional Commercial Use License attachments -. - ------------------------------------------------------------------------- - - - REALNETWORKS COMMUNITY SOURCE LICENSE - -Version 1.2 (Rev. Date: January 22, 2003). - - - RECITALS - -Original Contributor has developed Specifications, Source Code -implementations and Executables of certain Technology; and - -Original Contributor desires to license the Technology to a large -community to facilitate research, innovation and product development -while maintaining compatibility of such products with the Technology as -delivered by Original Contributor; and - -Original Contributor desires to license certain Trademarks for the -purpose of branding products that are compatible with the relevant -Technology delivered by Original Contributor; and - -You desire to license the Technology and possibly certain Trademarks -from Original Contributor on the terms and conditions specified in this -License. - -In consideration for the mutual covenants contained herein, You and -Original Contributor agree as follows: - - - AGREEMENT - -*1. Introduction.* - -The RealNetworks Community Source License ("RCSL") and effective -attachments ("License") may include five distinct licenses: - -i) Research Use license -- License plus Attachments A, B and C only. - -ii) Commercial Use and Trademark License, which may be for Internal -Deployment Use or external distribution, or both -- License plus -Attachments A, B, C, and D. - -iii) Technology Compatibility Kit (TCK) license -- Attachment C. - -iv) Add-On Technology License (Executable) Commercial Use License --Attachment F. - -v) Add-On Technology Source Code Porting and Optimization -License-Attachment G. - -The Research Use license is effective when You click and accept this -License. The TCK is effective when You click and accept this License, -unless otherwise specified in the TCK attachments. The Commercial Use -and Trademark, Add-On Technology License, and the Add-On Technology -Source Code Porting and Optimization licenses must each be signed by You -and Original Contributor to become effective. Once effective, these -licenses and the associated requirements and responsibilities are -cumulative. Capitalized terms used in this License are defined in the -Glossary. - -*2. License Grants.* - -2.1 Original Contributor Grant. - -Subject to Your compliance with Sections 3, 8.10 and Attachment A of -this License, Original Contributor grants to You a worldwide, -royalty-free, non-exclusive license, to the extent of Original -Contributor's Intellectual Property Rights covering the Original Code, -Upgraded Code and Specifications, to do the following: - -(a) Research Use License: - -(i) use, reproduce and modify the Original Code, Upgraded Code and -Specifications to create Modifications and Reformatted Specifications -for Research Use by You; - -(ii) publish and display Original Code, Upgraded Code and Specifications -with, or as part of Modifications, as permitted under Section 3.1(b) below; - -(iii) reproduce and distribute copies of Original Code and Upgraded Code -to Licensees and students for Research Use by You; - -(iv) compile, reproduce and distribute Original Code and Upgraded Code -in Executable form, and Reformatted Specifications to anyone for -Research Use by You. - -(b) Other than the licenses expressly granted in this License, Original -Contributor retains all right, title, and interest in Original Code and -Upgraded Code and Specifications. - -2.2 Your Grants. - -(a) To Other Licensees. You hereby grant to each Licensee a license to -Your Error Corrections and Shared Modifications, of the same scope and -extent as Original Contributor's licenses under Section 2.1 a) above -relative to Research Use and Attachment D relative to Commercial Use. - -(b) To Original Contributor. You hereby grant to Original Contributor a -worldwide, royalty-free, non-exclusive, perpetual and irrevocable -license, to the extent of Your Intellectual Property Rights covering -Your Error Corrections, Shared Modifications and Reformatted -Specifications, to use, reproduce, modify, display and distribute Your -Error Corrections, Shared Modifications and Reformatted Specifications, -in any form, including the right to sublicense such rights through -multiple tiers of distribution. - -(c) Other than the licenses expressly granted in Sections 2.2(a) and (b) -above, and the restrictions set forth in Section 3.1(d)(iv) below, You -retain all right, title, and interest in Your Error Corrections, Shared -Modifications and Reformatted Specifications. - -2.3 Contributor Modifications. - -You may use, reproduce, modify, display and distribute Contributor Error -Corrections, Shared Modifications and Reformatted Specifications, -obtained by You under this License, to the same scope and extent as with -Original Code, Upgraded Code and Specifications. - -2.4 Subcontracting. - -You may deliver the Source Code of Covered Code to other Licensees -having at least a Research Use license, for the sole purpose of -furnishing development services to You in connection with Your rights -granted in this License. All such Licensees must execute appropriate -documents with respect to such work consistent with the terms of this -License, and acknowledging their work-made-for-hire status or assigning -exclusive right to the work product and associated Intellectual Property -Rights to You. - -*3. Requirements and Responsibilities*. - -3.1 Research Use License. - -As a condition of exercising the rights granted under Section 2.1(a) -above, You agree to comply with the following: - -(a) Your Contribution to the Community. All Error Corrections and Shared -Modifications which You create or contribute to are automatically -subject to the licenses granted under Section 2.2 above. You are -encouraged to license all of Your other Modifications under Section 2.2 -as Shared Modifications, but are not required to do so. You agree to -notify Original Contributor of any errors in the Specification. - -(b) Source Code Availability. You agree to provide all Your Error -Corrections to Original Contributor as soon as reasonably practicable -and, in any event, prior to Internal Deployment Use or Commercial Use, -if applicable. Original Contributor may, at its discretion, post Source -Code for Your Error Corrections and Shared Modifications on the -Community Webserver. You may also post Error Corrections and Shared -Modifications on a web-server of Your choice; provided, that You must -take reasonable precautions to ensure that only Licensees have access to -such Error Corrections and Shared Modifications. Such precautions shall -include, without limitation, a password protection scheme limited to -Licensees and a click-on, download certification of Licensee status -required of those attempting to download from the server. An example of -an acceptable certification is attached as Attachment A-2. - -(c) Notices. All Error Corrections and Shared Modifications You create -or contribute to must include a file documenting the additions and -changes You made and the date of such additions and changes. You must -also include the notice set forth in Attachment A-1 in the file header. -If it is not possible to put the notice in a particular Source Code file -due to its structure, then You must include the notice in a location -(such as a relevant directory file), where a recipient would be most -likely to look for such a notice. - -(d) Redistribution. - -(i) Source. Covered Code may be distributed in Source Code form only to -another Licensee (except for students as provided below). You may not -offer or impose any terms on any Covered Code that alter the rights, -requirements, or responsibilities of such Licensee. You may distribute -Covered Code to students for use in connection with their course work -and research projects undertaken at accredited educational institutions. -Such students need not be Licensees, but must be given a copy of the -notice set forth in Attachment A-3 and such notice must also be included -in a file header or prominent location in the Source Code made available -to such students. - -(ii) Executable. You may distribute Executable version(s) of Covered -Code to Licensees and other third parties only for the purpose of -evaluation and comment in connection with Research Use by You and under -a license of Your choice, but which limits use of such Executable -version(s) of Covered Code only to that purpose. - -(iii) Modified Class, Interface and Package Naming. In connection with -Research Use by You only, You may use Original Contributor's class, -Interface and package names only to accurately reference or invoke the -Source Code files You modify. Original Contributor grants to You a -limited license to the extent necessary for such purposes. - -(iv) You expressly agree that any distribution, in whole or in part, of -Modifications developed by You shall only be done pursuant to the terms -and conditions of this License. - -(e) Extensions. - -(i) Covered Code. You may not include any Source Code of Community Code -in any Extensions. You may include the compiled Header Files of -Community Code in an Extension provided that Your use of the Covered -Code, including Heading Files, complies with the Commercial Use License, -the TCK and all other terms of this License. - -(ii) Publication. No later than the date on which You first distribute -such Extension for Commercial Use, You must publish to the industry, on -a non-confidential basis and free of all copyright restrictions with -respect to reproduction and use, an accurate and current specification -for any Extension. In addition, You must make available an appropriate -test suite, pursuant to the same rights as the specification, -sufficiently detailed to allow any third party reasonably skilled in the -technology to produce implementations of the Extension compatible with -the specification. Such test suites must be made available as soon as -reasonably practicable but, in no event, later than ninety (90) days -after Your first Commercial Use of the Extension. You must use -reasonable efforts to promptly clarify and correct the specification and -the test suite upon written request by Original Contributor. - -(iii) Open. You agree to refrain from enforcing any Intellectual -Property Rights You may have covering any interface(s) of Your -Extension, which would prevent the implementation of such interface(s) -by Original Contributor or any Licensee. This obligation does not -prevent You from enforcing any Intellectual Property Right You have that -would otherwise be infringed by an implementation of Your Extension. - -(iv) Interface Modifications and Naming. You may not modify or add to -the GUID space * * "xxxxxxxx-0901-11d1-8B06-00A024406D59" or any other -GUID space designated by Original Contributor. You may not modify any -Interface prefix provided with the Covered Code or any other prefix -designated by Original Contributor.* * - -* * - -(f) You agree that any Specifications provided to You by Original -Contributor are confidential and proprietary information of Original -Contributor. You must maintain the confidentiality of the Specifications -and may not disclose them to any third party without Original -Contributor's prior written consent. You may only use the Specifications -under the terms of this License and only for the purpose of implementing -the terms of this License with respect to Covered Code. You agree not -use, copy or distribute any such Specifications except as provided in -writing by Original Contributor. - -3.2 Commercial Use License. - -You may not make Commercial Use of any Covered Code unless You and -Original Contributor have executed a copy of the Commercial Use and -Trademark License attached as Attachment D. - -*4. Versions of the License.* - -4.1 License Versions. - -Original Contributor may publish revised versions of the License from -time to time. Each version will be given a distinguishing version number. - -4.2 Effect. - -Once a particular version of Covered Code has been provided under a -version of the License, You may always continue to use such Covered Code -under the terms of that version of the License. You may also choose to -use such Covered Code under the terms of any subsequent version of the -License. No one other than Original Contributor has the right to -promulgate License versions. - -4.3 Multiple-Licensed Code. - -Original Contributor may designate portions of the Covered Code as -"Multiple-Licensed." "Multiple-Licensed" means that the Original -Contributor permits You to utilize those designated portions of the -Covered Code under Your choice of this License or the alternative -license(s), if any, specified by the Original Contributor in an -Attachment to this License. - -*5. Disclaimer of Warranty.* - -5.1 COVERED CODE PROVIDED AS IS. - -COVERED CODE IS PROVIDED UNDER THIS LICENSE "AS IS," WITHOUT WARRANTY OF -ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, -WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT -FOR A PARTICULAR PURPOSE OR NON-INFRINGING. YOU AGREE TO BEAR THE ENTIRE -RISK IN CONNECTION WITH YOUR USE AND DISTRIBUTION OF COVERED CODE UNDER -THIS LICENSE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART -OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER -EXCEPT SUBJECT TO THIS DISCLAIMER. - -5.2 Not Designed for High Risk Activities. - -You acknowledge that Original Code, Upgraded Code and Specifications are -not designed or intended for use in high risk activities including, but -not limited to: (i) on-line control of aircraft, air traffic, aircraft -navigation or aircraft communications; or (ii) in the design, -construction, operation or maintenance of any nuclear facility. Original -Contributor disclaims any express or implied warranty of fitness for -such uses. - -*6. Termination.* - -6.1 By You. - -You may terminate this Research Use license at anytime by providing -written notice to Original Contributor. - -6.2 By Original Contributor. - -This License and the rights granted hereunder will terminate: - -(i) automatically if You fail to comply with the terms of this License -and fail to cure such breach within 30 days of receipt of written notice -of the breach; - -(ii) immediately in the event of circumstances specified in Sections 7.1 -and 8.4; or - -(iii) at Original Contributor's discretion upon any action initiated by -You (including by cross-claim or counter claim) alleging that use or -distribution by Original Contributor or any Licensee, of Original Code, -Upgraded Code, Error Corrections, Shared Modifications or Specifications -infringe a patent owned or controlled by You. - -6.3 Effective of Termination. - -Upon termination, You agree to discontinue use of and destroy all copies -of Covered Code in Your possession. All sublicenses to the Covered Code -which You have properly granted shall survive any termination of this -License. Provisions that, by their nature, should remain in effect -beyond the termination of this License shall survive including, without -limitation, Sections 2.2, 3, 5, 7 and 8. - -6.4 No Compensation. - -Each party waives and releases the other from any claim to compensation -or indemnity for permitted or lawful termination of the business -relationship established by this License. - -*7. Liability.* - -7.1 Infringement. Should any of the Original Code, Upgraded Code, TCK or -Specifications ("Materials") become the subject of a claim of -infringement, Original Contributor may, at its sole option, (i) attempt -to procure the rights necessary for You to continue using the Materials, -(ii) modify the Materials so that they are no longer infringing, or -(iii) terminate Your right to use the Materials, immediately upon -written notice, and refund to You the amount, if any, having then -actually been paid by You to Original Contributor for the Original Code, -Upgraded Code and TCK, depreciated on a straight line, five year basis. - -7.2 LIMITATION OF LIABILITY. TO THE FULL EXTENT ALLOWED BY APPLICABLE -LAW, ORIGINAL CONTRIBUTOR'S LIABILITY TO YOU FOR CLAIMS RELATING TO THIS -LICENSE, WHETHER FOR BREACH OR IN TORT, SHALL BE LIMITED TO ONE HUNDRED -PERCENT (100%) OF THE AMOUNT HAVING THEN ACTUALLY BEEN PAID BY YOU TO -ORIGINAL CONTRIBUTOR FOR ALL COPIES LICENSED HEREUNDER OF THE PARTICULAR -ITEMS GIVING RISE TO SUCH CLAIM, IF ANY, DURING THE TWELVE MONTHS -PRECEDING THE CLAIMED BREACH. IN NO EVENT WILL YOU (RELATIVE TO YOUR -SHARED MODIFICATIONS OR ERROR CORRECTIONS) OR ORIGINAL CONTRIBUTOR BE -LIABLE FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL -DAMAGES IN CONNECTION WITH OR RISING OUT OF THIS LICENSE (INCLUDING, -WITHOUT LIMITATION, LOSS OF PROFITS, USE, DATA, OR OTHER ECONOMIC -ADVANTAGE), HOWEVER IT ARISES AND ON ANY THEORY OF LIABILITY, WHETHER IN -AN ACTION FOR CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE) -OR OTHERWISE, WHETHER OR NOT YOU OR ORIGINAL CONTRIBUTOR HAS BEEN -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE AND NOTWITHSTANDING THE -FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. - -*8. Miscellaneous.* - -8.1 Trademark. - -You shall not use any Trademark unless You and Original Contributor -execute a copy of the Commercial Use and Trademark License Agreement -attached hereto as Attachment D. Except as expressly provided in the -License, You are granted no right, title or license to, or interest in, -any Trademarks. Whether or not You and Original Contributor enter into -the Trademark License, You agree not to (i) challenge Original -Contributor's ownership or use of Trademarks; (ii) attempt to register -any Trademarks, or any mark or logo substantially similar thereto; or -(iii) incorporate any Trademarks into Your own trademarks, product -names, service marks, company names, or domain names. - -8.2 Integration. - -This License represents the complete agreement concerning the subject -matter hereof. - -8.3 Assignment. - -Original Contributor may assign this License, and its rights and -obligations hereunder, in its sole discretion. You may assign the -Research Use portions of this License and the TCK license to a third -party upon prior written notice to Original Contributor (which may be -provided electronically via the Community Web-Server). You may not -assign the Commercial Use and Trademark license, the Add-On Technology -License, or the Add-On Technology Source Code Porting License, including -by way of merger (regardless of whether You are the surviving entity) or -acquisition, without Original Contributor's prior written consent. - -8.4 Severability. - -If any provision of this License is held to be unenforceable, such -provision shall be reformed only to the extent necessary to make it -enforceable. Notwithstanding the foregoing, if You are prohibited by law -from fully and specifically complying with Sections 2.2 or 3, this -License will immediately terminate and You must immediately discontinue -any use of Covered Code. - -8.5 Governing Law. - -This License shall be governed by the laws of the United States and the -State of Washington, as applied to contracts entered into and to be -performed in Washington between Washington residents. The application of -the United Nations Convention on Contracts for the International Sale of -Goods is expressly excluded. You agree that the state and federal courts -located in Seattle, Washington have exclusive jurisdiction over any -claim relating to the License, including contract and tort claims. - -8.6 Dispute Resolution. - -a) Arbitration. Any dispute arising out of or relating to this License -shall be finally settled by arbitration as set out herein, except that -either party may bring any action, in a court of competent jurisdiction -(which jurisdiction shall be exclusive), with respect to any dispute -relating to such party's Intellectual Property Rights or with respect to -Your compliance with the TCK license. Arbitration shall be administered: -(i) by the American Arbitration Association (AAA), (ii) in accordance -with the rules of the United Nations Commission on International Trade -Law (UNCITRAL) (the "Rules") in effect at the time of arbitration as -modified herein; and (iii) the arbitrator will apply the substantive -laws of Washington and the United States. Judgment upon the award -rendered by the arbitrator may be entered in any court having -jurisdiction to enforce such award. - -b) Arbitration language, venue and damages. All arbitration proceedings -shall be conducted in English by a single arbitrator selected in -accordance with the Rules, who must be fluent in English and be either a -retired judge or practicing attorney having at least ten (10) years -litigation experience and be reasonably familiar with the technology -matters relative to the dispute. Unless otherwise agreed, arbitration -venue shall be in Seattle, Washington. The arbitrator may award monetary -damages only and nothing shall preclude either party from seeking -provisional or emergency relief from a court of competent jurisdiction. -The arbitrator shall have no authority to award damages in excess of -those permitted in this License and any such award in excess is void. -All awards will be payable in U.S. dollars and may include, for the -prevailing party (i) pre-judgment award interest, (ii) reasonable -attorneys' fees incurred in connection with the arbitration, and (iii) -reasonable costs and expenses incurred in enforcing the award. The -arbitrator will order each party to produce identified documents and -respond to no more than twenty-five single question interrogatories. - -8.7 Construction. - -Any law or regulation, which provides that the language of a contract -shall be construed against the drafter, shall not apply to this License. - -8.8 U.S. Government End Users. - -The Covered Code is a "commercial item," as that term is defined in 48 -C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" -and "commercial computer software documentation," as such terms are used -in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and -48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government -End Users acquire Covered Code with only those rights set forth herein. -You agree to pass this notice to our licensees. - -8.9 Marketing Activities. - -Licensee hereby grants Original Contributor a non-exclusive, -non-transferable, limited license to use the Licensee's company name and -logo ("Licensee Marks") in any presentations, press releases, or -marketing materials solely for the purpose of identifying Licensee as a -member of the Helix Community. Licensee shall provide samples of -Licensee Marks to Original Contributor upon request by Original -Contributor. Original Contributor acknowledges that the Licensee Marks -are the trademarks of Licensee. Original Contributor shall not use the -Licensee Marks in a way that may imply that Original Contributor is an -agency or branch of Licensee. Original Contributor understands and -agrees that the use of any Licensee Marks in connection with this -Agreement shall not create any right, title or interest, in, or to the -Licensee Marks or any Licensee trademarks and that all such use and -goodwill associated with any such trademarks will inure to the benefit -of Licensee. Further the Original Contributor will stop usage of the -Licensee Marks upon Licensee's request. - -8.10 Press Announcements. - -You may make press announcements or other public statements regarding -this License without the prior written consent of the Original -Contributor, if Your statement is limited to announcing the licensing of -the Covered Code or the availability of Your Product and its -compatibility with the Covered Code. All other public announcements -regarding this license require the prior written consent of the Original -Contributor. Consent requests are welcome at press@helixcommunity.org. - -8.11 International Use. - -a) Export/Import laws. Covered Code is subject to U.S. export control -laws and may be subject to export or import regulations in other -countries. Each party agrees to comply strictly with all such laws and -regulations and acknowledges their responsibility to obtain such -licenses to export, re-export, or import as may be required. You agree -to pass these obligations to Your licensees. - -b) Intellectual Property Protection. Due to limited intellectual -property protection and enforcement in certain countries, You agree not -to redistribute the Original Code, Upgraded Code, TCK and Specifications -to any country on the list of restricted countries on the Community Web -Server. - -8.12 Language. - -This License is in the English language only, which language shall be -controlling in all respects, and all versions of this License in any -other language shall be for accommodation only and shall not be binding -on the parties to this License. All communications and notices made or -given pursuant to this License, and all documentation and support to be -provided, unless otherwise noted, shall be in the English language. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH REALNETWORKS, INC. IF YOU ARE AGREEING -TO THIS LICENSE ON BEHALF OF A COMPANY, YOU REPRESENT THAT YOU ARE -AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. WHETHER YOU ARE ACTING -ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, YOU MUST BE OF MAJORITY -AGE AND BE OTHERWISE COMPETENT TO ENTER INTO CONTRACTS. IF YOU DO NOT -MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY OF THE TERMS AND -CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON TO EXIT. - - - GLOSSARY - -1. *"Added Value"* means code which: - -(i) has a principal purpose which is substantially different from that -of the stand-alone Technology; - -(ii) represents a significant functional and value enhancement to the -Technology; - -(iii) operates in conjunction with the Technology; and - -(iv) is not marketed as a technology which replaces or substitutes for -the Technology - -2. "*Applicable Patent Rights*" mean: (a) in the case where Original -Contributor is the grantor of rights, claims of patents that (i) are now -or hereafter acquired, owned by or assigned to Original Contributor and -(ii) are necessarily infringed by using or making the Original Code or -Upgraded Code, including Modifications provided by Original Contributor, -alone and not in combination with other software or hardware; and (b) in -the case where Licensee is the grantor of rights, claims of patents that -(i) are now or hereafter acquired, owned by or assigned to Licensee and -(ii) are infringed (directly or indirectly) by using or making -Licensee's Modifications or Error Corrections, taken alone or in -combination with Covered Code. - -3. "*Application Programming Interfaces (APIs)"* means the interfaces, -associated header files, service provider interfaces, and protocols that -enable a device, application, Operating System, or other program to -obtain services from or make requests of (or provide services in -response to requests from) other programs, and to use, benefit from, or -rely on the resources, facilities, and capabilities of the relevant -programs using the APIs. APIs includes the technical documentation -describing the APIs, the Source Code constituting the API, and any -Header Files used with the APIs. - -4. "*Commercial Use*" means any use (internal or external), copying, -sublicensing or distribution (internal or external), directly or -indirectly of Covered Code by You other than Your Research Use of -Covered Code within Your business or organization or in conjunction with -other Licensees with equivalent Research Use rights. Commercial Use -includes any use of the Covered Code for direct or indirect commercial -or strategic gain, advantage or other business purpose. Any Commercial -Use requires execution of Attachment D by You and Original Contributor. - -5. "*Community Code*" means the Original Code, Upgraded Code, Error -Corrections, Shared Modifications, or any combination thereof. - -6. "*Community Webserver(s)"* means the webservers designated by -Original Contributor for access to the Original Code, Upgraded Code, TCK -and Specifications and for posting Error Corrections and Shared -Modifications. - -7. "*Compliant Covered Code*" means Covered Code that complies with the -requirements of the TCK. - -8. "*Contributor*" means each Licensee that creates or contributes to -the creation of any Error Correction or Shared Modification. - -9. "*Covered Code*" means the Original Code, Upgraded Code, -Modifications, or any combination thereof. - -10. "*Error Correction*" means any change made to Community Code which -conforms to the Specification and corrects the adverse effect of a -failure of Community Code to perform any function set forth in or -required by the Specifications. - -11. "*Executable*" means Covered Code that has been converted from -Source Code to the preferred form for execution by a computer or digital -processor (e.g. binary form). - -12. "*Extension(s)"* means any additional Interfaces developed by or for -You which: (i) are designed for use with the Technology; (ii) constitute -an API for a library of computing functions or services; and (iii) are -disclosed or otherwise made available to third party software developers -for the purpose of developing software which invokes such additional -Interfaces. The foregoing shall not apply to software developed by Your -subcontractors to be exclusively used by You. - -13. "*Header File(s)"* means that portion of the Source Code that -provides the names and types of member functions, data members, class -definitions, and interface definitions necessary to implement the APIs -for the Covered Code. Header Files include, files specifically -designated by Original Contributor as Header Files. Header Files do not -include the code necessary to implement the functionality underlying the -Interface. - -14. *"Helix DNA Server Technology"* means the program(s) that implement -the Helix Universal Server streaming engine for the Technology as -defined in the Specification. - -15. *"Helix DNA Client Technology"* means the Covered Code that -implements the RealOne Player engine as defined in the Specification. - -16. *"Helix DNA Producer Technology"* means the Covered Code that -implements the Helix Producer engine as defined in the Specification. - -17. *"Helix DNA Technology"* means the Helix DNA Server Technology, the -Helix DNA Client Technology, the Helix DNA Producer Technology and other -Helix technologies designated by Original Contributor. - -18. "*Intellectual Property Rights*" means worldwide statutory and -common law rights associated solely with (i) Applicable Patent Rights; -(ii) works of authorship including copyrights, copyright applications, -copyright registrations and "moral rights"; (iii) the protection of -trade and industrial secrets and confidential information; and (iv) -divisions, continuations, renewals, and re-issuances of the foregoing -now existing or acquired in the future. - -19. *"Interface*" means interfaces, functions, properties, class -definitions, APIs, Header Files, GUIDs, V-Tables, and/or protocols -allowing one piece of software, firmware or hardware to communicate or -interoperate with another piece of software, firmware or hardware. - -20. "*Internal Deployment Use*" means use of Compliant Covered Code -(excluding Research Use) within Your business or organization only by -Your employees and/or agents on behalf of Your business or organization, -but not to provide services, including content distribution, to third -parties, subject to execution of Attachment D by You and Original -Contributor, if required. - -21. "*Licensee*" means any party that has entered into and has in effect -a version of this License with Original Contributor. - -22. "*MIME type*" means a description of what type of media or other -content is in a file, including by way of example but not limited to -'audio/x-pn-realaudio-plugin.' - -23. "*Modification(s)"* means (i) any addition to, deletion from and/or -change to the substance and/or structure of the Covered Code, including -Interfaces; (ii) the combination of any Covered Code and any previous -Modifications; (iii) any new file or other representation of computer -program statements that contains any portion of Covered Code; and/or -(iv) any new Source Code implementing any portion of the Specifications. - -24. "*MP3 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Picture Experts Group known as MPEG-1 Audio Layer-3 or MP3, -including but not limited to all past and future versions, profiles, -extensions, parts and amendments relating to the MP3 specification. - -25. "*MPEG-4 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Pictures Experts Group known as MPEG-4, including but not -limited to all past and future versions, profiles, extensions, parts and -amendments relating to the MPEG-4 specification. - -26. "*Original Code*" means the initial Source Code for the Technology -as described on the Community Web Server. - -27. "*Original Contributor*" means RealNetworks, Inc., its affiliates -and its successors and assigns. - -28. "*Original Contributor MIME Type*" means the MIME registry, browser -preferences, or local file/protocol associations invoking any Helix DNA -Client-based application, including the RealOne Player, for playback of -RealAudio, RealVideo, other RealMedia MIME types or datatypes (e.g., -.ram, .rnx, .rpm, .ra, .rm, .rp, .rt, .rf, .prx, .mpe, .rmp, .rmj, .rav, -.rjs, .rmx, .rjt, .rms), and any other Original Contributor-specific or -proprietary MIME types that Original Contributor may introduce in the -future. - -29. "*Personal Use*" means use of Covered Code by an individual solely -for his or her personal, private and non-commercial purposes. An -individual's use of Covered Code in his or her capacity as an officer, -employee, member, independent contractor or agent of a corporation, -business or organization (commercial or non-commercial) does not qualify -as Personal Use. - -30. "*RealMedia File Format*" means the file format designed and -developed by RealNetworks for storing multimedia data and used to store -RealAudio and RealVideo encoded streams. Valid RealMedia File Format -extensions include: .rm, .rmj, .rmc, .rmvb, .rms. - -31. "*RCSL Webpage*" means the RealNetworks Community Source License -webpage located at https://www.helixcommunity.org/content/rcsl or such -other URL that Original Contributor may designate from time to time. - -32. "*Reformatted Specifications*" means any revision to the -Specifications which translates or reformats the Specifications (as for -example in connection with Your documentation) but which does not alter, -subset or superset * *the functional or operational aspects of the -Specifications. - -33. "*Research Use*" means use and distribution of Covered Code only for -Your Personal Use, research or development use and expressly excludes -Internal Deployment Use and Commercial Use. Research Use also includes -use of Covered Code to teach individuals how to use Covered Code. - -34. "*Shared Modifications*" means Modifications that You distribute or -use for a Commercial Use, in addition to any Modifications provided by -You, at Your option, pursuant to Section 2.2, or received by You from a -Contributor pursuant to Section 2.3. - -35. "*Source Code*" means the preferred form of the Covered Code for -making modifications to it, including all modules it contains, plus any -associated interface definition files, scripts used to control -compilation and installation of an Executable, or source code -differential comparisons against either the Original Code or another -well known, available Covered Code of the Contributor's choice. The -Source Code can be in a compressed or archival form, provided the -appropriate decompression or de-archiving software is widely available -for no charge. - -36. "*Specifications*" means the specifications for the Technology and -other documentation, as designated on the Community Web Server, as may -be revised by Original Contributor from time to time. - -37. "*Trademarks*" means Original Contributor's trademarks and logos, -including, but not limited to, RealNetworks, RealAudio, RealVideo, -RealOne, RealSystem, SureStream, Helix, Helix DNA and other trademarks -whether now used or adopted in the future. - -38. "*Technology*" means the technology described in Attachment B, and -Upgrades. - -39. "*Technology Compatibility Kit"* or *"TCK*" means the test programs, -procedures, acceptance criteria and/or other requirements, designated by -Original Contributor for use in verifying compliance of Covered Code -with the Specifications, in conjunction with the Original Code and -Upgraded Code. Original Contributor may, in its sole discretion and from -time to time, revise a TCK to correct errors and/or omissions and in -connection with Upgrades. - -40. "*Upgrade(s)"* means new versions of Technology designated -exclusively by Original Contributor as an "Upgrade" and released by -Original Contributor from time to time under the terms of the License. - -41. "*Upgraded Code*" means the Source Code and/or Executables for -Upgrades, possibly including Modifications made by Contributors. - -42. *"User's Guide"* means the users guide for the TCK which Original -Contributor makes available to You to provide direction in how to run -the TCK and properly interpret the results, as may be revised by -Original Contributor from time to time. - -43. "*You(r)*" means an individual, or a legal entity acting by and -through an individual or individuals, exercising rights either under -this License or under a future version of this License issued pursuant -to Section 4.1. For legal entities, "You(r)" includes any entity that by -majority voting interest controls, is controlled by, or is under common -control with You. - -44. "*Your Products*" means any (i) hardware products You distribute -integrating the Covered Code; (ii) any software products You distribute -with the Covered Code that utilize the APIs of the Covered Code; or -(iii) any services You provide using the Covered Code. - - - ATTACHMENT A - -REQUIRED NOTICES - - - ATTACHMENT A-1 - -REQUIRED IN ALL CASES - -Notice to be included in header file of all Error Corrections and Shared -Modifications: - -Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved. - -The contents of this file, and the files included with this file, are -subject to the current version of RealNetworks Community Source License -Version 1.1 (the "License"). You may not use this file except in -compliance with the License executed by both You and RealNetworks. You -may obtain a copy of the License at * -https://www.helixcommunity.org/content/rcsl.* You may also obtain a copy -of the License by contacting RealNetworks directly. Please see the -License for the rights, obligations and limitations governing use of the -contents of the file. - -This file is part of the Helix DNA technology. RealNetworks, Inc., is -the developer of the Original code and owns the copyrights in the -portions it created. - -This file, and the files included with this file, are distributed on an -'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, -AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT -LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): - -_______________________________________________ - -Technology Compatibility Kit Test Suite(s) Location: - -________________________________ - - - ATTACHMENT A-2 - -SAMPLE LICENSEE CERTIFICATION - -"By clicking the `Agree' button below, You certify that You are a -Licensee in good standing under the RealNetworks Community Source -License, ("License") and that Your access, use and distribution of code -and information You may obtain at this site is subject to the License. -If You are not a Licensee under the RealNetworks Community Source -License You agree not to download, copy or use the Helix DNA technology. - - - ATTACHMENT A-3 - -REQUIRED STUDENT NOTIFICATION - -"This software and related documentation has been obtained by Your -educational institution subject to the RealNetworks Community Source -License. You have been provided access to the software and related -documentation for use only in connection with your course work and -research activities as a matriculated student of Your educational -institution. Any other use is expressly prohibited. - -THIS SOFTWARE AND RELATED DOCUMENTATION CONTAINS PROPRIETARY MATERIAL OF -REALNETWORKS, INC, WHICH ARE PROTECTED BY VARIOUS INTELLECTUAL PROPERTY -RIGHTS. - -You may not use this file except in compliance with the License. You may -obtain a copy of the License on the web at -https://www.helixcommunity.org/content/rcsl. - -* -* - - - ATTACHMENT B - -Description of Technology - -Helix DNA, which consists of Helix DNA Client, Helix DNA Server and -Helix DNA Producer. - -Description of "Technology" - -Helix DNA Technology v1.0 as described on the Community Web Server. - - - ATTACHMENT C - -TECHNOLOGY COMPATIBILITY KIT LICENSE - -The following license is effective for the *Helix DNA* Technology -Compatibility Kit - as described on the Community Web Server. The -Technology Compatibility Kit(s) for the Technology specified in -Attachment B may be accessed at the Community Web Server. - -1. TCK License. - -1.1 Grants to use TCK - -Subject to the terms and restrictions set forth below and the -RealNetworks Community Source License, and the Research Use license, -Original Contributor grants to You a worldwide, non-exclusive, -non-transferable license, to the extent of Original Contributor's -Intellectual Property Rights in the TCK (without the right to -sublicense), to use the TCK to develop and test Covered Code. - -1.2 TCK Use Restrictions. - -You are not authorized to create derivative works of the TCK or use the -TCK to test any implementation of the Specification that is not Covered -Code. You may not publish Your test results or make claims of -comparative compatibility with respect to other implementations of the -Specification. In consideration for the license grant in Section 1.1 -above You agree not to develop Your own tests that are intended to -validate conformation with the Specification. - -2. Test Results. - -You agree to provide to Original Contributor or the third party test -facility if applicable, Your test results that demonstrate that Covered -Code is Compliant Covered Code and that Original Contributor may publish -or otherwise distribute such test results. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH THE ORIGINAL CONTRIBUTOR, REALNETWORKS, -INC. IF YOU ARE AGREEING TO THIS LICENSE ON BEHALF OF A COMPANY, YOU -REPRESENT THAT YOU ARE AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. -WHETHER YOU ARE ACTING ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, -YOU MUST BE OF MAJORITY AGE AND BE OTHERWISE COMPETENT TO ENTER INTO -CONTRACTS. IF YOU DO NOT MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY -OF THE TERMS AND CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON -TO EXIT. - -*ACCEPT / REJECT -* - -* -* - -*To agree to the R&D/academic terms of this license, please register - on the site -- -you will then be given a chance to agree to the clickwrap RCSL - -R&D License - -and gain access to the RCSL-licensed source code. To build or deploy -commercial applications based on the RCSL, you will need to agree to the -Commercial Use license attachments -* - - - diff --git a/bsp/stm32_radio/mp3/pub/RPSL.txt b/bsp/stm32_radio/mp3/pub/RPSL.txt deleted file mode 100644 index d040a45205..0000000000 --- a/bsp/stm32_radio/mp3/pub/RPSL.txt +++ /dev/null @@ -1,518 +0,0 @@ -RealNetworks Public Source License Version 1.0 -(Rev. Date October 28, 2002) - -1. General Definitions. This License applies to any program or other work which -RealNetworks, Inc., or any other entity that elects to use this license, -("Licensor") makes publicly available and which contains a notice placed by -Licensor identifying such program or work as "Original Code" and stating that it -is subject to the terms of this RealNetworks Public Source License version 1.0 -(or subsequent version thereof) ("License"). You are not required to accept this -License. However, nothing else grants You permission to use, copy, modify or -distribute the software or its derivative works. These actions are prohibited by -law if You do not accept this License. Therefore, by modifying, copying or -distributing the software (or any work based on the software), You indicate your -acceptance of this License to do so, and all its terms and conditions. In -addition, you agree to the terms of this License by clicking the Accept button -or downloading the software. As used in this License: - -1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the -grantor of rights, claims of patents that (i) are now or hereafter acquired, -owned by or assigned to Licensor and (ii) are necessarily infringed by using or -making the Original Code alone and not in combination with other software or -hardware; and (b) in the case where You are the grantor of rights, claims of -patents that (i) are now or hereafter acquired, owned by or assigned to You and -(ii) are infringed (directly or indirectly) by using or making Your -Modifications, taken alone or in combination with Original Code. - -1.2 "Compatible Source License" means any one of the licenses listed on Exhibit -B or at https://www.helixcommunity.org/content/complicense or other licenses -specifically identified by Licensor in writing. Notwithstanding any term to the -contrary in any Compatible Source License, any code covered by any Compatible -Source License that is used with Covered Code must be made readily available in -Source Code format for royalty-free use under the terms of the Compatible Source -License or this License. - -1.3 "Contributor" means any person or entity that creates or contributes to the -creation of Modifications. - -1.4 "Covered Code" means the Original Code, Modifications, the combination of -Original Code and any Modifications, and/or any respective portions thereof. - -1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for -Your internal research and development (R&D) and/or Personal Use, and includes -without limitation, any and all internal use or distribution of Covered Code -within Your business or organization except for R&D use and/or Personal Use, as -well as direct or indirect sublicensing or distribution of Covered Code by You -to any third party in any form or manner. - -1.6 "Derivative Work" means either the Covered Code or any derivative work under -United States copyright law, and including any work containing or including any -portion of the Covered Code or Modifications, either verbatim or with -modifications and/or translated into another language. Derivative Work also -includes any work which combines any portion of Covered Code or Modifications -with code not otherwise governed by the terms of this License. - -1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be -accessed or used by anyone other than You, used to provide any services to -anyone other than You, or used in any way to deliver any content to anyone other -than You, whether the Covered Code is distributed to those parties, made -available as an application intended for use over a computer network, or used to -provide services or otherwise deliver content to anyone other than You. - -1.8. "Interface" means interfaces, functions, properties, class definitions, -APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of -software, firmware or hardware to communicate or interoperate with another piece -of software, firmware or hardware. - -1.9 "Modifications" mean any addition to, deletion from, and/or change to, the -substance and/or structure of the Original Code, any previous Modifications, the -combination of Original Code and any previous Modifications, and/or any -respective portions thereof. When code is released as a series of files, a -Modification is: (a) any addition to or deletion from the contents of a file -containing Covered Code; and/or (b) any new file or other representation of -computer program statements that contains any part of Covered Code. - -1.10 "Original Code" means (a) the Source Code of a program or other work as -originally made available by Licensor under this License, including the Source -Code of any updates or upgrades to such programs or works made available by -Licensor under this License, and that has been expressly identified by Licensor -as such in the header file(s) of such work; and (b) the object code compiled -from such Source Code and originally made available by Licensor under this -License. - -1.11 "Personal Use" means use of Covered Code by an individual solely for his or -her personal, private and non-commercial purposes. An individual's use of -Covered Code in his or her capacity as an officer, employee, member, independent -contractor or agent of a corporation, business or organization (commercial or -non-commercial) does not qualify as Personal Use. - -1.12 "Source Code" means the human readable form of a program or other work that -is suitable for making modifications to it, including all modules it contains, -plus any associated interface definition files, scripts used to control -compilation and installation of an executable (object code). - -1.13 "You" or "Your" means an individual or a legal entity exercising rights -under this License. For legal entities, "You" or "Your" includes any entity -which controls, is controlled by, or is under common control with, You, where -"control" means (a) the power, direct or indirect, to cause the direction or -management of such entity, whether by contract or otherwise, or (b) ownership of -fifty percent (50%) or more of the outstanding shares or beneficial ownership of -such entity. - -2. Permitted Uses; Conditions & Restrictions. Subject to the terms and -conditions of this License, Licensor hereby grants You, effective on the date -You accept this License (via downloading or using Covered Code or otherwise -indicating your acceptance of this License), a worldwide, royalty-free, -non-exclusive copyright license, to the extent of Licensor's copyrights cover -the Original Code, to do the following: - -2.1 You may reproduce, display, perform, modify and Deploy Covered Code, -provided that in each instance: - -(a) You must retain and reproduce in all copies of Original Code the copyright -and other proprietary notices and disclaimers of Licensor as they appear in the -Original Code, and keep intact all notices in the Original Code that refer to -this License; - -(b) You must include a copy of this License with every copy of Source Code of -Covered Code and documentation You distribute, and You may not offer or impose -any terms on such Source Code that alter or restrict this License or the -recipients' rights hereunder, except as permitted under Section 6; - -(c) You must duplicate, to the extent it does not already exist, the notice in -Exhibit A in each file of the Source Code of all Your Modifications, and cause -the modified files to carry prominent notices stating that You changed the files -and the date of any change; - -(d) You must make Source Code of all Your Externally Deployed Modifications -publicly available under the terms of this License, including the license grants -set forth in Section 3 below, for as long as you Deploy the Covered Code or -twelve (12) months from the date of initial Deployment, whichever is longer. You -should preferably distribute the Source Code of Your Deployed Modifications -electronically (e.g. download from a web site); and - -(e) if You Deploy Covered Code in object code, executable form only, You must -include a prominent notice, in the code itself as well as in related -documentation, stating that Source Code of the Covered Code is available under -the terms of this License with information on how and where to obtain such -Source Code. You must also include the Object Code Notice set forth in Exhibit A -in the "about" box or other appropriate place where other copyright notices are -placed, including any packaging materials. - -2.2 You expressly acknowledge and agree that although Licensor and each -Contributor grants the licenses to their respective portions of the Covered Code -set forth herein, no assurances are provided by Licensor or any Contributor that -the Covered Code does not infringe the patent or other intellectual property -rights of any other entity. Licensor and each Contributor disclaim any liability -to You for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, You hereby assume sole responsibility to -secure any other intellectual property rights needed, if any. For example, if a -third party patent license is required to allow You to make, use, sell, import -or offer for sale the Covered Code, it is Your responsibility to acquire such -license(s). - -2.3 Subject to the terms and conditions of this License, Licensor hereby grants -You, effective on the date You accept this License (via downloading or using -Covered Code or otherwise indicating your acceptance of this License), a -worldwide, royalty-free, perpetual, non-exclusive patent license under -Licensor's Applicable Patent Rights to make, use, sell, offer for sale and -import the Covered Code, provided that in each instance you comply with the -terms of this License. - -3. Your Grants. In consideration of, and as a condition to, the licenses granted -to You under this License: - -(a) You grant to Licensor and all third parties a non-exclusive, perpetual, -irrevocable, royalty free license under Your Applicable Patent Rights and other -intellectual property rights owned or controlled by You, to make, sell, offer -for sale, use, import, reproduce, display, perform, modify, distribute and -Deploy Your Modifications of the same scope and extent as Licensor's licenses -under Sections 2.1 and 2.2; and - -(b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide, -royalty-free, perpetual and irrevocable license, under Your Applicable Patent -Rights and other intellectual property rights owned or controlled by You, to -make, use, sell, offer for sale, import, reproduce, display, perform, -distribute, modify or have modified (for Licensor and/or its subsidiaries), -sublicense and distribute Your Modifications, in any form and for any purpose, -through multiple tiers of distribution. - -(c) You agree not use any information derived from Your use and review of the -Covered Code, including but not limited to any algorithms or inventions that may -be contained in the Covered Code, for the purpose of asserting any of Your -patent rights, or assisting a third party to assert any of its patent rights, -against Licensor or any Contributor. - -4. Derivative Works. You may create a Derivative Work by combining Covered Code -with other code not otherwise governed by the terms of this License and -distribute the Derivative Work as an integrated product. In each such instance, -You must make sure the requirements of this License are fulfilled for the -Covered Code or any portion thereof, including all Modifications. - -4.1 You must cause any Derivative Work that you distribute, publish or -Externally Deploy, that in whole or in part contains or is derived from the -Covered Code or any part thereof, to be licensed as a whole at no charge to all -third parties under the terms of this License and no other license except as -provided in Section 4.2. You also must make Source Code available for the -Derivative Work under the same terms as Modifications, described in Sections 2 -and 3, above. - -4.2 Compatible Source Licenses. Software modules that have been independently -developed without any use of Covered Code and which contain no portion of the -Covered Code, Modifications or other Derivative Works, but are used or combined -in any way wtih the Covered Code or any Derivative Work to form a larger -Derivative Work, are exempt from the conditions described in Section 4.1 but -only to the extent that: the software module, including any software that is -linked to, integrated with, or part of the same applications as, the software -module by any method must be wholly subject to one of the Compatible Source -Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the -terms of this License. Thus, the entire Derivative Work must be licensed under a -combination of the RPSL (for Covered Code) and a Compatible Source License for -any independently developed software modules within the Derivative Work. The -foregoing requirement applies even if the Compatible Source License would -ordinarily allow the software module to link with, or form larger works with, -other software that is not subject to the Compatible Source License. For -example, although the Mozilla Public License v1.1 allows Mozilla code to be -combined with proprietary software that is not subject to the MPL, if -MPL-licensed code is used with Covered Code the MPL-licensed code could not be -combined or linked with any code not governed by the MPL. The general intent of -this section 4.2 is to enable use of Covered Code with applications that are -wholly subject to an acceptable open source license. You are responsible for -determining whether your use of software with Covered Code is allowed under Your -license to such software. - -4.3 Mere aggregation of another work not based on the Covered Code with the -Covered Code (or with a work based on the Covered Code) on a volume of a storage -or distribution medium does not bring the other work under the scope of this -License. If You deliver the Covered Code for combination and/or integration with -an application previously provided by You (for example, via automatic updating -technology), such combination and/or integration constitutes a Derivative Work -subject to the terms of this License. - -5. Exclusions From License Grant. Nothing in this License shall be deemed to -grant any rights to trademarks, copyrights, patents, trade secrets or any other -intellectual property of Licensor or any Contributor except as expressly stated -herein. No right is granted to the trademarks of Licensor or any Contributor -even if such marks are included in the Covered Code. Nothing in this License -shall be interpreted to prohibit Licensor from licensing under different terms -from this License any code that Licensor otherwise would have a right to -license. Modifications, Derivative Works and/or any use or combination of -Covered Code with other technology provided by Licensor or third parties may -require additional patent licenses from Licensor which Licensor may grant in its -sole discretion. No patent license is granted separate from the Original Code or -combinations of the Original Code with other software or hardware. - -5.1. Trademarks. This License does not grant any rights to use the trademarks or -trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any -trademark or trade name belonging to any Contributor. No Licensor Marks may be -used to endorse or promote products derived from the Original Code other than as -permitted by the Licensor Trademark Policy defined in Exhibit C. - -6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, -support, indemnity or liability obligations and/or other rights consistent with -the scope of the license granted herein ("Additional Terms") to one or more -recipients of Covered Code. However, You may do so only on Your own behalf and -as Your sole responsibility, and not on behalf of Licensor or any Contributor. -You must obtain the recipient's agreement that any such Additional Terms are -offered by You alone, and You hereby agree to indemnify, defend and hold -Licensor and every Contributor harmless for any liability incurred by or claims -asserted against Licensor or such Contributor by reason of any such Additional -Terms. - -7. Versions of the License. Licensor may publish revised and/or new versions of -this License from time to time. Each version will be given a distinguishing -version number. Once Original Code has been published under a particular version -of this License, You may continue to use it under the terms of that version. You -may also choose to use such Original Code under the terms of any subsequent -version of this License published by Licensor. No one other than Licensor has -the right to modify the terms applicable to Covered Code created under this -License. - -8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part -pre-release, untested, or not fully tested works. The Covered Code may contain -errors that could cause failures or loss of data, and may be incomplete or -contain inaccuracies. You expressly acknowledge and agree that use of the -Covered Code, or any portion thereof, is at Your sole and entire risk. THE -COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF -ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS -"LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY -DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF -SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET -ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH -CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE -COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR -REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR -ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR -WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR -AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You -acknowledge that the Covered Code is not intended for use in high risk -activities, including, but not limited to, the design, construction, operation -or maintenance of nuclear facilities, aircraft navigation, aircraft -communication systems, or air traffic control machines in which case the failure -of the Covered Code could lead to death, personal injury, or severe physical or -environmental damage. Licensor disclaims any express or implied warranty of -fitness for such uses. - -9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT -SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR -YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER -UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT -LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH -CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND -NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME -JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR -CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event -shall Licensor's total liability to You for all damages (other than as may be -required by applicable law) under this License exceed the amount of ten dollars -($10.00). - -10. Ownership. Subject to the licenses granted under this License, each -Contributor retains all rights, title and interest in and to any Modifications -made by such Contributor. Licensor retains all rights, title and interest in and -to the Original Code and any Modifications made by or on behalf of Licensor -("Licensor Modifications"), and such Licensor Modifications will not be -automatically subject to this License. Licensor may, at its sole discretion, -choose to license such Licensor Modifications under this License, or on -different terms from those contained in this License or may choose not to -license them at all. - -11. Termination. - -11.1 Term and Termination. The term of this License is perpetual unless -terminated as provided below. This License and the rights granted hereunder will -terminate: - -(a) automatically without notice from Licensor if You fail to comply with any -term(s) of this License and fail to cure such breach within 30 days of becoming -aware of such breach; - -(b) immediately in the event of the circumstances described in Section 12.5(b); -or - -(c) automatically without notice from Licensor if You, at any time during the -term of this License, commence an action for patent infringement against -Licensor (including by cross-claim or counter claim in a lawsuit); - -(d) upon written notice from Licensor if You, at any time during the term of -this License, commence an action for patent infringement against any third party -alleging that the Covered Code itself (excluding combinations with other -software or hardware) infringes any patent (including by cross-claim or counter -claim in a lawsuit). - -11.2 Effect of Termination. Upon termination, You agree to immediately stop any -further use, reproduction, modification, sublicensing and distribution of the -Covered Code and to destroy all copies of the Covered Code that are in your -possession or control. All sublicenses to the Covered Code which have been -properly granted prior to termination shall survive any termination of this -License. Provisions which, by their nature, should remain in effect beyond the -termination of this License shall survive, including but not limited to Sections -3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for -compensation, indemnity or damages of any sort solely as a result of terminating -this License in accordance with its terms, and termination of this License will -be without prejudice to any other right or remedy of any party. - -12. Miscellaneous. - -12.1 Government End Users. The Covered Code is a "commercial item" as defined in -FAR 2.101. Government software and technical data rights in the Covered Code -include only those rights customarily provided to the public as defined in this -License. This customary commercial license in technical data and software is -provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer -Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical -Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software -or Computer Software Documentation). Accordingly, all U.S. Government End Users -acquire Covered Code with only those rights set forth herein. - -12.2 Relationship of Parties. This License will not be construed as creating an -agency, partnership, joint venture or any other form of legal association -between or among You, Licensor or any Contributor, and You will not represent to -the contrary, whether expressly, by implication, appearance or otherwise. - -12.3 Independent Development. Nothing in this License will impair Licensor's -right to acquire, license, develop, have others develop for it, market and/or -distribute technology or products that perform the same or similar functions as, -or otherwise compete with, Modifications, Derivative Works, technology or -products that You may develop, produce, market or distribute. - -12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any -provision of this License will not be deemed a waiver of future enforcement of -that or any other provision. Any law or regulation which provides that the -language of a contract shall be construed against the drafter will not apply to -this License. - -12.5 Severability. (a) If for any reason a court of competent jurisdiction finds -any provision of this License, or portion thereof, to be unenforceable, that -provision of the License will be enforced to the maximum extent permissible so -as to effect the economic benefits and intent of the parties, and the remainder -of this License will continue in full force and effect. (b) Notwithstanding the -foregoing, if applicable law prohibits or restricts You from fully and/or -specifically complying with Sections 2 and/or 3 or prevents the enforceability -of either of those Sections, this License will immediately terminate and You -must immediately discontinue any use of the Covered Code and destroy all copies -of it that are in your possession or control. - -12.6 Dispute Resolution. Any litigation or other dispute resolution between You -and Licensor relating to this License shall take place in the Seattle, -Washington, and You and Licensor hereby consent to the personal jurisdiction of, -and venue in, the state and federal courts within that District with respect to -this License. The application of the United Nations Convention on Contracts for -the International Sale of Goods is expressly excluded. - -12.7 Export/Import Laws. This software is subject to all export and import laws -and restrictions and regulations of the country in which you receive the Covered -Code and You are solely responsible for ensuring that You do not export, -re-export or import the Covered Code or any direct product thereof in violation -of any such restrictions, laws or regulations, or without all necessary -authorizations. - -12.8 Entire Agreement; Governing Law. This License constitutes the entire -agreement between the parties with respect to the subject matter hereof. This -License shall be governed by the laws of the United States and the State of -Washington. - -Where You are located in the province of Quebec, Canada, the following clause -applies: The parties hereby confirm that they have requested that this License -and all related documents be drafted in English. Les parties ont exigé -que le présent contrat et tous les documents connexes soient -rédigés en anglais. - - EXHIBIT A. - -"Copyright © 1995-2002 -RealNetworks, Inc. and/or its licensors. All Rights Reserved. - -The contents of this file, and the files included with this file, are subject to -the current version of the RealNetworks Public Source License Version 1.0 (the -"RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have -licensed the file under the RealNetworks Community Source License Version 1.0 -(the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which -case the RCSL will apply. You may also obtain the license terms directly from -RealNetworks. You may not use this file except in compliance with the RPSL or, -if you have a valid RCSL with RealNetworks applicable to this file, the RCSL. -Please see the applicable RPSL or RCSL for the rights, obligations and -limitations governing use of the contents of the file. - -This file is part of the Helix DNA Technology. RealNetworks is the developer of -the Original code and owns the copyrights in the portions it created. - -This file, and the files included with this file, is distributed and made -available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR -IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING -WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): ____________________________________ - -Technology Compatibility Kit Test -Suite(s) Location (if licensed under the RCSL): ______________________________ - -Object Code Notice: Helix DNA Client technology included. Copyright (c) -RealNetworks, Inc., 1995-2002. All rights reserved. - - - EXHIBIT B - -Compatible Source Licenses for the RealNetworks Public Source License. The -following list applies to the most recent version of the license as of October -25, 2002, unless otherwise indicated. - -* Academic Free License -* Apache Software License -* Apple Public Source License -* Artistic license -* Attribution Assurance Licenses -* BSD license -* Common Public License (1) -* Eiffel Forum License -* GNU General Public License (GPL) (1) -* GNU Library or "Lesser" General Public License (LGPL) (1) -* IBM Public License -* Intel Open Source License -* Jabber Open Source License -* MIT license -* MITRE Collaborative Virtual Workspace License (CVW License) -* Motosoto License -* Mozilla Public License 1.0 (MPL) -* Mozilla Public License 1.1 (MPL) -* Nokia Open Source License -* Open Group Test Suite License -* Python Software Foundation License -* Ricoh Source Code Public License -* Sun Industry Standards Source License (SISSL) -* Sun Public License -* University of Illinois/NCSA Open Source License -* Vovida Software License v. 1.0 -* W3C License -* X.Net License -* Zope Public License -* zlib/libpng license - -(1) Note: because this license contains certain reciprocal licensing terms that -purport to extend to independently developed code, You may be prohibited under -the terms of this otherwise compatible license from using code licensed under -its terms with Covered Code because Covered Code may only be licensed under the -RealNetworks Public Source License. Any attempt to apply non RPSL license terms, -including without limitation the GPL, to Covered Code is expressly forbidden. -You are responsible for ensuring that Your use of Compatible Source Licensed -code does not violate either the RPSL or the Compatible Source License. - -The latest version of this list can be found at: -https://www.helixcommunity.org/content/complicense - - EXHIBIT C - -RealNetworks' Trademark policy. - -RealNetworks defines the following trademarks collectively as "Licensor -Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem", -"RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other -trademarks or trade names belonging to RealNetworks. - -RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks -except as permitted by and in strict compliance at all times with RealNetworks' -third party trademark usage guidelines which are posted at -http://www.realnetworks.com/info/helixlogo.html. - diff --git a/bsp/stm32_radio/mp3/pub/mp3common.h b/bsp/stm32_radio/mp3/pub/mp3common.h deleted file mode 100644 index ae3bfffb54..0000000000 --- a/bsp/stm32_radio/mp3/pub/mp3common.h +++ /dev/null @@ -1,123 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * mp3common.h - implementation-independent API's, datatypes, and definitions - **************************************************************************************/ - -#ifndef _MP3COMMON_H -#define _MP3COMMON_H - -#include "mp3dec.h" -#include "statname.h" /* do name-mangling for static linking */ - -#define MAX_SCFBD 4 /* max scalefactor bands per channel */ -#define NGRANS_MPEG1 2 -#define NGRANS_MPEG2 1 - -/* 11-bit syncword if MPEG 2.5 extensions are enabled */ -#define SYNCWORDH 0xff -#define SYNCWORDL 0xe0 - -/* 12-bit syncword if MPEG 1,2 only are supported - * #define SYNCWORDH 0xff - * #define SYNCWORDL 0xf0 - */ - -typedef struct _MP3DecInfo { - /* pointers to platform-specific data structures */ - void *FrameHeaderPS; - void *SideInfoPS; - void *ScaleFactorInfoPS; - void *HuffmanInfoPS; - void *DequantInfoPS; - void *IMDCTInfoPS; - void *SubbandInfoPS; - - /* buffer which must be large enough to hold largest possible main_data section */ - unsigned char mainBuf[MAINBUF_SIZE]; - - /* special info for "free" bitrate files */ - int freeBitrateFlag; - int freeBitrateSlots; - - /* user-accessible info */ - int bitrate; - int nChans; - int samprate; - int nGrans; /* granules per frame */ - int nGranSamps; /* samples per granule */ - int nSlots; - int layer; - MPEGVersion version; - - int mainDataBegin; - int mainDataBytes; - - int part23Length[MAX_NGRAN][MAX_NCHAN]; - -} MP3DecInfo; - -typedef struct _SFBandTable { - short l[23]; - short s[14]; -} SFBandTable; - -/* decoder functions which must be implemented for each platform */ -MP3DecInfo *AllocateBuffers(void); -void FreeBuffers(MP3DecInfo *mp3DecInfo); -int CheckPadBit(MP3DecInfo *mp3DecInfo); -int UnpackFrameHeader(MP3DecInfo *mp3DecInfo, unsigned char *buf); -int UnpackSideInfo(MP3DecInfo *mp3DecInfo, unsigned char *buf); -int DecodeHuffman(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int huffBlockBits, int gr, int ch); -int Dequantize(MP3DecInfo *mp3DecInfo, int gr); -int IMDCT(MP3DecInfo *mp3DecInfo, int gr, int ch); -int UnpackScaleFactors(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int bitsAvail, int gr, int ch); -int Subband(MP3DecInfo *mp3DecInfo, short *pcmBuf); - -/* mp3tabs.c - global ROM tables */ -extern const int samplerateTab[3][3]; -extern const short bitrateTab[3][3][15]; -extern const short samplesPerFrameTab[3][3]; -extern const short bitsPerSlotTab[3]; -extern const short sideBytesTab[3][2]; -extern const short slotTab[3][3][15]; -extern const SFBandTable sfBandTable[3][3]; - -#endif /* _MP3COMMON_H */ diff --git a/bsp/stm32_radio/mp3/pub/mp3dec.h b/bsp/stm32_radio/mp3/pub/mp3dec.h deleted file mode 100644 index 7262ab9dae..0000000000 --- a/bsp/stm32_radio/mp3/pub/mp3dec.h +++ /dev/null @@ -1,137 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * mp3dec.h - public C API for MP3 decoder - **************************************************************************************/ - -#ifndef _MP3DEC_H -#define _MP3DEC_H - -// Must be moved KJ -//#define __GNUC__ -#define ARM -#define ARM_ADS - -#if defined(_WIN32) && !defined(_WIN32_WCE) -# -#elif defined(_WIN32) && defined(_WIN32_WCE) && defined(ARM) -# -#elif defined(_WIN32) && defined(WINCE_EMULATOR) -# -#elif defined(ARM_ADS) -# -#elif defined(_SYMBIAN) && defined(__WINS__) /* Symbian emulator for Ix86 */ -# -#elif defined(__GNUC__) && defined(ARM) -# -#elif defined(__GNUC__) && defined(__i386__) -# -#elif defined(_OPENWAVE_SIMULATOR) || defined(_OPENWAVE_ARMULATOR) -# -#else -#error No platform defined. See valid options in mp3dec.h -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* determining MAINBUF_SIZE: - * max mainDataBegin = (2^9 - 1) bytes (since 9-bit offset) = 511 - * max nSlots (concatenated with mainDataBegin bytes from before) = 1440 - 9 - 4 + 1 = 1428 - * 511 + 1428 = 1939, round up to 1940 (4-byte align) - */ -#define MAINBUF_SIZE 1940 - -#define MAX_NGRAN 2 /* max granules */ -#define MAX_NCHAN 2 /* max channels */ -#define MAX_NSAMP 576 /* max samples per channel, per granule */ - -/* map to 0,1,2 to make table indexing easier */ -typedef enum { - MPEG1 = 0, - MPEG2 = 1, - MPEG25 = 2 -} MPEGVersion; - -typedef void *HMP3Decoder; - -enum { - ERR_MP3_NONE = 0, - ERR_MP3_INDATA_UNDERFLOW = -1, - ERR_MP3_MAINDATA_UNDERFLOW = -2, - ERR_MP3_FREE_BITRATE_SYNC = -3, - ERR_MP3_OUT_OF_MEMORY = -4, - ERR_MP3_NULL_POINTER = -5, - ERR_MP3_INVALID_FRAMEHEADER = -6, - ERR_MP3_INVALID_SIDEINFO = -7, - ERR_MP3_INVALID_SCALEFACT = -8, - ERR_MP3_INVALID_HUFFCODES = -9, - ERR_MP3_INVALID_DEQUANTIZE = -10, - ERR_MP3_INVALID_IMDCT = -11, - ERR_MP3_INVALID_SUBBAND = -12, - - ERR_UNKNOWN = -9999 -}; - -typedef struct _MP3FrameInfo { - int bitrate; - int nChans; - int samprate; - int bitsPerSample; - int outputSamps; - int layer; - int version; -} MP3FrameInfo; - -/* public API */ -HMP3Decoder MP3InitDecoder(void); -void MP3FreeDecoder(HMP3Decoder hMP3Decoder); -int MP3Decode(HMP3Decoder hMP3Decoder, unsigned char **inbuf, int *bytesLeft, short *outbuf, int useSize); - -void MP3GetLastFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo); -int MP3GetNextFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo, unsigned char *buf); -int MP3FindSyncWord(unsigned char *buf, int nBytes); - -#ifdef __cplusplus -} -#endif - -#endif /* _MP3DEC_H */ diff --git a/bsp/stm32_radio/mp3/pub/mp3dec.h.bak b/bsp/stm32_radio/mp3/pub/mp3dec.h.bak deleted file mode 100644 index 5cb099dd77..0000000000 --- a/bsp/stm32_radio/mp3/pub/mp3dec.h.bak +++ /dev/null @@ -1,133 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * mp3dec.h - public C API for MP3 decoder - **************************************************************************************/ - -#ifndef _MP3DEC_H -#define _MP3DEC_H - -#if defined(_WIN32) && !defined(_WIN32_WCE) -# -#elif defined(_WIN32) && defined(_WIN32_WCE) && defined(ARM) -# -#elif defined(_WIN32) && defined(WINCE_EMULATOR) -# -#elif defined(ARM_ADS) -# -#elif defined(_SYMBIAN) && defined(__WINS__) /* Symbian emulator for Ix86 */ -# -#elif defined(__GNUC__) && defined(ARM) -# -#elif defined(__GNUC__) && defined(__i386__) -# -#elif defined(_OPENWAVE_SIMULATOR) || defined(_OPENWAVE_ARMULATOR) -# -#else -// J.Sz. 21/04/2006 -#error No platform defined. See valid options in mp3dec.h -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* determining MAINBUF_SIZE: - * max mainDataBegin = (2^9 - 1) bytes (since 9-bit offset) = 511 - * max nSlots (concatenated with mainDataBegin bytes from before) = 1440 - 9 - 4 + 1 = 1428 - * 511 + 1428 = 1939, round up to 1940 (4-byte align) - */ -#define MAINBUF_SIZE 1940 - -#define MAX_NGRAN 2 /* max granules */ -#define MAX_NCHAN 2 /* max channels */ -#define MAX_NSAMP 576 /* max samples per channel, per granule */ - -/* map to 0,1,2 to make table indexing easier */ -typedef enum { - MPEG1 = 0, - MPEG2 = 1, - MPEG25 = 2 -} MPEGVersion; - -typedef void *HMP3Decoder; - -enum { - ERR_MP3_NONE = 0, - ERR_MP3_INDATA_UNDERFLOW = -1, - ERR_MP3_MAINDATA_UNDERFLOW = -2, - ERR_MP3_FREE_BITRATE_SYNC = -3, - ERR_MP3_OUT_OF_MEMORY = -4, - ERR_MP3_NULL_POINTER = -5, - ERR_MP3_INVALID_FRAMEHEADER = -6, - ERR_MP3_INVALID_SIDEINFO = -7, - ERR_MP3_INVALID_SCALEFACT = -8, - ERR_MP3_INVALID_HUFFCODES = -9, - ERR_MP3_INVALID_DEQUANTIZE = -10, - ERR_MP3_INVALID_IMDCT = -11, - ERR_MP3_INVALID_SUBBAND = -12, - - ERR_UNKNOWN = -9999 -}; - -typedef struct _MP3FrameInfo { - int bitrate; - int nChans; - int samprate; - int bitsPerSample; - int outputSamps; - int layer; - int version; -} MP3FrameInfo; - -/* public API */ -HMP3Decoder MP3InitDecoder(void); -void MP3FreeDecoder(HMP3Decoder hMP3Decoder); -int MP3Decode(HMP3Decoder hMP3Decoder, unsigned char **inbuf, int *bytesLeft, short *outbuf, int useSize); - -void MP3GetLastFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo); -int MP3GetNextFrameInfo(HMP3Decoder hMP3Decoder, MP3FrameInfo *mp3FrameInfo, unsigned char *buf); -int MP3FindSyncWord(unsigned char *buf, int nBytes); - -#ifdef __cplusplus -} -#endif - -#endif /* _MP3DEC_H */ diff --git a/bsp/stm32_radio/mp3/pub/mpadecobjfixpt.h b/bsp/stm32_radio/mp3/pub/mpadecobjfixpt.h deleted file mode 100644 index a8a5c40fea..0000000000 --- a/bsp/stm32_radio/mp3/pub/mpadecobjfixpt.h +++ /dev/null @@ -1,108 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef _MPADECOBJFIXPT_H_ -#define _MPADECOBJFIXPT_H_ - -#include "mp3dec.h" /* public C API for new MP3 decoder */ - -class CMpaDecObj -{ -public: - CMpaDecObj(); - ~CMpaDecObj(); - - /////////////////////////////////////////////////////////////////////////// - // Function: Init_n - // Purpose: Initialize the mp3 decoder. - // Parameters: pSync a pointer to a syncword - // ulSize the size of the buffer pSync points to - // bUseSize this tells the decoder to use the input frame - // size on the decode instead of calculating - // the frame size. This is necessary when - // our formatted mp3 data (main_data_begin always - // equal to 0). - // - // Returns: returns 1 on success, 0 on failure - /////////////////////////////////////////////////////////////////////////// - int Init_n(unsigned char *pSync, - unsigned long ulSize, - unsigned char bUseSize=0); - - /////////////////////////////////////////////////////////////////////////// - // Function: DecodeFrame_v - // Purpose: Decodes one mp3 frame - // Parameters: pSource pointer to an mp3 frame (at a syncword) - // pulSize size of the buffer pSource points to. It will - // contain the number of mp3 bytes decoded upon - // return. - // pPCM pointer to a buffer to decode into - // pulPCMSize size of the PCM buffer. It will contain the - // number of PCM bytes prodced upon return. - /////////////////////////////////////////////////////////////////////////// - void DecodeFrame_v(unsigned char *pSource, - unsigned long *pulSize, - unsigned char *pPCM, - unsigned long *pulPCMSize); - - // overloaded new version that returns error code in errCode - void DecodeFrame_v(unsigned char *pSource, - unsigned long *pulSize, - unsigned char *pPCM, - unsigned long *pulPCMSize, - int *errCode); - - void GetPCMInfo_v(unsigned long &ulSampRate, - int &nChannels, - int &nBitsPerSample); - - // return number of samples per frame, PER CHANNEL (renderer multiplies this result by nChannels) - int GetSamplesPerFrame_n(); - - void SetTrustPackets(unsigned char bTrust) { m_bTrustPackets = bTrust; } - -private: - void * m_pDec; // generic void ptr - - void * m_pDecL1; // not implemented (could use old Xing mpadecl1.cpp) - void * m_pDecL2; // not implemented (could use old Xing mpadecl2.cpp) - HMP3Decoder m_pDecL3; - - MP3FrameInfo m_lastMP3FrameInfo; - unsigned char m_bUseFrameSize; - unsigned char m_bTrustPackets; -}; - -#endif /* _MPADECOBJFIXPT_H_ */ diff --git a/bsp/stm32_radio/mp3/pub/statname.h b/bsp/stm32_radio/mp3/pub/statname.h deleted file mode 100644 index 518e4c73f9..0000000000 --- a/bsp/stm32_radio/mp3/pub/statname.h +++ /dev/null @@ -1,88 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * statname.h - name mangling macros for static linking - **************************************************************************************/ - -#ifndef _STATNAME_H -#define _STATNAME_H - -/* define STAT_PREFIX to a unique name for static linking - * all the C functions and global variables will be mangled by the preprocessor - * e.g. void FFT(int *fftbuf) becomes void cook_FFT(int *fftbuf) - */ -#define STAT_PREFIX xmp3 - -#define STATCC1(x,y,z) STATCC2(x,y,z) -#define STATCC2(x,y,z) x##y##z - -#ifdef STAT_PREFIX -#define STATNAME(func) STATCC1(STAT_PREFIX, _, func) -#else -#define STATNAME(func) func -#endif - -/* these symbols are common to all implementations */ -#define CheckPadBit STATNAME(CheckPadBit) -#define UnpackFrameHeader STATNAME(UnpackFrameHeader) -#define UnpackSideInfo STATNAME(UnpackSideInfo) -#define AllocateBuffers STATNAME(AllocateBuffers) -#define FreeBuffers STATNAME(FreeBuffers) -#define DecodeHuffman STATNAME(DecodeHuffman) -#define Dequantize STATNAME(Dequantize) -#define IMDCT STATNAME(IMDCT) -#define UnpackScaleFactors STATNAME(UnpackScaleFactors) -#define Subband STATNAME(Subband) - -#define samplerateTab STATNAME(samplerateTab) -#define bitrateTab STATNAME(bitrateTab) -#define samplesPerFrameTab STATNAME(samplesPerFrameTab) -#define bitsPerSlotTab STATNAME(bitsPerSlotTab) -#define sideBytesTab STATNAME(sideBytesTab) -#define slotTab STATNAME(slotTab) -#define sfBandTable STATNAME(sfBandTable) - -/* in your implementation's top-level include file (e.g. real\coder.h) you should - * add new #define sym STATNAME(sym) lines for all the - * additional global functions or variables which your - * implementation uses - */ - -#endif /* _STATNAME_H */ diff --git a/bsp/stm32_radio/mp3/real/LICENSE.txt b/bsp/stm32_radio/mp3/real/LICENSE.txt deleted file mode 100644 index 12e5372a9f..0000000000 --- a/bsp/stm32_radio/mp3/real/LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ - Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. - - The contents of this directory, and (except where otherwise - indicated) the directories included within this directory, are - subject to the current version of the RealNetworks Public Source - License (the "RPSL") available at RPSL.txt in this directory, unless - you have licensed the directory under the current version of the - RealNetworks Community Source License (the "RCSL") available at - RCSL.txt in this directory, in which case the RCSL will apply. You - may also obtain the license terms directly from RealNetworks. You - may not use the files in this directory except in compliance with the - RPSL or, if you have a valid RCSL with RealNetworks applicable to - this directory, the RCSL. Please see the applicable RPSL or RCSL for - the rights, obligations and limitations governing use of the contents - of the directory. - - This directory is part of the Helix DNA Technology. RealNetworks is - the developer of the Original Code and owns the copyrights in the - portions it created. - - This directory, and the directories included with this directory, are - distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY - OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY - DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - QUIET ENJOYMENT OR NON-INFRINGEMENT. - - Technology Compatibility Kit Test Suite(s) Location: - http://www.helixcommunity.org/content/tck - diff --git a/bsp/stm32_radio/mp3/real/RCSL.txt b/bsp/stm32_radio/mp3/real/RCSL.txt deleted file mode 100644 index a809759a32..0000000000 --- a/bsp/stm32_radio/mp3/real/RCSL.txt +++ /dev/null @@ -1,948 +0,0 @@ -The RCSL is made up of a base agreement and a few Attachments. - -For Research and Development use, you agree to the terms of the -RCSL R&D License (base RCSL and Attachments A, B, and C) - -For Commercial Use (either distribution or internal commercial -deployment) of the Helix DNA with or without support for RealNetworks' -RealAudio and RealVideo Add-on Technology, you agree to the -terms of the same RCSL R&D license -and execute one or more additional Commercial Use License attachments -. - ------------------------------------------------------------------------- - - - REALNETWORKS COMMUNITY SOURCE LICENSE - -Version 1.2 (Rev. Date: January 22, 2003). - - - RECITALS - -Original Contributor has developed Specifications, Source Code -implementations and Executables of certain Technology; and - -Original Contributor desires to license the Technology to a large -community to facilitate research, innovation and product development -while maintaining compatibility of such products with the Technology as -delivered by Original Contributor; and - -Original Contributor desires to license certain Trademarks for the -purpose of branding products that are compatible with the relevant -Technology delivered by Original Contributor; and - -You desire to license the Technology and possibly certain Trademarks -from Original Contributor on the terms and conditions specified in this -License. - -In consideration for the mutual covenants contained herein, You and -Original Contributor agree as follows: - - - AGREEMENT - -*1. Introduction.* - -The RealNetworks Community Source License ("RCSL") and effective -attachments ("License") may include five distinct licenses: - -i) Research Use license -- License plus Attachments A, B and C only. - -ii) Commercial Use and Trademark License, which may be for Internal -Deployment Use or external distribution, or both -- License plus -Attachments A, B, C, and D. - -iii) Technology Compatibility Kit (TCK) license -- Attachment C. - -iv) Add-On Technology License (Executable) Commercial Use License --Attachment F. - -v) Add-On Technology Source Code Porting and Optimization -License-Attachment G. - -The Research Use license is effective when You click and accept this -License. The TCK is effective when You click and accept this License, -unless otherwise specified in the TCK attachments. The Commercial Use -and Trademark, Add-On Technology License, and the Add-On Technology -Source Code Porting and Optimization licenses must each be signed by You -and Original Contributor to become effective. Once effective, these -licenses and the associated requirements and responsibilities are -cumulative. Capitalized terms used in this License are defined in the -Glossary. - -*2. License Grants.* - -2.1 Original Contributor Grant. - -Subject to Your compliance with Sections 3, 8.10 and Attachment A of -this License, Original Contributor grants to You a worldwide, -royalty-free, non-exclusive license, to the extent of Original -Contributor's Intellectual Property Rights covering the Original Code, -Upgraded Code and Specifications, to do the following: - -(a) Research Use License: - -(i) use, reproduce and modify the Original Code, Upgraded Code and -Specifications to create Modifications and Reformatted Specifications -for Research Use by You; - -(ii) publish and display Original Code, Upgraded Code and Specifications -with, or as part of Modifications, as permitted under Section 3.1(b) below; - -(iii) reproduce and distribute copies of Original Code and Upgraded Code -to Licensees and students for Research Use by You; - -(iv) compile, reproduce and distribute Original Code and Upgraded Code -in Executable form, and Reformatted Specifications to anyone for -Research Use by You. - -(b) Other than the licenses expressly granted in this License, Original -Contributor retains all right, title, and interest in Original Code and -Upgraded Code and Specifications. - -2.2 Your Grants. - -(a) To Other Licensees. You hereby grant to each Licensee a license to -Your Error Corrections and Shared Modifications, of the same scope and -extent as Original Contributor's licenses under Section 2.1 a) above -relative to Research Use and Attachment D relative to Commercial Use. - -(b) To Original Contributor. You hereby grant to Original Contributor a -worldwide, royalty-free, non-exclusive, perpetual and irrevocable -license, to the extent of Your Intellectual Property Rights covering -Your Error Corrections, Shared Modifications and Reformatted -Specifications, to use, reproduce, modify, display and distribute Your -Error Corrections, Shared Modifications and Reformatted Specifications, -in any form, including the right to sublicense such rights through -multiple tiers of distribution. - -(c) Other than the licenses expressly granted in Sections 2.2(a) and (b) -above, and the restrictions set forth in Section 3.1(d)(iv) below, You -retain all right, title, and interest in Your Error Corrections, Shared -Modifications and Reformatted Specifications. - -2.3 Contributor Modifications. - -You may use, reproduce, modify, display and distribute Contributor Error -Corrections, Shared Modifications and Reformatted Specifications, -obtained by You under this License, to the same scope and extent as with -Original Code, Upgraded Code and Specifications. - -2.4 Subcontracting. - -You may deliver the Source Code of Covered Code to other Licensees -having at least a Research Use license, for the sole purpose of -furnishing development services to You in connection with Your rights -granted in this License. All such Licensees must execute appropriate -documents with respect to such work consistent with the terms of this -License, and acknowledging their work-made-for-hire status or assigning -exclusive right to the work product and associated Intellectual Property -Rights to You. - -*3. Requirements and Responsibilities*. - -3.1 Research Use License. - -As a condition of exercising the rights granted under Section 2.1(a) -above, You agree to comply with the following: - -(a) Your Contribution to the Community. All Error Corrections and Shared -Modifications which You create or contribute to are automatically -subject to the licenses granted under Section 2.2 above. You are -encouraged to license all of Your other Modifications under Section 2.2 -as Shared Modifications, but are not required to do so. You agree to -notify Original Contributor of any errors in the Specification. - -(b) Source Code Availability. You agree to provide all Your Error -Corrections to Original Contributor as soon as reasonably practicable -and, in any event, prior to Internal Deployment Use or Commercial Use, -if applicable. Original Contributor may, at its discretion, post Source -Code for Your Error Corrections and Shared Modifications on the -Community Webserver. You may also post Error Corrections and Shared -Modifications on a web-server of Your choice; provided, that You must -take reasonable precautions to ensure that only Licensees have access to -such Error Corrections and Shared Modifications. Such precautions shall -include, without limitation, a password protection scheme limited to -Licensees and a click-on, download certification of Licensee status -required of those attempting to download from the server. An example of -an acceptable certification is attached as Attachment A-2. - -(c) Notices. All Error Corrections and Shared Modifications You create -or contribute to must include a file documenting the additions and -changes You made and the date of such additions and changes. You must -also include the notice set forth in Attachment A-1 in the file header. -If it is not possible to put the notice in a particular Source Code file -due to its structure, then You must include the notice in a location -(such as a relevant directory file), where a recipient would be most -likely to look for such a notice. - -(d) Redistribution. - -(i) Source. Covered Code may be distributed in Source Code form only to -another Licensee (except for students as provided below). You may not -offer or impose any terms on any Covered Code that alter the rights, -requirements, or responsibilities of such Licensee. You may distribute -Covered Code to students for use in connection with their course work -and research projects undertaken at accredited educational institutions. -Such students need not be Licensees, but must be given a copy of the -notice set forth in Attachment A-3 and such notice must also be included -in a file header or prominent location in the Source Code made available -to such students. - -(ii) Executable. You may distribute Executable version(s) of Covered -Code to Licensees and other third parties only for the purpose of -evaluation and comment in connection with Research Use by You and under -a license of Your choice, but which limits use of such Executable -version(s) of Covered Code only to that purpose. - -(iii) Modified Class, Interface and Package Naming. In connection with -Research Use by You only, You may use Original Contributor's class, -Interface and package names only to accurately reference or invoke the -Source Code files You modify. Original Contributor grants to You a -limited license to the extent necessary for such purposes. - -(iv) You expressly agree that any distribution, in whole or in part, of -Modifications developed by You shall only be done pursuant to the terms -and conditions of this License. - -(e) Extensions. - -(i) Covered Code. You may not include any Source Code of Community Code -in any Extensions. You may include the compiled Header Files of -Community Code in an Extension provided that Your use of the Covered -Code, including Heading Files, complies with the Commercial Use License, -the TCK and all other terms of this License. - -(ii) Publication. No later than the date on which You first distribute -such Extension for Commercial Use, You must publish to the industry, on -a non-confidential basis and free of all copyright restrictions with -respect to reproduction and use, an accurate and current specification -for any Extension. In addition, You must make available an appropriate -test suite, pursuant to the same rights as the specification, -sufficiently detailed to allow any third party reasonably skilled in the -technology to produce implementations of the Extension compatible with -the specification. Such test suites must be made available as soon as -reasonably practicable but, in no event, later than ninety (90) days -after Your first Commercial Use of the Extension. You must use -reasonable efforts to promptly clarify and correct the specification and -the test suite upon written request by Original Contributor. - -(iii) Open. You agree to refrain from enforcing any Intellectual -Property Rights You may have covering any interface(s) of Your -Extension, which would prevent the implementation of such interface(s) -by Original Contributor or any Licensee. This obligation does not -prevent You from enforcing any Intellectual Property Right You have that -would otherwise be infringed by an implementation of Your Extension. - -(iv) Interface Modifications and Naming. You may not modify or add to -the GUID space * * "xxxxxxxx-0901-11d1-8B06-00A024406D59" or any other -GUID space designated by Original Contributor. You may not modify any -Interface prefix provided with the Covered Code or any other prefix -designated by Original Contributor.* * - -* * - -(f) You agree that any Specifications provided to You by Original -Contributor are confidential and proprietary information of Original -Contributor. You must maintain the confidentiality of the Specifications -and may not disclose them to any third party without Original -Contributor's prior written consent. You may only use the Specifications -under the terms of this License and only for the purpose of implementing -the terms of this License with respect to Covered Code. You agree not -use, copy or distribute any such Specifications except as provided in -writing by Original Contributor. - -3.2 Commercial Use License. - -You may not make Commercial Use of any Covered Code unless You and -Original Contributor have executed a copy of the Commercial Use and -Trademark License attached as Attachment D. - -*4. Versions of the License.* - -4.1 License Versions. - -Original Contributor may publish revised versions of the License from -time to time. Each version will be given a distinguishing version number. - -4.2 Effect. - -Once a particular version of Covered Code has been provided under a -version of the License, You may always continue to use such Covered Code -under the terms of that version of the License. You may also choose to -use such Covered Code under the terms of any subsequent version of the -License. No one other than Original Contributor has the right to -promulgate License versions. - -4.3 Multiple-Licensed Code. - -Original Contributor may designate portions of the Covered Code as -"Multiple-Licensed." "Multiple-Licensed" means that the Original -Contributor permits You to utilize those designated portions of the -Covered Code under Your choice of this License or the alternative -license(s), if any, specified by the Original Contributor in an -Attachment to this License. - -*5. Disclaimer of Warranty.* - -5.1 COVERED CODE PROVIDED AS IS. - -COVERED CODE IS PROVIDED UNDER THIS LICENSE "AS IS," WITHOUT WARRANTY OF -ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, -WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT -FOR A PARTICULAR PURPOSE OR NON-INFRINGING. YOU AGREE TO BEAR THE ENTIRE -RISK IN CONNECTION WITH YOUR USE AND DISTRIBUTION OF COVERED CODE UNDER -THIS LICENSE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART -OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER -EXCEPT SUBJECT TO THIS DISCLAIMER. - -5.2 Not Designed for High Risk Activities. - -You acknowledge that Original Code, Upgraded Code and Specifications are -not designed or intended for use in high risk activities including, but -not limited to: (i) on-line control of aircraft, air traffic, aircraft -navigation or aircraft communications; or (ii) in the design, -construction, operation or maintenance of any nuclear facility. Original -Contributor disclaims any express or implied warranty of fitness for -such uses. - -*6. Termination.* - -6.1 By You. - -You may terminate this Research Use license at anytime by providing -written notice to Original Contributor. - -6.2 By Original Contributor. - -This License and the rights granted hereunder will terminate: - -(i) automatically if You fail to comply with the terms of this License -and fail to cure such breach within 30 days of receipt of written notice -of the breach; - -(ii) immediately in the event of circumstances specified in Sections 7.1 -and 8.4; or - -(iii) at Original Contributor's discretion upon any action initiated by -You (including by cross-claim or counter claim) alleging that use or -distribution by Original Contributor or any Licensee, of Original Code, -Upgraded Code, Error Corrections, Shared Modifications or Specifications -infringe a patent owned or controlled by You. - -6.3 Effective of Termination. - -Upon termination, You agree to discontinue use of and destroy all copies -of Covered Code in Your possession. All sublicenses to the Covered Code -which You have properly granted shall survive any termination of this -License. Provisions that, by their nature, should remain in effect -beyond the termination of this License shall survive including, without -limitation, Sections 2.2, 3, 5, 7 and 8. - -6.4 No Compensation. - -Each party waives and releases the other from any claim to compensation -or indemnity for permitted or lawful termination of the business -relationship established by this License. - -*7. Liability.* - -7.1 Infringement. Should any of the Original Code, Upgraded Code, TCK or -Specifications ("Materials") become the subject of a claim of -infringement, Original Contributor may, at its sole option, (i) attempt -to procure the rights necessary for You to continue using the Materials, -(ii) modify the Materials so that they are no longer infringing, or -(iii) terminate Your right to use the Materials, immediately upon -written notice, and refund to You the amount, if any, having then -actually been paid by You to Original Contributor for the Original Code, -Upgraded Code and TCK, depreciated on a straight line, five year basis. - -7.2 LIMITATION OF LIABILITY. TO THE FULL EXTENT ALLOWED BY APPLICABLE -LAW, ORIGINAL CONTRIBUTOR'S LIABILITY TO YOU FOR CLAIMS RELATING TO THIS -LICENSE, WHETHER FOR BREACH OR IN TORT, SHALL BE LIMITED TO ONE HUNDRED -PERCENT (100%) OF THE AMOUNT HAVING THEN ACTUALLY BEEN PAID BY YOU TO -ORIGINAL CONTRIBUTOR FOR ALL COPIES LICENSED HEREUNDER OF THE PARTICULAR -ITEMS GIVING RISE TO SUCH CLAIM, IF ANY, DURING THE TWELVE MONTHS -PRECEDING THE CLAIMED BREACH. IN NO EVENT WILL YOU (RELATIVE TO YOUR -SHARED MODIFICATIONS OR ERROR CORRECTIONS) OR ORIGINAL CONTRIBUTOR BE -LIABLE FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL -DAMAGES IN CONNECTION WITH OR RISING OUT OF THIS LICENSE (INCLUDING, -WITHOUT LIMITATION, LOSS OF PROFITS, USE, DATA, OR OTHER ECONOMIC -ADVANTAGE), HOWEVER IT ARISES AND ON ANY THEORY OF LIABILITY, WHETHER IN -AN ACTION FOR CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE) -OR OTHERWISE, WHETHER OR NOT YOU OR ORIGINAL CONTRIBUTOR HAS BEEN -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE AND NOTWITHSTANDING THE -FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. - -*8. Miscellaneous.* - -8.1 Trademark. - -You shall not use any Trademark unless You and Original Contributor -execute a copy of the Commercial Use and Trademark License Agreement -attached hereto as Attachment D. Except as expressly provided in the -License, You are granted no right, title or license to, or interest in, -any Trademarks. Whether or not You and Original Contributor enter into -the Trademark License, You agree not to (i) challenge Original -Contributor's ownership or use of Trademarks; (ii) attempt to register -any Trademarks, or any mark or logo substantially similar thereto; or -(iii) incorporate any Trademarks into Your own trademarks, product -names, service marks, company names, or domain names. - -8.2 Integration. - -This License represents the complete agreement concerning the subject -matter hereof. - -8.3 Assignment. - -Original Contributor may assign this License, and its rights and -obligations hereunder, in its sole discretion. You may assign the -Research Use portions of this License and the TCK license to a third -party upon prior written notice to Original Contributor (which may be -provided electronically via the Community Web-Server). You may not -assign the Commercial Use and Trademark license, the Add-On Technology -License, or the Add-On Technology Source Code Porting License, including -by way of merger (regardless of whether You are the surviving entity) or -acquisition, without Original Contributor's prior written consent. - -8.4 Severability. - -If any provision of this License is held to be unenforceable, such -provision shall be reformed only to the extent necessary to make it -enforceable. Notwithstanding the foregoing, if You are prohibited by law -from fully and specifically complying with Sections 2.2 or 3, this -License will immediately terminate and You must immediately discontinue -any use of Covered Code. - -8.5 Governing Law. - -This License shall be governed by the laws of the United States and the -State of Washington, as applied to contracts entered into and to be -performed in Washington between Washington residents. The application of -the United Nations Convention on Contracts for the International Sale of -Goods is expressly excluded. You agree that the state and federal courts -located in Seattle, Washington have exclusive jurisdiction over any -claim relating to the License, including contract and tort claims. - -8.6 Dispute Resolution. - -a) Arbitration. Any dispute arising out of or relating to this License -shall be finally settled by arbitration as set out herein, except that -either party may bring any action, in a court of competent jurisdiction -(which jurisdiction shall be exclusive), with respect to any dispute -relating to such party's Intellectual Property Rights or with respect to -Your compliance with the TCK license. Arbitration shall be administered: -(i) by the American Arbitration Association (AAA), (ii) in accordance -with the rules of the United Nations Commission on International Trade -Law (UNCITRAL) (the "Rules") in effect at the time of arbitration as -modified herein; and (iii) the arbitrator will apply the substantive -laws of Washington and the United States. Judgment upon the award -rendered by the arbitrator may be entered in any court having -jurisdiction to enforce such award. - -b) Arbitration language, venue and damages. All arbitration proceedings -shall be conducted in English by a single arbitrator selected in -accordance with the Rules, who must be fluent in English and be either a -retired judge or practicing attorney having at least ten (10) years -litigation experience and be reasonably familiar with the technology -matters relative to the dispute. Unless otherwise agreed, arbitration -venue shall be in Seattle, Washington. The arbitrator may award monetary -damages only and nothing shall preclude either party from seeking -provisional or emergency relief from a court of competent jurisdiction. -The arbitrator shall have no authority to award damages in excess of -those permitted in this License and any such award in excess is void. -All awards will be payable in U.S. dollars and may include, for the -prevailing party (i) pre-judgment award interest, (ii) reasonable -attorneys' fees incurred in connection with the arbitration, and (iii) -reasonable costs and expenses incurred in enforcing the award. The -arbitrator will order each party to produce identified documents and -respond to no more than twenty-five single question interrogatories. - -8.7 Construction. - -Any law or regulation, which provides that the language of a contract -shall be construed against the drafter, shall not apply to this License. - -8.8 U.S. Government End Users. - -The Covered Code is a "commercial item," as that term is defined in 48 -C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" -and "commercial computer software documentation," as such terms are used -in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and -48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government -End Users acquire Covered Code with only those rights set forth herein. -You agree to pass this notice to our licensees. - -8.9 Marketing Activities. - -Licensee hereby grants Original Contributor a non-exclusive, -non-transferable, limited license to use the Licensee's company name and -logo ("Licensee Marks") in any presentations, press releases, or -marketing materials solely for the purpose of identifying Licensee as a -member of the Helix Community. Licensee shall provide samples of -Licensee Marks to Original Contributor upon request by Original -Contributor. Original Contributor acknowledges that the Licensee Marks -are the trademarks of Licensee. Original Contributor shall not use the -Licensee Marks in a way that may imply that Original Contributor is an -agency or branch of Licensee. Original Contributor understands and -agrees that the use of any Licensee Marks in connection with this -Agreement shall not create any right, title or interest, in, or to the -Licensee Marks or any Licensee trademarks and that all such use and -goodwill associated with any such trademarks will inure to the benefit -of Licensee. Further the Original Contributor will stop usage of the -Licensee Marks upon Licensee's request. - -8.10 Press Announcements. - -You may make press announcements or other public statements regarding -this License without the prior written consent of the Original -Contributor, if Your statement is limited to announcing the licensing of -the Covered Code or the availability of Your Product and its -compatibility with the Covered Code. All other public announcements -regarding this license require the prior written consent of the Original -Contributor. Consent requests are welcome at press@helixcommunity.org. - -8.11 International Use. - -a) Export/Import laws. Covered Code is subject to U.S. export control -laws and may be subject to export or import regulations in other -countries. Each party agrees to comply strictly with all such laws and -regulations and acknowledges their responsibility to obtain such -licenses to export, re-export, or import as may be required. You agree -to pass these obligations to Your licensees. - -b) Intellectual Property Protection. Due to limited intellectual -property protection and enforcement in certain countries, You agree not -to redistribute the Original Code, Upgraded Code, TCK and Specifications -to any country on the list of restricted countries on the Community Web -Server. - -8.12 Language. - -This License is in the English language only, which language shall be -controlling in all respects, and all versions of this License in any -other language shall be for accommodation only and shall not be binding -on the parties to this License. All communications and notices made or -given pursuant to this License, and all documentation and support to be -provided, unless otherwise noted, shall be in the English language. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH REALNETWORKS, INC. IF YOU ARE AGREEING -TO THIS LICENSE ON BEHALF OF A COMPANY, YOU REPRESENT THAT YOU ARE -AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. WHETHER YOU ARE ACTING -ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, YOU MUST BE OF MAJORITY -AGE AND BE OTHERWISE COMPETENT TO ENTER INTO CONTRACTS. IF YOU DO NOT -MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY OF THE TERMS AND -CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON TO EXIT. - - - GLOSSARY - -1. *"Added Value"* means code which: - -(i) has a principal purpose which is substantially different from that -of the stand-alone Technology; - -(ii) represents a significant functional and value enhancement to the -Technology; - -(iii) operates in conjunction with the Technology; and - -(iv) is not marketed as a technology which replaces or substitutes for -the Technology - -2. "*Applicable Patent Rights*" mean: (a) in the case where Original -Contributor is the grantor of rights, claims of patents that (i) are now -or hereafter acquired, owned by or assigned to Original Contributor and -(ii) are necessarily infringed by using or making the Original Code or -Upgraded Code, including Modifications provided by Original Contributor, -alone and not in combination with other software or hardware; and (b) in -the case where Licensee is the grantor of rights, claims of patents that -(i) are now or hereafter acquired, owned by or assigned to Licensee and -(ii) are infringed (directly or indirectly) by using or making -Licensee's Modifications or Error Corrections, taken alone or in -combination with Covered Code. - -3. "*Application Programming Interfaces (APIs)"* means the interfaces, -associated header files, service provider interfaces, and protocols that -enable a device, application, Operating System, or other program to -obtain services from or make requests of (or provide services in -response to requests from) other programs, and to use, benefit from, or -rely on the resources, facilities, and capabilities of the relevant -programs using the APIs. APIs includes the technical documentation -describing the APIs, the Source Code constituting the API, and any -Header Files used with the APIs. - -4. "*Commercial Use*" means any use (internal or external), copying, -sublicensing or distribution (internal or external), directly or -indirectly of Covered Code by You other than Your Research Use of -Covered Code within Your business or organization or in conjunction with -other Licensees with equivalent Research Use rights. Commercial Use -includes any use of the Covered Code for direct or indirect commercial -or strategic gain, advantage or other business purpose. Any Commercial -Use requires execution of Attachment D by You and Original Contributor. - -5. "*Community Code*" means the Original Code, Upgraded Code, Error -Corrections, Shared Modifications, or any combination thereof. - -6. "*Community Webserver(s)"* means the webservers designated by -Original Contributor for access to the Original Code, Upgraded Code, TCK -and Specifications and for posting Error Corrections and Shared -Modifications. - -7. "*Compliant Covered Code*" means Covered Code that complies with the -requirements of the TCK. - -8. "*Contributor*" means each Licensee that creates or contributes to -the creation of any Error Correction or Shared Modification. - -9. "*Covered Code*" means the Original Code, Upgraded Code, -Modifications, or any combination thereof. - -10. "*Error Correction*" means any change made to Community Code which -conforms to the Specification and corrects the adverse effect of a -failure of Community Code to perform any function set forth in or -required by the Specifications. - -11. "*Executable*" means Covered Code that has been converted from -Source Code to the preferred form for execution by a computer or digital -processor (e.g. binary form). - -12. "*Extension(s)"* means any additional Interfaces developed by or for -You which: (i) are designed for use with the Technology; (ii) constitute -an API for a library of computing functions or services; and (iii) are -disclosed or otherwise made available to third party software developers -for the purpose of developing software which invokes such additional -Interfaces. The foregoing shall not apply to software developed by Your -subcontractors to be exclusively used by You. - -13. "*Header File(s)"* means that portion of the Source Code that -provides the names and types of member functions, data members, class -definitions, and interface definitions necessary to implement the APIs -for the Covered Code. Header Files include, files specifically -designated by Original Contributor as Header Files. Header Files do not -include the code necessary to implement the functionality underlying the -Interface. - -14. *"Helix DNA Server Technology"* means the program(s) that implement -the Helix Universal Server streaming engine for the Technology as -defined in the Specification. - -15. *"Helix DNA Client Technology"* means the Covered Code that -implements the RealOne Player engine as defined in the Specification. - -16. *"Helix DNA Producer Technology"* means the Covered Code that -implements the Helix Producer engine as defined in the Specification. - -17. *"Helix DNA Technology"* means the Helix DNA Server Technology, the -Helix DNA Client Technology, the Helix DNA Producer Technology and other -Helix technologies designated by Original Contributor. - -18. "*Intellectual Property Rights*" means worldwide statutory and -common law rights associated solely with (i) Applicable Patent Rights; -(ii) works of authorship including copyrights, copyright applications, -copyright registrations and "moral rights"; (iii) the protection of -trade and industrial secrets and confidential information; and (iv) -divisions, continuations, renewals, and re-issuances of the foregoing -now existing or acquired in the future. - -19. *"Interface*" means interfaces, functions, properties, class -definitions, APIs, Header Files, GUIDs, V-Tables, and/or protocols -allowing one piece of software, firmware or hardware to communicate or -interoperate with another piece of software, firmware or hardware. - -20. "*Internal Deployment Use*" means use of Compliant Covered Code -(excluding Research Use) within Your business or organization only by -Your employees and/or agents on behalf of Your business or organization, -but not to provide services, including content distribution, to third -parties, subject to execution of Attachment D by You and Original -Contributor, if required. - -21. "*Licensee*" means any party that has entered into and has in effect -a version of this License with Original Contributor. - -22. "*MIME type*" means a description of what type of media or other -content is in a file, including by way of example but not limited to -'audio/x-pn-realaudio-plugin.' - -23. "*Modification(s)"* means (i) any addition to, deletion from and/or -change to the substance and/or structure of the Covered Code, including -Interfaces; (ii) the combination of any Covered Code and any previous -Modifications; (iii) any new file or other representation of computer -program statements that contains any portion of Covered Code; and/or -(iv) any new Source Code implementing any portion of the Specifications. - -24. "*MP3 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Picture Experts Group known as MPEG-1 Audio Layer-3 or MP3, -including but not limited to all past and future versions, profiles, -extensions, parts and amendments relating to the MP3 specification. - -25. "*MPEG-4 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Pictures Experts Group known as MPEG-4, including but not -limited to all past and future versions, profiles, extensions, parts and -amendments relating to the MPEG-4 specification. - -26. "*Original Code*" means the initial Source Code for the Technology -as described on the Community Web Server. - -27. "*Original Contributor*" means RealNetworks, Inc., its affiliates -and its successors and assigns. - -28. "*Original Contributor MIME Type*" means the MIME registry, browser -preferences, or local file/protocol associations invoking any Helix DNA -Client-based application, including the RealOne Player, for playback of -RealAudio, RealVideo, other RealMedia MIME types or datatypes (e.g., -.ram, .rnx, .rpm, .ra, .rm, .rp, .rt, .rf, .prx, .mpe, .rmp, .rmj, .rav, -.rjs, .rmx, .rjt, .rms), and any other Original Contributor-specific or -proprietary MIME types that Original Contributor may introduce in the -future. - -29. "*Personal Use*" means use of Covered Code by an individual solely -for his or her personal, private and non-commercial purposes. An -individual's use of Covered Code in his or her capacity as an officer, -employee, member, independent contractor or agent of a corporation, -business or organization (commercial or non-commercial) does not qualify -as Personal Use. - -30. "*RealMedia File Format*" means the file format designed and -developed by RealNetworks for storing multimedia data and used to store -RealAudio and RealVideo encoded streams. Valid RealMedia File Format -extensions include: .rm, .rmj, .rmc, .rmvb, .rms. - -31. "*RCSL Webpage*" means the RealNetworks Community Source License -webpage located at https://www.helixcommunity.org/content/rcsl or such -other URL that Original Contributor may designate from time to time. - -32. "*Reformatted Specifications*" means any revision to the -Specifications which translates or reformats the Specifications (as for -example in connection with Your documentation) but which does not alter, -subset or superset * *the functional or operational aspects of the -Specifications. - -33. "*Research Use*" means use and distribution of Covered Code only for -Your Personal Use, research or development use and expressly excludes -Internal Deployment Use and Commercial Use. Research Use also includes -use of Covered Code to teach individuals how to use Covered Code. - -34. "*Shared Modifications*" means Modifications that You distribute or -use for a Commercial Use, in addition to any Modifications provided by -You, at Your option, pursuant to Section 2.2, or received by You from a -Contributor pursuant to Section 2.3. - -35. "*Source Code*" means the preferred form of the Covered Code for -making modifications to it, including all modules it contains, plus any -associated interface definition files, scripts used to control -compilation and installation of an Executable, or source code -differential comparisons against either the Original Code or another -well known, available Covered Code of the Contributor's choice. The -Source Code can be in a compressed or archival form, provided the -appropriate decompression or de-archiving software is widely available -for no charge. - -36. "*Specifications*" means the specifications for the Technology and -other documentation, as designated on the Community Web Server, as may -be revised by Original Contributor from time to time. - -37. "*Trademarks*" means Original Contributor's trademarks and logos, -including, but not limited to, RealNetworks, RealAudio, RealVideo, -RealOne, RealSystem, SureStream, Helix, Helix DNA and other trademarks -whether now used or adopted in the future. - -38. "*Technology*" means the technology described in Attachment B, and -Upgrades. - -39. "*Technology Compatibility Kit"* or *"TCK*" means the test programs, -procedures, acceptance criteria and/or other requirements, designated by -Original Contributor for use in verifying compliance of Covered Code -with the Specifications, in conjunction with the Original Code and -Upgraded Code. Original Contributor may, in its sole discretion and from -time to time, revise a TCK to correct errors and/or omissions and in -connection with Upgrades. - -40. "*Upgrade(s)"* means new versions of Technology designated -exclusively by Original Contributor as an "Upgrade" and released by -Original Contributor from time to time under the terms of the License. - -41. "*Upgraded Code*" means the Source Code and/or Executables for -Upgrades, possibly including Modifications made by Contributors. - -42. *"User's Guide"* means the users guide for the TCK which Original -Contributor makes available to You to provide direction in how to run -the TCK and properly interpret the results, as may be revised by -Original Contributor from time to time. - -43. "*You(r)*" means an individual, or a legal entity acting by and -through an individual or individuals, exercising rights either under -this License or under a future version of this License issued pursuant -to Section 4.1. For legal entities, "You(r)" includes any entity that by -majority voting interest controls, is controlled by, or is under common -control with You. - -44. "*Your Products*" means any (i) hardware products You distribute -integrating the Covered Code; (ii) any software products You distribute -with the Covered Code that utilize the APIs of the Covered Code; or -(iii) any services You provide using the Covered Code. - - - ATTACHMENT A - -REQUIRED NOTICES - - - ATTACHMENT A-1 - -REQUIRED IN ALL CASES - -Notice to be included in header file of all Error Corrections and Shared -Modifications: - -Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved. - -The contents of this file, and the files included with this file, are -subject to the current version of RealNetworks Community Source License -Version 1.1 (the "License"). You may not use this file except in -compliance with the License executed by both You and RealNetworks. You -may obtain a copy of the License at * -https://www.helixcommunity.org/content/rcsl.* You may also obtain a copy -of the License by contacting RealNetworks directly. Please see the -License for the rights, obligations and limitations governing use of the -contents of the file. - -This file is part of the Helix DNA technology. RealNetworks, Inc., is -the developer of the Original code and owns the copyrights in the -portions it created. - -This file, and the files included with this file, are distributed on an -'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, -AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT -LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): - -_______________________________________________ - -Technology Compatibility Kit Test Suite(s) Location: - -________________________________ - - - ATTACHMENT A-2 - -SAMPLE LICENSEE CERTIFICATION - -"By clicking the `Agree' button below, You certify that You are a -Licensee in good standing under the RealNetworks Community Source -License, ("License") and that Your access, use and distribution of code -and information You may obtain at this site is subject to the License. -If You are not a Licensee under the RealNetworks Community Source -License You agree not to download, copy or use the Helix DNA technology. - - - ATTACHMENT A-3 - -REQUIRED STUDENT NOTIFICATION - -"This software and related documentation has been obtained by Your -educational institution subject to the RealNetworks Community Source -License. You have been provided access to the software and related -documentation for use only in connection with your course work and -research activities as a matriculated student of Your educational -institution. Any other use is expressly prohibited. - -THIS SOFTWARE AND RELATED DOCUMENTATION CONTAINS PROPRIETARY MATERIAL OF -REALNETWORKS, INC, WHICH ARE PROTECTED BY VARIOUS INTELLECTUAL PROPERTY -RIGHTS. - -You may not use this file except in compliance with the License. You may -obtain a copy of the License on the web at -https://www.helixcommunity.org/content/rcsl. - -* -* - - - ATTACHMENT B - -Description of Technology - -Helix DNA, which consists of Helix DNA Client, Helix DNA Server and -Helix DNA Producer. - -Description of "Technology" - -Helix DNA Technology v1.0 as described on the Community Web Server. - - - ATTACHMENT C - -TECHNOLOGY COMPATIBILITY KIT LICENSE - -The following license is effective for the *Helix DNA* Technology -Compatibility Kit - as described on the Community Web Server. The -Technology Compatibility Kit(s) for the Technology specified in -Attachment B may be accessed at the Community Web Server. - -1. TCK License. - -1.1 Grants to use TCK - -Subject to the terms and restrictions set forth below and the -RealNetworks Community Source License, and the Research Use license, -Original Contributor grants to You a worldwide, non-exclusive, -non-transferable license, to the extent of Original Contributor's -Intellectual Property Rights in the TCK (without the right to -sublicense), to use the TCK to develop and test Covered Code. - -1.2 TCK Use Restrictions. - -You are not authorized to create derivative works of the TCK or use the -TCK to test any implementation of the Specification that is not Covered -Code. You may not publish Your test results or make claims of -comparative compatibility with respect to other implementations of the -Specification. In consideration for the license grant in Section 1.1 -above You agree not to develop Your own tests that are intended to -validate conformation with the Specification. - -2. Test Results. - -You agree to provide to Original Contributor or the third party test -facility if applicable, Your test results that demonstrate that Covered -Code is Compliant Covered Code and that Original Contributor may publish -or otherwise distribute such test results. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH THE ORIGINAL CONTRIBUTOR, REALNETWORKS, -INC. IF YOU ARE AGREEING TO THIS LICENSE ON BEHALF OF A COMPANY, YOU -REPRESENT THAT YOU ARE AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. -WHETHER YOU ARE ACTING ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, -YOU MUST BE OF MAJORITY AGE AND BE OTHERWISE COMPETENT TO ENTER INTO -CONTRACTS. IF YOU DO NOT MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY -OF THE TERMS AND CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON -TO EXIT. - -*ACCEPT / REJECT -* - -* -* - -*To agree to the R&D/academic terms of this license, please register - on the site -- -you will then be given a chance to agree to the clickwrap RCSL - -R&D License - -and gain access to the RCSL-licensed source code. To build or deploy -commercial applications based on the RCSL, you will need to agree to the -Commercial Use license attachments -* - - - diff --git a/bsp/stm32_radio/mp3/real/RPSL.txt b/bsp/stm32_radio/mp3/real/RPSL.txt deleted file mode 100644 index d040a45205..0000000000 --- a/bsp/stm32_radio/mp3/real/RPSL.txt +++ /dev/null @@ -1,518 +0,0 @@ -RealNetworks Public Source License Version 1.0 -(Rev. Date October 28, 2002) - -1. General Definitions. This License applies to any program or other work which -RealNetworks, Inc., or any other entity that elects to use this license, -("Licensor") makes publicly available and which contains a notice placed by -Licensor identifying such program or work as "Original Code" and stating that it -is subject to the terms of this RealNetworks Public Source License version 1.0 -(or subsequent version thereof) ("License"). You are not required to accept this -License. However, nothing else grants You permission to use, copy, modify or -distribute the software or its derivative works. These actions are prohibited by -law if You do not accept this License. Therefore, by modifying, copying or -distributing the software (or any work based on the software), You indicate your -acceptance of this License to do so, and all its terms and conditions. In -addition, you agree to the terms of this License by clicking the Accept button -or downloading the software. As used in this License: - -1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the -grantor of rights, claims of patents that (i) are now or hereafter acquired, -owned by or assigned to Licensor and (ii) are necessarily infringed by using or -making the Original Code alone and not in combination with other software or -hardware; and (b) in the case where You are the grantor of rights, claims of -patents that (i) are now or hereafter acquired, owned by or assigned to You and -(ii) are infringed (directly or indirectly) by using or making Your -Modifications, taken alone or in combination with Original Code. - -1.2 "Compatible Source License" means any one of the licenses listed on Exhibit -B or at https://www.helixcommunity.org/content/complicense or other licenses -specifically identified by Licensor in writing. Notwithstanding any term to the -contrary in any Compatible Source License, any code covered by any Compatible -Source License that is used with Covered Code must be made readily available in -Source Code format for royalty-free use under the terms of the Compatible Source -License or this License. - -1.3 "Contributor" means any person or entity that creates or contributes to the -creation of Modifications. - -1.4 "Covered Code" means the Original Code, Modifications, the combination of -Original Code and any Modifications, and/or any respective portions thereof. - -1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for -Your internal research and development (R&D) and/or Personal Use, and includes -without limitation, any and all internal use or distribution of Covered Code -within Your business or organization except for R&D use and/or Personal Use, as -well as direct or indirect sublicensing or distribution of Covered Code by You -to any third party in any form or manner. - -1.6 "Derivative Work" means either the Covered Code or any derivative work under -United States copyright law, and including any work containing or including any -portion of the Covered Code or Modifications, either verbatim or with -modifications and/or translated into another language. Derivative Work also -includes any work which combines any portion of Covered Code or Modifications -with code not otherwise governed by the terms of this License. - -1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be -accessed or used by anyone other than You, used to provide any services to -anyone other than You, or used in any way to deliver any content to anyone other -than You, whether the Covered Code is distributed to those parties, made -available as an application intended for use over a computer network, or used to -provide services or otherwise deliver content to anyone other than You. - -1.8. "Interface" means interfaces, functions, properties, class definitions, -APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of -software, firmware or hardware to communicate or interoperate with another piece -of software, firmware or hardware. - -1.9 "Modifications" mean any addition to, deletion from, and/or change to, the -substance and/or structure of the Original Code, any previous Modifications, the -combination of Original Code and any previous Modifications, and/or any -respective portions thereof. When code is released as a series of files, a -Modification is: (a) any addition to or deletion from the contents of a file -containing Covered Code; and/or (b) any new file or other representation of -computer program statements that contains any part of Covered Code. - -1.10 "Original Code" means (a) the Source Code of a program or other work as -originally made available by Licensor under this License, including the Source -Code of any updates or upgrades to such programs or works made available by -Licensor under this License, and that has been expressly identified by Licensor -as such in the header file(s) of such work; and (b) the object code compiled -from such Source Code and originally made available by Licensor under this -License. - -1.11 "Personal Use" means use of Covered Code by an individual solely for his or -her personal, private and non-commercial purposes. An individual's use of -Covered Code in his or her capacity as an officer, employee, member, independent -contractor or agent of a corporation, business or organization (commercial or -non-commercial) does not qualify as Personal Use. - -1.12 "Source Code" means the human readable form of a program or other work that -is suitable for making modifications to it, including all modules it contains, -plus any associated interface definition files, scripts used to control -compilation and installation of an executable (object code). - -1.13 "You" or "Your" means an individual or a legal entity exercising rights -under this License. For legal entities, "You" or "Your" includes any entity -which controls, is controlled by, or is under common control with, You, where -"control" means (a) the power, direct or indirect, to cause the direction or -management of such entity, whether by contract or otherwise, or (b) ownership of -fifty percent (50%) or more of the outstanding shares or beneficial ownership of -such entity. - -2. Permitted Uses; Conditions & Restrictions. Subject to the terms and -conditions of this License, Licensor hereby grants You, effective on the date -You accept this License (via downloading or using Covered Code or otherwise -indicating your acceptance of this License), a worldwide, royalty-free, -non-exclusive copyright license, to the extent of Licensor's copyrights cover -the Original Code, to do the following: - -2.1 You may reproduce, display, perform, modify and Deploy Covered Code, -provided that in each instance: - -(a) You must retain and reproduce in all copies of Original Code the copyright -and other proprietary notices and disclaimers of Licensor as they appear in the -Original Code, and keep intact all notices in the Original Code that refer to -this License; - -(b) You must include a copy of this License with every copy of Source Code of -Covered Code and documentation You distribute, and You may not offer or impose -any terms on such Source Code that alter or restrict this License or the -recipients' rights hereunder, except as permitted under Section 6; - -(c) You must duplicate, to the extent it does not already exist, the notice in -Exhibit A in each file of the Source Code of all Your Modifications, and cause -the modified files to carry prominent notices stating that You changed the files -and the date of any change; - -(d) You must make Source Code of all Your Externally Deployed Modifications -publicly available under the terms of this License, including the license grants -set forth in Section 3 below, for as long as you Deploy the Covered Code or -twelve (12) months from the date of initial Deployment, whichever is longer. You -should preferably distribute the Source Code of Your Deployed Modifications -electronically (e.g. download from a web site); and - -(e) if You Deploy Covered Code in object code, executable form only, You must -include a prominent notice, in the code itself as well as in related -documentation, stating that Source Code of the Covered Code is available under -the terms of this License with information on how and where to obtain such -Source Code. You must also include the Object Code Notice set forth in Exhibit A -in the "about" box or other appropriate place where other copyright notices are -placed, including any packaging materials. - -2.2 You expressly acknowledge and agree that although Licensor and each -Contributor grants the licenses to their respective portions of the Covered Code -set forth herein, no assurances are provided by Licensor or any Contributor that -the Covered Code does not infringe the patent or other intellectual property -rights of any other entity. Licensor and each Contributor disclaim any liability -to You for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, You hereby assume sole responsibility to -secure any other intellectual property rights needed, if any. For example, if a -third party patent license is required to allow You to make, use, sell, import -or offer for sale the Covered Code, it is Your responsibility to acquire such -license(s). - -2.3 Subject to the terms and conditions of this License, Licensor hereby grants -You, effective on the date You accept this License (via downloading or using -Covered Code or otherwise indicating your acceptance of this License), a -worldwide, royalty-free, perpetual, non-exclusive patent license under -Licensor's Applicable Patent Rights to make, use, sell, offer for sale and -import the Covered Code, provided that in each instance you comply with the -terms of this License. - -3. Your Grants. In consideration of, and as a condition to, the licenses granted -to You under this License: - -(a) You grant to Licensor and all third parties a non-exclusive, perpetual, -irrevocable, royalty free license under Your Applicable Patent Rights and other -intellectual property rights owned or controlled by You, to make, sell, offer -for sale, use, import, reproduce, display, perform, modify, distribute and -Deploy Your Modifications of the same scope and extent as Licensor's licenses -under Sections 2.1 and 2.2; and - -(b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide, -royalty-free, perpetual and irrevocable license, under Your Applicable Patent -Rights and other intellectual property rights owned or controlled by You, to -make, use, sell, offer for sale, import, reproduce, display, perform, -distribute, modify or have modified (for Licensor and/or its subsidiaries), -sublicense and distribute Your Modifications, in any form and for any purpose, -through multiple tiers of distribution. - -(c) You agree not use any information derived from Your use and review of the -Covered Code, including but not limited to any algorithms or inventions that may -be contained in the Covered Code, for the purpose of asserting any of Your -patent rights, or assisting a third party to assert any of its patent rights, -against Licensor or any Contributor. - -4. Derivative Works. You may create a Derivative Work by combining Covered Code -with other code not otherwise governed by the terms of this License and -distribute the Derivative Work as an integrated product. In each such instance, -You must make sure the requirements of this License are fulfilled for the -Covered Code or any portion thereof, including all Modifications. - -4.1 You must cause any Derivative Work that you distribute, publish or -Externally Deploy, that in whole or in part contains or is derived from the -Covered Code or any part thereof, to be licensed as a whole at no charge to all -third parties under the terms of this License and no other license except as -provided in Section 4.2. You also must make Source Code available for the -Derivative Work under the same terms as Modifications, described in Sections 2 -and 3, above. - -4.2 Compatible Source Licenses. Software modules that have been independently -developed without any use of Covered Code and which contain no portion of the -Covered Code, Modifications or other Derivative Works, but are used or combined -in any way wtih the Covered Code or any Derivative Work to form a larger -Derivative Work, are exempt from the conditions described in Section 4.1 but -only to the extent that: the software module, including any software that is -linked to, integrated with, or part of the same applications as, the software -module by any method must be wholly subject to one of the Compatible Source -Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the -terms of this License. Thus, the entire Derivative Work must be licensed under a -combination of the RPSL (for Covered Code) and a Compatible Source License for -any independently developed software modules within the Derivative Work. The -foregoing requirement applies even if the Compatible Source License would -ordinarily allow the software module to link with, or form larger works with, -other software that is not subject to the Compatible Source License. For -example, although the Mozilla Public License v1.1 allows Mozilla code to be -combined with proprietary software that is not subject to the MPL, if -MPL-licensed code is used with Covered Code the MPL-licensed code could not be -combined or linked with any code not governed by the MPL. The general intent of -this section 4.2 is to enable use of Covered Code with applications that are -wholly subject to an acceptable open source license. You are responsible for -determining whether your use of software with Covered Code is allowed under Your -license to such software. - -4.3 Mere aggregation of another work not based on the Covered Code with the -Covered Code (or with a work based on the Covered Code) on a volume of a storage -or distribution medium does not bring the other work under the scope of this -License. If You deliver the Covered Code for combination and/or integration with -an application previously provided by You (for example, via automatic updating -technology), such combination and/or integration constitutes a Derivative Work -subject to the terms of this License. - -5. Exclusions From License Grant. Nothing in this License shall be deemed to -grant any rights to trademarks, copyrights, patents, trade secrets or any other -intellectual property of Licensor or any Contributor except as expressly stated -herein. No right is granted to the trademarks of Licensor or any Contributor -even if such marks are included in the Covered Code. Nothing in this License -shall be interpreted to prohibit Licensor from licensing under different terms -from this License any code that Licensor otherwise would have a right to -license. Modifications, Derivative Works and/or any use or combination of -Covered Code with other technology provided by Licensor or third parties may -require additional patent licenses from Licensor which Licensor may grant in its -sole discretion. No patent license is granted separate from the Original Code or -combinations of the Original Code with other software or hardware. - -5.1. Trademarks. This License does not grant any rights to use the trademarks or -trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any -trademark or trade name belonging to any Contributor. No Licensor Marks may be -used to endorse or promote products derived from the Original Code other than as -permitted by the Licensor Trademark Policy defined in Exhibit C. - -6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, -support, indemnity or liability obligations and/or other rights consistent with -the scope of the license granted herein ("Additional Terms") to one or more -recipients of Covered Code. However, You may do so only on Your own behalf and -as Your sole responsibility, and not on behalf of Licensor or any Contributor. -You must obtain the recipient's agreement that any such Additional Terms are -offered by You alone, and You hereby agree to indemnify, defend and hold -Licensor and every Contributor harmless for any liability incurred by or claims -asserted against Licensor or such Contributor by reason of any such Additional -Terms. - -7. Versions of the License. Licensor may publish revised and/or new versions of -this License from time to time. Each version will be given a distinguishing -version number. Once Original Code has been published under a particular version -of this License, You may continue to use it under the terms of that version. You -may also choose to use such Original Code under the terms of any subsequent -version of this License published by Licensor. No one other than Licensor has -the right to modify the terms applicable to Covered Code created under this -License. - -8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part -pre-release, untested, or not fully tested works. The Covered Code may contain -errors that could cause failures or loss of data, and may be incomplete or -contain inaccuracies. You expressly acknowledge and agree that use of the -Covered Code, or any portion thereof, is at Your sole and entire risk. THE -COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF -ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS -"LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY -DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF -SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET -ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH -CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE -COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR -REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR -ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR -WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR -AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You -acknowledge that the Covered Code is not intended for use in high risk -activities, including, but not limited to, the design, construction, operation -or maintenance of nuclear facilities, aircraft navigation, aircraft -communication systems, or air traffic control machines in which case the failure -of the Covered Code could lead to death, personal injury, or severe physical or -environmental damage. Licensor disclaims any express or implied warranty of -fitness for such uses. - -9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT -SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR -YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER -UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT -LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH -CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND -NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME -JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR -CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event -shall Licensor's total liability to You for all damages (other than as may be -required by applicable law) under this License exceed the amount of ten dollars -($10.00). - -10. Ownership. Subject to the licenses granted under this License, each -Contributor retains all rights, title and interest in and to any Modifications -made by such Contributor. Licensor retains all rights, title and interest in and -to the Original Code and any Modifications made by or on behalf of Licensor -("Licensor Modifications"), and such Licensor Modifications will not be -automatically subject to this License. Licensor may, at its sole discretion, -choose to license such Licensor Modifications under this License, or on -different terms from those contained in this License or may choose not to -license them at all. - -11. Termination. - -11.1 Term and Termination. The term of this License is perpetual unless -terminated as provided below. This License and the rights granted hereunder will -terminate: - -(a) automatically without notice from Licensor if You fail to comply with any -term(s) of this License and fail to cure such breach within 30 days of becoming -aware of such breach; - -(b) immediately in the event of the circumstances described in Section 12.5(b); -or - -(c) automatically without notice from Licensor if You, at any time during the -term of this License, commence an action for patent infringement against -Licensor (including by cross-claim or counter claim in a lawsuit); - -(d) upon written notice from Licensor if You, at any time during the term of -this License, commence an action for patent infringement against any third party -alleging that the Covered Code itself (excluding combinations with other -software or hardware) infringes any patent (including by cross-claim or counter -claim in a lawsuit). - -11.2 Effect of Termination. Upon termination, You agree to immediately stop any -further use, reproduction, modification, sublicensing and distribution of the -Covered Code and to destroy all copies of the Covered Code that are in your -possession or control. All sublicenses to the Covered Code which have been -properly granted prior to termination shall survive any termination of this -License. Provisions which, by their nature, should remain in effect beyond the -termination of this License shall survive, including but not limited to Sections -3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for -compensation, indemnity or damages of any sort solely as a result of terminating -this License in accordance with its terms, and termination of this License will -be without prejudice to any other right or remedy of any party. - -12. Miscellaneous. - -12.1 Government End Users. The Covered Code is a "commercial item" as defined in -FAR 2.101. Government software and technical data rights in the Covered Code -include only those rights customarily provided to the public as defined in this -License. This customary commercial license in technical data and software is -provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer -Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical -Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software -or Computer Software Documentation). Accordingly, all U.S. Government End Users -acquire Covered Code with only those rights set forth herein. - -12.2 Relationship of Parties. This License will not be construed as creating an -agency, partnership, joint venture or any other form of legal association -between or among You, Licensor or any Contributor, and You will not represent to -the contrary, whether expressly, by implication, appearance or otherwise. - -12.3 Independent Development. Nothing in this License will impair Licensor's -right to acquire, license, develop, have others develop for it, market and/or -distribute technology or products that perform the same or similar functions as, -or otherwise compete with, Modifications, Derivative Works, technology or -products that You may develop, produce, market or distribute. - -12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any -provision of this License will not be deemed a waiver of future enforcement of -that or any other provision. Any law or regulation which provides that the -language of a contract shall be construed against the drafter will not apply to -this License. - -12.5 Severability. (a) If for any reason a court of competent jurisdiction finds -any provision of this License, or portion thereof, to be unenforceable, that -provision of the License will be enforced to the maximum extent permissible so -as to effect the economic benefits and intent of the parties, and the remainder -of this License will continue in full force and effect. (b) Notwithstanding the -foregoing, if applicable law prohibits or restricts You from fully and/or -specifically complying with Sections 2 and/or 3 or prevents the enforceability -of either of those Sections, this License will immediately terminate and You -must immediately discontinue any use of the Covered Code and destroy all copies -of it that are in your possession or control. - -12.6 Dispute Resolution. Any litigation or other dispute resolution between You -and Licensor relating to this License shall take place in the Seattle, -Washington, and You and Licensor hereby consent to the personal jurisdiction of, -and venue in, the state and federal courts within that District with respect to -this License. The application of the United Nations Convention on Contracts for -the International Sale of Goods is expressly excluded. - -12.7 Export/Import Laws. This software is subject to all export and import laws -and restrictions and regulations of the country in which you receive the Covered -Code and You are solely responsible for ensuring that You do not export, -re-export or import the Covered Code or any direct product thereof in violation -of any such restrictions, laws or regulations, or without all necessary -authorizations. - -12.8 Entire Agreement; Governing Law. This License constitutes the entire -agreement between the parties with respect to the subject matter hereof. This -License shall be governed by the laws of the United States and the State of -Washington. - -Where You are located in the province of Quebec, Canada, the following clause -applies: The parties hereby confirm that they have requested that this License -and all related documents be drafted in English. Les parties ont exigé -que le présent contrat et tous les documents connexes soient -rédigés en anglais. - - EXHIBIT A. - -"Copyright © 1995-2002 -RealNetworks, Inc. and/or its licensors. All Rights Reserved. - -The contents of this file, and the files included with this file, are subject to -the current version of the RealNetworks Public Source License Version 1.0 (the -"RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have -licensed the file under the RealNetworks Community Source License Version 1.0 -(the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which -case the RCSL will apply. You may also obtain the license terms directly from -RealNetworks. You may not use this file except in compliance with the RPSL or, -if you have a valid RCSL with RealNetworks applicable to this file, the RCSL. -Please see the applicable RPSL or RCSL for the rights, obligations and -limitations governing use of the contents of the file. - -This file is part of the Helix DNA Technology. RealNetworks is the developer of -the Original code and owns the copyrights in the portions it created. - -This file, and the files included with this file, is distributed and made -available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR -IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING -WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): ____________________________________ - -Technology Compatibility Kit Test -Suite(s) Location (if licensed under the RCSL): ______________________________ - -Object Code Notice: Helix DNA Client technology included. Copyright (c) -RealNetworks, Inc., 1995-2002. All rights reserved. - - - EXHIBIT B - -Compatible Source Licenses for the RealNetworks Public Source License. The -following list applies to the most recent version of the license as of October -25, 2002, unless otherwise indicated. - -* Academic Free License -* Apache Software License -* Apple Public Source License -* Artistic license -* Attribution Assurance Licenses -* BSD license -* Common Public License (1) -* Eiffel Forum License -* GNU General Public License (GPL) (1) -* GNU Library or "Lesser" General Public License (LGPL) (1) -* IBM Public License -* Intel Open Source License -* Jabber Open Source License -* MIT license -* MITRE Collaborative Virtual Workspace License (CVW License) -* Motosoto License -* Mozilla Public License 1.0 (MPL) -* Mozilla Public License 1.1 (MPL) -* Nokia Open Source License -* Open Group Test Suite License -* Python Software Foundation License -* Ricoh Source Code Public License -* Sun Industry Standards Source License (SISSL) -* Sun Public License -* University of Illinois/NCSA Open Source License -* Vovida Software License v. 1.0 -* W3C License -* X.Net License -* Zope Public License -* zlib/libpng license - -(1) Note: because this license contains certain reciprocal licensing terms that -purport to extend to independently developed code, You may be prohibited under -the terms of this otherwise compatible license from using code licensed under -its terms with Covered Code because Covered Code may only be licensed under the -RealNetworks Public Source License. Any attempt to apply non RPSL license terms, -including without limitation the GPL, to Covered Code is expressly forbidden. -You are responsible for ensuring that Your use of Compatible Source Licensed -code does not violate either the RPSL or the Compatible Source License. - -The latest version of this list can be found at: -https://www.helixcommunity.org/content/complicense - - EXHIBIT C - -RealNetworks' Trademark policy. - -RealNetworks defines the following trademarks collectively as "Licensor -Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem", -"RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other -trademarks or trade names belonging to RealNetworks. - -RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks -except as permitted by and in strict compliance at all times with RealNetworks' -third party trademark usage guidelines which are posted at -http://www.realnetworks.com/info/helixlogo.html. - diff --git a/bsp/stm32_radio/mp3/real/arm/LICENSE.txt b/bsp/stm32_radio/mp3/real/arm/LICENSE.txt deleted file mode 100644 index 12e5372a9f..0000000000 --- a/bsp/stm32_radio/mp3/real/arm/LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ - Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. - - The contents of this directory, and (except where otherwise - indicated) the directories included within this directory, are - subject to the current version of the RealNetworks Public Source - License (the "RPSL") available at RPSL.txt in this directory, unless - you have licensed the directory under the current version of the - RealNetworks Community Source License (the "RCSL") available at - RCSL.txt in this directory, in which case the RCSL will apply. You - may also obtain the license terms directly from RealNetworks. You - may not use the files in this directory except in compliance with the - RPSL or, if you have a valid RCSL with RealNetworks applicable to - this directory, the RCSL. Please see the applicable RPSL or RCSL for - the rights, obligations and limitations governing use of the contents - of the directory. - - This directory is part of the Helix DNA Technology. RealNetworks is - the developer of the Original Code and owns the copyrights in the - portions it created. - - This directory, and the directories included with this directory, are - distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY - OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY - DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - QUIET ENJOYMENT OR NON-INFRINGEMENT. - - Technology Compatibility Kit Test Suite(s) Location: - http://www.helixcommunity.org/content/tck - diff --git a/bsp/stm32_radio/mp3/real/arm/RCSL.txt b/bsp/stm32_radio/mp3/real/arm/RCSL.txt deleted file mode 100644 index a809759a32..0000000000 --- a/bsp/stm32_radio/mp3/real/arm/RCSL.txt +++ /dev/null @@ -1,948 +0,0 @@ -The RCSL is made up of a base agreement and a few Attachments. - -For Research and Development use, you agree to the terms of the -RCSL R&D License (base RCSL and Attachments A, B, and C) - -For Commercial Use (either distribution or internal commercial -deployment) of the Helix DNA with or without support for RealNetworks' -RealAudio and RealVideo Add-on Technology, you agree to the -terms of the same RCSL R&D license -and execute one or more additional Commercial Use License attachments -. - ------------------------------------------------------------------------- - - - REALNETWORKS COMMUNITY SOURCE LICENSE - -Version 1.2 (Rev. Date: January 22, 2003). - - - RECITALS - -Original Contributor has developed Specifications, Source Code -implementations and Executables of certain Technology; and - -Original Contributor desires to license the Technology to a large -community to facilitate research, innovation and product development -while maintaining compatibility of such products with the Technology as -delivered by Original Contributor; and - -Original Contributor desires to license certain Trademarks for the -purpose of branding products that are compatible with the relevant -Technology delivered by Original Contributor; and - -You desire to license the Technology and possibly certain Trademarks -from Original Contributor on the terms and conditions specified in this -License. - -In consideration for the mutual covenants contained herein, You and -Original Contributor agree as follows: - - - AGREEMENT - -*1. Introduction.* - -The RealNetworks Community Source License ("RCSL") and effective -attachments ("License") may include five distinct licenses: - -i) Research Use license -- License plus Attachments A, B and C only. - -ii) Commercial Use and Trademark License, which may be for Internal -Deployment Use or external distribution, or both -- License plus -Attachments A, B, C, and D. - -iii) Technology Compatibility Kit (TCK) license -- Attachment C. - -iv) Add-On Technology License (Executable) Commercial Use License --Attachment F. - -v) Add-On Technology Source Code Porting and Optimization -License-Attachment G. - -The Research Use license is effective when You click and accept this -License. The TCK is effective when You click and accept this License, -unless otherwise specified in the TCK attachments. The Commercial Use -and Trademark, Add-On Technology License, and the Add-On Technology -Source Code Porting and Optimization licenses must each be signed by You -and Original Contributor to become effective. Once effective, these -licenses and the associated requirements and responsibilities are -cumulative. Capitalized terms used in this License are defined in the -Glossary. - -*2. License Grants.* - -2.1 Original Contributor Grant. - -Subject to Your compliance with Sections 3, 8.10 and Attachment A of -this License, Original Contributor grants to You a worldwide, -royalty-free, non-exclusive license, to the extent of Original -Contributor's Intellectual Property Rights covering the Original Code, -Upgraded Code and Specifications, to do the following: - -(a) Research Use License: - -(i) use, reproduce and modify the Original Code, Upgraded Code and -Specifications to create Modifications and Reformatted Specifications -for Research Use by You; - -(ii) publish and display Original Code, Upgraded Code and Specifications -with, or as part of Modifications, as permitted under Section 3.1(b) below; - -(iii) reproduce and distribute copies of Original Code and Upgraded Code -to Licensees and students for Research Use by You; - -(iv) compile, reproduce and distribute Original Code and Upgraded Code -in Executable form, and Reformatted Specifications to anyone for -Research Use by You. - -(b) Other than the licenses expressly granted in this License, Original -Contributor retains all right, title, and interest in Original Code and -Upgraded Code and Specifications. - -2.2 Your Grants. - -(a) To Other Licensees. You hereby grant to each Licensee a license to -Your Error Corrections and Shared Modifications, of the same scope and -extent as Original Contributor's licenses under Section 2.1 a) above -relative to Research Use and Attachment D relative to Commercial Use. - -(b) To Original Contributor. You hereby grant to Original Contributor a -worldwide, royalty-free, non-exclusive, perpetual and irrevocable -license, to the extent of Your Intellectual Property Rights covering -Your Error Corrections, Shared Modifications and Reformatted -Specifications, to use, reproduce, modify, display and distribute Your -Error Corrections, Shared Modifications and Reformatted Specifications, -in any form, including the right to sublicense such rights through -multiple tiers of distribution. - -(c) Other than the licenses expressly granted in Sections 2.2(a) and (b) -above, and the restrictions set forth in Section 3.1(d)(iv) below, You -retain all right, title, and interest in Your Error Corrections, Shared -Modifications and Reformatted Specifications. - -2.3 Contributor Modifications. - -You may use, reproduce, modify, display and distribute Contributor Error -Corrections, Shared Modifications and Reformatted Specifications, -obtained by You under this License, to the same scope and extent as with -Original Code, Upgraded Code and Specifications. - -2.4 Subcontracting. - -You may deliver the Source Code of Covered Code to other Licensees -having at least a Research Use license, for the sole purpose of -furnishing development services to You in connection with Your rights -granted in this License. All such Licensees must execute appropriate -documents with respect to such work consistent with the terms of this -License, and acknowledging their work-made-for-hire status or assigning -exclusive right to the work product and associated Intellectual Property -Rights to You. - -*3. Requirements and Responsibilities*. - -3.1 Research Use License. - -As a condition of exercising the rights granted under Section 2.1(a) -above, You agree to comply with the following: - -(a) Your Contribution to the Community. All Error Corrections and Shared -Modifications which You create or contribute to are automatically -subject to the licenses granted under Section 2.2 above. You are -encouraged to license all of Your other Modifications under Section 2.2 -as Shared Modifications, but are not required to do so. You agree to -notify Original Contributor of any errors in the Specification. - -(b) Source Code Availability. You agree to provide all Your Error -Corrections to Original Contributor as soon as reasonably practicable -and, in any event, prior to Internal Deployment Use or Commercial Use, -if applicable. Original Contributor may, at its discretion, post Source -Code for Your Error Corrections and Shared Modifications on the -Community Webserver. You may also post Error Corrections and Shared -Modifications on a web-server of Your choice; provided, that You must -take reasonable precautions to ensure that only Licensees have access to -such Error Corrections and Shared Modifications. Such precautions shall -include, without limitation, a password protection scheme limited to -Licensees and a click-on, download certification of Licensee status -required of those attempting to download from the server. An example of -an acceptable certification is attached as Attachment A-2. - -(c) Notices. All Error Corrections and Shared Modifications You create -or contribute to must include a file documenting the additions and -changes You made and the date of such additions and changes. You must -also include the notice set forth in Attachment A-1 in the file header. -If it is not possible to put the notice in a particular Source Code file -due to its structure, then You must include the notice in a location -(such as a relevant directory file), where a recipient would be most -likely to look for such a notice. - -(d) Redistribution. - -(i) Source. Covered Code may be distributed in Source Code form only to -another Licensee (except for students as provided below). You may not -offer or impose any terms on any Covered Code that alter the rights, -requirements, or responsibilities of such Licensee. You may distribute -Covered Code to students for use in connection with their course work -and research projects undertaken at accredited educational institutions. -Such students need not be Licensees, but must be given a copy of the -notice set forth in Attachment A-3 and such notice must also be included -in a file header or prominent location in the Source Code made available -to such students. - -(ii) Executable. You may distribute Executable version(s) of Covered -Code to Licensees and other third parties only for the purpose of -evaluation and comment in connection with Research Use by You and under -a license of Your choice, but which limits use of such Executable -version(s) of Covered Code only to that purpose. - -(iii) Modified Class, Interface and Package Naming. In connection with -Research Use by You only, You may use Original Contributor's class, -Interface and package names only to accurately reference or invoke the -Source Code files You modify. Original Contributor grants to You a -limited license to the extent necessary for such purposes. - -(iv) You expressly agree that any distribution, in whole or in part, of -Modifications developed by You shall only be done pursuant to the terms -and conditions of this License. - -(e) Extensions. - -(i) Covered Code. You may not include any Source Code of Community Code -in any Extensions. You may include the compiled Header Files of -Community Code in an Extension provided that Your use of the Covered -Code, including Heading Files, complies with the Commercial Use License, -the TCK and all other terms of this License. - -(ii) Publication. No later than the date on which You first distribute -such Extension for Commercial Use, You must publish to the industry, on -a non-confidential basis and free of all copyright restrictions with -respect to reproduction and use, an accurate and current specification -for any Extension. In addition, You must make available an appropriate -test suite, pursuant to the same rights as the specification, -sufficiently detailed to allow any third party reasonably skilled in the -technology to produce implementations of the Extension compatible with -the specification. Such test suites must be made available as soon as -reasonably practicable but, in no event, later than ninety (90) days -after Your first Commercial Use of the Extension. You must use -reasonable efforts to promptly clarify and correct the specification and -the test suite upon written request by Original Contributor. - -(iii) Open. You agree to refrain from enforcing any Intellectual -Property Rights You may have covering any interface(s) of Your -Extension, which would prevent the implementation of such interface(s) -by Original Contributor or any Licensee. This obligation does not -prevent You from enforcing any Intellectual Property Right You have that -would otherwise be infringed by an implementation of Your Extension. - -(iv) Interface Modifications and Naming. You may not modify or add to -the GUID space * * "xxxxxxxx-0901-11d1-8B06-00A024406D59" or any other -GUID space designated by Original Contributor. You may not modify any -Interface prefix provided with the Covered Code or any other prefix -designated by Original Contributor.* * - -* * - -(f) You agree that any Specifications provided to You by Original -Contributor are confidential and proprietary information of Original -Contributor. You must maintain the confidentiality of the Specifications -and may not disclose them to any third party without Original -Contributor's prior written consent. You may only use the Specifications -under the terms of this License and only for the purpose of implementing -the terms of this License with respect to Covered Code. You agree not -use, copy or distribute any such Specifications except as provided in -writing by Original Contributor. - -3.2 Commercial Use License. - -You may not make Commercial Use of any Covered Code unless You and -Original Contributor have executed a copy of the Commercial Use and -Trademark License attached as Attachment D. - -*4. Versions of the License.* - -4.1 License Versions. - -Original Contributor may publish revised versions of the License from -time to time. Each version will be given a distinguishing version number. - -4.2 Effect. - -Once a particular version of Covered Code has been provided under a -version of the License, You may always continue to use such Covered Code -under the terms of that version of the License. You may also choose to -use such Covered Code under the terms of any subsequent version of the -License. No one other than Original Contributor has the right to -promulgate License versions. - -4.3 Multiple-Licensed Code. - -Original Contributor may designate portions of the Covered Code as -"Multiple-Licensed." "Multiple-Licensed" means that the Original -Contributor permits You to utilize those designated portions of the -Covered Code under Your choice of this License or the alternative -license(s), if any, specified by the Original Contributor in an -Attachment to this License. - -*5. Disclaimer of Warranty.* - -5.1 COVERED CODE PROVIDED AS IS. - -COVERED CODE IS PROVIDED UNDER THIS LICENSE "AS IS," WITHOUT WARRANTY OF -ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, -WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT -FOR A PARTICULAR PURPOSE OR NON-INFRINGING. YOU AGREE TO BEAR THE ENTIRE -RISK IN CONNECTION WITH YOUR USE AND DISTRIBUTION OF COVERED CODE UNDER -THIS LICENSE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART -OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER -EXCEPT SUBJECT TO THIS DISCLAIMER. - -5.2 Not Designed for High Risk Activities. - -You acknowledge that Original Code, Upgraded Code and Specifications are -not designed or intended for use in high risk activities including, but -not limited to: (i) on-line control of aircraft, air traffic, aircraft -navigation or aircraft communications; or (ii) in the design, -construction, operation or maintenance of any nuclear facility. Original -Contributor disclaims any express or implied warranty of fitness for -such uses. - -*6. Termination.* - -6.1 By You. - -You may terminate this Research Use license at anytime by providing -written notice to Original Contributor. - -6.2 By Original Contributor. - -This License and the rights granted hereunder will terminate: - -(i) automatically if You fail to comply with the terms of this License -and fail to cure such breach within 30 days of receipt of written notice -of the breach; - -(ii) immediately in the event of circumstances specified in Sections 7.1 -and 8.4; or - -(iii) at Original Contributor's discretion upon any action initiated by -You (including by cross-claim or counter claim) alleging that use or -distribution by Original Contributor or any Licensee, of Original Code, -Upgraded Code, Error Corrections, Shared Modifications or Specifications -infringe a patent owned or controlled by You. - -6.3 Effective of Termination. - -Upon termination, You agree to discontinue use of and destroy all copies -of Covered Code in Your possession. All sublicenses to the Covered Code -which You have properly granted shall survive any termination of this -License. Provisions that, by their nature, should remain in effect -beyond the termination of this License shall survive including, without -limitation, Sections 2.2, 3, 5, 7 and 8. - -6.4 No Compensation. - -Each party waives and releases the other from any claim to compensation -or indemnity for permitted or lawful termination of the business -relationship established by this License. - -*7. Liability.* - -7.1 Infringement. Should any of the Original Code, Upgraded Code, TCK or -Specifications ("Materials") become the subject of a claim of -infringement, Original Contributor may, at its sole option, (i) attempt -to procure the rights necessary for You to continue using the Materials, -(ii) modify the Materials so that they are no longer infringing, or -(iii) terminate Your right to use the Materials, immediately upon -written notice, and refund to You the amount, if any, having then -actually been paid by You to Original Contributor for the Original Code, -Upgraded Code and TCK, depreciated on a straight line, five year basis. - -7.2 LIMITATION OF LIABILITY. TO THE FULL EXTENT ALLOWED BY APPLICABLE -LAW, ORIGINAL CONTRIBUTOR'S LIABILITY TO YOU FOR CLAIMS RELATING TO THIS -LICENSE, WHETHER FOR BREACH OR IN TORT, SHALL BE LIMITED TO ONE HUNDRED -PERCENT (100%) OF THE AMOUNT HAVING THEN ACTUALLY BEEN PAID BY YOU TO -ORIGINAL CONTRIBUTOR FOR ALL COPIES LICENSED HEREUNDER OF THE PARTICULAR -ITEMS GIVING RISE TO SUCH CLAIM, IF ANY, DURING THE TWELVE MONTHS -PRECEDING THE CLAIMED BREACH. IN NO EVENT WILL YOU (RELATIVE TO YOUR -SHARED MODIFICATIONS OR ERROR CORRECTIONS) OR ORIGINAL CONTRIBUTOR BE -LIABLE FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL -DAMAGES IN CONNECTION WITH OR RISING OUT OF THIS LICENSE (INCLUDING, -WITHOUT LIMITATION, LOSS OF PROFITS, USE, DATA, OR OTHER ECONOMIC -ADVANTAGE), HOWEVER IT ARISES AND ON ANY THEORY OF LIABILITY, WHETHER IN -AN ACTION FOR CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE) -OR OTHERWISE, WHETHER OR NOT YOU OR ORIGINAL CONTRIBUTOR HAS BEEN -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE AND NOTWITHSTANDING THE -FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. - -*8. Miscellaneous.* - -8.1 Trademark. - -You shall not use any Trademark unless You and Original Contributor -execute a copy of the Commercial Use and Trademark License Agreement -attached hereto as Attachment D. Except as expressly provided in the -License, You are granted no right, title or license to, or interest in, -any Trademarks. Whether or not You and Original Contributor enter into -the Trademark License, You agree not to (i) challenge Original -Contributor's ownership or use of Trademarks; (ii) attempt to register -any Trademarks, or any mark or logo substantially similar thereto; or -(iii) incorporate any Trademarks into Your own trademarks, product -names, service marks, company names, or domain names. - -8.2 Integration. - -This License represents the complete agreement concerning the subject -matter hereof. - -8.3 Assignment. - -Original Contributor may assign this License, and its rights and -obligations hereunder, in its sole discretion. You may assign the -Research Use portions of this License and the TCK license to a third -party upon prior written notice to Original Contributor (which may be -provided electronically via the Community Web-Server). You may not -assign the Commercial Use and Trademark license, the Add-On Technology -License, or the Add-On Technology Source Code Porting License, including -by way of merger (regardless of whether You are the surviving entity) or -acquisition, without Original Contributor's prior written consent. - -8.4 Severability. - -If any provision of this License is held to be unenforceable, such -provision shall be reformed only to the extent necessary to make it -enforceable. Notwithstanding the foregoing, if You are prohibited by law -from fully and specifically complying with Sections 2.2 or 3, this -License will immediately terminate and You must immediately discontinue -any use of Covered Code. - -8.5 Governing Law. - -This License shall be governed by the laws of the United States and the -State of Washington, as applied to contracts entered into and to be -performed in Washington between Washington residents. The application of -the United Nations Convention on Contracts for the International Sale of -Goods is expressly excluded. You agree that the state and federal courts -located in Seattle, Washington have exclusive jurisdiction over any -claim relating to the License, including contract and tort claims. - -8.6 Dispute Resolution. - -a) Arbitration. Any dispute arising out of or relating to this License -shall be finally settled by arbitration as set out herein, except that -either party may bring any action, in a court of competent jurisdiction -(which jurisdiction shall be exclusive), with respect to any dispute -relating to such party's Intellectual Property Rights or with respect to -Your compliance with the TCK license. Arbitration shall be administered: -(i) by the American Arbitration Association (AAA), (ii) in accordance -with the rules of the United Nations Commission on International Trade -Law (UNCITRAL) (the "Rules") in effect at the time of arbitration as -modified herein; and (iii) the arbitrator will apply the substantive -laws of Washington and the United States. Judgment upon the award -rendered by the arbitrator may be entered in any court having -jurisdiction to enforce such award. - -b) Arbitration language, venue and damages. All arbitration proceedings -shall be conducted in English by a single arbitrator selected in -accordance with the Rules, who must be fluent in English and be either a -retired judge or practicing attorney having at least ten (10) years -litigation experience and be reasonably familiar with the technology -matters relative to the dispute. Unless otherwise agreed, arbitration -venue shall be in Seattle, Washington. The arbitrator may award monetary -damages only and nothing shall preclude either party from seeking -provisional or emergency relief from a court of competent jurisdiction. -The arbitrator shall have no authority to award damages in excess of -those permitted in this License and any such award in excess is void. -All awards will be payable in U.S. dollars and may include, for the -prevailing party (i) pre-judgment award interest, (ii) reasonable -attorneys' fees incurred in connection with the arbitration, and (iii) -reasonable costs and expenses incurred in enforcing the award. The -arbitrator will order each party to produce identified documents and -respond to no more than twenty-five single question interrogatories. - -8.7 Construction. - -Any law or regulation, which provides that the language of a contract -shall be construed against the drafter, shall not apply to this License. - -8.8 U.S. Government End Users. - -The Covered Code is a "commercial item," as that term is defined in 48 -C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" -and "commercial computer software documentation," as such terms are used -in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and -48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government -End Users acquire Covered Code with only those rights set forth herein. -You agree to pass this notice to our licensees. - -8.9 Marketing Activities. - -Licensee hereby grants Original Contributor a non-exclusive, -non-transferable, limited license to use the Licensee's company name and -logo ("Licensee Marks") in any presentations, press releases, or -marketing materials solely for the purpose of identifying Licensee as a -member of the Helix Community. Licensee shall provide samples of -Licensee Marks to Original Contributor upon request by Original -Contributor. Original Contributor acknowledges that the Licensee Marks -are the trademarks of Licensee. Original Contributor shall not use the -Licensee Marks in a way that may imply that Original Contributor is an -agency or branch of Licensee. Original Contributor understands and -agrees that the use of any Licensee Marks in connection with this -Agreement shall not create any right, title or interest, in, or to the -Licensee Marks or any Licensee trademarks and that all such use and -goodwill associated with any such trademarks will inure to the benefit -of Licensee. Further the Original Contributor will stop usage of the -Licensee Marks upon Licensee's request. - -8.10 Press Announcements. - -You may make press announcements or other public statements regarding -this License without the prior written consent of the Original -Contributor, if Your statement is limited to announcing the licensing of -the Covered Code or the availability of Your Product and its -compatibility with the Covered Code. All other public announcements -regarding this license require the prior written consent of the Original -Contributor. Consent requests are welcome at press@helixcommunity.org. - -8.11 International Use. - -a) Export/Import laws. Covered Code is subject to U.S. export control -laws and may be subject to export or import regulations in other -countries. Each party agrees to comply strictly with all such laws and -regulations and acknowledges their responsibility to obtain such -licenses to export, re-export, or import as may be required. You agree -to pass these obligations to Your licensees. - -b) Intellectual Property Protection. Due to limited intellectual -property protection and enforcement in certain countries, You agree not -to redistribute the Original Code, Upgraded Code, TCK and Specifications -to any country on the list of restricted countries on the Community Web -Server. - -8.12 Language. - -This License is in the English language only, which language shall be -controlling in all respects, and all versions of this License in any -other language shall be for accommodation only and shall not be binding -on the parties to this License. All communications and notices made or -given pursuant to this License, and all documentation and support to be -provided, unless otherwise noted, shall be in the English language. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH REALNETWORKS, INC. IF YOU ARE AGREEING -TO THIS LICENSE ON BEHALF OF A COMPANY, YOU REPRESENT THAT YOU ARE -AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. WHETHER YOU ARE ACTING -ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, YOU MUST BE OF MAJORITY -AGE AND BE OTHERWISE COMPETENT TO ENTER INTO CONTRACTS. IF YOU DO NOT -MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY OF THE TERMS AND -CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON TO EXIT. - - - GLOSSARY - -1. *"Added Value"* means code which: - -(i) has a principal purpose which is substantially different from that -of the stand-alone Technology; - -(ii) represents a significant functional and value enhancement to the -Technology; - -(iii) operates in conjunction with the Technology; and - -(iv) is not marketed as a technology which replaces or substitutes for -the Technology - -2. "*Applicable Patent Rights*" mean: (a) in the case where Original -Contributor is the grantor of rights, claims of patents that (i) are now -or hereafter acquired, owned by or assigned to Original Contributor and -(ii) are necessarily infringed by using or making the Original Code or -Upgraded Code, including Modifications provided by Original Contributor, -alone and not in combination with other software or hardware; and (b) in -the case where Licensee is the grantor of rights, claims of patents that -(i) are now or hereafter acquired, owned by or assigned to Licensee and -(ii) are infringed (directly or indirectly) by using or making -Licensee's Modifications or Error Corrections, taken alone or in -combination with Covered Code. - -3. "*Application Programming Interfaces (APIs)"* means the interfaces, -associated header files, service provider interfaces, and protocols that -enable a device, application, Operating System, or other program to -obtain services from or make requests of (or provide services in -response to requests from) other programs, and to use, benefit from, or -rely on the resources, facilities, and capabilities of the relevant -programs using the APIs. APIs includes the technical documentation -describing the APIs, the Source Code constituting the API, and any -Header Files used with the APIs. - -4. "*Commercial Use*" means any use (internal or external), copying, -sublicensing or distribution (internal or external), directly or -indirectly of Covered Code by You other than Your Research Use of -Covered Code within Your business or organization or in conjunction with -other Licensees with equivalent Research Use rights. Commercial Use -includes any use of the Covered Code for direct or indirect commercial -or strategic gain, advantage or other business purpose. Any Commercial -Use requires execution of Attachment D by You and Original Contributor. - -5. "*Community Code*" means the Original Code, Upgraded Code, Error -Corrections, Shared Modifications, or any combination thereof. - -6. "*Community Webserver(s)"* means the webservers designated by -Original Contributor for access to the Original Code, Upgraded Code, TCK -and Specifications and for posting Error Corrections and Shared -Modifications. - -7. "*Compliant Covered Code*" means Covered Code that complies with the -requirements of the TCK. - -8. "*Contributor*" means each Licensee that creates or contributes to -the creation of any Error Correction or Shared Modification. - -9. "*Covered Code*" means the Original Code, Upgraded Code, -Modifications, or any combination thereof. - -10. "*Error Correction*" means any change made to Community Code which -conforms to the Specification and corrects the adverse effect of a -failure of Community Code to perform any function set forth in or -required by the Specifications. - -11. "*Executable*" means Covered Code that has been converted from -Source Code to the preferred form for execution by a computer or digital -processor (e.g. binary form). - -12. "*Extension(s)"* means any additional Interfaces developed by or for -You which: (i) are designed for use with the Technology; (ii) constitute -an API for a library of computing functions or services; and (iii) are -disclosed or otherwise made available to third party software developers -for the purpose of developing software which invokes such additional -Interfaces. The foregoing shall not apply to software developed by Your -subcontractors to be exclusively used by You. - -13. "*Header File(s)"* means that portion of the Source Code that -provides the names and types of member functions, data members, class -definitions, and interface definitions necessary to implement the APIs -for the Covered Code. Header Files include, files specifically -designated by Original Contributor as Header Files. Header Files do not -include the code necessary to implement the functionality underlying the -Interface. - -14. *"Helix DNA Server Technology"* means the program(s) that implement -the Helix Universal Server streaming engine for the Technology as -defined in the Specification. - -15. *"Helix DNA Client Technology"* means the Covered Code that -implements the RealOne Player engine as defined in the Specification. - -16. *"Helix DNA Producer Technology"* means the Covered Code that -implements the Helix Producer engine as defined in the Specification. - -17. *"Helix DNA Technology"* means the Helix DNA Server Technology, the -Helix DNA Client Technology, the Helix DNA Producer Technology and other -Helix technologies designated by Original Contributor. - -18. "*Intellectual Property Rights*" means worldwide statutory and -common law rights associated solely with (i) Applicable Patent Rights; -(ii) works of authorship including copyrights, copyright applications, -copyright registrations and "moral rights"; (iii) the protection of -trade and industrial secrets and confidential information; and (iv) -divisions, continuations, renewals, and re-issuances of the foregoing -now existing or acquired in the future. - -19. *"Interface*" means interfaces, functions, properties, class -definitions, APIs, Header Files, GUIDs, V-Tables, and/or protocols -allowing one piece of software, firmware or hardware to communicate or -interoperate with another piece of software, firmware or hardware. - -20. "*Internal Deployment Use*" means use of Compliant Covered Code -(excluding Research Use) within Your business or organization only by -Your employees and/or agents on behalf of Your business or organization, -but not to provide services, including content distribution, to third -parties, subject to execution of Attachment D by You and Original -Contributor, if required. - -21. "*Licensee*" means any party that has entered into and has in effect -a version of this License with Original Contributor. - -22. "*MIME type*" means a description of what type of media or other -content is in a file, including by way of example but not limited to -'audio/x-pn-realaudio-plugin.' - -23. "*Modification(s)"* means (i) any addition to, deletion from and/or -change to the substance and/or structure of the Covered Code, including -Interfaces; (ii) the combination of any Covered Code and any previous -Modifications; (iii) any new file or other representation of computer -program statements that contains any portion of Covered Code; and/or -(iv) any new Source Code implementing any portion of the Specifications. - -24. "*MP3 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Picture Experts Group known as MPEG-1 Audio Layer-3 or MP3, -including but not limited to all past and future versions, profiles, -extensions, parts and amendments relating to the MP3 specification. - -25. "*MPEG-4 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Pictures Experts Group known as MPEG-4, including but not -limited to all past and future versions, profiles, extensions, parts and -amendments relating to the MPEG-4 specification. - -26. "*Original Code*" means the initial Source Code for the Technology -as described on the Community Web Server. - -27. "*Original Contributor*" means RealNetworks, Inc., its affiliates -and its successors and assigns. - -28. "*Original Contributor MIME Type*" means the MIME registry, browser -preferences, or local file/protocol associations invoking any Helix DNA -Client-based application, including the RealOne Player, for playback of -RealAudio, RealVideo, other RealMedia MIME types or datatypes (e.g., -.ram, .rnx, .rpm, .ra, .rm, .rp, .rt, .rf, .prx, .mpe, .rmp, .rmj, .rav, -.rjs, .rmx, .rjt, .rms), and any other Original Contributor-specific or -proprietary MIME types that Original Contributor may introduce in the -future. - -29. "*Personal Use*" means use of Covered Code by an individual solely -for his or her personal, private and non-commercial purposes. An -individual's use of Covered Code in his or her capacity as an officer, -employee, member, independent contractor or agent of a corporation, -business or organization (commercial or non-commercial) does not qualify -as Personal Use. - -30. "*RealMedia File Format*" means the file format designed and -developed by RealNetworks for storing multimedia data and used to store -RealAudio and RealVideo encoded streams. Valid RealMedia File Format -extensions include: .rm, .rmj, .rmc, .rmvb, .rms. - -31. "*RCSL Webpage*" means the RealNetworks Community Source License -webpage located at https://www.helixcommunity.org/content/rcsl or such -other URL that Original Contributor may designate from time to time. - -32. "*Reformatted Specifications*" means any revision to the -Specifications which translates or reformats the Specifications (as for -example in connection with Your documentation) but which does not alter, -subset or superset * *the functional or operational aspects of the -Specifications. - -33. "*Research Use*" means use and distribution of Covered Code only for -Your Personal Use, research or development use and expressly excludes -Internal Deployment Use and Commercial Use. Research Use also includes -use of Covered Code to teach individuals how to use Covered Code. - -34. "*Shared Modifications*" means Modifications that You distribute or -use for a Commercial Use, in addition to any Modifications provided by -You, at Your option, pursuant to Section 2.2, or received by You from a -Contributor pursuant to Section 2.3. - -35. "*Source Code*" means the preferred form of the Covered Code for -making modifications to it, including all modules it contains, plus any -associated interface definition files, scripts used to control -compilation and installation of an Executable, or source code -differential comparisons against either the Original Code or another -well known, available Covered Code of the Contributor's choice. The -Source Code can be in a compressed or archival form, provided the -appropriate decompression or de-archiving software is widely available -for no charge. - -36. "*Specifications*" means the specifications for the Technology and -other documentation, as designated on the Community Web Server, as may -be revised by Original Contributor from time to time. - -37. "*Trademarks*" means Original Contributor's trademarks and logos, -including, but not limited to, RealNetworks, RealAudio, RealVideo, -RealOne, RealSystem, SureStream, Helix, Helix DNA and other trademarks -whether now used or adopted in the future. - -38. "*Technology*" means the technology described in Attachment B, and -Upgrades. - -39. "*Technology Compatibility Kit"* or *"TCK*" means the test programs, -procedures, acceptance criteria and/or other requirements, designated by -Original Contributor for use in verifying compliance of Covered Code -with the Specifications, in conjunction with the Original Code and -Upgraded Code. Original Contributor may, in its sole discretion and from -time to time, revise a TCK to correct errors and/or omissions and in -connection with Upgrades. - -40. "*Upgrade(s)"* means new versions of Technology designated -exclusively by Original Contributor as an "Upgrade" and released by -Original Contributor from time to time under the terms of the License. - -41. "*Upgraded Code*" means the Source Code and/or Executables for -Upgrades, possibly including Modifications made by Contributors. - -42. *"User's Guide"* means the users guide for the TCK which Original -Contributor makes available to You to provide direction in how to run -the TCK and properly interpret the results, as may be revised by -Original Contributor from time to time. - -43. "*You(r)*" means an individual, or a legal entity acting by and -through an individual or individuals, exercising rights either under -this License or under a future version of this License issued pursuant -to Section 4.1. For legal entities, "You(r)" includes any entity that by -majority voting interest controls, is controlled by, or is under common -control with You. - -44. "*Your Products*" means any (i) hardware products You distribute -integrating the Covered Code; (ii) any software products You distribute -with the Covered Code that utilize the APIs of the Covered Code; or -(iii) any services You provide using the Covered Code. - - - ATTACHMENT A - -REQUIRED NOTICES - - - ATTACHMENT A-1 - -REQUIRED IN ALL CASES - -Notice to be included in header file of all Error Corrections and Shared -Modifications: - -Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved. - -The contents of this file, and the files included with this file, are -subject to the current version of RealNetworks Community Source License -Version 1.1 (the "License"). You may not use this file except in -compliance with the License executed by both You and RealNetworks. You -may obtain a copy of the License at * -https://www.helixcommunity.org/content/rcsl.* You may also obtain a copy -of the License by contacting RealNetworks directly. Please see the -License for the rights, obligations and limitations governing use of the -contents of the file. - -This file is part of the Helix DNA technology. RealNetworks, Inc., is -the developer of the Original code and owns the copyrights in the -portions it created. - -This file, and the files included with this file, are distributed on an -'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, -AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT -LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): - -_______________________________________________ - -Technology Compatibility Kit Test Suite(s) Location: - -________________________________ - - - ATTACHMENT A-2 - -SAMPLE LICENSEE CERTIFICATION - -"By clicking the `Agree' button below, You certify that You are a -Licensee in good standing under the RealNetworks Community Source -License, ("License") and that Your access, use and distribution of code -and information You may obtain at this site is subject to the License. -If You are not a Licensee under the RealNetworks Community Source -License You agree not to download, copy or use the Helix DNA technology. - - - ATTACHMENT A-3 - -REQUIRED STUDENT NOTIFICATION - -"This software and related documentation has been obtained by Your -educational institution subject to the RealNetworks Community Source -License. You have been provided access to the software and related -documentation for use only in connection with your course work and -research activities as a matriculated student of Your educational -institution. Any other use is expressly prohibited. - -THIS SOFTWARE AND RELATED DOCUMENTATION CONTAINS PROPRIETARY MATERIAL OF -REALNETWORKS, INC, WHICH ARE PROTECTED BY VARIOUS INTELLECTUAL PROPERTY -RIGHTS. - -You may not use this file except in compliance with the License. You may -obtain a copy of the License on the web at -https://www.helixcommunity.org/content/rcsl. - -* -* - - - ATTACHMENT B - -Description of Technology - -Helix DNA, which consists of Helix DNA Client, Helix DNA Server and -Helix DNA Producer. - -Description of "Technology" - -Helix DNA Technology v1.0 as described on the Community Web Server. - - - ATTACHMENT C - -TECHNOLOGY COMPATIBILITY KIT LICENSE - -The following license is effective for the *Helix DNA* Technology -Compatibility Kit - as described on the Community Web Server. The -Technology Compatibility Kit(s) for the Technology specified in -Attachment B may be accessed at the Community Web Server. - -1. TCK License. - -1.1 Grants to use TCK - -Subject to the terms and restrictions set forth below and the -RealNetworks Community Source License, and the Research Use license, -Original Contributor grants to You a worldwide, non-exclusive, -non-transferable license, to the extent of Original Contributor's -Intellectual Property Rights in the TCK (without the right to -sublicense), to use the TCK to develop and test Covered Code. - -1.2 TCK Use Restrictions. - -You are not authorized to create derivative works of the TCK or use the -TCK to test any implementation of the Specification that is not Covered -Code. You may not publish Your test results or make claims of -comparative compatibility with respect to other implementations of the -Specification. In consideration for the license grant in Section 1.1 -above You agree not to develop Your own tests that are intended to -validate conformation with the Specification. - -2. Test Results. - -You agree to provide to Original Contributor or the third party test -facility if applicable, Your test results that demonstrate that Covered -Code is Compliant Covered Code and that Original Contributor may publish -or otherwise distribute such test results. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH THE ORIGINAL CONTRIBUTOR, REALNETWORKS, -INC. IF YOU ARE AGREEING TO THIS LICENSE ON BEHALF OF A COMPANY, YOU -REPRESENT THAT YOU ARE AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. -WHETHER YOU ARE ACTING ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, -YOU MUST BE OF MAJORITY AGE AND BE OTHERWISE COMPETENT TO ENTER INTO -CONTRACTS. IF YOU DO NOT MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY -OF THE TERMS AND CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON -TO EXIT. - -*ACCEPT / REJECT -* - -* -* - -*To agree to the R&D/academic terms of this license, please register - on the site -- -you will then be given a chance to agree to the clickwrap RCSL - -R&D License - -and gain access to the RCSL-licensed source code. To build or deploy -commercial applications based on the RCSL, you will need to agree to the -Commercial Use license attachments -* - - - diff --git a/bsp/stm32_radio/mp3/real/arm/RPSL.txt b/bsp/stm32_radio/mp3/real/arm/RPSL.txt deleted file mode 100644 index d040a45205..0000000000 --- a/bsp/stm32_radio/mp3/real/arm/RPSL.txt +++ /dev/null @@ -1,518 +0,0 @@ -RealNetworks Public Source License Version 1.0 -(Rev. Date October 28, 2002) - -1. General Definitions. This License applies to any program or other work which -RealNetworks, Inc., or any other entity that elects to use this license, -("Licensor") makes publicly available and which contains a notice placed by -Licensor identifying such program or work as "Original Code" and stating that it -is subject to the terms of this RealNetworks Public Source License version 1.0 -(or subsequent version thereof) ("License"). You are not required to accept this -License. However, nothing else grants You permission to use, copy, modify or -distribute the software or its derivative works. These actions are prohibited by -law if You do not accept this License. Therefore, by modifying, copying or -distributing the software (or any work based on the software), You indicate your -acceptance of this License to do so, and all its terms and conditions. In -addition, you agree to the terms of this License by clicking the Accept button -or downloading the software. As used in this License: - -1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the -grantor of rights, claims of patents that (i) are now or hereafter acquired, -owned by or assigned to Licensor and (ii) are necessarily infringed by using or -making the Original Code alone and not in combination with other software or -hardware; and (b) in the case where You are the grantor of rights, claims of -patents that (i) are now or hereafter acquired, owned by or assigned to You and -(ii) are infringed (directly or indirectly) by using or making Your -Modifications, taken alone or in combination with Original Code. - -1.2 "Compatible Source License" means any one of the licenses listed on Exhibit -B or at https://www.helixcommunity.org/content/complicense or other licenses -specifically identified by Licensor in writing. Notwithstanding any term to the -contrary in any Compatible Source License, any code covered by any Compatible -Source License that is used with Covered Code must be made readily available in -Source Code format for royalty-free use under the terms of the Compatible Source -License or this License. - -1.3 "Contributor" means any person or entity that creates or contributes to the -creation of Modifications. - -1.4 "Covered Code" means the Original Code, Modifications, the combination of -Original Code and any Modifications, and/or any respective portions thereof. - -1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for -Your internal research and development (R&D) and/or Personal Use, and includes -without limitation, any and all internal use or distribution of Covered Code -within Your business or organization except for R&D use and/or Personal Use, as -well as direct or indirect sublicensing or distribution of Covered Code by You -to any third party in any form or manner. - -1.6 "Derivative Work" means either the Covered Code or any derivative work under -United States copyright law, and including any work containing or including any -portion of the Covered Code or Modifications, either verbatim or with -modifications and/or translated into another language. Derivative Work also -includes any work which combines any portion of Covered Code or Modifications -with code not otherwise governed by the terms of this License. - -1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be -accessed or used by anyone other than You, used to provide any services to -anyone other than You, or used in any way to deliver any content to anyone other -than You, whether the Covered Code is distributed to those parties, made -available as an application intended for use over a computer network, or used to -provide services or otherwise deliver content to anyone other than You. - -1.8. "Interface" means interfaces, functions, properties, class definitions, -APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of -software, firmware or hardware to communicate or interoperate with another piece -of software, firmware or hardware. - -1.9 "Modifications" mean any addition to, deletion from, and/or change to, the -substance and/or structure of the Original Code, any previous Modifications, the -combination of Original Code and any previous Modifications, and/or any -respective portions thereof. When code is released as a series of files, a -Modification is: (a) any addition to or deletion from the contents of a file -containing Covered Code; and/or (b) any new file or other representation of -computer program statements that contains any part of Covered Code. - -1.10 "Original Code" means (a) the Source Code of a program or other work as -originally made available by Licensor under this License, including the Source -Code of any updates or upgrades to such programs or works made available by -Licensor under this License, and that has been expressly identified by Licensor -as such in the header file(s) of such work; and (b) the object code compiled -from such Source Code and originally made available by Licensor under this -License. - -1.11 "Personal Use" means use of Covered Code by an individual solely for his or -her personal, private and non-commercial purposes. An individual's use of -Covered Code in his or her capacity as an officer, employee, member, independent -contractor or agent of a corporation, business or organization (commercial or -non-commercial) does not qualify as Personal Use. - -1.12 "Source Code" means the human readable form of a program or other work that -is suitable for making modifications to it, including all modules it contains, -plus any associated interface definition files, scripts used to control -compilation and installation of an executable (object code). - -1.13 "You" or "Your" means an individual or a legal entity exercising rights -under this License. For legal entities, "You" or "Your" includes any entity -which controls, is controlled by, or is under common control with, You, where -"control" means (a) the power, direct or indirect, to cause the direction or -management of such entity, whether by contract or otherwise, or (b) ownership of -fifty percent (50%) or more of the outstanding shares or beneficial ownership of -such entity. - -2. Permitted Uses; Conditions & Restrictions. Subject to the terms and -conditions of this License, Licensor hereby grants You, effective on the date -You accept this License (via downloading or using Covered Code or otherwise -indicating your acceptance of this License), a worldwide, royalty-free, -non-exclusive copyright license, to the extent of Licensor's copyrights cover -the Original Code, to do the following: - -2.1 You may reproduce, display, perform, modify and Deploy Covered Code, -provided that in each instance: - -(a) You must retain and reproduce in all copies of Original Code the copyright -and other proprietary notices and disclaimers of Licensor as they appear in the -Original Code, and keep intact all notices in the Original Code that refer to -this License; - -(b) You must include a copy of this License with every copy of Source Code of -Covered Code and documentation You distribute, and You may not offer or impose -any terms on such Source Code that alter or restrict this License or the -recipients' rights hereunder, except as permitted under Section 6; - -(c) You must duplicate, to the extent it does not already exist, the notice in -Exhibit A in each file of the Source Code of all Your Modifications, and cause -the modified files to carry prominent notices stating that You changed the files -and the date of any change; - -(d) You must make Source Code of all Your Externally Deployed Modifications -publicly available under the terms of this License, including the license grants -set forth in Section 3 below, for as long as you Deploy the Covered Code or -twelve (12) months from the date of initial Deployment, whichever is longer. You -should preferably distribute the Source Code of Your Deployed Modifications -electronically (e.g. download from a web site); and - -(e) if You Deploy Covered Code in object code, executable form only, You must -include a prominent notice, in the code itself as well as in related -documentation, stating that Source Code of the Covered Code is available under -the terms of this License with information on how and where to obtain such -Source Code. You must also include the Object Code Notice set forth in Exhibit A -in the "about" box or other appropriate place where other copyright notices are -placed, including any packaging materials. - -2.2 You expressly acknowledge and agree that although Licensor and each -Contributor grants the licenses to their respective portions of the Covered Code -set forth herein, no assurances are provided by Licensor or any Contributor that -the Covered Code does not infringe the patent or other intellectual property -rights of any other entity. Licensor and each Contributor disclaim any liability -to You for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, You hereby assume sole responsibility to -secure any other intellectual property rights needed, if any. For example, if a -third party patent license is required to allow You to make, use, sell, import -or offer for sale the Covered Code, it is Your responsibility to acquire such -license(s). - -2.3 Subject to the terms and conditions of this License, Licensor hereby grants -You, effective on the date You accept this License (via downloading or using -Covered Code or otherwise indicating your acceptance of this License), a -worldwide, royalty-free, perpetual, non-exclusive patent license under -Licensor's Applicable Patent Rights to make, use, sell, offer for sale and -import the Covered Code, provided that in each instance you comply with the -terms of this License. - -3. Your Grants. In consideration of, and as a condition to, the licenses granted -to You under this License: - -(a) You grant to Licensor and all third parties a non-exclusive, perpetual, -irrevocable, royalty free license under Your Applicable Patent Rights and other -intellectual property rights owned or controlled by You, to make, sell, offer -for sale, use, import, reproduce, display, perform, modify, distribute and -Deploy Your Modifications of the same scope and extent as Licensor's licenses -under Sections 2.1 and 2.2; and - -(b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide, -royalty-free, perpetual and irrevocable license, under Your Applicable Patent -Rights and other intellectual property rights owned or controlled by You, to -make, use, sell, offer for sale, import, reproduce, display, perform, -distribute, modify or have modified (for Licensor and/or its subsidiaries), -sublicense and distribute Your Modifications, in any form and for any purpose, -through multiple tiers of distribution. - -(c) You agree not use any information derived from Your use and review of the -Covered Code, including but not limited to any algorithms or inventions that may -be contained in the Covered Code, for the purpose of asserting any of Your -patent rights, or assisting a third party to assert any of its patent rights, -against Licensor or any Contributor. - -4. Derivative Works. You may create a Derivative Work by combining Covered Code -with other code not otherwise governed by the terms of this License and -distribute the Derivative Work as an integrated product. In each such instance, -You must make sure the requirements of this License are fulfilled for the -Covered Code or any portion thereof, including all Modifications. - -4.1 You must cause any Derivative Work that you distribute, publish or -Externally Deploy, that in whole or in part contains or is derived from the -Covered Code or any part thereof, to be licensed as a whole at no charge to all -third parties under the terms of this License and no other license except as -provided in Section 4.2. You also must make Source Code available for the -Derivative Work under the same terms as Modifications, described in Sections 2 -and 3, above. - -4.2 Compatible Source Licenses. Software modules that have been independently -developed without any use of Covered Code and which contain no portion of the -Covered Code, Modifications or other Derivative Works, but are used or combined -in any way wtih the Covered Code or any Derivative Work to form a larger -Derivative Work, are exempt from the conditions described in Section 4.1 but -only to the extent that: the software module, including any software that is -linked to, integrated with, or part of the same applications as, the software -module by any method must be wholly subject to one of the Compatible Source -Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the -terms of this License. Thus, the entire Derivative Work must be licensed under a -combination of the RPSL (for Covered Code) and a Compatible Source License for -any independently developed software modules within the Derivative Work. The -foregoing requirement applies even if the Compatible Source License would -ordinarily allow the software module to link with, or form larger works with, -other software that is not subject to the Compatible Source License. For -example, although the Mozilla Public License v1.1 allows Mozilla code to be -combined with proprietary software that is not subject to the MPL, if -MPL-licensed code is used with Covered Code the MPL-licensed code could not be -combined or linked with any code not governed by the MPL. The general intent of -this section 4.2 is to enable use of Covered Code with applications that are -wholly subject to an acceptable open source license. You are responsible for -determining whether your use of software with Covered Code is allowed under Your -license to such software. - -4.3 Mere aggregation of another work not based on the Covered Code with the -Covered Code (or with a work based on the Covered Code) on a volume of a storage -or distribution medium does not bring the other work under the scope of this -License. If You deliver the Covered Code for combination and/or integration with -an application previously provided by You (for example, via automatic updating -technology), such combination and/or integration constitutes a Derivative Work -subject to the terms of this License. - -5. Exclusions From License Grant. Nothing in this License shall be deemed to -grant any rights to trademarks, copyrights, patents, trade secrets or any other -intellectual property of Licensor or any Contributor except as expressly stated -herein. No right is granted to the trademarks of Licensor or any Contributor -even if such marks are included in the Covered Code. Nothing in this License -shall be interpreted to prohibit Licensor from licensing under different terms -from this License any code that Licensor otherwise would have a right to -license. Modifications, Derivative Works and/or any use or combination of -Covered Code with other technology provided by Licensor or third parties may -require additional patent licenses from Licensor which Licensor may grant in its -sole discretion. No patent license is granted separate from the Original Code or -combinations of the Original Code with other software or hardware. - -5.1. Trademarks. This License does not grant any rights to use the trademarks or -trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any -trademark or trade name belonging to any Contributor. No Licensor Marks may be -used to endorse or promote products derived from the Original Code other than as -permitted by the Licensor Trademark Policy defined in Exhibit C. - -6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, -support, indemnity or liability obligations and/or other rights consistent with -the scope of the license granted herein ("Additional Terms") to one or more -recipients of Covered Code. However, You may do so only on Your own behalf and -as Your sole responsibility, and not on behalf of Licensor or any Contributor. -You must obtain the recipient's agreement that any such Additional Terms are -offered by You alone, and You hereby agree to indemnify, defend and hold -Licensor and every Contributor harmless for any liability incurred by or claims -asserted against Licensor or such Contributor by reason of any such Additional -Terms. - -7. Versions of the License. Licensor may publish revised and/or new versions of -this License from time to time. Each version will be given a distinguishing -version number. Once Original Code has been published under a particular version -of this License, You may continue to use it under the terms of that version. You -may also choose to use such Original Code under the terms of any subsequent -version of this License published by Licensor. No one other than Licensor has -the right to modify the terms applicable to Covered Code created under this -License. - -8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part -pre-release, untested, or not fully tested works. The Covered Code may contain -errors that could cause failures or loss of data, and may be incomplete or -contain inaccuracies. You expressly acknowledge and agree that use of the -Covered Code, or any portion thereof, is at Your sole and entire risk. THE -COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF -ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS -"LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY -DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF -SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET -ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH -CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE -COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR -REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR -ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR -WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR -AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You -acknowledge that the Covered Code is not intended for use in high risk -activities, including, but not limited to, the design, construction, operation -or maintenance of nuclear facilities, aircraft navigation, aircraft -communication systems, or air traffic control machines in which case the failure -of the Covered Code could lead to death, personal injury, or severe physical or -environmental damage. Licensor disclaims any express or implied warranty of -fitness for such uses. - -9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT -SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR -YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER -UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT -LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH -CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND -NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME -JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR -CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event -shall Licensor's total liability to You for all damages (other than as may be -required by applicable law) under this License exceed the amount of ten dollars -($10.00). - -10. Ownership. Subject to the licenses granted under this License, each -Contributor retains all rights, title and interest in and to any Modifications -made by such Contributor. Licensor retains all rights, title and interest in and -to the Original Code and any Modifications made by or on behalf of Licensor -("Licensor Modifications"), and such Licensor Modifications will not be -automatically subject to this License. Licensor may, at its sole discretion, -choose to license such Licensor Modifications under this License, or on -different terms from those contained in this License or may choose not to -license them at all. - -11. Termination. - -11.1 Term and Termination. The term of this License is perpetual unless -terminated as provided below. This License and the rights granted hereunder will -terminate: - -(a) automatically without notice from Licensor if You fail to comply with any -term(s) of this License and fail to cure such breach within 30 days of becoming -aware of such breach; - -(b) immediately in the event of the circumstances described in Section 12.5(b); -or - -(c) automatically without notice from Licensor if You, at any time during the -term of this License, commence an action for patent infringement against -Licensor (including by cross-claim or counter claim in a lawsuit); - -(d) upon written notice from Licensor if You, at any time during the term of -this License, commence an action for patent infringement against any third party -alleging that the Covered Code itself (excluding combinations with other -software or hardware) infringes any patent (including by cross-claim or counter -claim in a lawsuit). - -11.2 Effect of Termination. Upon termination, You agree to immediately stop any -further use, reproduction, modification, sublicensing and distribution of the -Covered Code and to destroy all copies of the Covered Code that are in your -possession or control. All sublicenses to the Covered Code which have been -properly granted prior to termination shall survive any termination of this -License. Provisions which, by their nature, should remain in effect beyond the -termination of this License shall survive, including but not limited to Sections -3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for -compensation, indemnity or damages of any sort solely as a result of terminating -this License in accordance with its terms, and termination of this License will -be without prejudice to any other right or remedy of any party. - -12. Miscellaneous. - -12.1 Government End Users. The Covered Code is a "commercial item" as defined in -FAR 2.101. Government software and technical data rights in the Covered Code -include only those rights customarily provided to the public as defined in this -License. This customary commercial license in technical data and software is -provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer -Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical -Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software -or Computer Software Documentation). Accordingly, all U.S. Government End Users -acquire Covered Code with only those rights set forth herein. - -12.2 Relationship of Parties. This License will not be construed as creating an -agency, partnership, joint venture or any other form of legal association -between or among You, Licensor or any Contributor, and You will not represent to -the contrary, whether expressly, by implication, appearance or otherwise. - -12.3 Independent Development. Nothing in this License will impair Licensor's -right to acquire, license, develop, have others develop for it, market and/or -distribute technology or products that perform the same or similar functions as, -or otherwise compete with, Modifications, Derivative Works, technology or -products that You may develop, produce, market or distribute. - -12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any -provision of this License will not be deemed a waiver of future enforcement of -that or any other provision. Any law or regulation which provides that the -language of a contract shall be construed against the drafter will not apply to -this License. - -12.5 Severability. (a) If for any reason a court of competent jurisdiction finds -any provision of this License, or portion thereof, to be unenforceable, that -provision of the License will be enforced to the maximum extent permissible so -as to effect the economic benefits and intent of the parties, and the remainder -of this License will continue in full force and effect. (b) Notwithstanding the -foregoing, if applicable law prohibits or restricts You from fully and/or -specifically complying with Sections 2 and/or 3 or prevents the enforceability -of either of those Sections, this License will immediately terminate and You -must immediately discontinue any use of the Covered Code and destroy all copies -of it that are in your possession or control. - -12.6 Dispute Resolution. Any litigation or other dispute resolution between You -and Licensor relating to this License shall take place in the Seattle, -Washington, and You and Licensor hereby consent to the personal jurisdiction of, -and venue in, the state and federal courts within that District with respect to -this License. The application of the United Nations Convention on Contracts for -the International Sale of Goods is expressly excluded. - -12.7 Export/Import Laws. This software is subject to all export and import laws -and restrictions and regulations of the country in which you receive the Covered -Code and You are solely responsible for ensuring that You do not export, -re-export or import the Covered Code or any direct product thereof in violation -of any such restrictions, laws or regulations, or without all necessary -authorizations. - -12.8 Entire Agreement; Governing Law. This License constitutes the entire -agreement between the parties with respect to the subject matter hereof. This -License shall be governed by the laws of the United States and the State of -Washington. - -Where You are located in the province of Quebec, Canada, the following clause -applies: The parties hereby confirm that they have requested that this License -and all related documents be drafted in English. Les parties ont exigé -que le présent contrat et tous les documents connexes soient -rédigés en anglais. - - EXHIBIT A. - -"Copyright © 1995-2002 -RealNetworks, Inc. and/or its licensors. All Rights Reserved. - -The contents of this file, and the files included with this file, are subject to -the current version of the RealNetworks Public Source License Version 1.0 (the -"RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have -licensed the file under the RealNetworks Community Source License Version 1.0 -(the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which -case the RCSL will apply. You may also obtain the license terms directly from -RealNetworks. You may not use this file except in compliance with the RPSL or, -if you have a valid RCSL with RealNetworks applicable to this file, the RCSL. -Please see the applicable RPSL or RCSL for the rights, obligations and -limitations governing use of the contents of the file. - -This file is part of the Helix DNA Technology. RealNetworks is the developer of -the Original code and owns the copyrights in the portions it created. - -This file, and the files included with this file, is distributed and made -available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR -IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING -WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): ____________________________________ - -Technology Compatibility Kit Test -Suite(s) Location (if licensed under the RCSL): ______________________________ - -Object Code Notice: Helix DNA Client technology included. Copyright (c) -RealNetworks, Inc., 1995-2002. All rights reserved. - - - EXHIBIT B - -Compatible Source Licenses for the RealNetworks Public Source License. The -following list applies to the most recent version of the license as of October -25, 2002, unless otherwise indicated. - -* Academic Free License -* Apache Software License -* Apple Public Source License -* Artistic license -* Attribution Assurance Licenses -* BSD license -* Common Public License (1) -* Eiffel Forum License -* GNU General Public License (GPL) (1) -* GNU Library or "Lesser" General Public License (LGPL) (1) -* IBM Public License -* Intel Open Source License -* Jabber Open Source License -* MIT license -* MITRE Collaborative Virtual Workspace License (CVW License) -* Motosoto License -* Mozilla Public License 1.0 (MPL) -* Mozilla Public License 1.1 (MPL) -* Nokia Open Source License -* Open Group Test Suite License -* Python Software Foundation License -* Ricoh Source Code Public License -* Sun Industry Standards Source License (SISSL) -* Sun Public License -* University of Illinois/NCSA Open Source License -* Vovida Software License v. 1.0 -* W3C License -* X.Net License -* Zope Public License -* zlib/libpng license - -(1) Note: because this license contains certain reciprocal licensing terms that -purport to extend to independently developed code, You may be prohibited under -the terms of this otherwise compatible license from using code licensed under -its terms with Covered Code because Covered Code may only be licensed under the -RealNetworks Public Source License. Any attempt to apply non RPSL license terms, -including without limitation the GPL, to Covered Code is expressly forbidden. -You are responsible for ensuring that Your use of Compatible Source Licensed -code does not violate either the RPSL or the Compatible Source License. - -The latest version of this list can be found at: -https://www.helixcommunity.org/content/complicense - - EXHIBIT C - -RealNetworks' Trademark policy. - -RealNetworks defines the following trademarks collectively as "Licensor -Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem", -"RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other -trademarks or trade names belonging to RealNetworks. - -RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks -except as permitted by and in strict compliance at all times with RealNetworks' -third party trademark usage guidelines which are posted at -http://www.realnetworks.com/info/helixlogo.html. - diff --git a/bsp/stm32_radio/mp3/real/arm/asmmisc.s b/bsp/stm32_radio/mp3/real/arm/asmmisc.s deleted file mode 100644 index d5492cdae3..0000000000 --- a/bsp/stm32_radio/mp3/real/arm/asmmisc.s +++ /dev/null @@ -1,69 +0,0 @@ -;/* ***** BEGIN LICENSE BLOCK ***** -; * Version: RCSL 1.0/RPSL 1.0 -; * -; * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. -; * -; * The contents of this file, and the files included with this file, are -; * subject to the current version of the RealNetworks Public Source License -; * Version 1.0 (the "RPSL") available at -; * http://www.helixcommunity.org/content/rpsl unless you have licensed -; * the file under the RealNetworks Community Source License Version 1.0 -; * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, -; * in which case the RCSL will apply. You may also obtain the license terms -; * directly from RealNetworks. You may not use this file except in -; * compliance with the RPSL or, if you have a valid RCSL with RealNetworks -; * applicable to this file, the RCSL. Please see the applicable RPSL or -; * RCSL for the rights, obligations and limitations governing use of the -; * contents of the file. -; * -; * This file is part of the Helix DNA Technology. RealNetworks is the -; * developer of the Original Code and owns the copyrights in the portions -; * it created. -; * -; * This file, and the files included with this file, is distributed and made -; * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER -; * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, -; * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS -; * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. -; * -; * Technology Compatibility Kit Test Suite(s) Location: -; * http://www.helixcommunity.org/content/tck -; * -; * Contributor(s): -; * -; * ***** END LICENSE BLOCK ***** */ - - - AREA |.text|, CODE, READONLY - THUMB - REQUIRE8 - PRESERVE8 -; int xmp3_MULSHIFT32(int x, int y) - EXPORT xmp3_MULSHIFT32 - EXPORT xmp3_FASTABS - -;.cpu cortex-m3 -;.fpu softvfp -;.syntax unified -;.thumb -;.text - - ; .global xmp3_MULSHIFT32 - ; .thumb_func -xmp3_MULSHIFT32 PROC - smull r2, r0, r1, r0 -; mov pc, lr // KJ changed to BX for Cortex - BX lr - ENDP - - ;.global xmp3_FASTABS - ;.thumb_func -xmp3_FASTABS PROC - mov r1, r0 - mov r0, #0x0 - eor r0, r1, r1, asr # 31 - sub r0, r0, r1, asr # 31 - bx lr - ENDP - - END \ No newline at end of file diff --git a/bsp/stm32_radio/mp3/real/arm/asmpoly.s b/bsp/stm32_radio/mp3/real/arm/asmpoly.s deleted file mode 100644 index 711d562791..0000000000 --- a/bsp/stm32_radio/mp3/real/arm/asmpoly.s +++ /dev/null @@ -1,428 +0,0 @@ -# * -# * Version: RCSL 1.0/RPSL 1.0 -# * -# * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. -# * -# * The contents of this file, and the files included with this file, are -# * subject to the current version of the RealNetworks Public Source License -# * Version 1.0 (the "RPSL") available at -# * http://www.helixcommunity.org/content/rpsl unless you have licensed -# * the file under the RealNetworks Community Source License Version 1.0 -# * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, -# * in which case the RCSL will apply. You may also obtain the license terms -# * directly from RealNetworks. You may not use this file except in -# * compliance with the RPSL or, if you have a valid RCSL with RealNetworks -# * applicable to this file, the RCSL. Please see the applicable RPSL or -# * RCSL for the rights, obligations and limitations governing use of the -# * contents of the file. -# * -# * This file is part of the Helix DNA Technology. RealNetworks is the -# * developer of the Original Code and owns the copyrights in the portions -# * it created. -# * -# * This file, and the files included with this file, is distributed and made -# * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER -# * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, -# * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS -# * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. -# * -# * Technology Compatibility Kit Test Suite(s) Location: -# * http://www.helixcommunity.org/content/tck -# * -# * Contributor(s): -# * -# * ***** END LICENSE BLOCK ***** */ - -.GLOBAL xmp3_PolyphaseStereo -# * kj AREA |.text|, CODE, READONLY - -PCM .req r0 -VB1 .req r1 -COEF .req r2 - -VLO .req r0 @ must push PCM ptr to stack during inner looop -VHI .req r3 @ temp variable - -SUM1LL .req r4 -SUM1LH .req r5 -SUM2LL .req r6 -SUM2LH .req r7 -SUM1RL .req r8 -SUM1RH .req r9 -SUM2RL .req r10 -SUM2RH .req r11 - -CF1 .req r12 -CF2 .req r14 - -SIGN .req r12 @ used for clipping - after discarding CF1 -MAXPOS .req r14 @ used for clipping - after discarding CF2 - -I .req r12 @ overlay loop counter with CF1, SIGN - - GBLA RNDVAL -#RNDVAL SETA (1 << ((32 - 12) + (6 - 1))) - .set RNDVAL,(1 << ((32 - 12) + (6 - 1))) - - # C64TOS - clip 64-bit accumulator to short (no rounding) - # xl, xh = value (lo 32, hi 32) - # input assumed to have 6 fraction bits - # sign = temp variable to use for sign - # maxPos = 0x00007fff (takes 2 instr. to generate - calculating - # once and using repeatedly saves if you do several CTOS in a row) - MACRO - C64TOS $xl, $xh, $sign, $maxPos - - mov $xl, $xl, lsr #(20+6) - orr $xl, $xl, $xh, lsl #(12-6) - mov $sign, $xl, ASR #31 - cmp $sign, $xl, ASR #15 - eorne $xl, $sign, $maxPos - - MEND @ C64TOS - - # MC0S - process 2 taps, 1 sample per channel (sample 0) - # x = vb1 offset - MACRO - MC0S $x - - ldr CF1, [COEF], #4 - ldr CF2, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(23 - $x))] - - smlal SUM1LL, SUM1LH, VLO, CF1 - ldr VLO, [VB1, #(4*(32 + $x))] - rsb CF2, CF2, #0 - smlal SUM1LL, SUM1LH, VHI, CF2 - ldr VHI, [VB1, #(4*(32 + 23 - $x))] - - smlal SUM1RL, SUM1RH, VLO, CF1 - smlal SUM1RL, SUM1RH, VHI, CF2 - - MEND @ MC0S - - # MC1S - process 2 taps, 1 sample per channel (sample 16) - # x = vb1 offset - MACRO - MC1S $x - - ldr CF1, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(32 + $x))] - smlal SUM1LL, SUM1LH, VLO, CF1 - smlal SUM1RL, SUM1RH, VHI, CF1 - - MEND @ MC1S - - # MC2S - process 2 taps, 2 samples per channel - # x = vb1 offset - MACRO - MC2S $x - - # load data as far as possible in advance of using it - ldr CF1, [COEF], #4 - ldr CF2, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(23 - $x))] - - smlal SUM1LL, SUM1LH, VLO, CF1 - smlal SUM2LL, SUM2LH, VLO, CF2 - rsb CF2, CF2, #0 - smlal SUM2LL, SUM2LH, VHI, CF1 - smlal SUM1LL, SUM1LH, VHI, CF2 - - ldr VHI, [VB1, #(4*(32 + 23 - $x))] - ldr VLO, [VB1, #(4*(32 + $x))] - - smlal SUM1RL, SUM1RH, VHI, CF2 - smlal SUM2RL, SUM2RH, VHI, CF1 - rsb CF2, CF2, #0 - smlal SUM1RL, SUM1RH, VLO, CF1 - smlal SUM2RL, SUM2RH, VLO, CF2 - - MEND @ MC2S - -# void PolyphaseStereo(short *pcm, int *vbuf, const int *coefBase) - -xmp3_PolyphaseStereo FUNCTION - EXPORT xmp3_PolyphaseStereo - - stmfd sp!, {r4-r11, r14} @ Push to stack - - # clear out stack space for 2 local variables (4 bytes each) - sub sp, sp, #8 - str PCM, [sp, #4] @ sp[1] = pcm pointer - - # special case, output sample 0 - mov SUM1LL, #RNDVAL @ load rndVal (low 32) - mov SUM1RL, #RNDVAL @ load rndVal (low 32) - mov SUM1LH, #0 - mov SUM1RH, #0 - - MC0S 0 - MC0S 1 - MC0S 2 - MC0S 3 - MC0S 4 - MC0S 5 - MC0S 6 - MC0S 7 - - ldr PCM, [sp, #4] @ load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS - - strh SUM1LL, [PCM, #(2*0)] - strh SUM1RL, [PCM, #(2*1)] - - # special case, output sample 16 - add COEF, COEF, #(4*(256-16)) @ coef = coefBase + 256 (was coefBase + 16 after MC0S block) - add VB1, VB1, #(4*1024) @ vb1 = vbuf + 64*16 - - mov SUM1LL, #RNDVAL @ load rndVal (low 32) - mov SUM1RL, #RNDVAL @ load rndVal (low 32) - mov SUM1LH, #0 - mov SUM1RH, #0 - - MC1S 0 - MC1S 1 - MC1S 2 - MC1S 3 - MC1S 4 - MC1S 5 - MC1S 6 - MC1S 7 - - ldr PCM, [sp, #4] @ load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS - - strh SUM1LL, [PCM, #(2*(2*16+0))] - strh SUM1RL, [PCM, #(2*(2*16+1))] - - # main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 - sub COEF, COEF, #(4*(264-16)) @ coef = coefBase + 16 (was coefBase + 264 after MC1S block) - sub VB1, VB1, #(4*(1024-64)) @ vb1 = vbuf + 64 (was vbuf + 64*16 after MC1S block) - mov I, #15 @ loop counter, count down - add PCM, PCM, #(2*2) @ pcm+=2 - -LoopPS - str I, [sp, #0] @ sp[0] = i (loop counter) - str PCM, [sp, #4] @ sp[1] = pcm (pointer to pcm buffer) - - mov SUM1LL, #RNDVAL @ load rndVal (low 32) - mov SUM1RL, #RNDVAL @ load rndVal (low 32) - mov SUM2LL, #RNDVAL @ load rndVal (low 32) - mov SUM2RL, #RNDVAL @ load rndVal (low 32) - - mov SUM1LH, #0 - mov SUM1RH, #0 - mov SUM2LH, #0 - mov SUM2RH, #0 - - MC2S 0 - MC2S 1 - MC2S 2 - MC2S 3 - MC2S 4 - MC2S 5 - MC2S 6 - MC2S 7 - - add VB1, VB1, #(4*64) @ vb1 += 64 - - ldr PCM, [sp, #4] @ load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - - - #C64TOS $xl, $xh, $sign, $maxPos - -# mov SUM1LL, SUM1LL, lsr #(20+6) -# orr SUM1LL, SUM1LL, SUM1LH, lsl #(12-6) -# mov SIGN, SUM1LL, ASR #31 -# cmp SIGN, SUM1LL, ASR #15 -# eorne SUM1LL,SIGN, MAXPOS - - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS - C64TOS SUM2LL, SUM2LH, SIGN, MAXPOS - C64TOS SUM2RL, SUM2RH, SIGN, MAXPOS - - ldr I, [sp, #0] @ load loop counter - add CF2, PCM, I, lsl #3 @ CF2 = PCM + 4*i (short offset) - strh SUM2LL, [CF2], #2 @ *(pcm + 2*2*i + 0) - strh SUM2RL, [CF2], #2 @ *(pcm + 2*2*i + 1) - - strh SUM1LL, [PCM], #2 @ *(pcm + 0) - strh SUM1RL, [PCM], #2 @ *(pcm + 1) - - subs I, I, #1 - bne LoopPS - - # restore stack pointer - add sp, sp, #8 - - ldmfd sp!, {r4-r11, pc} - ENDFUNC - -## MONO PROCESSING - - # MC0M - process 2 taps, 1 sample (sample 0) - # x = vb1 offset - MACRO - MC0M $x - - ldr CF1, [COEF], #4 - ldr CF2, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(23 - $x))] - - rsb CF2, CF2, #0 - smlal SUM1LL, SUM1LH, VLO, CF1 - smlal SUM1LL, SUM1LH, VHI, CF2 - - MEND @ MC0M - - # MC1M - process 2 taps, 1 sample (sample 16) - # x = vb1 offset - MACRO - MC1M $x - - ldr CF1, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - smlal SUM1LL, SUM1LH, VLO, CF1 - - MEND @ MC1M - - # MC2M - process 2 taps, 2 samples - # x = vb1 offset - MACRO - MC2M $x - - # load data as far as possible in advance of using it - ldr CF1, [COEF], #4 - ldr CF2, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(23 - $x))] - - smlal SUM1LL, SUM1LH, VLO, CF1 - smlal SUM2LL, SUM2LH, VLO, CF2 - rsb CF2, CF2, #0 - smlal SUM1LL, SUM1LH, VHI, CF2 - smlal SUM2LL, SUM2LH, VHI, CF1 - - MEND @ MC2M - -# void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase) - -xmp3_PolyphaseMono FUNCTION - EXPORT xmp3_PolyphaseMono - - stmfd sp!, {r4-r11, r14} - - # clear out stack space for 4 local variables (4 bytes each) - sub sp, sp, #8 - str PCM, [sp, #4] @ sp[1] = pcm pointer - - # special case, output sample 0 - mov SUM1LL, #RNDVAL @ load rndVal (low 32) - mov SUM1LH, #0 - - MC0M 0 - MC0M 1 - MC0M 2 - MC0M 3 - MC0M 4 - MC0M 5 - MC0M 6 - MC0M 7 - - ldr PCM, [sp, #4] @ load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - strh SUM1LL, [PCM, #(2*0)] - - # special case, output sample 16 - add COEF, COEF, #(4*(256-16)) @ coef = coefBase + 256 (was coefBase + 16 after MC0M block) - add VB1, VB1, #(4*1024) @ vb1 = vbuf + 64*16 - - mov SUM1LL, #RNDVAL @ load rndVal (low 32) - mov SUM1LH, #0 - - MC1M 0 - MC1M 1 - MC1M 2 - MC1M 3 - MC1M 4 - MC1M 5 - MC1M 6 - MC1M 7 - - ldr PCM, [sp, #4] @ load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - - strh SUM1LL, [PCM, #(2*16)] - - # main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 - sub COEF, COEF, #(4*(264-16)) @ coef = coefBase + 16 (was coefBase + 264 after MC1M block) - sub VB1, VB1, #(4*(1024-64)) @ vb1 = vbuf + 64 (was vbuf + 64*16 after MC1M block) - mov I, #15 @ loop counter, count down - add PCM, PCM, #(2) @ pcm++ - -LoopPM - str I, [sp, #0] @ sp[0] = i (loop counter) - str PCM, [sp, #4] @ sp[1] = pcm (pointer to pcm buffer) - - mov SUM1LL, #RNDVAL @ load rndVal (low 32) - mov SUM2LL, #RNDVAL @ load rndVal (low 32) - mov SUM1LH, #0 - mov SUM2LH, #0 - - MC2M 0 - MC2M 1 - MC2M 2 - MC2M 3 - MC2M 4 - MC2M 5 - MC2M 6 - MC2M 7 - - add VB1, VB1, #(4*64) @ vb1 += 64 - - ldr PCM, [sp, #4] @ load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - C64TOS SUM2LL, SUM2LH, SIGN, MAXPOS - - ldr I, [sp, #0] @ load loop counter - add CF2, PCM, I, lsl #2 @ CF2 = PCM + 2*i (short offset) - strh SUM2LL, [CF2], #2 @ *(pcm + 2*i + 0) - strh SUM1LL, [PCM], #2 @ *(pcm + 0) # pcm++ - - subs I, I, #1 - bne LoopPM - - # restore stack pointer - add sp, sp, #8 - - ldmfd sp!, {r4-r11, pc} - ENDFUNC - - .END \ No newline at end of file diff --git a/bsp/stm32_radio/mp3/real/arm/asmpoly_thumb2.s b/bsp/stm32_radio/mp3/real/arm/asmpoly_thumb2.s deleted file mode 100644 index ba95530a6c..0000000000 --- a/bsp/stm32_radio/mp3/real/arm/asmpoly_thumb2.s +++ /dev/null @@ -1,384 +0,0 @@ - AREA |.text|, CODE, READONLY, ALIGN=2 - THUMB - REQUIRE8 - PRESERVE8 - -PCM RN r0 -VB1 RN r1 -COEF RN r2 - -VLO RN r0 -VHI RN r3 - -SUM1LL RN r4 -SUM1LH RN r5 -SUM2LL RN r6 -SUM2LH RN r7 -SUM1RL RN r8 -SUM1RH RN r9 -SUM2RL RN r10 -SUM2RH RN r11 - -CF1 RN r12 -CF2 RN r14 - -SIGN RN r12 -MAXPOS RN r14 - -I RN r12 - - GBLA RNDVAL -RNDVAL SETA (1 << ((32 - 12) + (6 - 1))) - - ; C64TOS - clip 64-bit accumulator to short (no rounding) - ; xl, xh = value (lo 32, hi 32) - ; input assumed to have 6 fraction bits - ; sign = temp variable to use for sign - ; maxPos = 0x00007fff (takes 2 instr. to generate - calculating - ; once and using repeatedly saves if you do several CTOS in a row) */ - MACRO - C64TOS $xl, $xh, $sign, $maxPos - - mov $xl, $xl, lsr #(20+6) - orr $xl, $xl, $xh, lsl #(12-6) - mov $sign, $xl, ASR #31 - cmp $sign, $xl, ASR #15 - it ne - eorne $xl, $sign, $maxPos - MEND ; C64TOS - - ; MC0S - process 2 taps, 1 sample per channel (sample 0) */ - ; x = vb1 offset */ - MACRO - MC0S $x - - ldr CF1, [COEF], #4 - ldr CF2, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(23 - $x))] - - smlal SUM1LL, SUM1LH, VLO, CF1 - ldr VLO, [VB1, #(4*(32 + $x))] - rsb CF2, CF2, #0 - smlal SUM1LL, SUM1LH, VHI, CF2 - ldr VHI, [VB1, #(4*(32 + 23 - $x))] - - smlal SUM1RL, SUM1RH, VLO, CF1 - smlal SUM1RL, SUM1RH, VHI, CF2 - - MEND ; MCOS - - ; MC1S - process 2 taps, 1 sample per channel (sample 16) - ; x = vb1 offset - MACRO - MC1S $x - - ldr CF1, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(32 + $x))] - smlal SUM1LL, SUM1LH, VLO, CF1 - smlal SUM1RL, SUM1RH, VHI, CF1 - - MEND ; MC1S - - ; MC2S - process 2 taps, 2 samples per channel - ; x = vb1 offset - MACRO - MC2S $x - - ; load data as far as possible in advance of using it - ldr CF1, [COEF], #4 - ldr CF2, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(23 - $x))] - - smlal SUM1LL, SUM1LH, VLO, CF1 - smlal SUM2LL, SUM2LH, VLO, CF2 - rsb CF2, CF2, #0 - smlal SUM2LL, SUM2LH, VHI, CF1 - smlal SUM1LL, SUM1LH, VHI, CF2 - - ldr VHI, [VB1, #(4*(32 + 23 - $x))] - ldr VLO, [VB1, #(4*(32 + $x))] - - smlal SUM1RL, SUM1RH, VHI, CF2 - smlal SUM2RL, SUM2RH, VHI, CF1 - rsb CF2, CF2, #0 - smlal SUM1RL, SUM1RH, VLO, CF1 - smlal SUM2RL, SUM2RH, VLO, CF2 - - MEND ; MC2S - - -; void PolyphaseStereo(short *pcm, int *vbuf, const int *coefBase) -xmp3_PolyphaseStereo PROC - EXPORT xmp3_PolyphaseStereo - - stmfd sp!, {r4-r11, r14} - - ; clear out stack space for 2 local variables (4 bytes each) - sub sp, sp, #8 - str PCM , [sp, #4] ; sp[1] = pcm pointer - - ; special case, output sample 0 - mov SUM1LL, #RNDVAL ; load rndVal (low 32) - mov SUM1RL, #RNDVAL ; load rndVal (low 32) - mov SUM1LH, #0 - mov SUM1RH, #0 - - MC0S 0 - MC0S 1 - MC0S 2 - MC0S 3 - MC0S 4 - MC0S 5 - MC0S 6 - MC0S 7 - - ldr PCM, [sp, #4] ; load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS - - strh SUM1LL, [PCM, #(2*0)] - strh SUM1RL, [PCM, #(2*1)] - - ; special case, output sample 16 - add COEF, COEF, #(4*(256-16)) ; coef = coefBase + 256 (was coefBase + 16 after MC0S block) - add VB1, VB1, #(4*1024) ; vb1 = vbuf + 64*16 - - mov SUM1LL, #RNDVAL ; load rndVal (low 32) - mov SUM1RL, #RNDVAL ; load rndVal (low 32) - mov SUM1LH, #0 - mov SUM1RH, #0 - - MC1S 0 - MC1S 1 - MC1S 2 - MC1S 3 - MC1S 4 - MC1S 5 - MC1S 6 - MC1S 7 - - ldr PCM, [sp, #4] ; load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS - - strh SUM1LL, [PCM, #(2*(2*16+0))] - strh SUM1RL, [PCM, #(2*(2*16+1))] - - ; main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 - sub COEF, COEF, #(4*(264-16)) ; coef = coefBase + 16 (was coefBase + 264 after MC1S block) - sub VB1, VB1, #(4*(1024-64)) ; vb1 = vbuf + 64 (was vbuf + 64*16 after MC1S block) - mov I, #15 ; loop counter, count down - add PCM, PCM, #(2*2) ; pcm+=2 - -LoopPS - str I, [sp, #0] ; sp[0] = i (loop counter) - str PCM, [sp, #4] ; sp[1] = pcm (pointer to pcm buffer) - - mov SUM1LL, #RNDVAL ; load rndVal (low 32) - mov SUM1RL, #RNDVAL ; load rndVal (low 32) - mov SUM2LL, #RNDVAL ; load rndVal (low 32) - mov SUM2RL, #RNDVAL ; load rndVal (low 32) - - mov SUM1LH, #0 - mov SUM1RH, #0 - mov SUM2LH, #0 - mov SUM2RH, #0 - - MC2S 0 - MC2S 1 - MC2S 2 - MC2S 3 - MC2S 4 - MC2S 5 - MC2S 6 - MC2S 7 - - add VB1, VB1, #(4*64) ; vb1 += 64 - - ldr PCM, [sp, #4] ; load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS - C64TOS SUM2LL, SUM2LH, SIGN, MAXPOS - C64TOS SUM2RL, SUM2RH, SIGN, MAXPOS - - ldr I, [sp, #0] ; load loop counter - add CF2, PCM, I, lsl #3 ; CF2 = PCM + 4*i (short offset) - strh SUM2LL, [CF2], #2 ; *(pcm + 2*2*i + 0) - strh SUM2RL, [CF2], #2 ; *(pcm + 2*2*i + 1) - - strh SUM1LL, [PCM], #2 ; *(pcm + 0) - strh SUM1RL, [PCM], #2 ; *(pcm + 1) - - subs I, I, #1 - bne LoopPS - - ; restore stack pointer - add sp, sp, #8 - - ldmfd sp!, {r4-r11, pc} - - ENDP - -; MONO PROCESSING - - ; MC0M - process 2 taps, 1 sample (sample 0) - ; x = vb1 offset - MACRO - MC0M $x - - ldr CF1, [COEF], #4 - ldr CF2, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(23 - $x))] - - rsb CF2, CF2, #0 - smlal SUM1LL, SUM1LH, VLO, CF1 - smlal SUM1LL, SUM1LH, VHI, CF2 - - MEND ; MC0M - - ; MC1M - process 2 taps, 1 sample (sample 16) - ; x = vb1 offset - MACRO - MC1M $x - - ldr CF1, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - smlal SUM1LL, SUM1LH, VLO, CF1 - - MEND ; MC1M - - ; MC2M - process 2 taps, 2 samples - ; x = vb1 offset - MACRO - MC2M $x - - ; load data as far as possible in advance of using it - ldr CF1, [COEF], #4 - ldr CF2, [COEF], #4 - ldr VLO, [VB1, #(4*($x))] - ldr VHI, [VB1, #(4*(23 - $x))] - - smlal SUM1LL, SUM1LH, VLO, CF1 - smlal SUM2LL, SUM2LH, VLO, CF2 - rsb CF2, CF2, #0 - smlal SUM1LL, SUM1LH, VHI, CF2 - smlal SUM2LL, SUM2LH, VHI, CF1 - - MEND ; MC2M - -; void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase) - -xmp3_PolyphaseMono PROC - EXPORT xmp3_PolyphaseMono - - stmfd sp!, {r4-r11, r14} - - ; clear out stack space for 4 local variables (4 bytes each) - sub sp, sp, #8 - str PCM, [sp, #4] ; sp[1] = pcm pointer - - ; special case, output sample 0 - mov SUM1LL, #RNDVAL ; load rndVal (low 32) - mov SUM1LH, #0 - - MC0M 0 - MC0M 1 - MC0M 2 - MC0M 3 - MC0M 4 - MC0M 5 - MC0M 6 - MC0M 7 - - ldr PCM, [sp, #4] ; load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - strh SUM1LL, [PCM, #(2*0)] - - ; special case, output sample 16 - add COEF, COEF, #(4*(256-16)) ; coef = coefBase + 256 (was coefBase + 16 after MC0M block) - add VB1, VB1, #(4*1024) ; vb1 = vbuf + 64*16 - - mov SUM1LL, #RNDVAL ; load rndVal (low 32) - mov SUM1LH, #0 - - MC1M 0 - MC1M 1 - MC1M 2 - MC1M 3 - MC1M 4 - MC1M 5 - MC1M 6 - MC1M 7 - - ldr PCM, [sp, #4] ; load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - - strh SUM1LL, [PCM, #(2*16)] - - ; main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 - sub COEF, COEF, #(4*(264-16)) ; coef = coefBase + 16 (was coefBase + 264 after MC1M block) - sub VB1, VB1, #(4*(1024-64)) ; vb1 = vbuf + 64 (was vbuf + 64*16 after MC1M block) - mov I, #15 ; loop counter, count down - add PCM, PCM, #(2) ; pcm++ - -LoopPM - str I, [sp, #0] ; sp[0] = i (loop counter) - str PCM, [sp, #4] ; sp[1] = pcm (pointer to pcm buffer) - - mov SUM1LL, #RNDVAL ; load rndVal (low 32) - mov SUM2LL, #RNDVAL ; load rndVal (low 32) - mov SUM1LH, #0 - mov SUM2LH, #0 - - MC2M 0 - MC2M 1 - MC2M 2 - MC2M 3 - MC2M 4 - MC2M 5 - MC2M 6 - MC2M 7 - - add VB1, VB1, #(4*64) ; vb1 += 64 - - ldr PCM, [sp, #4] ; load pcm pointer - mov MAXPOS, #0x7f00 - orr MAXPOS, MAXPOS, #0xff - - C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS - C64TOS SUM2LL, SUM2LH, SIGN, MAXPOS - - ldr I, [sp, #0] ; load loop counter*/ - add CF2, PCM, I, lsl #2 ; CF2 = PCM + 2*i (short offset)*/ - strh SUM2LL, [CF2], #2 ; (pcm + 2*i + 0) - strh SUM1LL, [PCM], #2 ; (pcm + 0) ; pcm++ - - subs I, I, #1 - bne LoopPM - - ; restore stack pointer - add sp, sp, #8 - - ldmfd sp!, {r4-r11, pc} - ENDP - - END diff --git a/bsp/stm32_radio/mp3/real/assembly.h b/bsp/stm32_radio/mp3/real/assembly.h deleted file mode 100644 index 0a3c68444e..0000000000 --- a/bsp/stm32_radio/mp3/real/assembly.h +++ /dev/null @@ -1,282 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * assembly.h - assembly language functions and prototypes for supported platforms - * - * - inline rountines with access to 64-bit multiply results - * - x86 (_WIN32) and ARM (ARM_ADS, _WIN32_WCE) versions included - * - some inline functions are mix of asm and C for speed - * - some functions are in native asm files, so only the prototype is given here - * - * MULSHIFT32(x, y) signed multiply of two 32-bit integers (x and y), returns top 32 bits of 64-bit result - * FASTABS(x) branchless absolute value of signed integer x - * CLZ(x) count leading zeros in x - * MADD64(sum, x, y) (Windows only) sum [64-bit] += x [32-bit] * y [32-bit] - * SHL64(sum, x, y) (Windows only) 64-bit left shift using __int64 - * SAR64(sum, x, y) (Windows only) 64-bit right shift using __int64 - */ - -#ifndef _ASSEMBLY_H -#define _ASSEMBLY_H - -#if (defined _WIN32 && !defined _WIN32_WCE) || (defined __WINS__ && defined _SYMBIAN) || defined(_OPENWAVE_SIMULATOR) || defined(WINCE_EMULATOR) /* Symbian emulator for Ix86 */ - -#pragma warning( disable : 4035 ) /* complains about inline asm not returning a value */ - -static __inline int MULSHIFT32(int x, int y) -{ - __asm { - mov eax, x - imul y - mov eax, edx - } -} - -static __inline int FASTABS(int x) -{ - int sign; - - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; - - return x; -} - -static __inline int CLZ(int x) -{ - int numZeros; - - if (!x) - return (sizeof(int) * 8); - - numZeros = 0; - while (!(x & 0x80000000)) { - numZeros++; - x <<= 1; - } - - return numZeros; -} - -/* MADD64, SHL64, SAR64: - * write in assembly to avoid dependency on run-time lib for 64-bit shifts, muls - * (sometimes compiler thunks to function calls instead of code generating) - * required for Symbian emulator - */ -#ifdef __CW32__ -typedef long long Word64; -#else -typedef __int64 Word64; -#endif - -static __inline Word64 MADD64(Word64 sum, int x, int y) -{ - unsigned int sumLo = ((unsigned int *)&sum)[0]; - int sumHi = ((int *)&sum)[1]; - - __asm { - mov eax, x - imul y - add eax, sumLo - adc edx, sumHi - } - - /* equivalent to return (sum + ((__int64)x * y)); */ -} - -static __inline Word64 SHL64(Word64 x, int n) -{ - unsigned int xLo = ((unsigned int *)&x)[0]; - int xHi = ((int *)&x)[1]; - unsigned char nb = (unsigned char)n; - - if (n < 32) { - __asm { - mov edx, xHi - mov eax, xLo - mov cl, nb - shld edx, eax, cl - shl eax, cl - } - } else if (n < 64) { - /* shl masks cl to 0x1f */ - __asm { - mov edx, xLo - mov cl, nb - xor eax, eax - shl edx, cl - } - } else { - __asm { - xor edx, edx - xor eax, eax - } - } -} - -static __inline Word64 SAR64(Word64 x, int n) -{ - unsigned int xLo = ((unsigned int *)&x)[0]; - int xHi = ((int *)&x)[1]; - unsigned char nb = (unsigned char)n; - - if (n < 32) { - __asm { - mov edx, xHi - mov eax, xLo - mov cl, nb - shrd eax, edx, cl - sar edx, cl - } - } else if (n < 64) { - /* sar masks cl to 0x1f */ - __asm { - mov edx, xHi - mov eax, xHi - mov cl, nb - sar edx, 31 - sar eax, cl - } - } else { - __asm { - sar xHi, 31 - mov eax, xHi - mov edx, xHi - } - } -} - -#elif (defined _WIN32) && (defined _WIN32_WCE) - -/* use asm function for now (EVC++ 3.0 does horrible job compiling __int64 version) */ -#define MULSHIFT32 xmp3_MULSHIFT32 -int MULSHIFT32(int x, int y); - -static __inline int FASTABS(int x) -{ - int sign; - - sign = x >> (sizeof(int) * 8 - 1); - x ^= sign; - x -= sign; - - return x; -} - -static __inline int CLZ(int x) -{ - int numZeros; - - if (!x) - return (sizeof(int) * 8); - - numZeros = 0; - while (!(x & 0x80000000)) { - numZeros++; - x <<= 1; - } - - return numZeros; -} - -#elif defined ARM_ADS - -typedef long long Word64; - -#define MULSHIFT32 xmp3_MULSHIFT32 -extern int MULSHIFT32(int x, int y); - - -#define FASTABS xmp3_FASTABS -int FASTABS(int x); - - -static __inline int CLZ(int x) -{ - int numZeros; - - if (!x) - return (sizeof(int) * 8); - - numZeros = 0; - while (!(x & 0x80000000)) { - numZeros++; - x <<= 1; - } - - return numZeros; -} - -#elif defined(__GNUC__) && defined(ARM) - -typedef long long Word64; - -#define MULSHIFT32 xmp3_MULSHIFT32 -extern int MULSHIFT32(int x, int y); - - -#define FASTABS xmp3_FASTABS -int FASTABS(int x); - - -static __inline int CLZ(int x) -{ - int numZeros; - - if (!x) - return (sizeof(int) * 8); - - numZeros = 0; - while (!(x & 0x80000000)) { - numZeros++; - x <<= 1; - } - - return numZeros; -} - -#else - -#error Unsupported platform in assembly.h - -#endif /* platforms */ - -#endif /* _ASSEMBLY_H */ diff --git a/bsp/stm32_radio/mp3/real/bitstream.c b/bsp/stm32_radio/mp3/real/bitstream.c deleted file mode 100644 index 608c39cc70..0000000000 --- a/bsp/stm32_radio/mp3/real/bitstream.c +++ /dev/null @@ -1,389 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * bitstream.c - bitstream unpacking, frame header parsing, side info parsing - **************************************************************************************/ - -#include "coder.h" -#include "assembly.h" - -/************************************************************************************** - * Function: SetBitstreamPointer - * - * Description: initialize bitstream reader - * - * Inputs: pointer to BitStreamInfo struct - * number of bytes in bitstream - * pointer to byte-aligned buffer of data to read from - * - * Outputs: filled bitstream info struct - * - * Return: none - **************************************************************************************/ -void SetBitstreamPointer(BitStreamInfo *bsi, int nBytes, unsigned char *buf) -{ - /* init bitstream */ - bsi->bytePtr = buf; - bsi->iCache = 0; /* 4-byte unsigned int */ - bsi->cachedBits = 0; /* i.e. zero bits in cache */ - bsi->nBytes = nBytes; -} - -/************************************************************************************** - * Function: RefillBitstreamCache - * - * Description: read new data from bitstream buffer into bsi cache - * - * Inputs: pointer to initialized BitStreamInfo struct - * - * Outputs: updated bitstream info struct - * - * Return: none - * - * Notes: only call when iCache is completely drained (resets bitOffset to 0) - * always loads 4 new bytes except when bsi->nBytes < 4 (end of buffer) - * stores data as big-endian in cache, regardless of machine endian-ness - * - * TODO: optimize for ARM - * possibly add little/big-endian modes for doing 32-bit loads - **************************************************************************************/ -static __inline void RefillBitstreamCache(BitStreamInfo *bsi) -{ - int nBytes = bsi->nBytes; - - /* optimize for common case, independent of machine endian-ness */ - if (nBytes >= 4) { - bsi->iCache = (*bsi->bytePtr++) << 24; - bsi->iCache |= (*bsi->bytePtr++) << 16; - bsi->iCache |= (*bsi->bytePtr++) << 8; - bsi->iCache |= (*bsi->bytePtr++); - bsi->cachedBits = 32; - bsi->nBytes -= 4; - } else { - bsi->iCache = 0; - while (nBytes--) { - bsi->iCache |= (*bsi->bytePtr++); - bsi->iCache <<= 8; - } - bsi->iCache <<= ((3 - bsi->nBytes)*8); - bsi->cachedBits = 8*bsi->nBytes; - bsi->nBytes = 0; - } -} - -/************************************************************************************** - * Function: GetBits - * - * Description: get bits from bitstream, advance bitstream pointer - * - * Inputs: pointer to initialized BitStreamInfo struct - * number of bits to get from bitstream - * - * Outputs: updated bitstream info struct - * - * Return: the next nBits bits of data from bitstream buffer - * - * Notes: nBits must be in range [0, 31], nBits outside this range masked by 0x1f - * for speed, does not indicate error if you overrun bit buffer - * if nBits = 0, returns 0 (useful for scalefactor unpacking) - * - * TODO: optimize for ARM - **************************************************************************************/ -unsigned int GetBits(BitStreamInfo *bsi, int nBits) -{ - unsigned int data, lowBits; - - nBits &= 0x1f; /* nBits mod 32 to avoid unpredictable results like >> by negative amount */ - data = bsi->iCache >> (31 - nBits); /* unsigned >> so zero-extend */ - data >>= 1; /* do as >> 31, >> 1 so that nBits = 0 works okay (returns 0) */ - bsi->iCache <<= nBits; /* left-justify cache */ - bsi->cachedBits -= nBits; /* how many bits have we drawn from the cache so far */ - - /* if we cross an int boundary, refill the cache */ - if (bsi->cachedBits < 0) { - lowBits = -bsi->cachedBits; - RefillBitstreamCache(bsi); - data |= bsi->iCache >> (32 - lowBits); /* get the low-order bits */ - - bsi->cachedBits -= lowBits; /* how many bits have we drawn from the cache so far */ - bsi->iCache <<= lowBits; /* left-justify cache */ - } - - return data; -} - -/************************************************************************************** - * Function: CalcBitsUsed - * - * Description: calculate how many bits have been read from bitstream - * - * Inputs: pointer to initialized BitStreamInfo struct - * pointer to start of bitstream buffer - * bit offset into first byte of startBuf (0-7) - * - * Outputs: none - * - * Return: number of bits read from bitstream, as offset from startBuf:startOffset - **************************************************************************************/ -int CalcBitsUsed(BitStreamInfo *bsi, unsigned char *startBuf, int startOffset) -{ - int bitsUsed; - - bitsUsed = (bsi->bytePtr - startBuf) * 8; - bitsUsed -= bsi->cachedBits; - bitsUsed -= startOffset; - - return bitsUsed; -} - -/************************************************************************************** - * Function: CheckPadBit - * - * Description: check whether padding byte is present in an MP3 frame - * - * Inputs: MP3DecInfo struct with valid FrameHeader struct - * (filled by UnpackFrameHeader()) - * - * Outputs: none - * - * Return: 1 if pad bit is set, 0 if not, -1 if null input pointer - **************************************************************************************/ -int CheckPadBit(MP3DecInfo *mp3DecInfo) -{ - FrameHeader *fh; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS) - return -1; - - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - - return (fh->paddingBit ? 1 : 0); -} - -/************************************************************************************** - * Function: UnpackFrameHeader - * - * Description: parse the fields of the MP3 frame header - * - * Inputs: buffer pointing to a complete MP3 frame header (4 bytes, plus 2 if CRC) - * - * Outputs: filled frame header info in the MP3DecInfo structure - * updated platform-specific FrameHeader struct - * - * Return: length (in bytes) of frame header (for caller to calculate offset to - * first byte following frame header) - * -1 if null frameHeader or invalid header - * - * TODO: check for valid modes, depending on capabilities of decoder - * test CRC on actual stream (verify no endian problems) - **************************************************************************************/ -int UnpackFrameHeader(MP3DecInfo *mp3DecInfo, unsigned char *buf) -{ - - int verIdx; - FrameHeader *fh; - - /* validate pointers and sync word */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || (buf[0] & SYNCWORDH) != SYNCWORDH || (buf[1] & SYNCWORDL) != SYNCWORDL) - return -1; - - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - - /* read header fields - use bitmasks instead of GetBits() for speed, since format never varies */ - verIdx = (buf[1] >> 3) & 0x03; - fh->ver = (MPEGVersion)( verIdx == 0 ? MPEG25 : ((verIdx & 0x01) ? MPEG1 : MPEG2) ); - fh->layer = 4 - ((buf[1] >> 1) & 0x03); /* easy mapping of index to layer number, 4 = error */ - fh->crc = 1 - ((buf[1] >> 0) & 0x01); - fh->brIdx = (buf[2] >> 4) & 0x0f; - fh->srIdx = (buf[2] >> 2) & 0x03; - fh->paddingBit = (buf[2] >> 1) & 0x01; - fh->privateBit = (buf[2] >> 0) & 0x01; - fh->sMode = (StereoMode)((buf[3] >> 6) & 0x03); /* maps to correct enum (see definition) */ - fh->modeExt = (buf[3] >> 4) & 0x03; - fh->copyFlag = (buf[3] >> 3) & 0x01; - fh->origFlag = (buf[3] >> 2) & 0x01; - fh->emphasis = (buf[3] >> 0) & 0x03; - - /* check parameters to avoid indexing tables with bad values */ - if (fh->srIdx == 3 || fh->layer == 4 || fh->brIdx == 15) - return -1; - - fh->sfBand = &sfBandTable[fh->ver][fh->srIdx]; /* for readability (we reference sfBandTable many times in decoder) */ - if (fh->sMode != Joint) /* just to be safe (dequant, stproc check fh->modeExt) */ - fh->modeExt = 0; - - /* init user-accessible data */ - mp3DecInfo->nChans = (fh->sMode == Mono ? 1 : 2); - mp3DecInfo->samprate = samplerateTab[fh->ver][fh->srIdx]; - mp3DecInfo->nGrans = (fh->ver == MPEG1 ? NGRANS_MPEG1 : NGRANS_MPEG2); - mp3DecInfo->nGranSamps = ((int)samplesPerFrameTab[fh->ver][fh->layer - 1]) / mp3DecInfo->nGrans; - mp3DecInfo->layer = fh->layer; - mp3DecInfo->version = fh->ver; - - /* get bitrate and nSlots from table, unless brIdx == 0 (free mode) in which case caller must figure it out himself - * question - do we want to overwrite mp3DecInfo->bitrate with 0 each time if it's free mode, and - * copy the pre-calculated actual free bitrate into it in mp3dec.c (according to the spec, - * this shouldn't be necessary, since it should be either all frames free or none free) - */ - if (fh->brIdx) { - mp3DecInfo->bitrate = ((int)bitrateTab[fh->ver][fh->layer - 1][fh->brIdx]) * 1000; - - /* nSlots = total frame bytes (from table) - sideInfo bytes - header - CRC (if present) + pad (if present) */ - mp3DecInfo->nSlots = (int)slotTab[fh->ver][fh->srIdx][fh->brIdx] - - (int)sideBytesTab[fh->ver][(fh->sMode == Mono ? 0 : 1)] - - 4 - (fh->crc ? 2 : 0) + (fh->paddingBit ? 1 : 0); - } - - /* load crc word, if enabled, and return length of frame header (in bytes) */ - if (fh->crc) { - fh->CRCWord = ((int)buf[4] << 8 | (int)buf[5] << 0); - return 6; - } else { - fh->CRCWord = 0; - return 4; - } -} - -/************************************************************************************** - * Function: UnpackSideInfo - * - * Description: parse the fields of the MP3 side info header - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader() - * buffer pointing to the MP3 side info data - * - * Outputs: updated mainDataBegin in MP3DecInfo struct - * updated private (platform-specific) SideInfo struct - * - * Return: length (in bytes) of side info data - * -1 if null input pointers - **************************************************************************************/ -int UnpackSideInfo(MP3DecInfo *mp3DecInfo, unsigned char *buf) -{ - int gr, ch, bd, nBytes; - BitStreamInfo bitStreamInfo, *bsi; - FrameHeader *fh; - SideInfo *si; - SideInfoSub *sis; - - /* validate pointers and sync word */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS) - return -1; - - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - si = ((SideInfo *)(mp3DecInfo->SideInfoPS)); - - bsi = &bitStreamInfo; - if (fh->ver == MPEG1) { - /* MPEG 1 */ - nBytes = (fh->sMode == Mono ? SIBYTES_MPEG1_MONO : SIBYTES_MPEG1_STEREO); - SetBitstreamPointer(bsi, nBytes, buf); - si->mainDataBegin = GetBits(bsi, 9); - si->privateBits = GetBits(bsi, (fh->sMode == Mono ? 5 : 3)); - - for (ch = 0; ch < mp3DecInfo->nChans; ch++) - for (bd = 0; bd < MAX_SCFBD; bd++) - si->scfsi[ch][bd] = GetBits(bsi, 1); - } else { - /* MPEG 2, MPEG 2.5 */ - nBytes = (fh->sMode == Mono ? SIBYTES_MPEG2_MONO : SIBYTES_MPEG2_STEREO); - SetBitstreamPointer(bsi, nBytes, buf); - si->mainDataBegin = GetBits(bsi, 8); - si->privateBits = GetBits(bsi, (fh->sMode == Mono ? 1 : 2)); - } - - for(gr =0; gr < mp3DecInfo->nGrans; gr++) { - for (ch = 0; ch < mp3DecInfo->nChans; ch++) { - sis = &si->sis[gr][ch]; /* side info subblock for this granule, channel */ - - sis->part23Length = GetBits(bsi, 12); - sis->nBigvals = GetBits(bsi, 9); - sis->globalGain = GetBits(bsi, 8); - sis->sfCompress = GetBits(bsi, (fh->ver == MPEG1 ? 4 : 9)); - sis->winSwitchFlag = GetBits(bsi, 1); - - if(sis->winSwitchFlag) { - /* this is a start, stop, short, or mixed block */ - sis->blockType = GetBits(bsi, 2); /* 0 = normal, 1 = start, 2 = short, 3 = stop */ - sis->mixedBlock = GetBits(bsi, 1); /* 0 = not mixed, 1 = mixed */ - sis->tableSelect[0] = GetBits(bsi, 5); - sis->tableSelect[1] = GetBits(bsi, 5); - sis->tableSelect[2] = 0; /* unused */ - sis->subBlockGain[0] = GetBits(bsi, 3); - sis->subBlockGain[1] = GetBits(bsi, 3); - sis->subBlockGain[2] = GetBits(bsi, 3); - - /* TODO - check logic */ - if (sis->blockType == 0) { - /* this should not be allowed, according to spec */ - sis->nBigvals = 0; - sis->part23Length = 0; - sis->sfCompress = 0; - } else if (sis->blockType == 2 && sis->mixedBlock == 0) { - /* short block, not mixed */ - sis->region0Count = 8; - } else { - /* start, stop, or short-mixed */ - sis->region0Count = 7; - } - sis->region1Count = 20 - sis->region0Count; - } else { - /* this is a normal block */ - sis->blockType = 0; - sis->mixedBlock = 0; - sis->tableSelect[0] = GetBits(bsi, 5); - sis->tableSelect[1] = GetBits(bsi, 5); - sis->tableSelect[2] = GetBits(bsi, 5); - sis->region0Count = GetBits(bsi, 4); - sis->region1Count = GetBits(bsi, 3); - } - sis->preFlag = (fh->ver == MPEG1 ? GetBits(bsi, 1) : 0); - sis->sfactScale = GetBits(bsi, 1); - sis->count1TableSelect = GetBits(bsi, 1); - } - } - mp3DecInfo->mainDataBegin = si->mainDataBegin; /* needed by main decode loop */ - - ASSERT(nBytes == CalcBitsUsed(bsi, buf, 0) >> 3); - - return nBytes; -} - diff --git a/bsp/stm32_radio/mp3/real/buffers.c b/bsp/stm32_radio/mp3/real/buffers.c deleted file mode 100644 index 690e5cecc1..0000000000 --- a/bsp/stm32_radio/mp3/real/buffers.c +++ /dev/null @@ -1,220 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * buffers.c - allocation and freeing of internal MP3 decoder buffers - * - * All memory allocation for the codec is done in this file, so if you don't want - * to use other the default system malloc() and free() for heap management this is - * the only file you'll need to change. - **************************************************************************************/ - -// J.Sz. 21/04/2006 #include "hlxclib/stdlib.h" /* for malloc, free */ - - -#include "coder.h" - -#define static_buffers -#ifdef static_buffers -MP3DecInfo mp3DecInfo; // 0x7f0 = 2032 -SubbandInfo sbi; // 0x2204 = 8708 -IMDCTInfo mi; // 0x1b20 = 6944 -HuffmanInfo hi; // 0x1210 = 4624 -DequantInfo di; // 0x348 = 840 -ScaleFactorInfo sfi; // 0x124 = 292 -SideInfo si; // 0x148 = 328 -FrameHeader fh; // 0x38 = 56 -#else -#include -#define malloc rt_malloc -#define free rt_free -#endif - -/************************************************************************************** - * Function: ClearBuffer - * - * Description: fill buffer with 0's - * - * Inputs: pointer to buffer - * number of bytes to fill with 0 - * - * Outputs: cleared buffer - * - * Return: none - * - * Notes: slow, platform-independent equivalent to memset(buf, 0, nBytes) - **************************************************************************************/ -void ClearBuffer(void *buf, int nBytes) -{ - int i; - unsigned char *cbuf = (unsigned char *)buf; - - for (i = 0; i < nBytes; i++) - cbuf[i] = 0; - -} - -/************************************************************************************** - * Function: AllocateBuffers - * - * Description: allocate all the memory needed for the MP3 decoder - * - * Inputs: none - * - * Outputs: none - * - * Return: pointer to MP3DecInfo structure (initialized with pointers to all - * the internal buffers needed for decoding, all other members of - * MP3DecInfo structure set to 0) - * - * Notes: if one or more mallocs fail, function frees any buffers already - * allocated before returning - * - * Changed by Kasper Jepsen to support static buffers as well. - * - **************************************************************************************/ -MP3DecInfo *AllocateBuffers(void) -{ - MP3DecInfo *mp3DecInfo_pointer; - #ifdef static_buffers - mp3DecInfo_pointer = (MP3DecInfo*)&mp3DecInfo; - ClearBuffer((void*)&mp3DecInfo, sizeof(MP3DecInfo)); - - mp3DecInfo.FrameHeaderPS = (void*)&fh; - mp3DecInfo.SideInfoPS = (void*)&si; - mp3DecInfo.ScaleFactorInfoPS = (void*)&sfi; - mp3DecInfo.HuffmanInfoPS = (void*)&hi; - mp3DecInfo.DequantInfoPS = (void*)&di; - mp3DecInfo.IMDCTInfoPS = (void*)&mi; - mp3DecInfo.SubbandInfoPS = (void*)&sbi; - - /* important to do this - DSP primitives assume a bunch of state variables are 0 on first use */ - ClearBuffer((void*)&fh, sizeof(FrameHeader)); - ClearBuffer((void*)&si, sizeof(SideInfo)); - ClearBuffer((void*)&sfi, sizeof(ScaleFactorInfo)); - ClearBuffer((void*)&hi, sizeof(HuffmanInfo)); - ClearBuffer((void*)&di, sizeof(DequantInfo)); - ClearBuffer((void*)&mi, sizeof(IMDCTInfo)); - ClearBuffer((void*)&sbi, sizeof(SubbandInfo)); - // return mp3DecInfo_pointer; - - #else - FrameHeader *fh; - SideInfo *si; - ScaleFactorInfo *sfi; - HuffmanInfo *hi; - DequantInfo *di; - IMDCTInfo *mi; - SubbandInfo *sbi; - - mp3DecInfo_pointer = (MP3DecInfo *)malloc(sizeof(MP3DecInfo)); - if (!mp3DecInfo_pointer) - return 0; - ClearBuffer(mp3DecInfo_pointer, sizeof(MP3DecInfo)); - - fh = (FrameHeader *) malloc(sizeof(FrameHeader)); - si = (SideInfo *) malloc(sizeof(SideInfo)); - sfi = (ScaleFactorInfo *) malloc(sizeof(ScaleFactorInfo)); - hi = (HuffmanInfo *) malloc(sizeof(HuffmanInfo)); - di = (DequantInfo *) malloc(sizeof(DequantInfo)); - mi = (IMDCTInfo *) malloc(sizeof(IMDCTInfo)); - sbi = (SubbandInfo *) malloc(sizeof(SubbandInfo)); - - mp3DecInfo_pointer->FrameHeaderPS = (void *)fh; - mp3DecInfo_pointer->SideInfoPS = (void *)si; - mp3DecInfo_pointer->ScaleFactorInfoPS = (void *)sfi; - mp3DecInfo_pointer->HuffmanInfoPS = (void *)hi; - mp3DecInfo_pointer->DequantInfoPS = (void *)di; - mp3DecInfo_pointer->IMDCTInfoPS = (void *)mi; - mp3DecInfo_pointer->SubbandInfoPS = (void *)sbi; - - if (!fh || !si || !sfi || !hi || !di || !mi || !sbi) { - FreeBuffers(mp3DecInfo_pointer); /* safe to call - only frees memory that was successfully allocated */ - return 0; - } - - /* important to do this - DSP primitives assume a bunch of state variables are 0 on first use */ - //Optimized away.. hmm - ClearBuffer(fh, sizeof(FrameHeader)); - ClearBuffer(si, sizeof(SideInfo)); - ClearBuffer(sfi, sizeof(ScaleFactorInfo)); - ClearBuffer(hi, sizeof(HuffmanInfo)); - ClearBuffer(di, sizeof(DequantInfo)); - ClearBuffer(mi, sizeof(IMDCTInfo)); - ClearBuffer(sbi, sizeof(SubbandInfo)); - -#endif - return mp3DecInfo_pointer; -} - - -#ifndef static_buffers -#define SAFE_FREE(x) {if (x) free(x); (x) = 0;} /* helper macro */ -#endif - -/************************************************************************************** - * Function: FreeBuffers - * - * Description: frees all the memory used by the MP3 decoder - * - * Inputs: pointer to initialized MP3DecInfo structure - * - * Outputs: none - * - * Return: none - * - * Notes: safe to call even if some buffers were not allocated (uses SAFE_FREE) - **************************************************************************************/ -void FreeBuffers(MP3DecInfo *mp3DecInfo) -{ -#ifndef static_buffers - if (!mp3DecInfo) - return; - - SAFE_FREE(mp3DecInfo->FrameHeaderPS); - SAFE_FREE(mp3DecInfo->SideInfoPS); - SAFE_FREE(mp3DecInfo->ScaleFactorInfoPS); - SAFE_FREE(mp3DecInfo->HuffmanInfoPS); - SAFE_FREE(mp3DecInfo->DequantInfoPS); - SAFE_FREE(mp3DecInfo->IMDCTInfoPS); - SAFE_FREE(mp3DecInfo->SubbandInfoPS); - - SAFE_FREE(mp3DecInfo); -#endif -} diff --git a/bsp/stm32_radio/mp3/real/buffers.c.bak b/bsp/stm32_radio/mp3/real/buffers.c.bak deleted file mode 100644 index 7e1af937a2..0000000000 --- a/bsp/stm32_radio/mp3/real/buffers.c.bak +++ /dev/null @@ -1,170 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * buffers.c - allocation and freeing of internal MP3 decoder buffers - * - * All memory allocation for the codec is done in this file, so if you don't want - * to use other the default system malloc() and free() for heap management this is - * the only file you'll need to change. - **************************************************************************************/ - -#include "hlxclib/stdlib.h" /* for malloc, free */ -#include "coder.h" - -/************************************************************************************** - * Function: ClearBuffer - * - * Description: fill buffer with 0's - * - * Inputs: pointer to buffer - * number of bytes to fill with 0 - * - * Outputs: cleared buffer - * - * Return: none - * - * Notes: slow, platform-independent equivalent to memset(buf, 0, nBytes) - **************************************************************************************/ -static void ClearBuffer(void *buf, int nBytes) -{ - int i; - unsigned char *cbuf = (unsigned char *)buf; - - for (i = 0; i < nBytes; i++) - cbuf[i] = 0; - - return; -} - -/************************************************************************************** - * Function: AllocateBuffers - * - * Description: allocate all the memory needed for the MP3 decoder - * - * Inputs: none - * - * Outputs: none - * - * Return: pointer to MP3DecInfo structure (initialized with pointers to all - * the internal buffers needed for decoding, all other members of - * MP3DecInfo structure set to 0) - * - * Notes: if one or more mallocs fail, function frees any buffers already - * allocated before returning - **************************************************************************************/ -MP3DecInfo *AllocateBuffers(void) -{ - MP3DecInfo *mp3DecInfo; - FrameHeader *fh; - SideInfo *si; - ScaleFactorInfo *sfi; - HuffmanInfo *hi; - DequantInfo *di; - IMDCTInfo *mi; - SubbandInfo *sbi; - - mp3DecInfo = (MP3DecInfo *)malloc(sizeof(MP3DecInfo)); - if (!mp3DecInfo) - return 0; - ClearBuffer(mp3DecInfo, sizeof(MP3DecInfo)); - - fh = (FrameHeader *) malloc(sizeof(FrameHeader)); - si = (SideInfo *) malloc(sizeof(SideInfo)); - sfi = (ScaleFactorInfo *) malloc(sizeof(ScaleFactorInfo)); - hi = (HuffmanInfo *) malloc(sizeof(HuffmanInfo)); - di = (DequantInfo *) malloc(sizeof(DequantInfo)); - mi = (IMDCTInfo *) malloc(sizeof(IMDCTInfo)); - sbi = (SubbandInfo *) malloc(sizeof(SubbandInfo)); - - mp3DecInfo->FrameHeaderPS = (void *)fh; - mp3DecInfo->SideInfoPS = (void *)si; - mp3DecInfo->ScaleFactorInfoPS = (void *)sfi; - mp3DecInfo->HuffmanInfoPS = (void *)hi; - mp3DecInfo->DequantInfoPS = (void *)di; - mp3DecInfo->IMDCTInfoPS = (void *)mi; - mp3DecInfo->SubbandInfoPS = (void *)sbi; - - if (!fh || !si || !sfi || !hi || !di || !mi || !sbi) { - FreeBuffers(mp3DecInfo); /* safe to call - only frees memory that was successfully allocated */ - return 0; - } - - /* important to do this - DSP primitives assume a bunch of state variables are 0 on first use */ - ClearBuffer(fh, sizeof(FrameHeader)); - ClearBuffer(si, sizeof(SideInfo)); - ClearBuffer(sfi, sizeof(ScaleFactorInfo)); - ClearBuffer(hi, sizeof(HuffmanInfo)); - ClearBuffer(di, sizeof(DequantInfo)); - ClearBuffer(mi, sizeof(IMDCTInfo)); - ClearBuffer(sbi, sizeof(SubbandInfo)); - - return mp3DecInfo; -} - -#define SAFE_FREE(x) {if (x) free(x); (x) = 0;} /* helper macro */ - -/************************************************************************************** - * Function: FreeBuffers - * - * Description: frees all the memory used by the MP3 decoder - * - * Inputs: pointer to initialized MP3DecInfo structure - * - * Outputs: none - * - * Return: none - * - * Notes: safe to call even if some buffers were not allocated (uses SAFE_FREE) - **************************************************************************************/ -void FreeBuffers(MP3DecInfo *mp3DecInfo) -{ - if (!mp3DecInfo) - return; - - SAFE_FREE(mp3DecInfo->FrameHeaderPS); - SAFE_FREE(mp3DecInfo->SideInfoPS); - SAFE_FREE(mp3DecInfo->ScaleFactorInfoPS); - SAFE_FREE(mp3DecInfo->HuffmanInfoPS); - SAFE_FREE(mp3DecInfo->DequantInfoPS); - SAFE_FREE(mp3DecInfo->IMDCTInfoPS); - SAFE_FREE(mp3DecInfo->SubbandInfoPS); - - SAFE_FREE(mp3DecInfo); -} diff --git a/bsp/stm32_radio/mp3/real/coder.h b/bsp/stm32_radio/mp3/real/coder.h deleted file mode 100644 index 9c4d57064b..0000000000 --- a/bsp/stm32_radio/mp3/real/coder.h +++ /dev/null @@ -1,306 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * coder.h - private, implementation-specific header file - **************************************************************************************/ - -#ifndef _CODER_H -#define _CODER_H - -#include "mp3common.h" - -#if defined(ASSERT) -#undef ASSERT -#endif -#if defined(_WIN32) && defined(_M_IX86) && (defined (_DEBUG) || defined (REL_ENABLE_ASSERTS)) -#define ASSERT(x) if (!(x)) __asm int 3; -#else -#define ASSERT(x) /* do nothing */ -#endif - -#ifndef MAX -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#endif - -#ifndef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#endif - -/* clip to range [-2^n, 2^n - 1] */ -#define CLIP_2N(y, n) { \ - int sign = (y) >> 31; \ - if (sign != (y) >> (n)) { \ - (y) = sign ^ ((1 << (n)) - 1); \ - } \ -} - -#define SIBYTES_MPEG1_MONO 17 -#define SIBYTES_MPEG1_STEREO 32 -#define SIBYTES_MPEG2_MONO 9 -#define SIBYTES_MPEG2_STEREO 17 - -/* number of fraction bits for pow43Tab (see comments there) */ -#define POW43_FRACBITS_LOW 22 -#define POW43_FRACBITS_HIGH 12 - -#define DQ_FRACBITS_OUT 25 /* number of fraction bits in output of dequant */ -#define IMDCT_SCALE 2 /* additional scaling (by sqrt(2)) for fast IMDCT36 */ - -#define HUFF_PAIRTABS 32 -#define BLOCK_SIZE 18 -#define NBANDS 32 -#define MAX_REORDER_SAMPS ((192-126)*3) /* largest critical band for short blocks (see sfBandTable) */ -#define VBUF_LENGTH (17 * 2 * NBANDS) /* for double-sized vbuf FIFO */ - -/* additional external symbols to name-mangle for static linking */ -#define SetBitstreamPointer STATNAME(SetBitstreamPointer) -#define GetBits STATNAME(GetBits) -#define CalcBitsUsed STATNAME(CalcBitsUsed) -#define DequantChannel STATNAME(DequantChannel) -#define MidSideProc STATNAME(MidSideProc) -#define IntensityProcMPEG1 STATNAME(IntensityProcMPEG1) -#define IntensityProcMPEG2 STATNAME(IntensityProcMPEG2) -#define PolyphaseMono STATNAME(PolyphaseMono) -#define PolyphaseStereo STATNAME(PolyphaseStereo) -#define FDCT32 STATNAME(FDCT32) - -#define ISFMpeg1 STATNAME(ISFMpeg1) -#define ISFMpeg2 STATNAME(ISFMpeg2) -#define ISFIIP STATNAME(ISFIIP) -#define uniqueIDTab STATNAME(uniqueIDTab) -#define coef32 STATNAME(coef32) -#define polyCoef STATNAME(polyCoef) -#define csa STATNAME(csa) -#define imdctWin STATNAME(imdctWin) - -#define huffTable STATNAME(huffTable) -#define huffTabOffset STATNAME(huffTabOffset) -#define huffTabLookup STATNAME(huffTabLookup) -#define quadTable STATNAME(quadTable) -#define quadTabOffset STATNAME(quadTabOffset) -#define quadTabMaxBits STATNAME(quadTabMaxBits) - -/* map these to the corresponding 2-bit values in the frame header */ -typedef enum { - Stereo = 0x00, /* two independent channels, but L and R frames might have different # of bits */ - Joint = 0x01, /* coupled channels - layer III: mix of M-S and intensity, Layers I/II: intensity and direct coding only */ - Dual = 0x02, /* two independent channels, L and R always have exactly 1/2 the total bitrate */ - Mono = 0x03 /* one channel */ -} StereoMode; - -typedef struct _BitStreamInfo { - unsigned char *bytePtr; - unsigned int iCache; - int cachedBits; - int nBytes; -} BitStreamInfo; - -typedef struct _FrameHeader { - MPEGVersion ver; /* version ID */ - int layer; /* layer index (1, 2, or 3) */ - int crc; /* CRC flag: 0 = disabled, 1 = enabled */ - int brIdx; /* bitrate index (0 - 15) */ - int srIdx; /* sample rate index (0 - 2) */ - int paddingBit; /* padding flag: 0 = no padding, 1 = single pad byte */ - int privateBit; /* unused */ - StereoMode sMode; /* mono/stereo mode */ - int modeExt; /* used to decipher joint stereo mode */ - int copyFlag; /* copyright flag: 0 = no, 1 = yes */ - int origFlag; /* original flag: 0 = copy, 1 = original */ - int emphasis; /* deemphasis mode */ - int CRCWord; /* CRC word (16 bits, 0 if crc not enabled) */ - - const SFBandTable *sfBand; -} FrameHeader; - -typedef struct _SideInfoSub { - int part23Length; /* number of bits in main data */ - int nBigvals; /* 2x this = first set of Huffman cw's (maximum amplitude can be > 1) */ - int globalGain; /* overall gain for dequantizer */ - int sfCompress; /* unpacked to figure out number of bits in scale factors */ - int winSwitchFlag; /* window switching flag */ - int blockType; /* block type */ - int mixedBlock; /* 0 = regular block (all short or long), 1 = mixed block */ - int tableSelect[3]; /* index of Huffman tables for the big values regions */ - int subBlockGain[3]; /* subblock gain offset, relative to global gain */ - int region0Count; /* 1+region0Count = num scale factor bands in first region of bigvals */ - int region1Count; /* 1+region1Count = num scale factor bands in second region of bigvals */ - int preFlag; /* for optional high frequency boost */ - int sfactScale; /* scaling of the scalefactors */ - int count1TableSelect; /* index of Huffman table for quad codewords */ -} SideInfoSub; - -typedef struct _SideInfo { - int mainDataBegin; - int privateBits; - int scfsi[MAX_NCHAN][MAX_SCFBD]; /* 4 scalefactor bands per channel */ - - SideInfoSub sis[MAX_NGRAN][MAX_NCHAN]; -} SideInfo; - -typedef struct { - int cbType; /* pure long = 0, pure short = 1, mixed = 2 */ - int cbEndS[3]; /* number nonzero short cb's, per subbblock */ - int cbEndSMax; /* max of cbEndS[] */ - int cbEndL; /* number nonzero long cb's */ -} CriticalBandInfo; - -typedef struct _DequantInfo { - int workBuf[MAX_REORDER_SAMPS]; /* workbuf for reordering short blocks */ - CriticalBandInfo cbi[MAX_NCHAN]; /* filled in dequantizer, used in joint stereo reconstruction */ -} DequantInfo; - -typedef struct _HuffmanInfo { - int huffDecBuf[MAX_NCHAN][MAX_NSAMP]; /* used both for decoded Huffman values and dequantized coefficients */ - int nonZeroBound[MAX_NCHAN]; /* number of coeffs in huffDecBuf[ch] which can be > 0 */ - int gb[MAX_NCHAN]; /* minimum number of guard bits in huffDecBuf[ch] */ -} HuffmanInfo; - -typedef enum _HuffTabType { - noBits, - oneShot, - loopNoLinbits, - loopLinbits, - quadA, - quadB, - invalidTab -} HuffTabType; - -typedef struct _HuffTabLookup { - int linBits; - HuffTabType tabType; -} HuffTabLookup; - -typedef struct _IMDCTInfo { - int outBuf[MAX_NCHAN][BLOCK_SIZE][NBANDS]; /* output of IMDCT */ - int overBuf[MAX_NCHAN][MAX_NSAMP / 2]; /* overlap-add buffer (by symmetry, only need 1/2 size) */ - int numPrevIMDCT[MAX_NCHAN]; /* how many IMDCT's calculated in this channel on prev. granule */ - int prevType[MAX_NCHAN]; - int prevWinSwitch[MAX_NCHAN]; - int gb[MAX_NCHAN]; -} IMDCTInfo; - -typedef struct _BlockCount { - int nBlocksLong; - int nBlocksTotal; - int nBlocksPrev; - int prevType; - int prevWinSwitch; - int currWinSwitch; - int gbIn; - int gbOut; -} BlockCount; - -/* max bits in scalefactors = 5, so use char's to save space */ -typedef struct _ScaleFactorInfoSub { - char l[23]; /* [band] */ - char s[13][3]; /* [band][window] */ -} ScaleFactorInfoSub; - -/* used in MPEG 2, 2.5 intensity (joint) stereo only */ -typedef struct _ScaleFactorJS { - int intensityScale; - int slen[4]; - int nr[4]; -} ScaleFactorJS; - -typedef struct _ScaleFactorInfo { - ScaleFactorInfoSub sfis[MAX_NGRAN][MAX_NCHAN]; - ScaleFactorJS sfjs; -} ScaleFactorInfo; - -/* NOTE - could get by with smaller vbuf if memory is more important than speed - * (in Subband, instead of replicating each block in FDCT32 you would do a memmove on the - * last 15 blocks to shift them down one, a hardware style FIFO) - */ -typedef struct _SubbandInfo { - int vbuf[MAX_NCHAN * VBUF_LENGTH]; /* vbuf for fast DCT-based synthesis PQMF - double size for speed (no modulo indexing) */ - int vindex; /* internal index for tracking position in vbuf */ -} SubbandInfo; - -/* bitstream.c */ -void SetBitstreamPointer(BitStreamInfo *bsi, int nBytes, unsigned char *buf); -unsigned int GetBits(BitStreamInfo *bsi, int nBits); -int CalcBitsUsed(BitStreamInfo *bsi, unsigned char *startBuf, int startOffset); - -/* dequant.c, dqchan.c, stproc.c */ -int DequantChannel(int *sampleBuf, int *workBuf, int *nonZeroBound, FrameHeader *fh, SideInfoSub *sis, - ScaleFactorInfoSub *sfis, CriticalBandInfo *cbi); -void MidSideProc(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, int mOut[2]); -void IntensityProcMPEG1(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, - CriticalBandInfo *cbi, int midSideFlag, int mixFlag, int mOut[2]); -void IntensityProcMPEG2(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, - CriticalBandInfo *cbi, ScaleFactorJS *sfjs, int midSideFlag, int mixFlag, int mOut[2]); - -/* dct32.c */ -void FDCT32(int *x, int *d, int offset, int oddBlock, int gb); - -/* hufftabs.c */ -extern const HuffTabLookup huffTabLookup[HUFF_PAIRTABS]; -extern const int huffTabOffset[HUFF_PAIRTABS]; -extern const unsigned short huffTable[]; -extern const unsigned char quadTable[64+16]; -extern const int quadTabOffset[2]; -extern const int quadTabMaxBits[2]; - -/* polyphase.c (or asmpoly.s) - * some platforms require a C++ compile of all source files, - * so if we're compiling C as C++ and using native assembly - * for these functions we need to prevent C++ name mangling. - */ -#ifdef __cplusplus -extern "C" { -#endif -void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase); -void PolyphaseStereo(short *pcm, int *vbuf, const int *coefBase); -#ifdef __cplusplus -} -#endif - -/* trigtabs.c */ -extern const int imdctWin[4][36]; -extern const int ISFMpeg1[2][7]; -extern const int ISFMpeg2[2][2][16]; -extern const int ISFIIP[2][2]; -extern const int csa[8][2]; -extern const int coef32[31]; -extern const int polyCoef[264]; - -#endif /* _CODER_H */ diff --git a/bsp/stm32_radio/mp3/real/dct32.c b/bsp/stm32_radio/mp3/real/dct32.c deleted file mode 100644 index a688aa98ba..0000000000 --- a/bsp/stm32_radio/mp3/real/dct32.c +++ /dev/null @@ -1,278 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * dct32.c - optimized implementations of 32-point DCT for matrixing stage of - * polyphase filter - **************************************************************************************/ - -#include "coder.h" -#include "assembly.h" - -#define COS0_0 0x4013c251 /* Q31 */ -#define COS0_1 0x40b345bd /* Q31 */ -#define COS0_2 0x41fa2d6d /* Q31 */ -#define COS0_3 0x43f93421 /* Q31 */ -#define COS0_4 0x46cc1bc4 /* Q31 */ -#define COS0_5 0x4a9d9cf0 /* Q31 */ -#define COS0_6 0x4fae3711 /* Q31 */ -#define COS0_7 0x56601ea7 /* Q31 */ -#define COS0_8 0x5f4cf6eb /* Q31 */ -#define COS0_9 0x6b6fcf26 /* Q31 */ -#define COS0_10 0x7c7d1db3 /* Q31 */ -#define COS0_11 0x4ad81a97 /* Q30 */ -#define COS0_12 0x5efc8d96 /* Q30 */ -#define COS0_13 0x41d95790 /* Q29 */ -#define COS0_14 0x6d0b20cf /* Q29 */ -#define COS0_15 0x518522fb /* Q27 */ - -#define COS1_0 0x404f4672 /* Q31 */ -#define COS1_1 0x42e13c10 /* Q31 */ -#define COS1_2 0x48919f44 /* Q31 */ -#define COS1_3 0x52cb0e63 /* Q31 */ -#define COS1_4 0x64e2402e /* Q31 */ -#define COS1_5 0x43e224a9 /* Q30 */ -#define COS1_6 0x6e3c92c1 /* Q30 */ -#define COS1_7 0x519e4e04 /* Q28 */ - -#define COS2_0 0x4140fb46 /* Q31 */ -#define COS2_1 0x4cf8de88 /* Q31 */ -#define COS2_2 0x73326bbf /* Q31 */ -#define COS2_3 0x52036742 /* Q29 */ - -#define COS3_0 0x4545e9ef /* Q31 */ -#define COS3_1 0x539eba45 /* Q30 */ - -#define COS4_0 0x5a82799a /* Q31 */ - -static const int dcttab[48] = { - /* first pass */ - COS0_0, COS0_15, COS1_0, /* 31, 27, 31 */ - COS0_1, COS0_14, COS1_1, /* 31, 29, 31 */ - COS0_2, COS0_13, COS1_2, /* 31, 29, 31 */ - COS0_3, COS0_12, COS1_3, /* 31, 30, 31 */ - COS0_4, COS0_11, COS1_4, /* 31, 30, 31 */ - COS0_5, COS0_10, COS1_5, /* 31, 31, 30 */ - COS0_6, COS0_9, COS1_6, /* 31, 31, 30 */ - COS0_7, COS0_8, COS1_7, /* 31, 31, 28 */ - /* second pass */ - COS2_0, COS2_3, COS3_0, /* 31, 29, 31 */ - COS2_1, COS2_2, COS3_1, /* 31, 31, 30 */ - -COS2_0, -COS2_3, COS3_0, /* 31, 29, 31 */ - -COS2_1, -COS2_2, COS3_1, /* 31, 31, 30 */ - COS2_0, COS2_3, COS3_0, /* 31, 29, 31 */ - COS2_1, COS2_2, COS3_1, /* 31, 31, 30 */ - -COS2_0, -COS2_3, COS3_0, /* 31, 29, 31 */ - -COS2_1, -COS2_2, COS3_1, /* 31, 31, 30 */ -}; - -#define D32FP(i, s0, s1, s2) { \ - a0 = buf[i]; a3 = buf[31-i]; \ - a1 = buf[15-i]; a2 = buf[16+i]; \ - b0 = a0 + a3; b3 = MULSHIFT32(*cptr++, a0 - a3) << (s0); \ - b1 = a1 + a2; b2 = MULSHIFT32(*cptr++, a1 - a2) << (s1); \ - buf[i] = b0 + b1; buf[15-i] = MULSHIFT32(*cptr, b0 - b1) << (s2); \ - buf[16+i] = b2 + b3; buf[31-i] = MULSHIFT32(*cptr++, b3 - b2) << (s2); \ -} - -/************************************************************************************** - * Function: FDCT32 - * - * Description: Ken's highly-optimized 32-point DCT (radix-4 + radix-8) - * - * Inputs: input buffer, length = 32 samples - * require at least 6 guard bits in input vector x to avoid possibility - * of overflow in internal calculations (see bbtest_imdct test app) - * buffer offset and oddblock flag for polyphase filter input buffer - * number of guard bits in input - * - * Outputs: output buffer, data copied and interleaved for polyphase filter - * no guarantees about number of guard bits in output - * - * Return: none - * - * Notes: number of muls = 4*8 + 12*4 = 80 - * final stage of DCT is hardcoded to shuffle data into the proper order - * for the polyphase filterbank - * fully unrolled stage 1, for max precision (scale the 1/cos() factors - * differently, depending on magnitude) - * guard bit analysis verified by exhaustive testing of all 2^32 - * combinations of max pos/max neg values in x[] - * - * TODO: code organization and optimization for ARM - * possibly interleave stereo (cut # of coef loads in half - may not have - * enough registers) - **************************************************************************************/ -void FDCT32(int *buf, int *dest, int offset, int oddBlock, int gb) -{ - int i, s, tmp, es; - const int *cptr = dcttab; - int a0, a1, a2, a3, a4, a5, a6, a7; - int b0, b1, b2, b3, b4, b5, b6, b7; - int *d; - - /* scaling - ensure at least 6 guard bits for DCT - * (in practice this is already true 99% of time, so this code is - * almost never triggered) - */ - es = 0; - if (gb < 6) { - es = 6 - gb; - for (i = 0; i < 32; i++) - buf[i] >>= es; - } - - /* first pass */ - D32FP(0, 1, 5, 1); - D32FP(1, 1, 3, 1); - D32FP(2, 1, 3, 1); - D32FP(3, 1, 2, 1); - D32FP(4, 1, 2, 1); - D32FP(5, 1, 1, 2); - D32FP(6, 1, 1, 2); - D32FP(7, 1, 1, 4); - - /* second pass */ - for (i = 4; i > 0; i--) { - a0 = buf[0]; a7 = buf[7]; a3 = buf[3]; a4 = buf[4]; - b0 = a0 + a7; b7 = MULSHIFT32(*cptr++, a0 - a7) << 1; - b3 = a3 + a4; b4 = MULSHIFT32(*cptr++, a3 - a4) << 3; - a0 = b0 + b3; a3 = MULSHIFT32(*cptr, b0 - b3) << 1; - a4 = b4 + b7; a7 = MULSHIFT32(*cptr++, b7 - b4) << 1; - - a1 = buf[1]; a6 = buf[6]; a2 = buf[2]; a5 = buf[5]; - b1 = a1 + a6; b6 = MULSHIFT32(*cptr++, a1 - a6) << 1; - b2 = a2 + a5; b5 = MULSHIFT32(*cptr++, a2 - a5) << 1; - a1 = b1 + b2; a2 = MULSHIFT32(*cptr, b1 - b2) << 2; - a5 = b5 + b6; a6 = MULSHIFT32(*cptr++, b6 - b5) << 2; - - b0 = a0 + a1; b1 = MULSHIFT32(COS4_0, a0 - a1) << 1; - b2 = a2 + a3; b3 = MULSHIFT32(COS4_0, a3 - a2) << 1; - buf[0] = b0; buf[1] = b1; - buf[2] = b2 + b3; buf[3] = b3; - - b4 = a4 + a5; b5 = MULSHIFT32(COS4_0, a4 - a5) << 1; - b6 = a6 + a7; b7 = MULSHIFT32(COS4_0, a7 - a6) << 1; - b6 += b7; - buf[4] = b4 + b6; buf[5] = b5 + b7; - buf[6] = b5 + b6; buf[7] = b7; - - buf += 8; - } - buf -= 32; /* reset */ - - /* sample 0 - always delayed one block */ - d = dest + 64*16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); - s = buf[ 0]; d[0] = d[8] = s; - - /* samples 16 to 31 */ - d = dest + offset + (oddBlock ? VBUF_LENGTH : 0); - - s = buf[ 1]; d[0] = d[8] = s; d += 64; - - tmp = buf[25] + buf[29]; - s = buf[17] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 9] + buf[13]; d[0] = d[8] = s; d += 64; - s = buf[21] + tmp; d[0] = d[8] = s; d += 64; - - tmp = buf[29] + buf[27]; - s = buf[ 5]; d[0] = d[8] = s; d += 64; - s = buf[21] + tmp; d[0] = d[8] = s; d += 64; - s = buf[13] + buf[11]; d[0] = d[8] = s; d += 64; - s = buf[19] + tmp; d[0] = d[8] = s; d += 64; - - tmp = buf[27] + buf[31]; - s = buf[ 3]; d[0] = d[8] = s; d += 64; - s = buf[19] + tmp; d[0] = d[8] = s; d += 64; - s = buf[11] + buf[15]; d[0] = d[8] = s; d += 64; - s = buf[23] + tmp; d[0] = d[8] = s; d += 64; - - tmp = buf[31]; - s = buf[ 7]; d[0] = d[8] = s; d += 64; - s = buf[23] + tmp; d[0] = d[8] = s; d += 64; - s = buf[15]; d[0] = d[8] = s; d += 64; - s = tmp; d[0] = d[8] = s; - - /* samples 16 to 1 (sample 16 used again) */ - d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); - - s = buf[ 1]; d[0] = d[8] = s; d += 64; - - tmp = buf[30] + buf[25]; - s = buf[17] + tmp; d[0] = d[8] = s; d += 64; - s = buf[14] + buf[ 9]; d[0] = d[8] = s; d += 64; - s = buf[22] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 6]; d[0] = d[8] = s; d += 64; - - tmp = buf[26] + buf[30]; - s = buf[22] + tmp; d[0] = d[8] = s; d += 64; - s = buf[10] + buf[14]; d[0] = d[8] = s; d += 64; - s = buf[18] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 2]; d[0] = d[8] = s; d += 64; - - tmp = buf[28] + buf[26]; - s = buf[18] + tmp; d[0] = d[8] = s; d += 64; - s = buf[12] + buf[10]; d[0] = d[8] = s; d += 64; - s = buf[20] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 4]; d[0] = d[8] = s; d += 64; - - tmp = buf[24] + buf[28]; - s = buf[20] + tmp; d[0] = d[8] = s; d += 64; - s = buf[ 8] + buf[12]; d[0] = d[8] = s; d += 64; - s = buf[16] + tmp; d[0] = d[8] = s; - - /* this is so rarely invoked that it's not worth making two versions of the output - * shuffle code (one for no shift, one for clip + variable shift) like in IMDCT - * here we just load, clip, shift, and store on the rare instances that es != 0 - */ - if (es) { - d = dest + 64*16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); - s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); - - d = dest + offset + (oddBlock ? VBUF_LENGTH : 0); - for (i = 16; i <= 31; i++) { - s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64; - } - - d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH); - for (i = 15; i >= 0; i--) { - s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64; - } - } -} diff --git a/bsp/stm32_radio/mp3/real/dequant.c b/bsp/stm32_radio/mp3/real/dequant.c deleted file mode 100644 index b989b7dee9..0000000000 --- a/bsp/stm32_radio/mp3/real/dequant.c +++ /dev/null @@ -1,158 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * dequant.c - dequantization, stereo processing (intensity, mid-side), short-block - * coefficient reordering - **************************************************************************************/ - -#include "coder.h" -#include "assembly.h" - -/************************************************************************************** - * Function: Dequantize - * - * Description: dequantize coefficients, decode stereo, reorder short blocks - * (one granule-worth) - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(), - * UnpackScaleFactors(), and DecodeHuffman() (for this granule) - * index of current granule - * - * Outputs: dequantized and reordered coefficients in hi->huffDecBuf - * (one granule-worth, all channels), format = Q26 - * operates in-place on huffDecBuf but also needs di->workBuf - * updated hi->nonZeroBound index for both channels - * - * Return: 0 on success, -1 if null input pointers - * - * Notes: In calling output Q(DQ_FRACBITS_OUT), we assume an implicit bias - * of 2^15. Some (floating-point) reference implementations factor this - * into the 2^(0.25 * gain) scaling explicitly. But to avoid precision - * loss, we don't do that. Instead take it into account in the final - * round to PCM (>> by 15 less than we otherwise would have). - * Equivalently, we can think of the dequantized coefficients as - * Q(DQ_FRACBITS_OUT - 15) with no implicit bias. - **************************************************************************************/ -int Dequantize(MP3DecInfo *mp3DecInfo, int gr) -{ - int i, ch, nSamps, mOut[2]; - FrameHeader *fh; - SideInfo *si; - ScaleFactorInfo *sfi; - HuffmanInfo *hi; - DequantInfo *di; - CriticalBandInfo *cbi; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS || - !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->DequantInfoPS) - return -1; - - fh = (FrameHeader *)(mp3DecInfo->FrameHeaderPS); - - /* si is an array of up to 4 structs, stored as gr0ch0, gr0ch1, gr1ch0, gr1ch1 */ - si = (SideInfo *)(mp3DecInfo->SideInfoPS); - sfi = (ScaleFactorInfo *)(mp3DecInfo->ScaleFactorInfoPS); - hi = (HuffmanInfo *)mp3DecInfo->HuffmanInfoPS; - di = (DequantInfo *)mp3DecInfo->DequantInfoPS; - cbi = di->cbi; - mOut[0] = mOut[1] = 0; - - /* dequantize all the samples in each channel */ - for (ch = 0; ch < mp3DecInfo->nChans; ch++) { - hi->gb[ch] = DequantChannel(hi->huffDecBuf[ch], di->workBuf, &hi->nonZeroBound[ch], fh, - &si->sis[gr][ch], &sfi->sfis[gr][ch], &cbi[ch]); - } - - /* joint stereo processing assumes one guard bit in input samples - * it's extremely rare not to have at least one gb, so if this is the case - * just make a pass over the data and clip to [-2^30+1, 2^30-1] - * in practice this may never happen - */ - if (fh->modeExt && (hi->gb[0] < 1 || hi->gb[1] < 1)) { - for (i = 0; i < hi->nonZeroBound[0]; i++) { - if (hi->huffDecBuf[0][i] < -0x3fffffff) hi->huffDecBuf[0][i] = -0x3fffffff; - if (hi->huffDecBuf[0][i] > 0x3fffffff) hi->huffDecBuf[0][i] = 0x3fffffff; - } - for (i = 0; i < hi->nonZeroBound[1]; i++) { - if (hi->huffDecBuf[1][i] < -0x3fffffff) hi->huffDecBuf[1][i] = -0x3fffffff; - if (hi->huffDecBuf[1][i] > 0x3fffffff) hi->huffDecBuf[1][i] = 0x3fffffff; - } - } - - /* do mid-side stereo processing, if enabled */ - if (fh->modeExt >> 1) { - if (fh->modeExt & 0x01) { - /* intensity stereo enabled - run mid-side up to start of right zero region */ - if (cbi[1].cbType == 0) - nSamps = fh->sfBand->l[cbi[1].cbEndL + 1]; - else - nSamps = 3 * fh->sfBand->s[cbi[1].cbEndSMax + 1]; - } else { - /* intensity stereo disabled - run mid-side on whole spectrum */ - nSamps = MAX(hi->nonZeroBound[0], hi->nonZeroBound[1]); - } - MidSideProc(hi->huffDecBuf, nSamps, mOut); - } - - /* do intensity stereo processing, if enabled */ - if (fh->modeExt & 0x01) { - nSamps = hi->nonZeroBound[0]; - if (fh->ver == MPEG1) { - IntensityProcMPEG1(hi->huffDecBuf, nSamps, fh, &sfi->sfis[gr][1], di->cbi, - fh->modeExt >> 1, si->sis[gr][1].mixedBlock, mOut); - } else { - IntensityProcMPEG2(hi->huffDecBuf, nSamps, fh, &sfi->sfis[gr][1], di->cbi, &sfi->sfjs, - fh->modeExt >> 1, si->sis[gr][1].mixedBlock, mOut); - } - } - - /* adjust guard bit count and nonZeroBound if we did any stereo processing */ - if (fh->modeExt) { - hi->gb[0] = CLZ(mOut[0]) - 1; - hi->gb[1] = CLZ(mOut[1]) - 1; - nSamps = MAX(hi->nonZeroBound[0], hi->nonZeroBound[1]); - hi->nonZeroBound[0] = nSamps; - hi->nonZeroBound[1] = nSamps; - } - - /* output format Q(DQ_FRACBITS_OUT) */ - return 0; -} diff --git a/bsp/stm32_radio/mp3/real/dqchan.c b/bsp/stm32_radio/mp3/real/dqchan.c deleted file mode 100644 index 72720f8780..0000000000 --- a/bsp/stm32_radio/mp3/real/dqchan.c +++ /dev/null @@ -1,375 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * August 2003 - * - * dqchan.c - dequantization of transform coefficients - **************************************************************************************/ - -#include "coder.h" -#include "assembly.h" - -typedef int ARRAY3[3]; /* for short-block reordering */ - -/* optional pre-emphasis for high-frequency scale factor bands */ -static const char preTab[22] = { 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0 }; - -/* pow(2,-i/4) for i=0..3, Q31 format */ -static const int pow14[4] = { - 0x7fffffff, 0x6ba27e65, 0x5a82799a, 0x4c1bf829 -}; - -/* pow(2,-i/4) * pow(j,4/3) for i=0..3 j=0..15, Q25 format */ -static const int pow43_14[4][16] = { -{ 0x00000000, 0x10000000, 0x285145f3, 0x453a5cdb, /* Q28 */ - 0x0cb2ff53, 0x111989d6, 0x15ce31c8, 0x1ac7f203, - 0x20000000, 0x257106b9, 0x2b16b4a3, 0x30ed74b4, - 0x36f23fa5, 0x3d227bd3, 0x437be656, 0x49fc823c, }, - -{ 0x00000000, 0x0d744fcd, 0x21e71f26, 0x3a36abd9, - 0x0aadc084, 0x0e610e6e, 0x12560c1d, 0x168523cf, - 0x1ae89f99, 0x1f7c03a4, 0x243bae49, 0x29249c67, - 0x2e34420f, 0x33686f85, 0x38bf3dff, 0x3e370182, }, - -{ 0x00000000, 0x0b504f33, 0x1c823e07, 0x30f39a55, - 0x08facd62, 0x0c176319, 0x0f6b3522, 0x12efe2ad, - 0x16a09e66, 0x1a79a317, 0x1e77e301, 0x2298d5b4, - 0x26da56fc, 0x2b3a902a, 0x2fb7e7e7, 0x3450f650, }, - -{ 0x00000000, 0x09837f05, 0x17f910d7, 0x2929c7a9, - 0x078d0dfa, 0x0a2ae661, 0x0cf73154, 0x0fec91cb, - 0x1306fe0a, 0x16434a6c, 0x199ee595, 0x1d17ae3d, - 0x20abd76a, 0x2459d551, 0x28204fbb, 0x2bfe1808, }, -}; - -/* pow(j,4/3) for j=16..63, Q23 format */ -static const int pow43[] = { - 0x1428a2fa, 0x15db1bd6, 0x1796302c, 0x19598d85, - 0x1b24e8bb, 0x1cf7fcfa, 0x1ed28af2, 0x20b4582a, - 0x229d2e6e, 0x248cdb55, 0x26832fda, 0x28800000, - 0x2a832287, 0x2c8c70a8, 0x2e9bc5d8, 0x30b0ff99, - 0x32cbfd4a, 0x34eca001, 0x3712ca62, 0x393e6088, - 0x3b6f47e0, 0x3da56717, 0x3fe0a5fc, 0x4220ed72, - 0x44662758, 0x46b03e7c, 0x48ff1e87, 0x4b52b3f3, - 0x4daaebfd, 0x5007b497, 0x5268fc62, 0x54ceb29c, - 0x5738c721, 0x59a72a59, 0x5c19cd35, 0x5e90a129, - 0x610b9821, 0x638aa47f, 0x660db90f, 0x6894c90b, - 0x6b1fc80c, 0x6daeaa0d, 0x70416360, 0x72d7e8b0, - 0x75722ef9, 0x78102b85, 0x7ab1d3ec, 0x7d571e09, -}; - -/* sqrt(0.5) in Q31 format */ -#define SQRTHALF 0x5a82799a - -/* - * Minimax polynomial approximation to pow(x, 4/3), over the range - * poly43lo: x = [0.5, 0.7071] - * poly43hi: x = [0.7071, 1.0] - * - * Relative error < 1E-7 - * Coefs are scaled by 4, 2, 1, 0.5, 0.25 - */ -static const int poly43lo[5] = { 0x29a0bda9, 0xb02e4828, 0x5957aa1b, 0x236c498d, 0xff581859 }; -static const int poly43hi[5] = { 0x10852163, 0xd333f6a4, 0x46e9408b, 0x27c2cef0, 0xfef577b4 }; - -/* pow(2, i*4/3) as exp and frac */ -static const int pow2exp[8] = { 14, 13, 11, 10, 9, 7, 6, 5 }; - -static const int pow2frac[8] = { - 0x6597fa94, 0x50a28be6, 0x7fffffff, 0x6597fa94, - 0x50a28be6, 0x7fffffff, 0x6597fa94, 0x50a28be6 -}; - -/************************************************************************************** - * Function: DequantBlock - * - * Description: Ken's highly-optimized, low memory dequantizer performing the operation - * y = pow(x, 4.0/3.0) * pow(2, 25 - scale/4.0) - * - * Inputs: input buffer of decode Huffman codewords (signed-magnitude) - * output buffer of same length (in-place (outbuf = inbuf) is allowed) - * number of samples - * - * Outputs: dequantized samples in Q25 format - * - * Return: bitwise-OR of the unsigned outputs (for guard bit calculations) - **************************************************************************************/ -static int DequantBlock(int *inbuf, int *outbuf, int num, int scale) -{ - int tab4[4]; - int scalef, scalei, shift; - int sx, x, y; - int mask = 0; - const int *tab16, *coef; - - tab16 = pow43_14[scale & 0x3]; - scalef = pow14[scale & 0x3]; - scalei = MIN(scale >> 2, 31); /* smallest input scale = -47, so smallest scalei = -12 */ - - /* cache first 4 values */ - shift = MIN(scalei + 3, 31); - shift = MAX(shift, 0); - tab4[0] = 0; - tab4[1] = tab16[1] >> shift; - tab4[2] = tab16[2] >> shift; - tab4[3] = tab16[3] >> shift; - - do { - - sx = *inbuf++; - x = sx & 0x7fffffff; /* sx = sign|mag */ - - if (x < 4) { - - y = tab4[x]; - - } else if (x < 16) { - - y = tab16[x]; - y = (scalei < 0) ? y << -scalei : y >> scalei; - - } else { - - if (x < 64) { - - y = pow43[x-16]; - - /* fractional scale */ - y = MULSHIFT32(y, scalef); - shift = scalei - 3; - - } else { - - /* normalize to [0x40000000, 0x7fffffff] */ - x <<= 17; - shift = 0; - if (x < 0x08000000) - x <<= 4, shift += 4; - if (x < 0x20000000) - x <<= 2, shift += 2; - if (x < 0x40000000) - x <<= 1, shift += 1; - - coef = (x < SQRTHALF) ? poly43lo : poly43hi; - - /* polynomial */ - y = coef[0]; - y = MULSHIFT32(y, x) + coef[1]; - y = MULSHIFT32(y, x) + coef[2]; - y = MULSHIFT32(y, x) + coef[3]; - y = MULSHIFT32(y, x) + coef[4]; - y = MULSHIFT32(y, pow2frac[shift]) << 3; - - /* fractional scale */ - y = MULSHIFT32(y, scalef); - shift = scalei - pow2exp[shift]; - } - - /* integer scale */ - if (shift < 0) { - shift = -shift; - if (y > (0x7fffffff >> shift)) - y = 0x7fffffff; /* clip */ - else - y <<= shift; - } else { - y >>= shift; - } - } - - /* sign and store */ - mask |= y; - *outbuf++ = (sx < 0) ? -y : y; - - } while (--num); - - return mask; -} - -/************************************************************************************** - * Function: DequantChannel - * - * Description: dequantize one granule, one channel worth of decoded Huffman codewords - * - * Inputs: sample buffer (decoded Huffman codewords), length = MAX_NSAMP samples - * work buffer for reordering short-block, length = MAX_REORDER_SAMPS - * samples (3 * width of largest short-block critical band) - * non-zero bound for this channel/granule - * valid FrameHeader, SideInfoSub, ScaleFactorInfoSub, and CriticalBandInfo - * structures for this channel/granule - * - * Outputs: MAX_NSAMP dequantized samples in sampleBuf - * updated non-zero bound (indicating which samples are != 0 after DQ) - * filled-in cbi structure indicating start and end critical bands - * - * Return: minimum number of guard bits in dequantized sampleBuf - * - * Notes: dequantized samples in Q(DQ_FRACBITS_OUT) format - **************************************************************************************/ -int DequantChannel(int *sampleBuf, int *workBuf, int *nonZeroBound, FrameHeader *fh, SideInfoSub *sis, - ScaleFactorInfoSub *sfis, CriticalBandInfo *cbi) -{ - int i, j, w, cb; - int cbStartL, cbEndL, cbStartS, cbEndS; - int nSamps, nonZero, sfactMultiplier, gbMask; - int globalGain, gainI; - int cbMax[3]; - ARRAY3 *buf; /* short block reorder */ - - /* set default start/end points for short/long blocks - will update with non-zero cb info */ - if (sis->blockType == 2) { - cbStartL = 0; - if (sis->mixedBlock) { - cbEndL = (fh->ver == MPEG1 ? 8 : 6); - cbStartS = 3; - } else { - cbEndL = 0; - cbStartS = 0; - } - cbEndS = 13; - } else { - /* long block */ - cbStartL = 0; - cbEndL = 22; - cbStartS = 13; - cbEndS = 13; - } - cbMax[2] = cbMax[1] = cbMax[0] = 0; - gbMask = 0; - i = 0; - - /* sfactScale = 0 --> quantizer step size = 2 - * sfactScale = 1 --> quantizer step size = sqrt(2) - * so sfactMultiplier = 2 or 4 (jump through globalGain by powers of 2 or sqrt(2)) - */ - sfactMultiplier = 2 * (sis->sfactScale + 1); - - /* offset globalGain by -2 if midSide enabled, for 1/sqrt(2) used in MidSideProc() - * (DequantBlock() does 0.25 * gainI so knocking it down by two is the same as - * dividing every sample by sqrt(2) = multiplying by 2^-.5) - */ - globalGain = sis->globalGain; - if (fh->modeExt >> 1) - globalGain -= 2; - globalGain += IMDCT_SCALE; /* scale everything by sqrt(2), for fast IMDCT36 */ - - /* long blocks */ - for (cb = 0; cb < cbEndL; cb++) { - - nonZero = 0; - nSamps = fh->sfBand->l[cb + 1] - fh->sfBand->l[cb]; - gainI = 210 - globalGain + sfactMultiplier * (sfis->l[cb] + (sis->preFlag ? (int)preTab[cb] : 0)); - - nonZero |= DequantBlock(sampleBuf + i, sampleBuf + i, nSamps, gainI); - i += nSamps; - - /* update highest non-zero critical band */ - if (nonZero) - cbMax[0] = cb; - gbMask |= nonZero; - - if (i >= *nonZeroBound) - break; - } - - /* set cbi (Type, EndS[], EndSMax will be overwritten if we proceed to do short blocks) */ - cbi->cbType = 0; /* long only */ - cbi->cbEndL = cbMax[0]; - cbi->cbEndS[0] = cbi->cbEndS[1] = cbi->cbEndS[2] = 0; - cbi->cbEndSMax = 0; - - /* early exit if no short blocks */ - if (cbStartS >= 12) - return CLZ(gbMask) - 1; - - /* short blocks */ - cbMax[2] = cbMax[1] = cbMax[0] = cbStartS; - for (cb = cbStartS; cb < cbEndS; cb++) { - - nSamps = fh->sfBand->s[cb + 1] - fh->sfBand->s[cb]; - for (w = 0; w < 3; w++) { - nonZero = 0; - gainI = 210 - globalGain + 8*sis->subBlockGain[w] + sfactMultiplier*(sfis->s[cb][w]); - - nonZero |= DequantBlock(sampleBuf + i + nSamps*w, workBuf + nSamps*w, nSamps, gainI); - - /* update highest non-zero critical band */ - if (nonZero) - cbMax[w] = cb; - gbMask |= nonZero; - } - - /* reorder blocks */ - buf = (ARRAY3 *)(sampleBuf + i); - i += 3*nSamps; - for (j = 0; j < nSamps; j++) { - buf[j][0] = workBuf[0*nSamps + j]; - buf[j][1] = workBuf[1*nSamps + j]; - buf[j][2] = workBuf[2*nSamps + j]; - } - - ASSERT(3*nSamps <= MAX_REORDER_SAMPS); - - if (i >= *nonZeroBound) - break; - } - - /* i = last non-zero INPUT sample processed, which corresponds to highest possible non-zero - * OUTPUT sample (after reorder) - * however, the original nzb is no longer necessarily true - * for each cb, buf[][] is updated with 3*nSamps samples (i increases 3*nSamps each time) - * (buf[j + 1][0] = 3 (input) samples ahead of buf[j][0]) - * so update nonZeroBound to i - */ - *nonZeroBound = i; - - ASSERT(*nonZeroBound <= MAX_NSAMP); - - cbi->cbType = (sis->mixedBlock ? 2 : 1); /* 2 = mixed short/long, 1 = short only */ - - cbi->cbEndS[0] = cbMax[0]; - cbi->cbEndS[1] = cbMax[1]; - cbi->cbEndS[2] = cbMax[2]; - - cbi->cbEndSMax = cbMax[0]; - cbi->cbEndSMax = MAX(cbi->cbEndSMax, cbMax[1]); - cbi->cbEndSMax = MAX(cbi->cbEndSMax, cbMax[2]); - - return CLZ(gbMask) - 1; -} - diff --git a/bsp/stm32_radio/mp3/real/huffman.c b/bsp/stm32_radio/mp3/real/huffman.c deleted file mode 100644 index c1d3347e0f..0000000000 --- a/bsp/stm32_radio/mp3/real/huffman.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * July 2003 - * - * huffman.c - Huffman decoding of transform coefficients - **************************************************************************************/ - -#include "coder.h" - -/* helper macros - see comments in hufftabs.c about the format of the huffman tables */ -#define GetMaxbits(x) ((int)( (((unsigned short)(x)) >> 0) & 0x000f)) -#define GetHLen(x) ((int)( (((unsigned short)(x)) >> 12) & 0x000f)) -#define GetCWY(x) ((int)( (((unsigned short)(x)) >> 8) & 0x000f)) -#define GetCWX(x) ((int)( (((unsigned short)(x)) >> 4) & 0x000f)) -#define GetSignBits(x) ((int)( (((unsigned short)(x)) >> 0) & 0x000f)) - -#define GetHLenQ(x) ((int)( (((unsigned char)(x)) >> 4) & 0x0f)) -#define GetCWVQ(x) ((int)( (((unsigned char)(x)) >> 3) & 0x01)) -#define GetCWWQ(x) ((int)( (((unsigned char)(x)) >> 2) & 0x01)) -#define GetCWXQ(x) ((int)( (((unsigned char)(x)) >> 1) & 0x01)) -#define GetCWYQ(x) ((int)( (((unsigned char)(x)) >> 0) & 0x01)) - -/* apply sign of s to the positive number x (save in MSB, will do two's complement in dequant) */ -#define ApplySign(x, s) { (x) |= ((s) & 0x80000000); } - -/************************************************************************************** - * Function: DecodeHuffmanPairs - * - * Description: decode 2-way vector Huffman codes in the "bigValues" region of spectrum - * - * Inputs: valid BitStreamInfo struct, pointing to start of pair-wise codes - * pointer to xy buffer to received decoded values - * number of codewords to decode - * index of Huffman table to use - * number of bits remaining in bitstream - * - * Outputs: pairs of decoded coefficients in vwxy - * updated BitStreamInfo struct - * - * Return: number of bits used, or -1 if out of bits - * - * Notes: assumes that nVals is an even number - * si_huff.bit tests every Huffman codeword in every table (though not - * necessarily all linBits outputs for x,y > 15) - **************************************************************************************/ -static int DecodeHuffmanPairs(int *xy, int nVals, int tabIdx, int bitsLeft, unsigned char *buf, int bitOffset) -{ - int i, x, y; - int cachedBits, padBits, len, startBits, linBits, maxBits, minBits; - HuffTabType tabType; - unsigned short cw, *tBase, *tCurr; - unsigned int cache; - - if(nVals <= 0) - return 0; - - if (bitsLeft < 0) - return -1; - startBits = bitsLeft; - - tBase = (unsigned short *)(huffTable + huffTabOffset[tabIdx]); - linBits = huffTabLookup[tabIdx].linBits; - tabType = huffTabLookup[tabIdx].tabType; - - ASSERT(!(nVals & 0x01)); - ASSERT(tabIdx < HUFF_PAIRTABS); - ASSERT(tabIdx >= 0); - ASSERT(tabType != invalidTab); - - /* initially fill cache with any partial byte */ - cache = 0; - cachedBits = (8 - bitOffset) & 0x07; - if (cachedBits) - cache = (unsigned int)(*buf++) << (32 - cachedBits); - bitsLeft -= cachedBits; - - if (tabType == noBits) { - /* table 0, no data, x = y = 0 */ - for (i = 0; i < nVals; i+=2) { - xy[i+0] = 0; - xy[i+1] = 0; - } - return 0; - } else if (tabType == oneShot) { - /* single lookup, no escapes */ - maxBits = GetMaxbits(tBase[0]); - tBase++; - padBits = 0; - while (nVals > 0) { - /* refill cache - assumes cachedBits <= 16 */ - if (bitsLeft >= 16) { - /* load 2 new bytes into left-justified cache */ - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += 16; - bitsLeft -= 16; - } else { - /* last time through, pad cache with zeros and drain cache */ - if (cachedBits + bitsLeft <= 0) return -1; - if (bitsLeft > 0) cache |= (unsigned int)(*buf++) << (24 - cachedBits); - if (bitsLeft > 8) cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += bitsLeft; - bitsLeft = 0; - - cache &= (signed int)0x80000000 >> (cachedBits - 1); - padBits = 11; - cachedBits += padBits; /* okay if this is > 32 (0's automatically shifted in from right) */ - } - - /* largest maxBits = 9, plus 2 for sign bits, so make sure cache has at least 11 bits */ - while (nVals > 0 && cachedBits >= 11 ) { - cw = tBase[cache >> (32 - maxBits)]; - len = GetHLen(cw); - cachedBits -= len; - cache <<= len; - - x = GetCWX(cw); if (x) {ApplySign(x, cache); cache <<= 1; cachedBits--;} - y = GetCWY(cw); if (y) {ApplySign(y, cache); cache <<= 1; cachedBits--;} - - /* ran out of bits - should never have consumed padBits */ - if (cachedBits < padBits) - return -1; - - *xy++ = x; - *xy++ = y; - nVals -= 2; - } - } - bitsLeft += (cachedBits - padBits); - return (startBits - bitsLeft); - } else if (tabType == loopLinbits || tabType == loopNoLinbits) { - tCurr = tBase; - padBits = 0; - while (nVals > 0) { - /* refill cache - assumes cachedBits <= 16 */ - if (bitsLeft >= 16) { - /* load 2 new bytes into left-justified cache */ - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += 16; - bitsLeft -= 16; - } else { - /* last time through, pad cache with zeros and drain cache */ - if (cachedBits + bitsLeft <= 0) return -1; - if (bitsLeft > 0) cache |= (unsigned int)(*buf++) << (24 - cachedBits); - if (bitsLeft > 8) cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += bitsLeft; - bitsLeft = 0; - - cache &= (signed int)0x80000000 >> (cachedBits - 1); - padBits = 11; - cachedBits += padBits; /* okay if this is > 32 (0's automatically shifted in from right) */ - } - - /* largest maxBits = 9, plus 2 for sign bits, so make sure cache has at least 11 bits */ - while (nVals > 0 && cachedBits >= 11 ) { - maxBits = GetMaxbits(tCurr[0]); - cw = tCurr[(cache >> (32 - maxBits)) + 1]; - len = GetHLen(cw); - if (!len) { - cachedBits -= maxBits; - cache <<= maxBits; - tCurr += cw; - continue; - } - cachedBits -= len; - cache <<= len; - - x = GetCWX(cw); - y = GetCWY(cw); - - if (x == 15 && tabType == loopLinbits) { - minBits = linBits + 1 + (y ? 1 : 0); - if (cachedBits + bitsLeft < minBits) - return -1; - while (cachedBits < minBits) { - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cachedBits += 8; - bitsLeft -= 8; - } - if (bitsLeft < 0) { - cachedBits += bitsLeft; - bitsLeft = 0; - cache &= (signed int)0x80000000 >> (cachedBits - 1); - } - x += (int)(cache >> (32 - linBits)); - cachedBits -= linBits; - cache <<= linBits; - } - if (x) {ApplySign(x, cache); cache <<= 1; cachedBits--;} - - if (y == 15 && tabType == loopLinbits) { - minBits = linBits + 1; - if (cachedBits + bitsLeft < minBits) - return -1; - while (cachedBits < minBits) { - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cachedBits += 8; - bitsLeft -= 8; - } - if (bitsLeft < 0) { - cachedBits += bitsLeft; - bitsLeft = 0; - cache &= (signed int)0x80000000 >> (cachedBits - 1); - } - y += (int)(cache >> (32 - linBits)); - cachedBits -= linBits; - cache <<= linBits; - } - if (y) {ApplySign(y, cache); cache <<= 1; cachedBits--;} - - /* ran out of bits - should never have consumed padBits */ - if (cachedBits < padBits) - return -1; - - *xy++ = x; - *xy++ = y; - nVals -= 2; - tCurr = tBase; - } - } - bitsLeft += (cachedBits - padBits); - return (startBits - bitsLeft); - } - - /* error in bitstream - trying to access unused Huffman table */ - return -1; -} - -/************************************************************************************** - * Function: DecodeHuffmanQuads - * - * Description: decode 4-way vector Huffman codes in the "count1" region of spectrum - * - * Inputs: valid BitStreamInfo struct, pointing to start of quadword codes - * pointer to vwxy buffer to received decoded values - * maximum number of codewords to decode - * index of quadword table (0 = table A, 1 = table B) - * number of bits remaining in bitstream - * - * Outputs: quadruples of decoded coefficients in vwxy - * updated BitStreamInfo struct - * - * Return: index of the first "zero_part" value (index of the first sample - * of the quad word after which all samples are 0) - * - * Notes: si_huff.bit tests every vwxy output in both quad tables - **************************************************************************************/ -static int DecodeHuffmanQuads(int *vwxy, int nVals, int tabIdx, int bitsLeft, unsigned char *buf, int bitOffset) -{ - int i, v, w, x, y; - int len, maxBits, cachedBits, padBits; - unsigned int cache; - unsigned char cw, *tBase; - - if (bitsLeft <= 0) - return 0; - - tBase = (unsigned char *)quadTable + quadTabOffset[tabIdx]; - maxBits = quadTabMaxBits[tabIdx]; - - /* initially fill cache with any partial byte */ - cache = 0; - cachedBits = (8 - bitOffset) & 0x07; - if (cachedBits) - cache = (unsigned int)(*buf++) << (32 - cachedBits); - bitsLeft -= cachedBits; - - i = padBits = 0; - while (i < (nVals - 3)) { - /* refill cache - assumes cachedBits <= 16 */ - if (bitsLeft >= 16) { - /* load 2 new bytes into left-justified cache */ - cache |= (unsigned int)(*buf++) << (24 - cachedBits); - cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += 16; - bitsLeft -= 16; - } else { - /* last time through, pad cache with zeros and drain cache */ - if (cachedBits + bitsLeft <= 0) return i; - if (bitsLeft > 0) cache |= (unsigned int)(*buf++) << (24 - cachedBits); - if (bitsLeft > 8) cache |= (unsigned int)(*buf++) << (16 - cachedBits); - cachedBits += bitsLeft; - bitsLeft = 0; - - cache &= (signed int)0x80000000 >> (cachedBits - 1); - padBits = 10; - cachedBits += padBits; /* okay if this is > 32 (0's automatically shifted in from right) */ - } - - /* largest maxBits = 6, plus 4 for sign bits, so make sure cache has at least 10 bits */ - while (i < (nVals - 3) && cachedBits >= 10 ) { - cw = tBase[cache >> (32 - maxBits)]; - len = GetHLenQ(cw); - cachedBits -= len; - cache <<= len; - - v = GetCWVQ(cw); if(v) {ApplySign(v, cache); cache <<= 1; cachedBits--;} - w = GetCWWQ(cw); if(w) {ApplySign(w, cache); cache <<= 1; cachedBits--;} - x = GetCWXQ(cw); if(x) {ApplySign(x, cache); cache <<= 1; cachedBits--;} - y = GetCWYQ(cw); if(y) {ApplySign(y, cache); cache <<= 1; cachedBits--;} - - /* ran out of bits - okay (means we're done) */ - if (cachedBits < padBits) - return i; - - *vwxy++ = v; - *vwxy++ = w; - *vwxy++ = x; - *vwxy++ = y; - i += 4; - } - } - - /* decoded max number of quad values */ - return i; -} - -/************************************************************************************** - * Function: DecodeHuffman - * - * Description: decode one granule, one channel worth of Huffman codes - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(), - * and UnpackScaleFactors() (for this granule) - * buffer pointing to start of Huffman data in MP3 frame - * pointer to bit offset (0-7) indicating starting bit in buf[0] - * number of bits in the Huffman data section of the frame - * (could include padding bits) - * index of current granule and channel - * - * Outputs: decoded coefficients in hi->huffDecBuf[ch] (hi pointer in mp3DecInfo) - * updated bitOffset - * - * Return: length (in bytes) of Huffman codes - * bitOffset also returned in parameter (0 = MSB, 7 = LSB of - * byte located at buf + offset) - * -1 if null input pointers, huffBlockBits < 0, or decoder runs - * out of bits prematurely (invalid bitstream) - **************************************************************************************/ -int DecodeHuffman(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int huffBlockBits, int gr, int ch) -{ - int r1Start, r2Start, rEnd[4]; /* region boundaries */ - int i, w, bitsUsed, bitsLeft; - unsigned char *startBuf = buf; - - FrameHeader *fh; - SideInfo *si; - SideInfoSub *sis; - ScaleFactorInfo *sfi; - HuffmanInfo *hi; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS || !mp3DecInfo->HuffmanInfoPS) - return -1; - - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - si = ((SideInfo *)(mp3DecInfo->SideInfoPS)); - sis = &si->sis[gr][ch]; - sfi = ((ScaleFactorInfo *)(mp3DecInfo->ScaleFactorInfoPS)); - hi = (HuffmanInfo*)(mp3DecInfo->HuffmanInfoPS); - - if (huffBlockBits < 0) - return -1; - - /* figure out region boundaries (the first 2*bigVals coefficients divided into 3 regions) */ - if (sis->winSwitchFlag && sis->blockType == 2) { - if (sis->mixedBlock == 0) { - r1Start = fh->sfBand->s[(sis->region0Count + 1)/3] * 3; - } else { - if (fh->ver == MPEG1) { - r1Start = fh->sfBand->l[sis->region0Count + 1]; - } else { - /* see MPEG2 spec for explanation */ - w = fh->sfBand->s[4] - fh->sfBand->s[3]; - r1Start = fh->sfBand->l[6] + 2*w; - } - } - r2Start = MAX_NSAMP; /* short blocks don't have region 2 */ - } else { - r1Start = fh->sfBand->l[sis->region0Count + 1]; - r2Start = fh->sfBand->l[sis->region0Count + 1 + sis->region1Count + 1]; - } - - /* offset rEnd index by 1 so first region = rEnd[1] - rEnd[0], etc. */ - rEnd[3] = MIN(MAX_NSAMP, 2 * sis->nBigvals); - rEnd[2] = MIN(r2Start, rEnd[3]); - rEnd[1] = MIN(r1Start, rEnd[3]); - rEnd[0] = 0; - - /* rounds up to first all-zero pair (we don't check last pair for (x,y) == (non-zero, zero)) */ - hi->nonZeroBound[ch] = rEnd[3]; - - /* decode Huffman pairs (rEnd[i] are always even numbers) */ - bitsLeft = huffBlockBits; - for (i = 0; i < 3; i++) { - bitsUsed = DecodeHuffmanPairs(hi->huffDecBuf[ch] + rEnd[i], rEnd[i+1] - rEnd[i], sis->tableSelect[i], bitsLeft, buf, *bitOffset); - if (bitsUsed < 0 || bitsUsed > bitsLeft) /* error - overran end of bitstream */ - return -1; - - /* update bitstream position */ - buf += (bitsUsed + *bitOffset) >> 3; - *bitOffset = (bitsUsed + *bitOffset) & 0x07; - bitsLeft -= bitsUsed; - } - - /* decode Huffman quads (if any) */ - hi->nonZeroBound[ch] += DecodeHuffmanQuads(hi->huffDecBuf[ch] + rEnd[3], MAX_NSAMP - rEnd[3], sis->count1TableSelect, bitsLeft, buf, *bitOffset); - - ASSERT(hi->nonZeroBound[ch] <= MAX_NSAMP); - for (i = hi->nonZeroBound[ch]; i < MAX_NSAMP; i++) - hi->huffDecBuf[ch][i] = 0; - - /* If bits used for 576 samples < huffBlockBits, then the extras are considered - * to be stuffing bits (throw away, but need to return correct bitstream position) - */ - buf += (bitsLeft + *bitOffset) >> 3; - *bitOffset = (bitsLeft + *bitOffset) & 0x07; - - return (buf - startBuf); -} - diff --git a/bsp/stm32_radio/mp3/real/hufftabs.c b/bsp/stm32_radio/mp3/real/hufftabs.c deleted file mode 100644 index c1b066cfe5..0000000000 --- a/bsp/stm32_radio/mp3/real/hufftabs.c +++ /dev/null @@ -1,755 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * hufftabs.c - compressed Huffman code tables - **************************************************************************************/ - -#include "coder.h" - -/* NOTE - regenerated tables to use shorts instead of ints - * (all needed data can fit in 16 bits - see below) - * - * format 0xABCD - * A = length of codeword - * B = y value - * C = x value - * D = number of sign bits (0, 1, or 2) - * - * to read a CW, the code reads maxbits from the stream (dep. on - * table index), but doesn't remove them from the bitstream reader - * then it gets the correct CW by direct lookup into the table - * of length (2^maxbits) (more complicated for non-oneShot...) - * for CW's with hlen < maxbits, there are multiple entries in the - * table (extra bits are don't cares) - * the bitstream reader then "purges" (or removes) only the correct - * number of bits for the chosen CW - * - * entries starting with F are special: D (signbits) is maxbits, - * so the decoder always checks huffTableXX[0] first, gets the - * signbits, and reads that many bits from the bitstream - * (sometimes it takes > 1 read to get the value, so maxbits is - * can get updated by jumping to another value starting with 0xF) - * entries starting with 0 are also special: A = hlen = 0, rest of - * value is an offset to jump higher in the table (for tables of - * type loopNoLinbits or loopLinbits) - */ - -/* store Huffman codes as one big table plus table of offsets, since some platforms - * don't properly support table-of-tables (table of pointers to other const tables) - */ -const unsigned short huffTable[] = { - /* huffTable01[9] */ - 0xf003, 0x3112, 0x3101, 0x2011, 0x2011, 0x1000, 0x1000, 0x1000, - 0x1000, - - /* huffTable02[65] */ - 0xf006, 0x6222, 0x6201, 0x5212, 0x5212, 0x5122, 0x5122, 0x5021, - 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, - - /* huffTable03[65] */ - 0xf006, 0x6222, 0x6201, 0x5212, 0x5212, 0x5122, 0x5122, 0x5021, - 0x5021, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, - 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, - 0x2101, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, - - /* huffTable05[257] */ - 0xf008, 0x8332, 0x8322, 0x7232, 0x7232, 0x6132, 0x6132, 0x6132, - 0x6132, 0x7312, 0x7312, 0x7301, 0x7301, 0x7031, 0x7031, 0x7222, - 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, - 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, - - /* huffTable06[129] */ - 0xf007, 0x7332, 0x7301, 0x6322, 0x6322, 0x6232, 0x6232, 0x6031, - 0x6031, 0x5312, 0x5312, 0x5312, 0x5312, 0x5132, 0x5132, 0x5132, - 0x5132, 0x5222, 0x5222, 0x5222, 0x5222, 0x5201, 0x5201, 0x5201, - 0x5201, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, - 0x4021, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, - - /* huffTable07[110] */ - 0xf006, 0x0041, 0x0052, 0x005b, 0x0060, 0x0063, 0x0068, 0x006b, - 0x6212, 0x5122, 0x5122, 0x6201, 0x6021, 0x4112, 0x4112, 0x4112, - 0x4112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf004, 0x4552, 0x4542, 0x4452, 0x4352, 0x3532, 0x3532, - 0x3442, 0x3442, 0x3522, 0x3522, 0x3252, 0x3252, 0x2512, 0x2512, - 0x2512, 0x2512, 0xf003, 0x2152, 0x2152, 0x3501, 0x3432, 0x2051, - 0x2051, 0x3342, 0x3332, 0xf002, 0x2422, 0x2242, 0x1412, 0x1412, - 0xf001, 0x1142, 0x1041, 0xf002, 0x2401, 0x2322, 0x2232, 0x2301, - 0xf001, 0x1312, 0x1132, 0xf001, 0x1031, 0x1222, - - /* huffTable08[280] */ - 0xf008, 0x0101, 0x010a, 0x010f, 0x8512, 0x8152, 0x0112, 0x0115, - 0x8422, 0x8242, 0x8412, 0x7142, 0x7142, 0x8401, 0x8041, 0x8322, - 0x8232, 0x8312, 0x8132, 0x8301, 0x8031, 0x6222, 0x6222, 0x6222, - 0x6222, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0xf003, 0x3552, 0x3452, 0x2542, 0x2542, 0x1352, 0x1352, - 0x1352, 0x1352, 0xf002, 0x2532, 0x2442, 0x1522, 0x1522, 0xf001, - 0x1252, 0x1501, 0xf001, 0x1432, 0x1342, 0xf001, 0x1051, 0x1332, - - /* huffTable09[93] */ - 0xf006, 0x0041, 0x004a, 0x004f, 0x0052, 0x0057, 0x005a, 0x6412, - 0x6142, 0x6322, 0x6232, 0x5312, 0x5312, 0x5132, 0x5132, 0x6301, - 0x6031, 0x5222, 0x5222, 0x5201, 0x5201, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4021, 0x4021, 0x4021, - 0x4021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0xf003, 0x3552, 0x3542, 0x2532, 0x2532, 0x2352, 0x2352, - 0x3452, 0x3501, 0xf002, 0x2442, 0x2522, 0x2252, 0x2512, 0xf001, - 0x1152, 0x1432, 0xf002, 0x1342, 0x1342, 0x2051, 0x2401, 0xf001, - 0x1422, 0x1242, 0xf001, 0x1332, 0x1041, - - /* huffTable10[320] */ - 0xf008, 0x0101, 0x010a, 0x010f, 0x0118, 0x011b, 0x0120, 0x0125, - 0x8712, 0x8172, 0x012a, 0x012d, 0x0132, 0x8612, 0x8162, 0x8061, - 0x0137, 0x013a, 0x013d, 0x8412, 0x8142, 0x8041, 0x8322, 0x8232, - 0x8301, 0x7312, 0x7312, 0x7132, 0x7132, 0x7031, 0x7031, 0x7222, - 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, - 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf003, 0x3772, 0x3762, 0x3672, 0x3752, 0x3572, 0x3662, - 0x2742, 0x2742, 0xf002, 0x2472, 0x2652, 0x2562, 0x2732, 0xf003, - 0x2372, 0x2372, 0x2642, 0x2642, 0x3552, 0x3452, 0x2362, 0x2362, - 0xf001, 0x1722, 0x1272, 0xf002, 0x2462, 0x2701, 0x1071, 0x1071, - 0xf002, 0x1262, 0x1262, 0x2542, 0x2532, 0xf002, 0x1601, 0x1601, - 0x2352, 0x2442, 0xf001, 0x1632, 0x1622, 0xf002, 0x2522, 0x2252, - 0x1512, 0x1512, 0xf002, 0x1152, 0x1152, 0x2432, 0x2342, 0xf001, - 0x1501, 0x1051, 0xf001, 0x1422, 0x1242, 0xf001, 0x1332, 0x1401, - - /* huffTable11[296] */ - 0xf008, 0x0101, 0x0106, 0x010f, 0x0114, 0x0117, 0x8722, 0x8272, - 0x011c, 0x7172, 0x7172, 0x8712, 0x8071, 0x8632, 0x8362, 0x8061, - 0x011f, 0x0122, 0x8512, 0x7262, 0x7262, 0x8622, 0x8601, 0x7612, - 0x7612, 0x7162, 0x7162, 0x8152, 0x8432, 0x8051, 0x0125, 0x8422, - 0x8242, 0x8412, 0x8142, 0x8401, 0x8041, 0x7322, 0x7322, 0x7232, - 0x7232, 0x6312, 0x6312, 0x6312, 0x6312, 0x6132, 0x6132, 0x6132, - 0x6132, 0x7301, 0x7301, 0x7031, 0x7031, 0x6222, 0x6222, 0x6222, - 0x6222, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, - 0x5201, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, - 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0xf002, 0x2772, 0x2762, 0x2672, 0x2572, 0xf003, 0x2662, - 0x2662, 0x2742, 0x2742, 0x2472, 0x2472, 0x3752, 0x3552, 0xf002, - 0x2652, 0x2562, 0x1732, 0x1732, 0xf001, 0x1372, 0x1642, 0xf002, - 0x2542, 0x2452, 0x2532, 0x2352, 0xf001, 0x1462, 0x1701, 0xf001, - 0x1442, 0x1522, 0xf001, 0x1252, 0x1501, 0xf001, 0x1342, 0x1332, - - /* huffTable12[185] */ - 0xf007, 0x0081, 0x008a, 0x008f, 0x0092, 0x0097, 0x009a, 0x009d, - 0x00a2, 0x00a5, 0x00a8, 0x7622, 0x7262, 0x7162, 0x00ad, 0x00b0, - 0x00b3, 0x7512, 0x7152, 0x7432, 0x7342, 0x00b6, 0x7422, 0x7242, - 0x7412, 0x6332, 0x6332, 0x6142, 0x6142, 0x6322, 0x6322, 0x6232, - 0x6232, 0x7041, 0x7301, 0x6031, 0x6031, 0x5312, 0x5312, 0x5312, - 0x5312, 0x5132, 0x5132, 0x5132, 0x5132, 0x5222, 0x5222, 0x5222, - 0x5222, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x5201, 0x5201, 0x5201, 0x5201, 0x5021, 0x5021, 0x5021, - 0x5021, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0xf003, 0x3772, 0x3762, 0x2672, 0x2672, 0x2752, 0x2752, - 0x2572, 0x2572, 0xf002, 0x2662, 0x2742, 0x2472, 0x2562, 0xf001, - 0x1652, 0x1732, 0xf002, 0x2372, 0x2552, 0x1722, 0x1722, 0xf001, - 0x1272, 0x1642, 0xf001, 0x1462, 0x1712, 0xf002, 0x1172, 0x1172, - 0x2701, 0x2071, 0xf001, 0x1632, 0x1362, 0xf001, 0x1542, 0x1452, - 0xf002, 0x1442, 0x1442, 0x2601, 0x2501, 0xf001, 0x1612, 0x1061, - 0xf001, 0x1532, 0x1352, 0xf001, 0x1522, 0x1252, 0xf001, 0x1051, - 0x1401, - - /* huffTable13[497] */ - 0xf006, 0x0041, 0x0082, 0x00c3, 0x00e4, 0x0105, 0x0116, 0x011f, - 0x0130, 0x0139, 0x013e, 0x0143, 0x0146, 0x6212, 0x6122, 0x6201, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4101, 0x4101, 0x4101, - 0x4101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf006, 0x0108, 0x0111, 0x011a, 0x0123, 0x012c, 0x0131, - 0x0136, 0x013f, 0x0144, 0x0147, 0x014c, 0x0151, 0x0156, 0x015b, - 0x6f12, 0x61f2, 0x60f1, 0x0160, 0x0163, 0x0166, 0x62e2, 0x0169, - 0x6e12, 0x61e2, 0x016c, 0x016f, 0x0172, 0x0175, 0x0178, 0x017b, - 0x66c2, 0x6d32, 0x017e, 0x6d22, 0x62d2, 0x6d12, 0x67b2, 0x0181, - 0x0184, 0x63c2, 0x0187, 0x6b42, 0x51d2, 0x51d2, 0x6d01, 0x60d1, - 0x6a82, 0x68a2, 0x6c42, 0x64c2, 0x6b62, 0x66b2, 0x5c32, 0x5c32, - 0x5c22, 0x5c22, 0x52c2, 0x52c2, 0x5b52, 0x5b52, 0x65b2, 0x6982, - 0x5c12, 0x5c12, 0xf006, 0x51c2, 0x51c2, 0x6892, 0x6c01, 0x50c1, - 0x50c1, 0x64b2, 0x6a62, 0x66a2, 0x6972, 0x5b32, 0x5b32, 0x53b2, - 0x53b2, 0x6882, 0x6a52, 0x5b22, 0x5b22, 0x65a2, 0x6962, 0x54a2, - 0x54a2, 0x6872, 0x6782, 0x5492, 0x5492, 0x6772, 0x6672, 0x42b2, - 0x42b2, 0x42b2, 0x42b2, 0x4b12, 0x4b12, 0x4b12, 0x4b12, 0x41b2, - 0x41b2, 0x41b2, 0x41b2, 0x5b01, 0x5b01, 0x50b1, 0x50b1, 0x5692, - 0x5692, 0x5a42, 0x5a42, 0x5a32, 0x5a32, 0x53a2, 0x53a2, 0x5952, - 0x5952, 0x5592, 0x5592, 0x4a22, 0x4a22, 0x4a22, 0x4a22, 0x42a2, - 0x42a2, 0x42a2, 0x42a2, 0xf005, 0x4a12, 0x4a12, 0x41a2, 0x41a2, - 0x5a01, 0x5862, 0x40a1, 0x40a1, 0x5682, 0x5942, 0x4392, 0x4392, - 0x5932, 0x5852, 0x5582, 0x5762, 0x4922, 0x4922, 0x4292, 0x4292, - 0x5752, 0x5572, 0x4832, 0x4832, 0x4382, 0x4382, 0x5662, 0x5742, - 0x5472, 0x5652, 0x5562, 0x5372, 0xf005, 0x3912, 0x3912, 0x3912, - 0x3912, 0x3192, 0x3192, 0x3192, 0x3192, 0x4901, 0x4901, 0x4091, - 0x4091, 0x4842, 0x4842, 0x4482, 0x4482, 0x4272, 0x4272, 0x5642, - 0x5462, 0x3822, 0x3822, 0x3822, 0x3822, 0x3282, 0x3282, 0x3282, - 0x3282, 0x3812, 0x3812, 0x3812, 0x3812, 0xf004, 0x4732, 0x4722, - 0x3712, 0x3712, 0x3172, 0x3172, 0x4552, 0x4701, 0x4071, 0x4632, - 0x4362, 0x4542, 0x4452, 0x4622, 0x4262, 0x4532, 0xf003, 0x2182, - 0x2182, 0x3801, 0x3081, 0x3612, 0x3162, 0x3601, 0x3061, 0xf004, - 0x4352, 0x4442, 0x3522, 0x3522, 0x3252, 0x3252, 0x3501, 0x3501, - 0x2512, 0x2512, 0x2512, 0x2512, 0x2152, 0x2152, 0x2152, 0x2152, - 0xf003, 0x3432, 0x3342, 0x3051, 0x3422, 0x3242, 0x3332, 0x2412, - 0x2412, 0xf002, 0x1142, 0x1142, 0x2401, 0x2041, 0xf002, 0x2322, - 0x2232, 0x1312, 0x1312, 0xf001, 0x1132, 0x1301, 0xf001, 0x1031, - 0x1222, 0xf003, 0x0082, 0x008b, 0x008e, 0x0091, 0x0094, 0x0097, - 0x3ce2, 0x3dd2, 0xf003, 0x0093, 0x3eb2, 0x3be2, 0x3f92, 0x39f2, - 0x3ae2, 0x3db2, 0x3bd2, 0xf003, 0x3f82, 0x38f2, 0x3cc2, 0x008d, - 0x3e82, 0x0090, 0x27f2, 0x27f2, 0xf003, 0x2ad2, 0x2ad2, 0x3da2, - 0x3cb2, 0x3bc2, 0x36f2, 0x2f62, 0x2f62, 0xf002, 0x28e2, 0x2f52, - 0x2d92, 0x29d2, 0xf002, 0x25f2, 0x27e2, 0x2ca2, 0x2bb2, 0xf003, - 0x2f42, 0x2f42, 0x24f2, 0x24f2, 0x3ac2, 0x36e2, 0x23f2, 0x23f2, - 0xf002, 0x1f32, 0x1f32, 0x2d82, 0x28d2, 0xf001, 0x1f22, 0x12f2, - 0xf002, 0x2e62, 0x2c92, 0x1f01, 0x1f01, 0xf002, 0x29c2, 0x2e52, - 0x1ba2, 0x1ba2, 0xf002, 0x2d72, 0x27d2, 0x1e42, 0x1e42, 0xf002, - 0x28c2, 0x26d2, 0x1e32, 0x1e32, 0xf002, 0x19b2, 0x19b2, 0x2b92, - 0x2aa2, 0xf001, 0x1ab2, 0x15e2, 0xf001, 0x14e2, 0x1c82, 0xf001, - 0x1d62, 0x13e2, 0xf001, 0x1e22, 0x1e01, 0xf001, 0x10e1, 0x1d52, - 0xf001, 0x15d2, 0x1c72, 0xf001, 0x17c2, 0x1d42, 0xf001, 0x1b82, - 0x18b2, 0xf001, 0x14d2, 0x1a92, 0xf001, 0x19a2, 0x1c62, 0xf001, - 0x13d2, 0x1b72, 0xf001, 0x1c52, 0x15c2, 0xf001, 0x1992, 0x1a72, - 0xf001, 0x17a2, 0x1792, 0xf003, 0x0023, 0x3df2, 0x2de2, 0x2de2, - 0x1ff2, 0x1ff2, 0x1ff2, 0x1ff2, 0xf001, 0x1fe2, 0x1fd2, 0xf001, - 0x1ee2, 0x1fc2, 0xf001, 0x1ed2, 0x1fb2, 0xf001, 0x1bf2, 0x1ec2, - 0xf002, 0x1cd2, 0x1cd2, 0x2fa2, 0x29e2, 0xf001, 0x1af2, 0x1dc2, - 0xf001, 0x1ea2, 0x1e92, 0xf001, 0x1f72, 0x1e72, 0xf001, 0x1ef2, - 0x1cf2, - - /* huffTable15[580] */ - 0xf008, 0x0101, 0x0122, 0x0143, 0x0154, 0x0165, 0x0176, 0x017f, - 0x0188, 0x0199, 0x01a2, 0x01ab, 0x01b4, 0x01bd, 0x01c2, 0x01cb, - 0x01d4, 0x01d9, 0x01de, 0x01e3, 0x01e8, 0x01ed, 0x01f2, 0x01f7, - 0x01fc, 0x0201, 0x0204, 0x0207, 0x020a, 0x020f, 0x0212, 0x0215, - 0x021a, 0x021d, 0x0220, 0x8192, 0x0223, 0x0226, 0x0229, 0x022c, - 0x022f, 0x8822, 0x8282, 0x8812, 0x8182, 0x0232, 0x0235, 0x0238, - 0x023b, 0x8722, 0x8272, 0x8462, 0x8712, 0x8552, 0x8172, 0x023e, - 0x8632, 0x8362, 0x8542, 0x8452, 0x8622, 0x8262, 0x8612, 0x0241, - 0x8532, 0x7162, 0x7162, 0x8352, 0x8442, 0x7522, 0x7522, 0x7252, - 0x7252, 0x7512, 0x7512, 0x7152, 0x7152, 0x8501, 0x8051, 0x7432, - 0x7432, 0x7342, 0x7342, 0x7422, 0x7422, 0x7242, 0x7242, 0x7332, - 0x7332, 0x6142, 0x6142, 0x6142, 0x6142, 0x7412, 0x7412, 0x7401, - 0x7401, 0x6322, 0x6322, 0x6322, 0x6322, 0x6232, 0x6232, 0x6232, - 0x6232, 0x7041, 0x7041, 0x7301, 0x7301, 0x6312, 0x6312, 0x6312, - 0x6312, 0x6132, 0x6132, 0x6132, 0x6132, 0x6031, 0x6031, 0x6031, - 0x6031, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, - 0x5222, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, - 0x5212, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, - 0x5201, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, - 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0xf005, 0x5ff2, 0x5fe2, 0x5ef2, 0x5fd2, 0x4ee2, 0x4ee2, - 0x5df2, 0x5fc2, 0x5cf2, 0x5ed2, 0x5de2, 0x5fb2, 0x4bf2, 0x4bf2, - 0x5ec2, 0x5ce2, 0x4dd2, 0x4dd2, 0x4fa2, 0x4fa2, 0x4af2, 0x4af2, - 0x4eb2, 0x4eb2, 0x4be2, 0x4be2, 0x4dc2, 0x4dc2, 0x4cd2, 0x4cd2, - 0x4f92, 0x4f92, 0xf005, 0x49f2, 0x49f2, 0x4ae2, 0x4ae2, 0x4db2, - 0x4db2, 0x4bd2, 0x4bd2, 0x4f82, 0x4f82, 0x48f2, 0x48f2, 0x4cc2, - 0x4cc2, 0x4e92, 0x4e92, 0x49e2, 0x49e2, 0x4f72, 0x4f72, 0x47f2, - 0x47f2, 0x4da2, 0x4da2, 0x4ad2, 0x4ad2, 0x4cb2, 0x4cb2, 0x4f62, - 0x4f62, 0x5ea2, 0x5f01, 0xf004, 0x3bc2, 0x3bc2, 0x36f2, 0x36f2, - 0x4e82, 0x48e2, 0x4f52, 0x4d92, 0x35f2, 0x35f2, 0x3e72, 0x3e72, - 0x37e2, 0x37e2, 0x3ca2, 0x3ca2, 0xf004, 0x3ac2, 0x3ac2, 0x3bb2, - 0x3bb2, 0x49d2, 0x4d82, 0x3f42, 0x3f42, 0x34f2, 0x34f2, 0x3f32, - 0x3f32, 0x33f2, 0x33f2, 0x38d2, 0x38d2, 0xf004, 0x36e2, 0x36e2, - 0x3f22, 0x3f22, 0x32f2, 0x32f2, 0x4e62, 0x40f1, 0x3f12, 0x3f12, - 0x31f2, 0x31f2, 0x3c92, 0x3c92, 0x39c2, 0x39c2, 0xf003, 0x3e52, - 0x3ba2, 0x3ab2, 0x35e2, 0x3d72, 0x37d2, 0x3e42, 0x34e2, 0xf003, - 0x3c82, 0x38c2, 0x3e32, 0x3d62, 0x36d2, 0x33e2, 0x3b92, 0x39b2, - 0xf004, 0x3e22, 0x3e22, 0x3aa2, 0x3aa2, 0x32e2, 0x32e2, 0x3e12, - 0x3e12, 0x31e2, 0x31e2, 0x4e01, 0x40e1, 0x3d52, 0x3d52, 0x35d2, - 0x35d2, 0xf003, 0x3c72, 0x37c2, 0x3d42, 0x3b82, 0x24d2, 0x24d2, - 0x38b2, 0x3a92, 0xf003, 0x39a2, 0x3c62, 0x36c2, 0x3d32, 0x23d2, - 0x23d2, 0x22d2, 0x22d2, 0xf003, 0x3d22, 0x3d01, 0x2d12, 0x2d12, - 0x2b72, 0x2b72, 0x27b2, 0x27b2, 0xf003, 0x21d2, 0x21d2, 0x3c52, - 0x30d1, 0x25c2, 0x25c2, 0x2a82, 0x2a82, 0xf002, 0x28a2, 0x2c42, - 0x24c2, 0x2b62, 0xf003, 0x26b2, 0x26b2, 0x3992, 0x3c01, 0x2c32, - 0x2c32, 0x23c2, 0x23c2, 0xf003, 0x2a72, 0x2a72, 0x27a2, 0x27a2, - 0x26a2, 0x26a2, 0x30c1, 0x3b01, 0xf002, 0x12c2, 0x12c2, 0x2c22, - 0x2b52, 0xf002, 0x25b2, 0x2c12, 0x2982, 0x2892, 0xf002, 0x21c2, - 0x2b42, 0x24b2, 0x2a62, 0xf002, 0x2b32, 0x2972, 0x13b2, 0x13b2, - 0xf002, 0x2792, 0x2882, 0x2b22, 0x2a52, 0xf002, 0x12b2, 0x12b2, - 0x25a2, 0x2b12, 0xf002, 0x11b2, 0x11b2, 0x20b1, 0x2962, 0xf002, - 0x2692, 0x2a42, 0x24a2, 0x2872, 0xf002, 0x2782, 0x2a32, 0x13a2, - 0x13a2, 0xf001, 0x1952, 0x1592, 0xf001, 0x1a22, 0x12a2, 0xf001, - 0x1a12, 0x11a2, 0xf002, 0x2a01, 0x20a1, 0x1862, 0x1862, 0xf001, - 0x1682, 0x1942, 0xf001, 0x1492, 0x1932, 0xf002, 0x1392, 0x1392, - 0x2772, 0x2901, 0xf001, 0x1852, 0x1582, 0xf001, 0x1922, 0x1762, - 0xf001, 0x1672, 0x1292, 0xf001, 0x1912, 0x1091, 0xf001, 0x1842, - 0x1482, 0xf001, 0x1752, 0x1572, 0xf001, 0x1832, 0x1382, 0xf001, - 0x1662, 0x1742, 0xf001, 0x1472, 0x1801, 0xf001, 0x1081, 0x1652, - 0xf001, 0x1562, 0x1732, 0xf001, 0x1372, 0x1642, 0xf001, 0x1701, - 0x1071, 0xf001, 0x1601, 0x1061, - - /* huffTable16[651] */ - 0xf008, 0x0101, 0x010a, 0x0113, 0x8ff2, 0x0118, 0x011d, 0x0120, - 0x82f2, 0x0131, 0x8f12, 0x81f2, 0x0134, 0x0145, 0x0156, 0x0167, - 0x0178, 0x0189, 0x019a, 0x01a3, 0x01ac, 0x01b5, 0x01be, 0x01c7, - 0x01d0, 0x01d9, 0x01de, 0x01e3, 0x01e6, 0x01eb, 0x01f0, 0x8152, - 0x01f3, 0x01f6, 0x01f9, 0x01fc, 0x8412, 0x8142, 0x01ff, 0x8322, - 0x8232, 0x7312, 0x7312, 0x7132, 0x7132, 0x8301, 0x8031, 0x7222, - 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, - 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf003, 0x3fe2, 0x3ef2, 0x3fd2, 0x3df2, 0x3fc2, 0x3cf2, - 0x3fb2, 0x3bf2, 0xf003, 0x2fa2, 0x2fa2, 0x3af2, 0x3f92, 0x39f2, - 0x38f2, 0x2f82, 0x2f82, 0xf002, 0x2f72, 0x27f2, 0x2f62, 0x26f2, - 0xf002, 0x2f52, 0x25f2, 0x1f42, 0x1f42, 0xf001, 0x14f2, 0x13f2, - 0xf004, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, - 0x10f1, 0x2f32, 0x2f32, 0x2f32, 0x2f32, 0x00e2, 0x00f3, 0x00fc, - 0x0105, 0xf001, 0x1f22, 0x1f01, 0xf004, 0x00fa, 0x00ff, 0x0104, - 0x0109, 0x010c, 0x0111, 0x0116, 0x0119, 0x011e, 0x0123, 0x0128, - 0x43e2, 0x012d, 0x0130, 0x0133, 0x0136, 0xf004, 0x0128, 0x012b, - 0x012e, 0x4d01, 0x0131, 0x0134, 0x0137, 0x4c32, 0x013a, 0x4c12, - 0x40c1, 0x013d, 0x32e2, 0x32e2, 0x4e22, 0x4e12, 0xf004, 0x43d2, - 0x4d22, 0x42d2, 0x41d2, 0x4b32, 0x012f, 0x3d12, 0x3d12, 0x44c2, - 0x4b62, 0x43c2, 0x47a2, 0x3c22, 0x3c22, 0x42c2, 0x45b2, 0xf004, - 0x41c2, 0x4c01, 0x4b42, 0x44b2, 0x4a62, 0x46a2, 0x33b2, 0x33b2, - 0x4a52, 0x45a2, 0x3b22, 0x3b22, 0x32b2, 0x32b2, 0x3b12, 0x3b12, - 0xf004, 0x31b2, 0x31b2, 0x4b01, 0x40b1, 0x4962, 0x4692, 0x4a42, - 0x44a2, 0x4872, 0x4782, 0x33a2, 0x33a2, 0x4a32, 0x4952, 0x3a22, - 0x3a22, 0xf004, 0x4592, 0x4862, 0x31a2, 0x31a2, 0x4682, 0x4772, - 0x3492, 0x3492, 0x4942, 0x4752, 0x3762, 0x3762, 0x22a2, 0x22a2, - 0x22a2, 0x22a2, 0xf003, 0x2a12, 0x2a12, 0x3a01, 0x30a1, 0x3932, - 0x3392, 0x3852, 0x3582, 0xf003, 0x2922, 0x2922, 0x2292, 0x2292, - 0x3672, 0x3901, 0x2912, 0x2912, 0xf003, 0x2192, 0x2192, 0x3091, - 0x3842, 0x3482, 0x3572, 0x3832, 0x3382, 0xf003, 0x3662, 0x3822, - 0x2282, 0x2282, 0x3742, 0x3472, 0x2812, 0x2812, 0xf003, 0x2182, - 0x2182, 0x2081, 0x2081, 0x3801, 0x3652, 0x2732, 0x2732, 0xf003, - 0x2372, 0x2372, 0x3562, 0x3642, 0x2722, 0x2722, 0x2272, 0x2272, - 0xf003, 0x3462, 0x3552, 0x2701, 0x2701, 0x1712, 0x1712, 0x1712, - 0x1712, 0xf002, 0x1172, 0x1172, 0x2071, 0x2632, 0xf002, 0x2362, - 0x2542, 0x2452, 0x2622, 0xf001, 0x1262, 0x1612, 0xf002, 0x1162, - 0x1162, 0x2601, 0x2061, 0xf002, 0x1352, 0x1352, 0x2532, 0x2442, - 0xf001, 0x1522, 0x1252, 0xf001, 0x1512, 0x1501, 0xf001, 0x1432, - 0x1342, 0xf001, 0x1051, 0x1422, 0xf001, 0x1242, 0x1332, 0xf001, - 0x1401, 0x1041, 0xf004, 0x4ec2, 0x0086, 0x3ed2, 0x3ed2, 0x39e2, - 0x39e2, 0x4ae2, 0x49d2, 0x2ee2, 0x2ee2, 0x2ee2, 0x2ee2, 0x3de2, - 0x3de2, 0x3be2, 0x3be2, 0xf003, 0x2eb2, 0x2eb2, 0x2dc2, 0x2dc2, - 0x3cd2, 0x3bd2, 0x2ea2, 0x2ea2, 0xf003, 0x2cc2, 0x2cc2, 0x3da2, - 0x3ad2, 0x3e72, 0x3ca2, 0x2ac2, 0x2ac2, 0xf003, 0x39c2, 0x3d72, - 0x2e52, 0x2e52, 0x1db2, 0x1db2, 0x1db2, 0x1db2, 0xf002, 0x1e92, - 0x1e92, 0x2cb2, 0x2bc2, 0xf002, 0x2e82, 0x28e2, 0x2d92, 0x27e2, - 0xf002, 0x2bb2, 0x2d82, 0x28d2, 0x2e62, 0xf001, 0x16e2, 0x1c92, - 0xf002, 0x2ba2, 0x2ab2, 0x25e2, 0x27d2, 0xf002, 0x1e42, 0x1e42, - 0x24e2, 0x2c82, 0xf001, 0x18c2, 0x1e32, 0xf002, 0x1d62, 0x1d62, - 0x26d2, 0x2b92, 0xf002, 0x29b2, 0x2aa2, 0x11e2, 0x11e2, 0xf002, - 0x14d2, 0x14d2, 0x28b2, 0x29a2, 0xf002, 0x1b72, 0x1b72, 0x27b2, - 0x20d1, 0xf001, 0x1e01, 0x10e1, 0xf001, 0x1d52, 0x15d2, 0xf001, - 0x1c72, 0x17c2, 0xf001, 0x1d42, 0x1b82, 0xf001, 0x1a92, 0x1c62, - 0xf001, 0x16c2, 0x1d32, 0xf001, 0x1c52, 0x15c2, 0xf001, 0x1a82, - 0x18a2, 0xf001, 0x1992, 0x1c42, 0xf001, 0x16b2, 0x1a72, 0xf001, - 0x1b52, 0x1982, 0xf001, 0x1892, 0x1972, 0xf001, 0x1792, 0x1882, - 0xf001, 0x1ce2, 0x1dd2, - - /* huffTable24[705] */ - 0xf009, 0x8fe2, 0x8fe2, 0x8ef2, 0x8ef2, 0x8fd2, 0x8fd2, 0x8df2, - 0x8df2, 0x8fc2, 0x8fc2, 0x8cf2, 0x8cf2, 0x8fb2, 0x8fb2, 0x8bf2, - 0x8bf2, 0x7af2, 0x7af2, 0x7af2, 0x7af2, 0x8fa2, 0x8fa2, 0x8f92, - 0x8f92, 0x79f2, 0x79f2, 0x79f2, 0x79f2, 0x78f2, 0x78f2, 0x78f2, - 0x78f2, 0x8f82, 0x8f82, 0x8f72, 0x8f72, 0x77f2, 0x77f2, 0x77f2, - 0x77f2, 0x7f62, 0x7f62, 0x7f62, 0x7f62, 0x76f2, 0x76f2, 0x76f2, - 0x76f2, 0x7f52, 0x7f52, 0x7f52, 0x7f52, 0x75f2, 0x75f2, 0x75f2, - 0x75f2, 0x7f42, 0x7f42, 0x7f42, 0x7f42, 0x74f2, 0x74f2, 0x74f2, - 0x74f2, 0x7f32, 0x7f32, 0x7f32, 0x7f32, 0x73f2, 0x73f2, 0x73f2, - 0x73f2, 0x7f22, 0x7f22, 0x7f22, 0x7f22, 0x72f2, 0x72f2, 0x72f2, - 0x72f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x8f12, 0x8f12, 0x80f1, - 0x80f1, 0x9f01, 0x0201, 0x0206, 0x020b, 0x0210, 0x0215, 0x021a, - 0x021f, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x0224, 0x0229, 0x0232, 0x0237, 0x023a, 0x023f, 0x0242, - 0x0245, 0x024a, 0x024d, 0x0250, 0x0253, 0x0256, 0x0259, 0x025c, - 0x025f, 0x0262, 0x0265, 0x0268, 0x026b, 0x026e, 0x0271, 0x0274, - 0x0277, 0x027a, 0x027d, 0x0280, 0x0283, 0x0288, 0x028b, 0x028e, - 0x0291, 0x0294, 0x0297, 0x029a, 0x029f, 0x94b2, 0x02a4, 0x02a7, - 0x02aa, 0x93b2, 0x9882, 0x02af, 0x92b2, 0x02b2, 0x02b5, 0x9692, - 0x94a2, 0x02b8, 0x9782, 0x9a32, 0x93a2, 0x9952, 0x9592, 0x9a22, - 0x92a2, 0x91a2, 0x9862, 0x9682, 0x9772, 0x9942, 0x9492, 0x9932, - 0x9392, 0x9852, 0x9582, 0x9922, 0x9762, 0x9672, 0x9292, 0x9912, - 0x9192, 0x9842, 0x9482, 0x9752, 0x9572, 0x9832, 0x9382, 0x9662, - 0x9822, 0x9282, 0x9812, 0x9742, 0x9472, 0x9182, 0x02bb, 0x9652, - 0x9562, 0x9712, 0x02be, 0x8372, 0x8372, 0x9732, 0x9722, 0x8272, - 0x8272, 0x8642, 0x8642, 0x8462, 0x8462, 0x8552, 0x8552, 0x8172, - 0x8172, 0x8632, 0x8632, 0x8362, 0x8362, 0x8542, 0x8542, 0x8452, - 0x8452, 0x8622, 0x8622, 0x8262, 0x8262, 0x8612, 0x8612, 0x8162, - 0x8162, 0x9601, 0x9061, 0x8532, 0x8532, 0x8352, 0x8352, 0x8442, - 0x8442, 0x8522, 0x8522, 0x8252, 0x8252, 0x8512, 0x8512, 0x9501, - 0x9051, 0x7152, 0x7152, 0x7152, 0x7152, 0x8432, 0x8432, 0x8342, - 0x8342, 0x7422, 0x7422, 0x7422, 0x7422, 0x7242, 0x7242, 0x7242, - 0x7242, 0x7332, 0x7332, 0x7332, 0x7332, 0x7412, 0x7412, 0x7412, - 0x7412, 0x7142, 0x7142, 0x7142, 0x7142, 0x8401, 0x8401, 0x8041, - 0x8041, 0x7322, 0x7322, 0x7322, 0x7322, 0x7232, 0x7232, 0x7232, - 0x7232, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, - 0x6312, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, - 0x6132, 0x7301, 0x7301, 0x7301, 0x7301, 0x7031, 0x7031, 0x7031, - 0x7031, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, - 0x6222, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, - 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, - 0x5212, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, - 0x6201, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0xf002, 0x2ee2, 0x2ed2, 0x2de2, 0x2ec2, 0xf002, 0x2ce2, - 0x2dd2, 0x2eb2, 0x2be2, 0xf002, 0x2dc2, 0x2cd2, 0x2ea2, 0x2ae2, - 0xf002, 0x2db2, 0x2bd2, 0x2cc2, 0x2e92, 0xf002, 0x29e2, 0x2da2, - 0x2ad2, 0x2cb2, 0xf002, 0x2bc2, 0x2e82, 0x28e2, 0x2d92, 0xf002, - 0x29d2, 0x2e72, 0x27e2, 0x2ca2, 0xf002, 0x2ac2, 0x2bb2, 0x2d82, - 0x28d2, 0xf003, 0x3e01, 0x30e1, 0x2d01, 0x2d01, 0x16e2, 0x16e2, - 0x16e2, 0x16e2, 0xf002, 0x2e62, 0x2c92, 0x19c2, 0x19c2, 0xf001, - 0x1e52, 0x1ab2, 0xf002, 0x15e2, 0x15e2, 0x2ba2, 0x2d72, 0xf001, - 0x17d2, 0x14e2, 0xf001, 0x1c82, 0x18c2, 0xf002, 0x2e42, 0x2e22, - 0x1e32, 0x1e32, 0xf001, 0x1d62, 0x16d2, 0xf001, 0x13e2, 0x1b92, - 0xf001, 0x19b2, 0x1aa2, 0xf001, 0x12e2, 0x1e12, 0xf001, 0x11e2, - 0x1d52, 0xf001, 0x15d2, 0x1c72, 0xf001, 0x17c2, 0x1d42, 0xf001, - 0x1b82, 0x18b2, 0xf001, 0x14d2, 0x1a92, 0xf001, 0x19a2, 0x1c62, - 0xf001, 0x16c2, 0x1d32, 0xf001, 0x13d2, 0x1d22, 0xf001, 0x12d2, - 0x1d12, 0xf001, 0x1b72, 0x17b2, 0xf001, 0x11d2, 0x1c52, 0xf001, - 0x15c2, 0x1a82, 0xf001, 0x18a2, 0x1992, 0xf001, 0x1c42, 0x14c2, - 0xf001, 0x1b62, 0x16b2, 0xf002, 0x20d1, 0x2c01, 0x1c32, 0x1c32, - 0xf001, 0x13c2, 0x1a72, 0xf001, 0x17a2, 0x1c22, 0xf001, 0x12c2, - 0x1b52, 0xf001, 0x15b2, 0x1c12, 0xf001, 0x1982, 0x1892, 0xf001, - 0x11c2, 0x1b42, 0xf002, 0x20c1, 0x2b01, 0x1b32, 0x1b32, 0xf002, - 0x20b1, 0x2a01, 0x1a12, 0x1a12, 0xf001, 0x1a62, 0x16a2, 0xf001, - 0x1972, 0x1792, 0xf002, 0x20a1, 0x2901, 0x1091, 0x1091, 0xf001, - 0x1b22, 0x1a52, 0xf001, 0x15a2, 0x1b12, 0xf001, 0x11b2, 0x1962, - 0xf001, 0x1a42, 0x1872, 0xf001, 0x1801, 0x1081, 0xf001, 0x1701, - 0x1071, -}; - -#define HUFF_OFFSET_01 0 -#define HUFF_OFFSET_02 ( 9 + HUFF_OFFSET_01) -#define HUFF_OFFSET_03 ( 65 + HUFF_OFFSET_02) -#define HUFF_OFFSET_05 ( 65 + HUFF_OFFSET_03) -#define HUFF_OFFSET_06 (257 + HUFF_OFFSET_05) -#define HUFF_OFFSET_07 (129 + HUFF_OFFSET_06) -#define HUFF_OFFSET_08 (110 + HUFF_OFFSET_07) -#define HUFF_OFFSET_09 (280 + HUFF_OFFSET_08) -#define HUFF_OFFSET_10 ( 93 + HUFF_OFFSET_09) -#define HUFF_OFFSET_11 (320 + HUFF_OFFSET_10) -#define HUFF_OFFSET_12 (296 + HUFF_OFFSET_11) -#define HUFF_OFFSET_13 (185 + HUFF_OFFSET_12) -#define HUFF_OFFSET_15 (497 + HUFF_OFFSET_13) -#define HUFF_OFFSET_16 (580 + HUFF_OFFSET_15) -#define HUFF_OFFSET_24 (651 + HUFF_OFFSET_16) - -const int huffTabOffset[HUFF_PAIRTABS] = { - 0, - HUFF_OFFSET_01, - HUFF_OFFSET_02, - HUFF_OFFSET_03, - 0, - HUFF_OFFSET_05, - HUFF_OFFSET_06, - HUFF_OFFSET_07, - HUFF_OFFSET_08, - HUFF_OFFSET_09, - HUFF_OFFSET_10, - HUFF_OFFSET_11, - HUFF_OFFSET_12, - HUFF_OFFSET_13, - 0, - HUFF_OFFSET_15, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, -}; - -const HuffTabLookup huffTabLookup[HUFF_PAIRTABS] = { - { 0, noBits }, - { 0, oneShot }, - { 0, oneShot }, - { 0, oneShot }, - { 0, invalidTab }, - { 0, oneShot }, - { 0, oneShot }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, invalidTab }, - { 0, loopNoLinbits }, - { 1, loopLinbits }, - { 2, loopLinbits }, - { 3, loopLinbits }, - { 4, loopLinbits }, - { 6, loopLinbits }, - { 8, loopLinbits }, - { 10, loopLinbits }, - { 13, loopLinbits }, - { 4, loopLinbits }, - { 5, loopLinbits }, - { 6, loopLinbits }, - { 7, loopLinbits }, - { 8, loopLinbits }, - { 9, loopLinbits }, - { 11, loopLinbits }, - { 13, loopLinbits }, -}; - -/* tables for quadruples - * format 0xAB - * A = length of codeword - * B = codeword - */ -const unsigned char quadTable[64+16] = { - /* table A */ - 0x6b, 0x6f, 0x6d, 0x6e, 0x67, 0x65, 0x59, 0x59, - 0x56, 0x56, 0x53, 0x53, 0x5a, 0x5a, 0x5c, 0x5c, - 0x42, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 0x41, - 0x44, 0x44, 0x44, 0x44, 0x48, 0x48, 0x48, 0x48, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - /* table B */ - 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, - 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, -}; - -const int quadTabOffset[2] = {0, 64}; -const int quadTabMaxBits[2] = {6, 4}; diff --git a/bsp/stm32_radio/mp3/real/hufftabs.c.bak b/bsp/stm32_radio/mp3/real/hufftabs.c.bak deleted file mode 100644 index 916e114f14..0000000000 --- a/bsp/stm32_radio/mp3/real/hufftabs.c.bak +++ /dev/null @@ -1,755 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * hufftabs.c - compressed Huffman code tables - **************************************************************************************/ - -#include "coder.h" - -/* NOTE - regenerated tables to use shorts instead of ints - * (all needed data can fit in 16 bits - see below) - * - * format 0xABCD - * A = length of codeword - * B = y value - * C = x value - * D = number of sign bits (0, 1, or 2) - * - * to read a CW, the code reads maxbits from the stream (dep. on - * table index), but doesn't remove them from the bitstream reader - * then it gets the correct CW by direct lookup into the table - * of length (2^maxbits) (more complicated for non-oneShot...) - * for CW's with hlen < maxbits, there are multiple entries in the - * table (extra bits are don't cares) - * the bitstream reader then "purges" (or removes) only the correct - * number of bits for the chosen CW - * - * entries starting with F are special: D (signbits) is maxbits, - * so the decoder always checks huffTableXX[0] first, gets the - * signbits, and reads that many bits from the bitstream - * (sometimes it takes > 1 read to get the value, so maxbits is - * can get updated by jumping to another value starting with 0xF) - * entries starting with 0 are also special: A = hlen = 0, rest of - * value is an offset to jump higher in the table (for tables of - * type loopNoLinbits or loopLinbits) - */ - -/* store Huffman codes as one big table plus table of offsets, since some platforms - * don't properly support table-of-tables (table of pointers to other const tables) - */ -const unsigned short huffTable[] = { - /* huffTable01[9] */ - 0xf003, 0x3112, 0x3101, 0x2011, 0x2011, 0x1000, 0x1000, 0x1000, - 0x1000, - - /* huffTable02[65] */ - 0xf006, 0x6222, 0x6201, 0x5212, 0x5212, 0x5122, 0x5122, 0x5021, - 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, - - /* huffTable03[65] */ - 0xf006, 0x6222, 0x6201, 0x5212, 0x5212, 0x5122, 0x5122, 0x5021, - 0x5021, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, - 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, 0x2101, - 0x2101, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, - - /* huffTable05[257] */ - 0xf008, 0x8332, 0x8322, 0x7232, 0x7232, 0x6132, 0x6132, 0x6132, - 0x6132, 0x7312, 0x7312, 0x7301, 0x7301, 0x7031, 0x7031, 0x7222, - 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, - 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, - - /* huffTable06[129] */ - 0xf007, 0x7332, 0x7301, 0x6322, 0x6322, 0x6232, 0x6232, 0x6031, - 0x6031, 0x5312, 0x5312, 0x5312, 0x5312, 0x5132, 0x5132, 0x5132, - 0x5132, 0x5222, 0x5222, 0x5222, 0x5222, 0x5201, 0x5201, 0x5201, - 0x5201, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, 0x4021, - 0x4021, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, - - /* huffTable07[110] */ - 0xf006, 0x0041, 0x0052, 0x005b, 0x0060, 0x0063, 0x0068, 0x006b, - 0x6212, 0x5122, 0x5122, 0x6201, 0x6021, 0x4112, 0x4112, 0x4112, - 0x4112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf004, 0x4552, 0x4542, 0x4452, 0x4352, 0x3532, 0x3532, - 0x3442, 0x3442, 0x3522, 0x3522, 0x3252, 0x3252, 0x2512, 0x2512, - 0x2512, 0x2512, 0xf003, 0x2152, 0x2152, 0x3501, 0x3432, 0x2051, - 0x2051, 0x3342, 0x3332, 0xf002, 0x2422, 0x2242, 0x1412, 0x1412, - 0xf001, 0x1142, 0x1041, 0xf002, 0x2401, 0x2322, 0x2232, 0x2301, - 0xf001, 0x1312, 0x1132, 0xf001, 0x1031, 0x1222, - - /* huffTable08[280] */ - 0xf008, 0x0101, 0x010a, 0x010f, 0x8512, 0x8152, 0x0112, 0x0115, - 0x8422, 0x8242, 0x8412, 0x7142, 0x7142, 0x8401, 0x8041, 0x8322, - 0x8232, 0x8312, 0x8132, 0x8301, 0x8031, 0x6222, 0x6222, 0x6222, - 0x6222, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, 0x2112, - 0x2112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0xf003, 0x3552, 0x3452, 0x2542, 0x2542, 0x1352, 0x1352, - 0x1352, 0x1352, 0xf002, 0x2532, 0x2442, 0x1522, 0x1522, 0xf001, - 0x1252, 0x1501, 0xf001, 0x1432, 0x1342, 0xf001, 0x1051, 0x1332, - - /* huffTable09[93] */ - 0xf006, 0x0041, 0x004a, 0x004f, 0x0052, 0x0057, 0x005a, 0x6412, - 0x6142, 0x6322, 0x6232, 0x5312, 0x5312, 0x5132, 0x5132, 0x6301, - 0x6031, 0x5222, 0x5222, 0x5201, 0x5201, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4021, 0x4021, 0x4021, - 0x4021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0xf003, 0x3552, 0x3542, 0x2532, 0x2532, 0x2352, 0x2352, - 0x3452, 0x3501, 0xf002, 0x2442, 0x2522, 0x2252, 0x2512, 0xf001, - 0x1152, 0x1432, 0xf002, 0x1342, 0x1342, 0x2051, 0x2401, 0xf001, - 0x1422, 0x1242, 0xf001, 0x1332, 0x1041, - - /* huffTable10[320] */ - 0xf008, 0x0101, 0x010a, 0x010f, 0x0118, 0x011b, 0x0120, 0x0125, - 0x8712, 0x8172, 0x012a, 0x012d, 0x0132, 0x8612, 0x8162, 0x8061, - 0x0137, 0x013a, 0x013d, 0x8412, 0x8142, 0x8041, 0x8322, 0x8232, - 0x8301, 0x7312, 0x7312, 0x7132, 0x7132, 0x7031, 0x7031, 0x7222, - 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, - 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf003, 0x3772, 0x3762, 0x3672, 0x3752, 0x3572, 0x3662, - 0x2742, 0x2742, 0xf002, 0x2472, 0x2652, 0x2562, 0x2732, 0xf003, - 0x2372, 0x2372, 0x2642, 0x2642, 0x3552, 0x3452, 0x2362, 0x2362, - 0xf001, 0x1722, 0x1272, 0xf002, 0x2462, 0x2701, 0x1071, 0x1071, - 0xf002, 0x1262, 0x1262, 0x2542, 0x2532, 0xf002, 0x1601, 0x1601, - 0x2352, 0x2442, 0xf001, 0x1632, 0x1622, 0xf002, 0x2522, 0x2252, - 0x1512, 0x1512, 0xf002, 0x1152, 0x1152, 0x2432, 0x2342, 0xf001, - 0x1501, 0x1051, 0xf001, 0x1422, 0x1242, 0xf001, 0x1332, 0x1401, - - /* huffTable11[296] */ - 0xf008, 0x0101, 0x0106, 0x010f, 0x0114, 0x0117, 0x8722, 0x8272, - 0x011c, 0x7172, 0x7172, 0x8712, 0x8071, 0x8632, 0x8362, 0x8061, - 0x011f, 0x0122, 0x8512, 0x7262, 0x7262, 0x8622, 0x8601, 0x7612, - 0x7612, 0x7162, 0x7162, 0x8152, 0x8432, 0x8051, 0x0125, 0x8422, - 0x8242, 0x8412, 0x8142, 0x8401, 0x8041, 0x7322, 0x7322, 0x7232, - 0x7232, 0x6312, 0x6312, 0x6312, 0x6312, 0x6132, 0x6132, 0x6132, - 0x6132, 0x7301, 0x7301, 0x7031, 0x7031, 0x6222, 0x6222, 0x6222, - 0x6222, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, - 0x5201, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, - 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, - 0x2000, 0xf002, 0x2772, 0x2762, 0x2672, 0x2572, 0xf003, 0x2662, - 0x2662, 0x2742, 0x2742, 0x2472, 0x2472, 0x3752, 0x3552, 0xf002, - 0x2652, 0x2562, 0x1732, 0x1732, 0xf001, 0x1372, 0x1642, 0xf002, - 0x2542, 0x2452, 0x2532, 0x2352, 0xf001, 0x1462, 0x1701, 0xf001, - 0x1442, 0x1522, 0xf001, 0x1252, 0x1501, 0xf001, 0x1342, 0x1332, - - /* huffTable12[185] */ - 0xf007, 0x0081, 0x008a, 0x008f, 0x0092, 0x0097, 0x009a, 0x009d, - 0x00a2, 0x00a5, 0x00a8, 0x7622, 0x7262, 0x7162, 0x00ad, 0x00b0, - 0x00b3, 0x7512, 0x7152, 0x7432, 0x7342, 0x00b6, 0x7422, 0x7242, - 0x7412, 0x6332, 0x6332, 0x6142, 0x6142, 0x6322, 0x6322, 0x6232, - 0x6232, 0x7041, 0x7301, 0x6031, 0x6031, 0x5312, 0x5312, 0x5312, - 0x5312, 0x5132, 0x5132, 0x5132, 0x5132, 0x5222, 0x5222, 0x5222, - 0x5222, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, 0x4212, - 0x4212, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, 0x4122, - 0x4122, 0x5201, 0x5201, 0x5201, 0x5201, 0x5021, 0x5021, 0x5021, - 0x5021, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, 0x3101, - 0x3101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0xf003, 0x3772, 0x3762, 0x2672, 0x2672, 0x2752, 0x2752, - 0x2572, 0x2572, 0xf002, 0x2662, 0x2742, 0x2472, 0x2562, 0xf001, - 0x1652, 0x1732, 0xf002, 0x2372, 0x2552, 0x1722, 0x1722, 0xf001, - 0x1272, 0x1642, 0xf001, 0x1462, 0x1712, 0xf002, 0x1172, 0x1172, - 0x2701, 0x2071, 0xf001, 0x1632, 0x1362, 0xf001, 0x1542, 0x1452, - 0xf002, 0x1442, 0x1442, 0x2601, 0x2501, 0xf001, 0x1612, 0x1061, - 0xf001, 0x1532, 0x1352, 0xf001, 0x1522, 0x1252, 0xf001, 0x1051, - 0x1401, - - /* huffTable13[497] */ - 0xf006, 0x0041, 0x0082, 0x00c3, 0x00e4, 0x0105, 0x0116, 0x011f, - 0x0130, 0x0139, 0x013e, 0x0143, 0x0146, 0x6212, 0x6122, 0x6201, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4101, 0x4101, 0x4101, - 0x4101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf006, 0x0108, 0x0111, 0x011a, 0x0123, 0x012c, 0x0131, - 0x0136, 0x013f, 0x0144, 0x0147, 0x014c, 0x0151, 0x0156, 0x015b, - 0x6f12, 0x61f2, 0x60f1, 0x0160, 0x0163, 0x0166, 0x62e2, 0x0169, - 0x6e12, 0x61e2, 0x016c, 0x016f, 0x0172, 0x0175, 0x0178, 0x017b, - 0x66c2, 0x6d32, 0x017e, 0x6d22, 0x62d2, 0x6d12, 0x67b2, 0x0181, - 0x0184, 0x63c2, 0x0187, 0x6b42, 0x51d2, 0x51d2, 0x6d01, 0x60d1, - 0x6a82, 0x68a2, 0x6c42, 0x64c2, 0x6b62, 0x66b2, 0x5c32, 0x5c32, - 0x5c22, 0x5c22, 0x52c2, 0x52c2, 0x5b52, 0x5b52, 0x65b2, 0x6982, - 0x5c12, 0x5c12, 0xf006, 0x51c2, 0x51c2, 0x6892, 0x6c01, 0x50c1, - 0x50c1, 0x64b2, 0x6a62, 0x66a2, 0x6972, 0x5b32, 0x5b32, 0x53b2, - 0x53b2, 0x6882, 0x6a52, 0x5b22, 0x5b22, 0x65a2, 0x6962, 0x54a2, - 0x54a2, 0x6872, 0x6782, 0x5492, 0x5492, 0x6772, 0x6672, 0x42b2, - 0x42b2, 0x42b2, 0x42b2, 0x4b12, 0x4b12, 0x4b12, 0x4b12, 0x41b2, - 0x41b2, 0x41b2, 0x41b2, 0x5b01, 0x5b01, 0x50b1, 0x50b1, 0x5692, - 0x5692, 0x5a42, 0x5a42, 0x5a32, 0x5a32, 0x53a2, 0x53a2, 0x5952, - 0x5952, 0x5592, 0x5592, 0x4a22, 0x4a22, 0x4a22, 0x4a22, 0x42a2, - 0x42a2, 0x42a2, 0x42a2, 0xf005, 0x4a12, 0x4a12, 0x41a2, 0x41a2, - 0x5a01, 0x5862, 0x40a1, 0x40a1, 0x5682, 0x5942, 0x4392, 0x4392, - 0x5932, 0x5852, 0x5582, 0x5762, 0x4922, 0x4922, 0x4292, 0x4292, - 0x5752, 0x5572, 0x4832, 0x4832, 0x4382, 0x4382, 0x5662, 0x5742, - 0x5472, 0x5652, 0x5562, 0x5372, 0xf005, 0x3912, 0x3912, 0x3912, - 0x3912, 0x3192, 0x3192, 0x3192, 0x3192, 0x4901, 0x4901, 0x4091, - 0x4091, 0x4842, 0x4842, 0x4482, 0x4482, 0x4272, 0x4272, 0x5642, - 0x5462, 0x3822, 0x3822, 0x3822, 0x3822, 0x3282, 0x3282, 0x3282, - 0x3282, 0x3812, 0x3812, 0x3812, 0x3812, 0xf004, 0x4732, 0x4722, - 0x3712, 0x3712, 0x3172, 0x3172, 0x4552, 0x4701, 0x4071, 0x4632, - 0x4362, 0x4542, 0x4452, 0x4622, 0x4262, 0x4532, 0xf003, 0x2182, - 0x2182, 0x3801, 0x3081, 0x3612, 0x3162, 0x3601, 0x3061, 0xf004, - 0x4352, 0x4442, 0x3522, 0x3522, 0x3252, 0x3252, 0x3501, 0x3501, - 0x2512, 0x2512, 0x2512, 0x2512, 0x2152, 0x2152, 0x2152, 0x2152, - 0xf003, 0x3432, 0x3342, 0x3051, 0x3422, 0x3242, 0x3332, 0x2412, - 0x2412, 0xf002, 0x1142, 0x1142, 0x2401, 0x2041, 0xf002, 0x2322, - 0x2232, 0x1312, 0x1312, 0xf001, 0x1132, 0x1301, 0xf001, 0x1031, - 0x1222, 0xf003, 0x0082, 0x008b, 0x008e, 0x0091, 0x0094, 0x0097, - 0x3ce2, 0x3dd2, 0xf003, 0x0093, 0x3eb2, 0x3be2, 0x3f92, 0x39f2, - 0x3ae2, 0x3db2, 0x3bd2, 0xf003, 0x3f82, 0x38f2, 0x3cc2, 0x008d, - 0x3e82, 0x0090, 0x27f2, 0x27f2, 0xf003, 0x2ad2, 0x2ad2, 0x3da2, - 0x3cb2, 0x3bc2, 0x36f2, 0x2f62, 0x2f62, 0xf002, 0x28e2, 0x2f52, - 0x2d92, 0x29d2, 0xf002, 0x25f2, 0x27e2, 0x2ca2, 0x2bb2, 0xf003, - 0x2f42, 0x2f42, 0x24f2, 0x24f2, 0x3ac2, 0x36e2, 0x23f2, 0x23f2, - 0xf002, 0x1f32, 0x1f32, 0x2d82, 0x28d2, 0xf001, 0x1f22, 0x12f2, - 0xf002, 0x2e62, 0x2c92, 0x1f01, 0x1f01, 0xf002, 0x29c2, 0x2e52, - 0x1ba2, 0x1ba2, 0xf002, 0x2d72, 0x27d2, 0x1e42, 0x1e42, 0xf002, - 0x28c2, 0x26d2, 0x1e32, 0x1e32, 0xf002, 0x19b2, 0x19b2, 0x2b92, - 0x2aa2, 0xf001, 0x1ab2, 0x15e2, 0xf001, 0x14e2, 0x1c82, 0xf001, - 0x1d62, 0x13e2, 0xf001, 0x1e22, 0x1e01, 0xf001, 0x10e1, 0x1d52, - 0xf001, 0x15d2, 0x1c72, 0xf001, 0x17c2, 0x1d42, 0xf001, 0x1b82, - 0x18b2, 0xf001, 0x14d2, 0x1a92, 0xf001, 0x19a2, 0x1c62, 0xf001, - 0x13d2, 0x1b72, 0xf001, 0x1c52, 0x15c2, 0xf001, 0x1992, 0x1a72, - 0xf001, 0x17a2, 0x1792, 0xf003, 0x0023, 0x3df2, 0x2de2, 0x2de2, - 0x1ff2, 0x1ff2, 0x1ff2, 0x1ff2, 0xf001, 0x1fe2, 0x1fd2, 0xf001, - 0x1ee2, 0x1fc2, 0xf001, 0x1ed2, 0x1fb2, 0xf001, 0x1bf2, 0x1ec2, - 0xf002, 0x1cd2, 0x1cd2, 0x2fa2, 0x29e2, 0xf001, 0x1af2, 0x1dc2, - 0xf001, 0x1ea2, 0x1e92, 0xf001, 0x1f72, 0x1e72, 0xf001, 0x1ef2, - 0x1cf2, - - /* huffTable15[580] */ - 0xf008, 0x0101, 0x0122, 0x0143, 0x0154, 0x0165, 0x0176, 0x017f, - 0x0188, 0x0199, 0x01a2, 0x01ab, 0x01b4, 0x01bd, 0x01c2, 0x01cb, - 0x01d4, 0x01d9, 0x01de, 0x01e3, 0x01e8, 0x01ed, 0x01f2, 0x01f7, - 0x01fc, 0x0201, 0x0204, 0x0207, 0x020a, 0x020f, 0x0212, 0x0215, - 0x021a, 0x021d, 0x0220, 0x8192, 0x0223, 0x0226, 0x0229, 0x022c, - 0x022f, 0x8822, 0x8282, 0x8812, 0x8182, 0x0232, 0x0235, 0x0238, - 0x023b, 0x8722, 0x8272, 0x8462, 0x8712, 0x8552, 0x8172, 0x023e, - 0x8632, 0x8362, 0x8542, 0x8452, 0x8622, 0x8262, 0x8612, 0x0241, - 0x8532, 0x7162, 0x7162, 0x8352, 0x8442, 0x7522, 0x7522, 0x7252, - 0x7252, 0x7512, 0x7512, 0x7152, 0x7152, 0x8501, 0x8051, 0x7432, - 0x7432, 0x7342, 0x7342, 0x7422, 0x7422, 0x7242, 0x7242, 0x7332, - 0x7332, 0x6142, 0x6142, 0x6142, 0x6142, 0x7412, 0x7412, 0x7401, - 0x7401, 0x6322, 0x6322, 0x6322, 0x6322, 0x6232, 0x6232, 0x6232, - 0x6232, 0x7041, 0x7041, 0x7301, 0x7301, 0x6312, 0x6312, 0x6312, - 0x6312, 0x6132, 0x6132, 0x6132, 0x6132, 0x6031, 0x6031, 0x6031, - 0x6031, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, - 0x5222, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, - 0x5212, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, - 0x5201, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, - 0x5021, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, 0x3112, - 0x3112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, - 0x3000, 0xf005, 0x5ff2, 0x5fe2, 0x5ef2, 0x5fd2, 0x4ee2, 0x4ee2, - 0x5df2, 0x5fc2, 0x5cf2, 0x5ed2, 0x5de2, 0x5fb2, 0x4bf2, 0x4bf2, - 0x5ec2, 0x5ce2, 0x4dd2, 0x4dd2, 0x4fa2, 0x4fa2, 0x4af2, 0x4af2, - 0x4eb2, 0x4eb2, 0x4be2, 0x4be2, 0x4dc2, 0x4dc2, 0x4cd2, 0x4cd2, - 0x4f92, 0x4f92, 0xf005, 0x49f2, 0x49f2, 0x4ae2, 0x4ae2, 0x4db2, - 0x4db2, 0x4bd2, 0x4bd2, 0x4f82, 0x4f82, 0x48f2, 0x48f2, 0x4cc2, - 0x4cc2, 0x4e92, 0x4e92, 0x49e2, 0x49e2, 0x4f72, 0x4f72, 0x47f2, - 0x47f2, 0x4da2, 0x4da2, 0x4ad2, 0x4ad2, 0x4cb2, 0x4cb2, 0x4f62, - 0x4f62, 0x5ea2, 0x5f01, 0xf004, 0x3bc2, 0x3bc2, 0x36f2, 0x36f2, - 0x4e82, 0x48e2, 0x4f52, 0x4d92, 0x35f2, 0x35f2, 0x3e72, 0x3e72, - 0x37e2, 0x37e2, 0x3ca2, 0x3ca2, 0xf004, 0x3ac2, 0x3ac2, 0x3bb2, - 0x3bb2, 0x49d2, 0x4d82, 0x3f42, 0x3f42, 0x34f2, 0x34f2, 0x3f32, - 0x3f32, 0x33f2, 0x33f2, 0x38d2, 0x38d2, 0xf004, 0x36e2, 0x36e2, - 0x3f22, 0x3f22, 0x32f2, 0x32f2, 0x4e62, 0x40f1, 0x3f12, 0x3f12, - 0x31f2, 0x31f2, 0x3c92, 0x3c92, 0x39c2, 0x39c2, 0xf003, 0x3e52, - 0x3ba2, 0x3ab2, 0x35e2, 0x3d72, 0x37d2, 0x3e42, 0x34e2, 0xf003, - 0x3c82, 0x38c2, 0x3e32, 0x3d62, 0x36d2, 0x33e2, 0x3b92, 0x39b2, - 0xf004, 0x3e22, 0x3e22, 0x3aa2, 0x3aa2, 0x32e2, 0x32e2, 0x3e12, - 0x3e12, 0x31e2, 0x31e2, 0x4e01, 0x40e1, 0x3d52, 0x3d52, 0x35d2, - 0x35d2, 0xf003, 0x3c72, 0x37c2, 0x3d42, 0x3b82, 0x24d2, 0x24d2, - 0x38b2, 0x3a92, 0xf003, 0x39a2, 0x3c62, 0x36c2, 0x3d32, 0x23d2, - 0x23d2, 0x22d2, 0x22d2, 0xf003, 0x3d22, 0x3d01, 0x2d12, 0x2d12, - 0x2b72, 0x2b72, 0x27b2, 0x27b2, 0xf003, 0x21d2, 0x21d2, 0x3c52, - 0x30d1, 0x25c2, 0x25c2, 0x2a82, 0x2a82, 0xf002, 0x28a2, 0x2c42, - 0x24c2, 0x2b62, 0xf003, 0x26b2, 0x26b2, 0x3992, 0x3c01, 0x2c32, - 0x2c32, 0x23c2, 0x23c2, 0xf003, 0x2a72, 0x2a72, 0x27a2, 0x27a2, - 0x26a2, 0x26a2, 0x30c1, 0x3b01, 0xf002, 0x12c2, 0x12c2, 0x2c22, - 0x2b52, 0xf002, 0x25b2, 0x2c12, 0x2982, 0x2892, 0xf002, 0x21c2, - 0x2b42, 0x24b2, 0x2a62, 0xf002, 0x2b32, 0x2972, 0x13b2, 0x13b2, - 0xf002, 0x2792, 0x2882, 0x2b22, 0x2a52, 0xf002, 0x12b2, 0x12b2, - 0x25a2, 0x2b12, 0xf002, 0x11b2, 0x11b2, 0x20b1, 0x2962, 0xf002, - 0x2692, 0x2a42, 0x24a2, 0x2872, 0xf002, 0x2782, 0x2a32, 0x13a2, - 0x13a2, 0xf001, 0x1952, 0x1592, 0xf001, 0x1a22, 0x12a2, 0xf001, - 0x1a12, 0x11a2, 0xf002, 0x2a01, 0x20a1, 0x1862, 0x1862, 0xf001, - 0x1682, 0x1942, 0xf001, 0x1492, 0x1932, 0xf002, 0x1392, 0x1392, - 0x2772, 0x2901, 0xf001, 0x1852, 0x1582, 0xf001, 0x1922, 0x1762, - 0xf001, 0x1672, 0x1292, 0xf001, 0x1912, 0x1091, 0xf001, 0x1842, - 0x1482, 0xf001, 0x1752, 0x1572, 0xf001, 0x1832, 0x1382, 0xf001, - 0x1662, 0x1742, 0xf001, 0x1472, 0x1801, 0xf001, 0x1081, 0x1652, - 0xf001, 0x1562, 0x1732, 0xf001, 0x1372, 0x1642, 0xf001, 0x1701, - 0x1071, 0xf001, 0x1601, 0x1061, - - /* huffTable16[651] */ - 0xf008, 0x0101, 0x010a, 0x0113, 0x8ff2, 0x0118, 0x011d, 0x0120, - 0x82f2, 0x0131, 0x8f12, 0x81f2, 0x0134, 0x0145, 0x0156, 0x0167, - 0x0178, 0x0189, 0x019a, 0x01a3, 0x01ac, 0x01b5, 0x01be, 0x01c7, - 0x01d0, 0x01d9, 0x01de, 0x01e3, 0x01e6, 0x01eb, 0x01f0, 0x8152, - 0x01f3, 0x01f6, 0x01f9, 0x01fc, 0x8412, 0x8142, 0x01ff, 0x8322, - 0x8232, 0x7312, 0x7312, 0x7132, 0x7132, 0x8301, 0x8031, 0x7222, - 0x7222, 0x6212, 0x6212, 0x6212, 0x6212, 0x6122, 0x6122, 0x6122, - 0x6122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, 0x3011, - 0x3011, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, - 0x1000, 0xf003, 0x3fe2, 0x3ef2, 0x3fd2, 0x3df2, 0x3fc2, 0x3cf2, - 0x3fb2, 0x3bf2, 0xf003, 0x2fa2, 0x2fa2, 0x3af2, 0x3f92, 0x39f2, - 0x38f2, 0x2f82, 0x2f82, 0xf002, 0x2f72, 0x27f2, 0x2f62, 0x26f2, - 0xf002, 0x2f52, 0x25f2, 0x1f42, 0x1f42, 0xf001, 0x14f2, 0x13f2, - 0xf004, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, 0x10f1, - 0x10f1, 0x2f32, 0x2f32, 0x2f32, 0x2f32, 0x00e2, 0x00f3, 0x00fc, - 0x0105, 0xf001, 0x1f22, 0x1f01, 0xf004, 0x00fa, 0x00ff, 0x0104, - 0x0109, 0x010c, 0x0111, 0x0116, 0x0119, 0x011e, 0x0123, 0x0128, - 0x43e2, 0x012d, 0x0130, 0x0133, 0x0136, 0xf004, 0x0128, 0x012b, - 0x012e, 0x4d01, 0x0131, 0x0134, 0x0137, 0x4c32, 0x013a, 0x4c12, - 0x40c1, 0x013d, 0x32e2, 0x32e2, 0x4e22, 0x4e12, 0xf004, 0x43d2, - 0x4d22, 0x42d2, 0x41d2, 0x4b32, 0x012f, 0x3d12, 0x3d12, 0x44c2, - 0x4b62, 0x43c2, 0x47a2, 0x3c22, 0x3c22, 0x42c2, 0x45b2, 0xf004, - 0x41c2, 0x4c01, 0x4b42, 0x44b2, 0x4a62, 0x46a2, 0x33b2, 0x33b2, - 0x4a52, 0x45a2, 0x3b22, 0x3b22, 0x32b2, 0x32b2, 0x3b12, 0x3b12, - 0xf004, 0x31b2, 0x31b2, 0x4b01, 0x40b1, 0x4962, 0x4692, 0x4a42, - 0x44a2, 0x4872, 0x4782, 0x33a2, 0x33a2, 0x4a32, 0x4952, 0x3a22, - 0x3a22, 0xf004, 0x4592, 0x4862, 0x31a2, 0x31a2, 0x4682, 0x4772, - 0x3492, 0x3492, 0x4942, 0x4752, 0x3762, 0x3762, 0x22a2, 0x22a2, - 0x22a2, 0x22a2, 0xf003, 0x2a12, 0x2a12, 0x3a01, 0x30a1, 0x3932, - 0x3392, 0x3852, 0x3582, 0xf003, 0x2922, 0x2922, 0x2292, 0x2292, - 0x3672, 0x3901, 0x2912, 0x2912, 0xf003, 0x2192, 0x2192, 0x3091, - 0x3842, 0x3482, 0x3572, 0x3832, 0x3382, 0xf003, 0x3662, 0x3822, - 0x2282, 0x2282, 0x3742, 0x3472, 0x2812, 0x2812, 0xf003, 0x2182, - 0x2182, 0x2081, 0x2081, 0x3801, 0x3652, 0x2732, 0x2732, 0xf003, - 0x2372, 0x2372, 0x3562, 0x3642, 0x2722, 0x2722, 0x2272, 0x2272, - 0xf003, 0x3462, 0x3552, 0x2701, 0x2701, 0x1712, 0x1712, 0x1712, - 0x1712, 0xf002, 0x1172, 0x1172, 0x2071, 0x2632, 0xf002, 0x2362, - 0x2542, 0x2452, 0x2622, 0xf001, 0x1262, 0x1612, 0xf002, 0x1162, - 0x1162, 0x2601, 0x2061, 0xf002, 0x1352, 0x1352, 0x2532, 0x2442, - 0xf001, 0x1522, 0x1252, 0xf001, 0x1512, 0x1501, 0xf001, 0x1432, - 0x1342, 0xf001, 0x1051, 0x1422, 0xf001, 0x1242, 0x1332, 0xf001, - 0x1401, 0x1041, 0xf004, 0x4ec2, 0x0086, 0x3ed2, 0x3ed2, 0x39e2, - 0x39e2, 0x4ae2, 0x49d2, 0x2ee2, 0x2ee2, 0x2ee2, 0x2ee2, 0x3de2, - 0x3de2, 0x3be2, 0x3be2, 0xf003, 0x2eb2, 0x2eb2, 0x2dc2, 0x2dc2, - 0x3cd2, 0x3bd2, 0x2ea2, 0x2ea2, 0xf003, 0x2cc2, 0x2cc2, 0x3da2, - 0x3ad2, 0x3e72, 0x3ca2, 0x2ac2, 0x2ac2, 0xf003, 0x39c2, 0x3d72, - 0x2e52, 0x2e52, 0x1db2, 0x1db2, 0x1db2, 0x1db2, 0xf002, 0x1e92, - 0x1e92, 0x2cb2, 0x2bc2, 0xf002, 0x2e82, 0x28e2, 0x2d92, 0x27e2, - 0xf002, 0x2bb2, 0x2d82, 0x28d2, 0x2e62, 0xf001, 0x16e2, 0x1c92, - 0xf002, 0x2ba2, 0x2ab2, 0x25e2, 0x27d2, 0xf002, 0x1e42, 0x1e42, - 0x24e2, 0x2c82, 0xf001, 0x18c2, 0x1e32, 0xf002, 0x1d62, 0x1d62, - 0x26d2, 0x2b92, 0xf002, 0x29b2, 0x2aa2, 0x11e2, 0x11e2, 0xf002, - 0x14d2, 0x14d2, 0x28b2, 0x29a2, 0xf002, 0x1b72, 0x1b72, 0x27b2, - 0x20d1, 0xf001, 0x1e01, 0x10e1, 0xf001, 0x1d52, 0x15d2, 0xf001, - 0x1c72, 0x17c2, 0xf001, 0x1d42, 0x1b82, 0xf001, 0x1a92, 0x1c62, - 0xf001, 0x16c2, 0x1d32, 0xf001, 0x1c52, 0x15c2, 0xf001, 0x1a82, - 0x18a2, 0xf001, 0x1992, 0x1c42, 0xf001, 0x16b2, 0x1a72, 0xf001, - 0x1b52, 0x1982, 0xf001, 0x1892, 0x1972, 0xf001, 0x1792, 0x1882, - 0xf001, 0x1ce2, 0x1dd2, - - /* huffTable24[705] */ - 0xf009, 0x8fe2, 0x8fe2, 0x8ef2, 0x8ef2, 0x8fd2, 0x8fd2, 0x8df2, - 0x8df2, 0x8fc2, 0x8fc2, 0x8cf2, 0x8cf2, 0x8fb2, 0x8fb2, 0x8bf2, - 0x8bf2, 0x7af2, 0x7af2, 0x7af2, 0x7af2, 0x8fa2, 0x8fa2, 0x8f92, - 0x8f92, 0x79f2, 0x79f2, 0x79f2, 0x79f2, 0x78f2, 0x78f2, 0x78f2, - 0x78f2, 0x8f82, 0x8f82, 0x8f72, 0x8f72, 0x77f2, 0x77f2, 0x77f2, - 0x77f2, 0x7f62, 0x7f62, 0x7f62, 0x7f62, 0x76f2, 0x76f2, 0x76f2, - 0x76f2, 0x7f52, 0x7f52, 0x7f52, 0x7f52, 0x75f2, 0x75f2, 0x75f2, - 0x75f2, 0x7f42, 0x7f42, 0x7f42, 0x7f42, 0x74f2, 0x74f2, 0x74f2, - 0x74f2, 0x7f32, 0x7f32, 0x7f32, 0x7f32, 0x73f2, 0x73f2, 0x73f2, - 0x73f2, 0x7f22, 0x7f22, 0x7f22, 0x7f22, 0x72f2, 0x72f2, 0x72f2, - 0x72f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x8f12, 0x8f12, 0x80f1, - 0x80f1, 0x9f01, 0x0201, 0x0206, 0x020b, 0x0210, 0x0215, 0x021a, - 0x021f, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff2, - 0x4ff2, 0x0224, 0x0229, 0x0232, 0x0237, 0x023a, 0x023f, 0x0242, - 0x0245, 0x024a, 0x024d, 0x0250, 0x0253, 0x0256, 0x0259, 0x025c, - 0x025f, 0x0262, 0x0265, 0x0268, 0x026b, 0x026e, 0x0271, 0x0274, - 0x0277, 0x027a, 0x027d, 0x0280, 0x0283, 0x0288, 0x028b, 0x028e, - 0x0291, 0x0294, 0x0297, 0x029a, 0x029f, 0x94b2, 0x02a4, 0x02a7, - 0x02aa, 0x93b2, 0x9882, 0x02af, 0x92b2, 0x02b2, 0x02b5, 0x9692, - 0x94a2, 0x02b8, 0x9782, 0x9a32, 0x93a2, 0x9952, 0x9592, 0x9a22, - 0x92a2, 0x91a2, 0x9862, 0x9682, 0x9772, 0x9942, 0x9492, 0x9932, - 0x9392, 0x9852, 0x9582, 0x9922, 0x9762, 0x9672, 0x9292, 0x9912, - 0x9192, 0x9842, 0x9482, 0x9752, 0x9572, 0x9832, 0x9382, 0x9662, - 0x9822, 0x9282, 0x9812, 0x9742, 0x9472, 0x9182, 0x02bb, 0x9652, - 0x9562, 0x9712, 0x02be, 0x8372, 0x8372, 0x9732, 0x9722, 0x8272, - 0x8272, 0x8642, 0x8642, 0x8462, 0x8462, 0x8552, 0x8552, 0x8172, - 0x8172, 0x8632, 0x8632, 0x8362, 0x8362, 0x8542, 0x8542, 0x8452, - 0x8452, 0x8622, 0x8622, 0x8262, 0x8262, 0x8612, 0x8612, 0x8162, - 0x8162, 0x9601, 0x9061, 0x8532, 0x8532, 0x8352, 0x8352, 0x8442, - 0x8442, 0x8522, 0x8522, 0x8252, 0x8252, 0x8512, 0x8512, 0x9501, - 0x9051, 0x7152, 0x7152, 0x7152, 0x7152, 0x8432, 0x8432, 0x8342, - 0x8342, 0x7422, 0x7422, 0x7422, 0x7422, 0x7242, 0x7242, 0x7242, - 0x7242, 0x7332, 0x7332, 0x7332, 0x7332, 0x7412, 0x7412, 0x7412, - 0x7412, 0x7142, 0x7142, 0x7142, 0x7142, 0x8401, 0x8401, 0x8041, - 0x8041, 0x7322, 0x7322, 0x7322, 0x7322, 0x7232, 0x7232, 0x7232, - 0x7232, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, 0x6312, - 0x6312, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, 0x6132, - 0x6132, 0x7301, 0x7301, 0x7301, 0x7301, 0x7031, 0x7031, 0x7031, - 0x7031, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, 0x6222, - 0x6222, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, - 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, - 0x5212, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, - 0x5122, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, 0x6201, - 0x6201, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, 0x6021, - 0x6021, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, - 0x4112, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, 0x4101, - 0x4101, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, 0x4011, - 0x4011, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, - 0x4000, 0xf002, 0x2ee2, 0x2ed2, 0x2de2, 0x2ec2, 0xf002, 0x2ce2, - 0x2dd2, 0x2eb2, 0x2be2, 0xf002, 0x2dc2, 0x2cd2, 0x2ea2, 0x2ae2, - 0xf002, 0x2db2, 0x2bd2, 0x2cc2, 0x2e92, 0xf002, 0x29e2, 0x2da2, - 0x2ad2, 0x2cb2, 0xf002, 0x2bc2, 0x2e82, 0x28e2, 0x2d92, 0xf002, - 0x29d2, 0x2e72, 0x27e2, 0x2ca2, 0xf002, 0x2ac2, 0x2bb2, 0x2d82, - 0x28d2, 0xf003, 0x3e01, 0x30e1, 0x2d01, 0x2d01, 0x16e2, 0x16e2, - 0x16e2, 0x16e2, 0xf002, 0x2e62, 0x2c92, 0x19c2, 0x19c2, 0xf001, - 0x1e52, 0x1ab2, 0xf002, 0x15e2, 0x15e2, 0x2ba2, 0x2d72, 0xf001, - 0x17d2, 0x14e2, 0xf001, 0x1c82, 0x18c2, 0xf002, 0x2e42, 0x2e22, - 0x1e32, 0x1e32, 0xf001, 0x1d62, 0x16d2, 0xf001, 0x13e2, 0x1b92, - 0xf001, 0x19b2, 0x1aa2, 0xf001, 0x12e2, 0x1e12, 0xf001, 0x11e2, - 0x1d52, 0xf001, 0x15d2, 0x1c72, 0xf001, 0x17c2, 0x1d42, 0xf001, - 0x1b82, 0x18b2, 0xf001, 0x14d2, 0x1a92, 0xf001, 0x19a2, 0x1c62, - 0xf001, 0x16c2, 0x1d32, 0xf001, 0x13d2, 0x1d22, 0xf001, 0x12d2, - 0x1d12, 0xf001, 0x1b72, 0x17b2, 0xf001, 0x11d2, 0x1c52, 0xf001, - 0x15c2, 0x1a82, 0xf001, 0x18a2, 0x1992, 0xf001, 0x1c42, 0x14c2, - 0xf001, 0x1b62, 0x16b2, 0xf002, 0x20d1, 0x2c01, 0x1c32, 0x1c32, - 0xf001, 0x13c2, 0x1a72, 0xf001, 0x17a2, 0x1c22, 0xf001, 0x12c2, - 0x1b52, 0xf001, 0x15b2, 0x1c12, 0xf001, 0x1982, 0x1892, 0xf001, - 0x11c2, 0x1b42, 0xf002, 0x20c1, 0x2b01, 0x1b32, 0x1b32, 0xf002, - 0x20b1, 0x2a01, 0x1a12, 0x1a12, 0xf001, 0x1a62, 0x16a2, 0xf001, - 0x1972, 0x1792, 0xf002, 0x20a1, 0x2901, 0x1091, 0x1091, 0xf001, - 0x1b22, 0x1a52, 0xf001, 0x15a2, 0x1b12, 0xf001, 0x11b2, 0x1962, - 0xf001, 0x1a42, 0x1872, 0xf001, 0x1801, 0x1081, 0xf001, 0x1701, - 0x1071, -}; - -#define HUFF_OFFSET_01 0 -#define HUFF_OFFSET_02 ( 9 + HUFF_OFFSET_01) -#define HUFF_OFFSET_03 ( 65 + HUFF_OFFSET_02) -#define HUFF_OFFSET_05 ( 65 + HUFF_OFFSET_03) -#define HUFF_OFFSET_06 (257 + HUFF_OFFSET_05) -#define HUFF_OFFSET_07 (129 + HUFF_OFFSET_06) -#define HUFF_OFFSET_08 (110 + HUFF_OFFSET_07) -#define HUFF_OFFSET_09 (280 + HUFF_OFFSET_08) -#define HUFF_OFFSET_10 ( 93 + HUFF_OFFSET_09) -#define HUFF_OFFSET_11 (320 + HUFF_OFFSET_10) -#define HUFF_OFFSET_12 (296 + HUFF_OFFSET_11) -#define HUFF_OFFSET_13 (185 + HUFF_OFFSET_12) -#define HUFF_OFFSET_15 (497 + HUFF_OFFSET_13) -#define HUFF_OFFSET_16 (580 + HUFF_OFFSET_15) -#define HUFF_OFFSET_24 (651 + HUFF_OFFSET_16) - -const int huffTabOffset[HUFF_PAIRTABS] = { - 0, - HUFF_OFFSET_01, - HUFF_OFFSET_02, - HUFF_OFFSET_03, - 0, - HUFF_OFFSET_05, - HUFF_OFFSET_06, - HUFF_OFFSET_07, - HUFF_OFFSET_08, - HUFF_OFFSET_09, - HUFF_OFFSET_10, - HUFF_OFFSET_11, - HUFF_OFFSET_12, - HUFF_OFFSET_13, - 0, - HUFF_OFFSET_15, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_16, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, - HUFF_OFFSET_24, -}; - -const HuffTabLookup huffTabLookup[HUFF_PAIRTABS] = { - { 0, noBits }, - { 0, oneShot }, - { 0, oneShot }, - { 0, oneShot }, - { 0, invalidTab }, - { 0, oneShot }, - { 0, oneShot }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, loopNoLinbits }, - { 0, invalidTab }, - { 0, loopNoLinbits }, - { 1, loopLinbits }, - { 2, loopLinbits }, - { 3, loopLinbits }, - { 4, loopLinbits }, - { 6, loopLinbits }, - { 8, loopLinbits }, - { 10, loopLinbits }, - { 13, loopLinbits }, - { 4, loopLinbits }, - { 5, loopLinbits }, - { 6, loopLinbits }, - { 7, loopLinbits }, - { 8, loopLinbits }, - { 9, loopLinbits }, - { 11, loopLinbits }, - { 13, loopLinbits }, -}; - -/* tables for quadruples - * format 0xAB - * A = length of codeword - * B = codeword - */ -const unsigned char quadTable[64+16] = { - /* table A */ - 0x6b, 0x6f, 0x6d, 0x6e, 0x67, 0x65, 0x59, 0x59, - 0x56, 0x56, 0x53, 0x53, 0x5a, 0x5a, 0x5c, 0x5c, - 0x42, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 0x41, - 0x44, 0x44, 0x44, 0x44, 0x48, 0x48, 0x48, 0x48, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - /* table B */ - 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, - 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, -}; - -const int quadTabOffset[2] = {0, 64}; -const int quadTabMaxBits[2] = {6, 4}; \ No newline at end of file diff --git a/bsp/stm32_radio/mp3/real/imdct.c b/bsp/stm32_radio/mp3/real/imdct.c deleted file mode 100644 index d98ba52b08..0000000000 --- a/bsp/stm32_radio/mp3/real/imdct.c +++ /dev/null @@ -1,779 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * imdct.c - antialias, inverse transform (short/long/mixed), windowing, - * overlap-add, frequency inversion - **************************************************************************************/ - -#include "coder.h" -#include "assembly.h" - -/************************************************************************************** - * Function: AntiAlias - * - * Description: smooth transition across DCT block boundaries (every 18 coefficients) - * - * Inputs: vector of dequantized coefficients, length = (nBfly+1) * 18 - * number of "butterflies" to perform (one butterfly means one - * inter-block smoothing operation) - * - * Outputs: updated coefficient vector x - * - * Return: none - * - * Notes: weighted average of opposite bands (pairwise) from the 8 samples - * before and after each block boundary - * nBlocks = (nonZeroBound + 7) / 18, since nZB is the first ZERO sample - * above which all other samples are also zero - * max gain per sample = 1.372 - * MAX(i) (abs(csa[i][0]) + abs(csa[i][1])) - * bits gained = 0 - * assume at least 1 guard bit in x[] to avoid overflow - * (should be guaranteed from dequant, and max gain from stproc * max - * gain from AntiAlias < 2.0) - **************************************************************************************/ -static void AntiAlias(int *x, int nBfly) -{ - int k, a0, b0, c0, c1; - const int *c; - - /* csa = Q31 */ - for (k = nBfly; k > 0; k--) { - c = csa[0]; - x += 18; - - a0 = x[-1]; c0 = *c; c++; b0 = x[0]; c1 = *c; c++; - x[-1] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[0] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-2]; c0 = *c; c++; b0 = x[1]; c1 = *c; c++; - x[-2] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[1] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-3]; c0 = *c; c++; b0 = x[2]; c1 = *c; c++; - x[-3] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[2] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-4]; c0 = *c; c++; b0 = x[3]; c1 = *c; c++; - x[-4] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[3] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-5]; c0 = *c; c++; b0 = x[4]; c1 = *c; c++; - x[-5] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[4] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-6]; c0 = *c; c++; b0 = x[5]; c1 = *c; c++; - x[-6] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[5] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-7]; c0 = *c; c++; b0 = x[6]; c1 = *c; c++; - x[-7] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[6] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - - a0 = x[-8]; c0 = *c; c++; b0 = x[7]; c1 = *c; c++; - x[-8] = (MULSHIFT32(c0, a0) - MULSHIFT32(c1, b0)) << 1; - x[7] = (MULSHIFT32(c0, b0) + MULSHIFT32(c1, a0)) << 1; - } -} - -/************************************************************************************** - * Function: WinPrevious - * - * Description: apply specified window to second half of previous IMDCT (overlap part) - * - * Inputs: vector of 9 coefficients (xPrev) - * - * Outputs: 18 windowed output coefficients (gain 1 integer bit) - * window type (0, 1, 2, 3) - * - * Return: none - * - * Notes: produces 9 output samples from 18 input samples via symmetry - * all blocks gain at least 1 guard bit via window (long blocks get extra - * sign bit, short blocks can have one addition but max gain < 1.0) - **************************************************************************************/ -static void WinPrevious(int *xPrev, int *xPrevWin, int btPrev) -{ - int i, x, *xp, *xpwLo, *xpwHi, wLo, wHi; - const int *wpLo, *wpHi; - - xp = xPrev; - /* mapping (see IMDCT12x3): xPrev[0-2] = sum[6-8], xPrev[3-8] = sum[12-17] */ - if (btPrev == 2) { - /* this could be reordered for minimum loads/stores */ - wpLo = imdctWin[btPrev]; - xPrevWin[ 0] = MULSHIFT32(wpLo[ 6], xPrev[2]) + MULSHIFT32(wpLo[0], xPrev[6]); - xPrevWin[ 1] = MULSHIFT32(wpLo[ 7], xPrev[1]) + MULSHIFT32(wpLo[1], xPrev[7]); - xPrevWin[ 2] = MULSHIFT32(wpLo[ 8], xPrev[0]) + MULSHIFT32(wpLo[2], xPrev[8]); - xPrevWin[ 3] = MULSHIFT32(wpLo[ 9], xPrev[0]) + MULSHIFT32(wpLo[3], xPrev[8]); - xPrevWin[ 4] = MULSHIFT32(wpLo[10], xPrev[1]) + MULSHIFT32(wpLo[4], xPrev[7]); - xPrevWin[ 5] = MULSHIFT32(wpLo[11], xPrev[2]) + MULSHIFT32(wpLo[5], xPrev[6]); - xPrevWin[ 6] = MULSHIFT32(wpLo[ 6], xPrev[5]); - xPrevWin[ 7] = MULSHIFT32(wpLo[ 7], xPrev[4]); - xPrevWin[ 8] = MULSHIFT32(wpLo[ 8], xPrev[3]); - xPrevWin[ 9] = MULSHIFT32(wpLo[ 9], xPrev[3]); - xPrevWin[10] = MULSHIFT32(wpLo[10], xPrev[4]); - xPrevWin[11] = MULSHIFT32(wpLo[11], xPrev[5]); - xPrevWin[12] = xPrevWin[13] = xPrevWin[14] = xPrevWin[15] = xPrevWin[16] = xPrevWin[17] = 0; - } else { - /* use ARM-style pointers (*ptr++) so that ADS compiles well */ - wpLo = imdctWin[btPrev] + 18; - wpHi = wpLo + 17; - xpwLo = xPrevWin; - xpwHi = xPrevWin + 17; - for (i = 9; i > 0; i--) { - x = *xp++; wLo = *wpLo++; wHi = *wpHi--; - *xpwLo++ = MULSHIFT32(wLo, x); - *xpwHi-- = MULSHIFT32(wHi, x); - } - } -} - -/************************************************************************************** - * Function: FreqInvertRescale - * - * Description: do frequency inversion (odd samples of odd blocks) and rescale - * if necessary (extra guard bits added before IMDCT) - * - * Inputs: output vector y (18 new samples, spaced NBANDS apart) - * previous sample vector xPrev (9 samples) - * index of current block - * number of extra shifts added before IMDCT (usually 0) - * - * Outputs: inverted and rescaled (as necessary) outputs - * rescaled (as necessary) previous samples - * - * Return: updated mOut (from new outputs y) - **************************************************************************************/ -static int FreqInvertRescale(int *y, int *xPrev, int blockIdx, int es) -{ - int i, d, mOut; - int y0, y1, y2, y3, y4, y5, y6, y7, y8; - - if (es == 0) { - /* fast case - frequency invert only (no rescaling) - can fuse into overlap-add for speed, if desired */ - if (blockIdx & 0x01) { - y += NBANDS; - y0 = *y; y += 2*NBANDS; - y1 = *y; y += 2*NBANDS; - y2 = *y; y += 2*NBANDS; - y3 = *y; y += 2*NBANDS; - y4 = *y; y += 2*NBANDS; - y5 = *y; y += 2*NBANDS; - y6 = *y; y += 2*NBANDS; - y7 = *y; y += 2*NBANDS; - y8 = *y; y += 2*NBANDS; - - y -= 18*NBANDS; - *y = -y0; y += 2*NBANDS; - *y = -y1; y += 2*NBANDS; - *y = -y2; y += 2*NBANDS; - *y = -y3; y += 2*NBANDS; - *y = -y4; y += 2*NBANDS; - *y = -y5; y += 2*NBANDS; - *y = -y6; y += 2*NBANDS; - *y = -y7; y += 2*NBANDS; - *y = -y8; y += 2*NBANDS; - } - return 0; - } else { - /* undo pre-IMDCT scaling, clipping if necessary */ - mOut = 0; - if (blockIdx & 0x01) { - /* frequency invert */ - for (i = 0; i < 18; i+=2) { - d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; - d = -*y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; - d = *xPrev; CLIP_2N(d, 31 - es); *xPrev++ = d << es; - } - } else { - for (i = 0; i < 18; i+=2) { - d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; - d = *y; CLIP_2N(d, 31 - es); *y = d << es; mOut |= FASTABS(*y); y += NBANDS; - d = *xPrev; CLIP_2N(d, 31 - es); *xPrev++ = d << es; - } - } - return mOut; - } -} - -/* format = Q31 - * #define M_PI 3.14159265358979323846 - * double u = 2.0 * M_PI / 9.0; - * float c0 = sqrt(3.0) / 2.0; - * float c1 = cos(u); - * float c2 = cos(2*u); - * float c3 = sin(u); - * float c4 = sin(2*u); - */ -static const int c9_0 = 0x6ed9eba1; -static const int c9_1 = 0x620dbe8b; -static const int c9_2 = 0x163a1a7e; -static const int c9_3 = 0x5246dd49; -static const int c9_4 = 0x7e0e2e32; - -/* format = Q31 - * cos(((0:8) + 0.5) * (pi/18)) - */ -static const int c18[9] = { - 0x7f834ed0, 0x7ba3751d, 0x7401e4c1, 0x68d9f964, 0x5a82799a, 0x496af3e2, 0x36185aee, 0x2120fb83, 0x0b27eb5c, -}; - -/* require at least 3 guard bits in x[] to ensure no overflow */ -static __inline void idct9(int *x) -{ - int a1, a2, a3, a4, a5, a6, a7, a8, a9; - int a10, a11, a12, a13, a14, a15, a16, a17, a18; - int a19, a20, a21, a22, a23, a24, a25, a26, a27; - int m1, m3, m5, m6, m7, m8, m9, m10, m11, m12; - int x0, x1, x2, x3, x4, x5, x6, x7, x8; - - x0 = x[0]; x1 = x[1]; x2 = x[2]; x3 = x[3]; x4 = x[4]; - x5 = x[5]; x6 = x[6]; x7 = x[7]; x8 = x[8]; - - a1 = x0 - x6; - a2 = x1 - x5; - a3 = x1 + x5; - a4 = x2 - x4; - a5 = x2 + x4; - a6 = x2 + x8; - a7 = x1 + x7; - - a8 = a6 - a5; /* ie x[8] - x[4] */ - a9 = a3 - a7; /* ie x[5] - x[7] */ - a10 = a2 - x7; /* ie x[1] - x[5] - x[7] */ - a11 = a4 - x8; /* ie x[2] - x[4] - x[8] */ - - /* do the << 1 as constant shifts where mX is actually used (free, no stall or extra inst.) */ - m1 = MULSHIFT32(c9_0, x3); - m3 = MULSHIFT32(c9_0, a10); - m5 = MULSHIFT32(c9_1, a5); - m6 = MULSHIFT32(c9_2, a6); - m7 = MULSHIFT32(c9_1, a8); - m8 = MULSHIFT32(c9_2, a5); - m9 = MULSHIFT32(c9_3, a9); - m10 = MULSHIFT32(c9_4, a7); - m11 = MULSHIFT32(c9_3, a3); - m12 = MULSHIFT32(c9_4, a9); - - a12 = x[0] + (x[6] >> 1); - a13 = a12 + ( m1 << 1); - a14 = a12 - ( m1 << 1); - a15 = a1 + ( a11 >> 1); - a16 = ( m5 << 1) + (m6 << 1); - a17 = ( m7 << 1) - (m8 << 1); - a18 = a16 + a17; - a19 = ( m9 << 1) + (m10 << 1); - a20 = (m11 << 1) - (m12 << 1); - - a21 = a20 - a19; - a22 = a13 + a16; - a23 = a14 + a16; - a24 = a14 + a17; - a25 = a13 + a17; - a26 = a14 - a18; - a27 = a13 - a18; - - x0 = a22 + a19; x[0] = x0; - x1 = a15 + (m3 << 1); x[1] = x1; - x2 = a24 + a20; x[2] = x2; - x3 = a26 - a21; x[3] = x3; - x4 = a1 - a11; x[4] = x4; - x5 = a27 + a21; x[5] = x5; - x6 = a25 - a20; x[6] = x6; - x7 = a15 - (m3 << 1); x[7] = x7; - x8 = a23 - a19; x[8] = x8; -} - -/* let c(j) = cos(M_PI/36 * ((j)+0.5)), s(j) = sin(M_PI/36 * ((j)+0.5)) - * then fastWin[2*j+0] = c(j)*(s(j) + c(j)), j = [0, 8] - * fastWin[2*j+1] = c(j)*(s(j) - c(j)) - * format = Q30 - */ -static const int fastWin36[18] = { - 0x42aace8b, 0xc2e92724, 0x47311c28, 0xc95f619a, 0x4a868feb, 0xd0859d8c, - 0x4c913b51, 0xd8243ea0, 0x4d413ccc, 0xe0000000, 0x4c913b51, 0xe7dbc161, - 0x4a868feb, 0xef7a6275, 0x47311c28, 0xf6a09e67, 0x42aace8b, 0xfd16d8dd, -}; - -/************************************************************************************** - * Function: IMDCT36 - * - * Description: 36-point modified DCT, with windowing and overlap-add (50% overlap) - * - * Inputs: vector of 18 coefficients (N/2 inputs produces N outputs, by symmetry) - * overlap part of last IMDCT (9 samples - see output comments) - * window type (0,1,2,3) of current and previous block - * current block index (for deciding whether to do frequency inversion) - * number of guard bits in input vector - * - * Outputs: 18 output samples, after windowing and overlap-add with last frame - * second half of (unwindowed) 36-point IMDCT - save for next time - * only save 9 xPrev samples, using symmetry (see WinPrevious()) - * - * Notes: this is Ken's hyper-fast algorithm, including symmetric sin window - * optimization, if applicable - * total number of multiplies, general case: - * 2*10 (idct9) + 9 (last stage imdct) + 36 (for windowing) = 65 - * total number of multiplies, btCurr == 0 && btPrev == 0: - * 2*10 (idct9) + 9 (last stage imdct) + 18 (for windowing) = 47 - * - * blockType == 0 is by far the most common case, so it should be - * possible to use the fast path most of the time - * this is the fastest known algorithm for performing - * long IMDCT + windowing + overlap-add in MP3 - * - * Return: mOut (OR of abs(y) for all y calculated here) - * - * TODO: optimize for ARM (reorder window coefs, ARM-style pointers in C, - * inline asm may or may not be helpful) - **************************************************************************************/ -static int IMDCT36(int *xCurr, int *xPrev, int *y, int btCurr, int btPrev, int blockIdx, int gb) -{ - int i, es, xBuf[18], xPrevWin[18]; - int acc1, acc2, s, d, t, mOut; - int xo, xe, c, *xp, yLo, yHi; - const int *cp, *wp; - - acc1 = acc2 = 0; - xCurr += 17; - - /* 7 gb is always adequate for antialias + accumulator loop + idct9 */ - if (gb < 7) { - /* rarely triggered - 5% to 10% of the time on normal clips (with Q25 input) */ - es = 7 - gb; - for (i = 8; i >= 0; i--) { - acc1 = ((*xCurr--) >> es) - acc1; - acc2 = acc1 - acc2; - acc1 = ((*xCurr--) >> es) - acc1; - xBuf[i+9] = acc2; /* odd */ - xBuf[i+0] = acc1; /* even */ - xPrev[i] >>= es; - } - } else { - es = 0; - /* max gain = 18, assume adequate guard bits */ - for (i = 8; i >= 0; i--) { - acc1 = (*xCurr--) - acc1; - acc2 = acc1 - acc2; - acc1 = (*xCurr--) - acc1; - xBuf[i+9] = acc2; /* odd */ - xBuf[i+0] = acc1; /* even */ - } - } - /* xEven[0] and xOdd[0] scaled by 0.5 */ - xBuf[9] >>= 1; - xBuf[0] >>= 1; - - /* do 9-point IDCT on even and odd */ - idct9(xBuf+0); /* even */ - idct9(xBuf+9); /* odd */ - - xp = xBuf + 8; - cp = c18 + 8; - mOut = 0; - if (btPrev == 0 && btCurr == 0) { - /* fast path - use symmetry of sin window to reduce windowing multiplies to 18 (N/2) */ - wp = fastWin36; - for (i = 0; i < 9; i++) { - /* do ARM-style pointer arithmetic (i still needed for y[] indexing - compiler spills if 2 y pointers) */ - c = *cp--; xo = *(xp + 9); xe = *xp--; - /* gain 2 int bits here */ - xo = MULSHIFT32(c, xo); /* 2*c18*xOdd (mul by 2 implicit in scaling) */ - xe >>= 2; - - s = -(*xPrev); /* sum from last block (always at least 2 guard bits) */ - d = -(xe - xo); /* gain 2 int bits, don't shift xo (effective << 1 to eat sign bit, << 1 for mul by 2) */ - (*xPrev++) = xe + xo; /* symmetry - xPrev[i] = xPrev[17-i] for long blocks */ - t = s - d; - - yLo = (d + (MULSHIFT32(t, *wp++) << 2)); - yHi = (s + (MULSHIFT32(t, *wp++) << 2)); - y[(i)*NBANDS] = yLo; - y[(17-i)*NBANDS] = yHi; - mOut |= FASTABS(yLo); - mOut |= FASTABS(yHi); - } - } else { - /* slower method - either prev or curr is using window type != 0 so do full 36-point window - * output xPrevWin has at least 3 guard bits (xPrev has 2, gain 1 in WinPrevious) - */ - WinPrevious(xPrev, xPrevWin, btPrev); - - wp = imdctWin[btCurr]; - for (i = 0; i < 9; i++) { - c = *cp--; xo = *(xp + 9); xe = *xp--; - /* gain 2 int bits here */ - xo = MULSHIFT32(c, xo); /* 2*c18*xOdd (mul by 2 implicit in scaling) */ - xe >>= 2; - - d = xe - xo; - (*xPrev++) = xe + xo; /* symmetry - xPrev[i] = xPrev[17-i] for long blocks */ - - yLo = (xPrevWin[i] + MULSHIFT32(d, wp[i])) << 2; - yHi = (xPrevWin[17-i] + MULSHIFT32(d, wp[17-i])) << 2; - y[(i)*NBANDS] = yLo; - y[(17-i)*NBANDS] = yHi; - mOut |= FASTABS(yLo); - mOut |= FASTABS(yHi); - } - } - - xPrev -= 9; - mOut |= FreqInvertRescale(y, xPrev, blockIdx, es); - - return mOut; -} - -static const int c3_0 = 0x6ed9eba1; /* format = Q31, cos(pi/6) */ -static const int c6[3] = { 0x7ba3751d, 0x5a82799a, 0x2120fb83 }; /* format = Q31, cos(((0:2) + 0.5) * (pi/6)) */ - -/* 12-point inverse DCT, used in IMDCT12x3() - * 4 input guard bits will ensure no overflow - */ -static __inline void imdct12 (int *x, int *out) -{ - int a0, a1, a2; - int x0, x1, x2, x3, x4, x5; - - x0 = *x; x+=3; x1 = *x; x+=3; - x2 = *x; x+=3; x3 = *x; x+=3; - x4 = *x; x+=3; x5 = *x; x+=3; - - x4 -= x5; - x3 -= x4; - x2 -= x3; - x3 -= x5; - x1 -= x2; - x0 -= x1; - x1 -= x3; - - x0 >>= 1; - x1 >>= 1; - - a0 = MULSHIFT32(c3_0, x2) << 1; - a1 = x0 + (x4 >> 1); - a2 = x0 - x4; - x0 = a1 + a0; - x2 = a2; - x4 = a1 - a0; - - a0 = MULSHIFT32(c3_0, x3) << 1; - a1 = x1 + (x5 >> 1); - a2 = x1 - x5; - - /* cos window odd samples, mul by 2, eat sign bit */ - x1 = MULSHIFT32(c6[0], a1 + a0) << 2; - x3 = MULSHIFT32(c6[1], a2) << 2; - x5 = MULSHIFT32(c6[2], a1 - a0) << 2; - - *out = x0 + x1; out++; - *out = x2 + x3; out++; - *out = x4 + x5; out++; - *out = x4 - x5; out++; - *out = x2 - x3; out++; - *out = x0 - x1; -} - -/************************************************************************************** - * Function: IMDCT12x3 - * - * Description: three 12-point modified DCT's for short blocks, with windowing, - * short block concatenation, and overlap-add - * - * Inputs: 3 interleaved vectors of 6 samples each - * (block0[0], block1[0], block2[0], block0[1], block1[1]....) - * overlap part of last IMDCT (9 samples - see output comments) - * window type (0,1,2,3) of previous block - * current block index (for deciding whether to do frequency inversion) - * number of guard bits in input vector - * - * Outputs: updated sample vector x, net gain of 1 integer bit - * second half of (unwindowed) IMDCT's - save for next time - * only save 9 xPrev samples, using symmetry (see WinPrevious()) - * - * Return: mOut (OR of abs(y) for all y calculated here) - * - * TODO: optimize for ARM - **************************************************************************************/ -static int IMDCT12x3(int *xCurr, int *xPrev, int *y, int btPrev, int blockIdx, int gb) -{ - int i, es, mOut, yLo, xBuf[18], xPrevWin[18]; /* need temp buffer for reordering short blocks */ - const int *wp; - - es = 0; - /* 7 gb is always adequate for accumulator loop + idct12 + window + overlap */ - if (gb < 7) { - es = 7 - gb; - for (i = 0; i < 18; i+=2) { - xCurr[i+0] >>= es; - xCurr[i+1] >>= es; - *xPrev++ >>= es; - } - xPrev -= 9; - } - - /* requires 4 input guard bits for each imdct12 */ - imdct12(xCurr + 0, xBuf + 0); - imdct12(xCurr + 1, xBuf + 6); - imdct12(xCurr + 2, xBuf + 12); - - /* window previous from last time */ - WinPrevious(xPrev, xPrevWin, btPrev); - - /* could unroll this for speed, minimum loads (short blocks usually rare, so doesn't make much overall difference) - * xPrevWin[i] << 2 still has 1 gb always, max gain of windowed xBuf stuff also < 1.0 and gain the sign bit - * so y calculations won't overflow - */ - wp = imdctWin[2]; - mOut = 0; - for (i = 0; i < 3; i++) { - yLo = (xPrevWin[ 0+i] << 2); - mOut |= FASTABS(yLo); y[( 0+i)*NBANDS] = yLo; - yLo = (xPrevWin[ 3+i] << 2); - mOut |= FASTABS(yLo); y[( 3+i)*NBANDS] = yLo; - yLo = (xPrevWin[ 6+i] << 2) + (MULSHIFT32(wp[0+i], xBuf[3+i])); - mOut |= FASTABS(yLo); y[( 6+i)*NBANDS] = yLo; - yLo = (xPrevWin[ 9+i] << 2) + (MULSHIFT32(wp[3+i], xBuf[5-i])); - mOut |= FASTABS(yLo); y[( 9+i)*NBANDS] = yLo; - yLo = (xPrevWin[12+i] << 2) + (MULSHIFT32(wp[6+i], xBuf[2-i]) + MULSHIFT32(wp[0+i], xBuf[(6+3)+i])); - mOut |= FASTABS(yLo); y[(12+i)*NBANDS] = yLo; - yLo = (xPrevWin[15+i] << 2) + (MULSHIFT32(wp[9+i], xBuf[0+i]) + MULSHIFT32(wp[3+i], xBuf[(6+5)-i])); - mOut |= FASTABS(yLo); y[(15+i)*NBANDS] = yLo; - } - - /* save previous (unwindowed) for overlap - only need samples 6-8, 12-17 */ - for (i = 6; i < 9; i++) - *xPrev++ = xBuf[i] >> 2; - for (i = 12; i < 18; i++) - *xPrev++ = xBuf[i] >> 2; - - xPrev -= 9; - mOut |= FreqInvertRescale(y, xPrev, blockIdx, es); - - return mOut; -} - -/************************************************************************************** - * Function: HybridTransform - * - * Description: IMDCT's, windowing, and overlap-add on long/short/mixed blocks - * - * Inputs: vector of input coefficients, length = nBlocksTotal * 18) - * vector of overlap samples from last time, length = nBlocksPrev * 9) - * buffer for output samples, length = MAXNSAMP - * SideInfoSub struct for this granule/channel - * BlockCount struct with necessary info - * number of non-zero input and overlap blocks - * number of long blocks in input vector (rest assumed to be short blocks) - * number of blocks which use long window (type) 0 in case of mixed block - * (bc->currWinSwitch, 0 for non-mixed blocks) - * - * Outputs: transformed, windowed, and overlapped sample buffer - * does frequency inversion on odd blocks - * updated buffer of samples for overlap - * - * Return: number of non-zero IMDCT blocks calculated in this call - * (including overlap-add) - * - * TODO: examine mixedBlock/winSwitch logic carefully (test he_mode.bit) - **************************************************************************************/ -static int HybridTransform(int *xCurr, int *xPrev, int y[BLOCK_SIZE][NBANDS], SideInfoSub *sis, BlockCount *bc) -{ - int xPrevWin[18], currWinIdx, prevWinIdx; - int i, j, nBlocksOut, nonZero, mOut; - int fiBit, xp; - - ASSERT(bc->nBlocksLong <= NBANDS); - ASSERT(bc->nBlocksTotal <= NBANDS); - ASSERT(bc->nBlocksPrev <= NBANDS); - - mOut = 0; - - /* do long blocks, if any */ - for(i = 0; i < bc->nBlocksLong; i++) { - /* currWinIdx picks the right window for long blocks (if mixed, long blocks use window type 0) */ - currWinIdx = sis->blockType; - if (sis->mixedBlock && i < bc->currWinSwitch) - currWinIdx = 0; - - prevWinIdx = bc->prevType; - if (i < bc->prevWinSwitch) - prevWinIdx = 0; - - /* do 36-point IMDCT, including windowing and overlap-add */ - mOut |= IMDCT36(xCurr, xPrev, &(y[0][i]), currWinIdx, prevWinIdx, i, bc->gbIn); - xCurr += 18; - xPrev += 9; - } - - /* do short blocks (if any) */ - for ( ; i < bc->nBlocksTotal; i++) { - ASSERT(sis->blockType == 2); - - prevWinIdx = bc->prevType; - if (i < bc->prevWinSwitch) - prevWinIdx = 0; - - mOut |= IMDCT12x3(xCurr, xPrev, &(y[0][i]), prevWinIdx, i, bc->gbIn); - xCurr += 18; - xPrev += 9; - } - nBlocksOut = i; - - /* window and overlap prev if prev longer that current */ - for ( ; i < bc->nBlocksPrev; i++) { - prevWinIdx = bc->prevType; - if (i < bc->prevWinSwitch) - prevWinIdx = 0; - WinPrevious(xPrev, xPrevWin, prevWinIdx); - - nonZero = 0; - fiBit = i << 31; - for (j = 0; j < 9; j++) { - xp = xPrevWin[2*j+0] << 2; /* << 2 temp for scaling */ - nonZero |= xp; - y[2*j+0][i] = xp; - mOut |= FASTABS(xp); - - /* frequency inversion on odd blocks/odd samples (flip sign if i odd, j odd) */ - xp = xPrevWin[2*j+1] << 2; - xp = (xp ^ (fiBit >> 31)) + (i & 0x01); - nonZero |= xp; - y[2*j+1][i] = xp; - mOut |= FASTABS(xp); - - xPrev[j] = 0; - } - xPrev += 9; - if (nonZero) - nBlocksOut = i; - } - - /* clear rest of blocks */ - for ( ; i < 32; i++) { - for (j = 0; j < 18; j++) - y[j][i] = 0; - } - - bc->gbOut = CLZ(mOut) - 1; - - return nBlocksOut; -} - -/************************************************************************************** - * Function: IMDCT - * - * Description: do alias reduction, inverse MDCT, overlap-add, and frequency inversion - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader(), UnpackSideInfo(), - * UnpackScaleFactors(), and DecodeHuffman() (for this granule, channel) - * includes PCM samples in overBuf (from last call to IMDCT) for OLA - * index of current granule and channel - * - * Outputs: PCM samples in outBuf, for input to subband transform - * PCM samples in overBuf, for OLA next time - * updated hi->nonZeroBound index for this channel - * - * Return: 0 on success, -1 if null input pointers - **************************************************************************************/ -int IMDCT(MP3DecInfo *mp3DecInfo, int gr, int ch) -{ - int nBfly, blockCutoff; - FrameHeader *fh; - SideInfo *si; - HuffmanInfo *hi; - IMDCTInfo *mi; - BlockCount bc; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || - !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->IMDCTInfoPS) - return -1; - - /* si is an array of up to 4 structs, stored as gr0ch0, gr0ch1, gr1ch0, gr1ch1 */ - fh = (FrameHeader *)(mp3DecInfo->FrameHeaderPS); - si = (SideInfo *)(mp3DecInfo->SideInfoPS); - hi = (HuffmanInfo*)(mp3DecInfo->HuffmanInfoPS); - mi = (IMDCTInfo *)(mp3DecInfo->IMDCTInfoPS); - - /* anti-aliasing done on whole long blocks only - * for mixed blocks, nBfly always 1, except 3 for 8 kHz MPEG 2.5 (see sfBandTab) - * nLongBlocks = number of blocks with (possibly) non-zero power - * nBfly = number of butterflies to do (nLongBlocks - 1, unless no long blocks) - */ - blockCutoff = fh->sfBand->l[(fh->ver == MPEG1 ? 8 : 6)] / 18; /* same as 3* num short sfb's in spec */ - if (si->sis[gr][ch].blockType != 2) { - /* all long transforms */ - bc.nBlocksLong = MIN((hi->nonZeroBound[ch] + 7) / 18 + 1, 32); - nBfly = bc.nBlocksLong - 1; - } else if (si->sis[gr][ch].blockType == 2 && si->sis[gr][ch].mixedBlock) { - /* mixed block - long transforms until cutoff, then short transforms */ - bc.nBlocksLong = blockCutoff; - nBfly = bc.nBlocksLong - 1; - } else { - /* all short transforms */ - bc.nBlocksLong = 0; - nBfly = 0; - } - - AntiAlias(hi->huffDecBuf[ch], nBfly); - hi->nonZeroBound[ch] = MAX(hi->nonZeroBound[ch], (nBfly * 18) + 8); - - ASSERT(hi->nonZeroBound[ch] <= MAX_NSAMP); - - /* for readability, use a struct instead of passing a million parameters to HybridTransform() */ - bc.nBlocksTotal = (hi->nonZeroBound[ch] + 17) / 18; - bc.nBlocksPrev = mi->numPrevIMDCT[ch]; - bc.prevType = mi->prevType[ch]; - bc.prevWinSwitch = mi->prevWinSwitch[ch]; - bc.currWinSwitch = (si->sis[gr][ch].mixedBlock ? blockCutoff : 0); /* where WINDOW switches (not nec. transform) */ - bc.gbIn = hi->gb[ch]; - - mi->numPrevIMDCT[ch] = HybridTransform(hi->huffDecBuf[ch], mi->overBuf[ch], mi->outBuf[ch], &si->sis[gr][ch], &bc); - mi->prevType[ch] = si->sis[gr][ch].blockType; - mi->prevWinSwitch[ch] = bc.currWinSwitch; /* 0 means not a mixed block (either all short or all long) */ - mi->gb[ch] = bc.gbOut; - - ASSERT(mi->numPrevIMDCT[ch] <= NBANDS); - - /* output has gained 2 int bits */ - return 0; -} diff --git a/bsp/stm32_radio/mp3/real/polyphase.c b/bsp/stm32_radio/mp3/real/polyphase.c deleted file mode 100644 index bd331dfebb..0000000000 --- a/bsp/stm32_radio/mp3/real/polyphase.c +++ /dev/null @@ -1,295 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * polyphase.c - final stage of subband transform (polyphase synthesis filter) - * - * This is the C reference version using __int64 - * Look in the appropriate subdirectories for optimized asm implementations - * (e.g. arm/asmpoly.s) - **************************************************************************************/ - -#include "coder.h" -#include "assembly.h" - -/* input to Polyphase = Q(DQ_FRACBITS_OUT-2), gain 2 bits in convolution - * we also have the implicit bias of 2^15 to add back, so net fraction bits = - * DQ_FRACBITS_OUT - 2 - 2 - 15 - * (see comment on Dequantize() for more info) - */ -#define DEF_NFRACBITS (DQ_FRACBITS_OUT - 2 - 2 - 15) -#define CSHIFT 12 /* coefficients have 12 leading sign bits for early-terminating mulitplies */ - -static __inline short ClipToShort(int x, int fracBits) -{ - int sign; - - /* assumes you've already rounded (x += (1 << (fracBits-1))) */ - x >>= fracBits; - - /* Ken's trick: clips to [-32768, 32767] */ - sign = x >> 31; - if (sign != (x >> 15)) - x = sign ^ ((1 << 15) - 1); - - return (short)x; -} - -#define MC0M(x) { \ - c1 = *coef; coef++; c2 = *coef; coef++; \ - vLo = *(vb1+(x)); vHi = *(vb1+(23-(x))); \ - sum1L = MADD64(sum1L, vLo, c1); sum1L = MADD64(sum1L, vHi, -c2); \ -} - -#define MC1M(x) { \ - c1 = *coef; coef++; \ - vLo = *(vb1+(x)); \ - sum1L = MADD64(sum1L, vLo, c1); \ -} - -#define MC2M(x) { \ - c1 = *coef; coef++; c2 = *coef; coef++; \ - vLo = *(vb1+(x)); vHi = *(vb1+(23-(x))); \ - sum1L = MADD64(sum1L, vLo, c1); sum2L = MADD64(sum2L, vLo, c2); \ - sum1L = MADD64(sum1L, vHi, -c2); sum2L = MADD64(sum2L, vHi, c1); \ -} - -/************************************************************************************** - * Function: PolyphaseMono - * - * Description: filter one subband and produce 32 output PCM samples for one channel - * - * Inputs: pointer to PCM output buffer - * number of "extra shifts" (vbuf format = Q(DQ_FRACBITS_OUT-2)) - * pointer to start of vbuf (preserved from last call) - * start of filter coefficient table (in proper, shuffled order) - * no minimum number of guard bits is required for input vbuf - * (see additional scaling comments below) - * - * Outputs: 32 samples of one channel of decoded PCM data, (i.e. Q16.0) - * - * Return: none - * - * TODO: add 32-bit version for platforms where 64-bit mul-acc is not supported - * (note max filter gain - see polyCoef[] comments) - **************************************************************************************/ -void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase) -{ - int i; - const int *coef; - int *vb1; - int vLo, vHi, c1, c2; - Word64 sum1L, sum2L, rndVal; - - rndVal = (Word64)( 1 << (DEF_NFRACBITS - 1 + (32 - CSHIFT)) ); - - /* special case, output sample 0 */ - coef = coefBase; - vb1 = vbuf; - sum1L = rndVal; - - MC0M(0) - MC0M(1) - MC0M(2) - MC0M(3) - MC0M(4) - MC0M(5) - MC0M(6) - MC0M(7) - - *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - - /* special case, output sample 16 */ - coef = coefBase + 256; - vb1 = vbuf + 64*16; - sum1L = rndVal; - - MC1M(0) - MC1M(1) - MC1M(2) - MC1M(3) - MC1M(4) - MC1M(5) - MC1M(6) - MC1M(7) - - *(pcm + 16) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - - /* main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 */ - coef = coefBase + 16; - vb1 = vbuf + 64; - pcm++; - - /* right now, the compiler creates bad asm from this... */ - for (i = 15; i > 0; i--) { - sum1L = sum2L = rndVal; - - MC2M(0) - MC2M(1) - MC2M(2) - MC2M(3) - MC2M(4) - MC2M(5) - MC2M(6) - MC2M(7) - - vb1 += 64; - *(pcm) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 2*i) = ClipToShort((int)SAR64(sum2L, (32-CSHIFT)), DEF_NFRACBITS); - pcm++; - } -} - -#define MC0S(x) { \ - c1 = *coef; coef++; c2 = *coef; coef++; \ - vLo = *(vb1+(x)); vHi = *(vb1+(23-(x))); \ - sum1L = MADD64(sum1L, vLo, c1); sum1L = MADD64(sum1L, vHi, -c2); \ - vLo = *(vb1+32+(x)); vHi = *(vb1+32+(23-(x))); \ - sum1R = MADD64(sum1R, vLo, c1); sum1R = MADD64(sum1R, vHi, -c2); \ -} - -#define MC1S(x) { \ - c1 = *coef; coef++; \ - vLo = *(vb1+(x)); \ - sum1L = MADD64(sum1L, vLo, c1); \ - vLo = *(vb1+32+(x)); \ - sum1R = MADD64(sum1R, vLo, c1); \ -} - -#define MC2S(x) { \ - c1 = *coef; coef++; c2 = *coef; coef++; \ - vLo = *(vb1+(x)); vHi = *(vb1+(23-(x))); \ - sum1L = MADD64(sum1L, vLo, c1); sum2L = MADD64(sum2L, vLo, c2); \ - sum1L = MADD64(sum1L, vHi, -c2); sum2L = MADD64(sum2L, vHi, c1); \ - vLo = *(vb1+32+(x)); vHi = *(vb1+32+(23-(x))); \ - sum1R = MADD64(sum1R, vLo, c1); sum2R = MADD64(sum2R, vLo, c2); \ - sum1R = MADD64(sum1R, vHi, -c2); sum2R = MADD64(sum2R, vHi, c1); \ -} - -/************************************************************************************** - * Function: PolyphaseStereo - * - * Description: filter one subband and produce 32 output PCM samples for each channel - * - * Inputs: pointer to PCM output buffer - * number of "extra shifts" (vbuf format = Q(DQ_FRACBITS_OUT-2)) - * pointer to start of vbuf (preserved from last call) - * start of filter coefficient table (in proper, shuffled order) - * no minimum number of guard bits is required for input vbuf - * (see additional scaling comments below) - * - * Outputs: 32 samples of two channels of decoded PCM data, (i.e. Q16.0) - * - * Return: none - * - * Notes: interleaves PCM samples LRLRLR... - * - * TODO: add 32-bit version for platforms where 64-bit mul-acc is not supported - **************************************************************************************/ -void PolyphaseStereo(short *pcm, int *vbuf, const int *coefBase) -{ - int i; - const int *coef; - int *vb1; - int vLo, vHi, c1, c2; - Word64 sum1L, sum2L, sum1R, sum2R, rndVal; - - rndVal = (Word64)( 1 << (DEF_NFRACBITS - 1 + (32 - CSHIFT)) ); - - /* special case, output sample 0 */ - coef = coefBase; - vb1 = vbuf; - sum1L = sum1R = rndVal; - - MC0S(0) - MC0S(1) - MC0S(2) - MC0S(3) - MC0S(4) - MC0S(5) - MC0S(6) - MC0S(7) - - *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 1) = ClipToShort((int)SAR64(sum1R, (32-CSHIFT)), DEF_NFRACBITS); - - /* special case, output sample 16 */ - coef = coefBase + 256; - vb1 = vbuf + 64*16; - sum1L = sum1R = rndVal; - - MC1S(0) - MC1S(1) - MC1S(2) - MC1S(3) - MC1S(4) - MC1S(5) - MC1S(6) - MC1S(7) - - *(pcm + 2*16 + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 2*16 + 1) = ClipToShort((int)SAR64(sum1R, (32-CSHIFT)), DEF_NFRACBITS); - - /* main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 */ - coef = coefBase + 16; - vb1 = vbuf + 64; - pcm += 2; - - /* right now, the compiler creates bad asm from this... */ - for (i = 15; i > 0; i--) { - sum1L = sum2L = rndVal; - sum1R = sum2R = rndVal; - - MC2S(0) - MC2S(1) - MC2S(2) - MC2S(3) - MC2S(4) - MC2S(5) - MC2S(6) - MC2S(7) - - vb1 += 64; - *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 1) = ClipToShort((int)SAR64(sum1R, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 2*2*i + 0) = ClipToShort((int)SAR64(sum2L, (32-CSHIFT)), DEF_NFRACBITS); - *(pcm + 2*2*i + 1) = ClipToShort((int)SAR64(sum2R, (32-CSHIFT)), DEF_NFRACBITS); - pcm += 2; - } -} diff --git a/bsp/stm32_radio/mp3/real/projects/armads/LICENSE.txt b/bsp/stm32_radio/mp3/real/projects/armads/LICENSE.txt deleted file mode 100644 index 12e5372a9f..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/armads/LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ - Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. - - The contents of this directory, and (except where otherwise - indicated) the directories included within this directory, are - subject to the current version of the RealNetworks Public Source - License (the "RPSL") available at RPSL.txt in this directory, unless - you have licensed the directory under the current version of the - RealNetworks Community Source License (the "RCSL") available at - RCSL.txt in this directory, in which case the RCSL will apply. You - may also obtain the license terms directly from RealNetworks. You - may not use the files in this directory except in compliance with the - RPSL or, if you have a valid RCSL with RealNetworks applicable to - this directory, the RCSL. Please see the applicable RPSL or RCSL for - the rights, obligations and limitations governing use of the contents - of the directory. - - This directory is part of the Helix DNA Technology. RealNetworks is - the developer of the Original Code and owns the copyrights in the - portions it created. - - This directory, and the directories included with this directory, are - distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY - OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY - DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - QUIET ENJOYMENT OR NON-INFRINGEMENT. - - Technology Compatibility Kit Test Suite(s) Location: - http://www.helixcommunity.org/content/tck - diff --git a/bsp/stm32_radio/mp3/real/projects/armads/RCSL.txt b/bsp/stm32_radio/mp3/real/projects/armads/RCSL.txt deleted file mode 100644 index a809759a32..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/armads/RCSL.txt +++ /dev/null @@ -1,948 +0,0 @@ -The RCSL is made up of a base agreement and a few Attachments. - -For Research and Development use, you agree to the terms of the -RCSL R&D License (base RCSL and Attachments A, B, and C) - -For Commercial Use (either distribution or internal commercial -deployment) of the Helix DNA with or without support for RealNetworks' -RealAudio and RealVideo Add-on Technology, you agree to the -terms of the same RCSL R&D license -and execute one or more additional Commercial Use License attachments -. - ------------------------------------------------------------------------- - - - REALNETWORKS COMMUNITY SOURCE LICENSE - -Version 1.2 (Rev. Date: January 22, 2003). - - - RECITALS - -Original Contributor has developed Specifications, Source Code -implementations and Executables of certain Technology; and - -Original Contributor desires to license the Technology to a large -community to facilitate research, innovation and product development -while maintaining compatibility of such products with the Technology as -delivered by Original Contributor; and - -Original Contributor desires to license certain Trademarks for the -purpose of branding products that are compatible with the relevant -Technology delivered by Original Contributor; and - -You desire to license the Technology and possibly certain Trademarks -from Original Contributor on the terms and conditions specified in this -License. - -In consideration for the mutual covenants contained herein, You and -Original Contributor agree as follows: - - - AGREEMENT - -*1. Introduction.* - -The RealNetworks Community Source License ("RCSL") and effective -attachments ("License") may include five distinct licenses: - -i) Research Use license -- License plus Attachments A, B and C only. - -ii) Commercial Use and Trademark License, which may be for Internal -Deployment Use or external distribution, or both -- License plus -Attachments A, B, C, and D. - -iii) Technology Compatibility Kit (TCK) license -- Attachment C. - -iv) Add-On Technology License (Executable) Commercial Use License --Attachment F. - -v) Add-On Technology Source Code Porting and Optimization -License-Attachment G. - -The Research Use license is effective when You click and accept this -License. The TCK is effective when You click and accept this License, -unless otherwise specified in the TCK attachments. The Commercial Use -and Trademark, Add-On Technology License, and the Add-On Technology -Source Code Porting and Optimization licenses must each be signed by You -and Original Contributor to become effective. Once effective, these -licenses and the associated requirements and responsibilities are -cumulative. Capitalized terms used in this License are defined in the -Glossary. - -*2. License Grants.* - -2.1 Original Contributor Grant. - -Subject to Your compliance with Sections 3, 8.10 and Attachment A of -this License, Original Contributor grants to You a worldwide, -royalty-free, non-exclusive license, to the extent of Original -Contributor's Intellectual Property Rights covering the Original Code, -Upgraded Code and Specifications, to do the following: - -(a) Research Use License: - -(i) use, reproduce and modify the Original Code, Upgraded Code and -Specifications to create Modifications and Reformatted Specifications -for Research Use by You; - -(ii) publish and display Original Code, Upgraded Code and Specifications -with, or as part of Modifications, as permitted under Section 3.1(b) below; - -(iii) reproduce and distribute copies of Original Code and Upgraded Code -to Licensees and students for Research Use by You; - -(iv) compile, reproduce and distribute Original Code and Upgraded Code -in Executable form, and Reformatted Specifications to anyone for -Research Use by You. - -(b) Other than the licenses expressly granted in this License, Original -Contributor retains all right, title, and interest in Original Code and -Upgraded Code and Specifications. - -2.2 Your Grants. - -(a) To Other Licensees. You hereby grant to each Licensee a license to -Your Error Corrections and Shared Modifications, of the same scope and -extent as Original Contributor's licenses under Section 2.1 a) above -relative to Research Use and Attachment D relative to Commercial Use. - -(b) To Original Contributor. You hereby grant to Original Contributor a -worldwide, royalty-free, non-exclusive, perpetual and irrevocable -license, to the extent of Your Intellectual Property Rights covering -Your Error Corrections, Shared Modifications and Reformatted -Specifications, to use, reproduce, modify, display and distribute Your -Error Corrections, Shared Modifications and Reformatted Specifications, -in any form, including the right to sublicense such rights through -multiple tiers of distribution. - -(c) Other than the licenses expressly granted in Sections 2.2(a) and (b) -above, and the restrictions set forth in Section 3.1(d)(iv) below, You -retain all right, title, and interest in Your Error Corrections, Shared -Modifications and Reformatted Specifications. - -2.3 Contributor Modifications. - -You may use, reproduce, modify, display and distribute Contributor Error -Corrections, Shared Modifications and Reformatted Specifications, -obtained by You under this License, to the same scope and extent as with -Original Code, Upgraded Code and Specifications. - -2.4 Subcontracting. - -You may deliver the Source Code of Covered Code to other Licensees -having at least a Research Use license, for the sole purpose of -furnishing development services to You in connection with Your rights -granted in this License. All such Licensees must execute appropriate -documents with respect to such work consistent with the terms of this -License, and acknowledging their work-made-for-hire status or assigning -exclusive right to the work product and associated Intellectual Property -Rights to You. - -*3. Requirements and Responsibilities*. - -3.1 Research Use License. - -As a condition of exercising the rights granted under Section 2.1(a) -above, You agree to comply with the following: - -(a) Your Contribution to the Community. All Error Corrections and Shared -Modifications which You create or contribute to are automatically -subject to the licenses granted under Section 2.2 above. You are -encouraged to license all of Your other Modifications under Section 2.2 -as Shared Modifications, but are not required to do so. You agree to -notify Original Contributor of any errors in the Specification. - -(b) Source Code Availability. You agree to provide all Your Error -Corrections to Original Contributor as soon as reasonably practicable -and, in any event, prior to Internal Deployment Use or Commercial Use, -if applicable. Original Contributor may, at its discretion, post Source -Code for Your Error Corrections and Shared Modifications on the -Community Webserver. You may also post Error Corrections and Shared -Modifications on a web-server of Your choice; provided, that You must -take reasonable precautions to ensure that only Licensees have access to -such Error Corrections and Shared Modifications. Such precautions shall -include, without limitation, a password protection scheme limited to -Licensees and a click-on, download certification of Licensee status -required of those attempting to download from the server. An example of -an acceptable certification is attached as Attachment A-2. - -(c) Notices. All Error Corrections and Shared Modifications You create -or contribute to must include a file documenting the additions and -changes You made and the date of such additions and changes. You must -also include the notice set forth in Attachment A-1 in the file header. -If it is not possible to put the notice in a particular Source Code file -due to its structure, then You must include the notice in a location -(such as a relevant directory file), where a recipient would be most -likely to look for such a notice. - -(d) Redistribution. - -(i) Source. Covered Code may be distributed in Source Code form only to -another Licensee (except for students as provided below). You may not -offer or impose any terms on any Covered Code that alter the rights, -requirements, or responsibilities of such Licensee. You may distribute -Covered Code to students for use in connection with their course work -and research projects undertaken at accredited educational institutions. -Such students need not be Licensees, but must be given a copy of the -notice set forth in Attachment A-3 and such notice must also be included -in a file header or prominent location in the Source Code made available -to such students. - -(ii) Executable. You may distribute Executable version(s) of Covered -Code to Licensees and other third parties only for the purpose of -evaluation and comment in connection with Research Use by You and under -a license of Your choice, but which limits use of such Executable -version(s) of Covered Code only to that purpose. - -(iii) Modified Class, Interface and Package Naming. In connection with -Research Use by You only, You may use Original Contributor's class, -Interface and package names only to accurately reference or invoke the -Source Code files You modify. Original Contributor grants to You a -limited license to the extent necessary for such purposes. - -(iv) You expressly agree that any distribution, in whole or in part, of -Modifications developed by You shall only be done pursuant to the terms -and conditions of this License. - -(e) Extensions. - -(i) Covered Code. You may not include any Source Code of Community Code -in any Extensions. You may include the compiled Header Files of -Community Code in an Extension provided that Your use of the Covered -Code, including Heading Files, complies with the Commercial Use License, -the TCK and all other terms of this License. - -(ii) Publication. No later than the date on which You first distribute -such Extension for Commercial Use, You must publish to the industry, on -a non-confidential basis and free of all copyright restrictions with -respect to reproduction and use, an accurate and current specification -for any Extension. In addition, You must make available an appropriate -test suite, pursuant to the same rights as the specification, -sufficiently detailed to allow any third party reasonably skilled in the -technology to produce implementations of the Extension compatible with -the specification. Such test suites must be made available as soon as -reasonably practicable but, in no event, later than ninety (90) days -after Your first Commercial Use of the Extension. You must use -reasonable efforts to promptly clarify and correct the specification and -the test suite upon written request by Original Contributor. - -(iii) Open. You agree to refrain from enforcing any Intellectual -Property Rights You may have covering any interface(s) of Your -Extension, which would prevent the implementation of such interface(s) -by Original Contributor or any Licensee. This obligation does not -prevent You from enforcing any Intellectual Property Right You have that -would otherwise be infringed by an implementation of Your Extension. - -(iv) Interface Modifications and Naming. You may not modify or add to -the GUID space * * "xxxxxxxx-0901-11d1-8B06-00A024406D59" or any other -GUID space designated by Original Contributor. You may not modify any -Interface prefix provided with the Covered Code or any other prefix -designated by Original Contributor.* * - -* * - -(f) You agree that any Specifications provided to You by Original -Contributor are confidential and proprietary information of Original -Contributor. You must maintain the confidentiality of the Specifications -and may not disclose them to any third party without Original -Contributor's prior written consent. You may only use the Specifications -under the terms of this License and only for the purpose of implementing -the terms of this License with respect to Covered Code. You agree not -use, copy or distribute any such Specifications except as provided in -writing by Original Contributor. - -3.2 Commercial Use License. - -You may not make Commercial Use of any Covered Code unless You and -Original Contributor have executed a copy of the Commercial Use and -Trademark License attached as Attachment D. - -*4. Versions of the License.* - -4.1 License Versions. - -Original Contributor may publish revised versions of the License from -time to time. Each version will be given a distinguishing version number. - -4.2 Effect. - -Once a particular version of Covered Code has been provided under a -version of the License, You may always continue to use such Covered Code -under the terms of that version of the License. You may also choose to -use such Covered Code under the terms of any subsequent version of the -License. No one other than Original Contributor has the right to -promulgate License versions. - -4.3 Multiple-Licensed Code. - -Original Contributor may designate portions of the Covered Code as -"Multiple-Licensed." "Multiple-Licensed" means that the Original -Contributor permits You to utilize those designated portions of the -Covered Code under Your choice of this License or the alternative -license(s), if any, specified by the Original Contributor in an -Attachment to this License. - -*5. Disclaimer of Warranty.* - -5.1 COVERED CODE PROVIDED AS IS. - -COVERED CODE IS PROVIDED UNDER THIS LICENSE "AS IS," WITHOUT WARRANTY OF -ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, -WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT -FOR A PARTICULAR PURPOSE OR NON-INFRINGING. YOU AGREE TO BEAR THE ENTIRE -RISK IN CONNECTION WITH YOUR USE AND DISTRIBUTION OF COVERED CODE UNDER -THIS LICENSE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART -OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER -EXCEPT SUBJECT TO THIS DISCLAIMER. - -5.2 Not Designed for High Risk Activities. - -You acknowledge that Original Code, Upgraded Code and Specifications are -not designed or intended for use in high risk activities including, but -not limited to: (i) on-line control of aircraft, air traffic, aircraft -navigation or aircraft communications; or (ii) in the design, -construction, operation or maintenance of any nuclear facility. Original -Contributor disclaims any express or implied warranty of fitness for -such uses. - -*6. Termination.* - -6.1 By You. - -You may terminate this Research Use license at anytime by providing -written notice to Original Contributor. - -6.2 By Original Contributor. - -This License and the rights granted hereunder will terminate: - -(i) automatically if You fail to comply with the terms of this License -and fail to cure such breach within 30 days of receipt of written notice -of the breach; - -(ii) immediately in the event of circumstances specified in Sections 7.1 -and 8.4; or - -(iii) at Original Contributor's discretion upon any action initiated by -You (including by cross-claim or counter claim) alleging that use or -distribution by Original Contributor or any Licensee, of Original Code, -Upgraded Code, Error Corrections, Shared Modifications or Specifications -infringe a patent owned or controlled by You. - -6.3 Effective of Termination. - -Upon termination, You agree to discontinue use of and destroy all copies -of Covered Code in Your possession. All sublicenses to the Covered Code -which You have properly granted shall survive any termination of this -License. Provisions that, by their nature, should remain in effect -beyond the termination of this License shall survive including, without -limitation, Sections 2.2, 3, 5, 7 and 8. - -6.4 No Compensation. - -Each party waives and releases the other from any claim to compensation -or indemnity for permitted or lawful termination of the business -relationship established by this License. - -*7. Liability.* - -7.1 Infringement. Should any of the Original Code, Upgraded Code, TCK or -Specifications ("Materials") become the subject of a claim of -infringement, Original Contributor may, at its sole option, (i) attempt -to procure the rights necessary for You to continue using the Materials, -(ii) modify the Materials so that they are no longer infringing, or -(iii) terminate Your right to use the Materials, immediately upon -written notice, and refund to You the amount, if any, having then -actually been paid by You to Original Contributor for the Original Code, -Upgraded Code and TCK, depreciated on a straight line, five year basis. - -7.2 LIMITATION OF LIABILITY. TO THE FULL EXTENT ALLOWED BY APPLICABLE -LAW, ORIGINAL CONTRIBUTOR'S LIABILITY TO YOU FOR CLAIMS RELATING TO THIS -LICENSE, WHETHER FOR BREACH OR IN TORT, SHALL BE LIMITED TO ONE HUNDRED -PERCENT (100%) OF THE AMOUNT HAVING THEN ACTUALLY BEEN PAID BY YOU TO -ORIGINAL CONTRIBUTOR FOR ALL COPIES LICENSED HEREUNDER OF THE PARTICULAR -ITEMS GIVING RISE TO SUCH CLAIM, IF ANY, DURING THE TWELVE MONTHS -PRECEDING THE CLAIMED BREACH. IN NO EVENT WILL YOU (RELATIVE TO YOUR -SHARED MODIFICATIONS OR ERROR CORRECTIONS) OR ORIGINAL CONTRIBUTOR BE -LIABLE FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL -DAMAGES IN CONNECTION WITH OR RISING OUT OF THIS LICENSE (INCLUDING, -WITHOUT LIMITATION, LOSS OF PROFITS, USE, DATA, OR OTHER ECONOMIC -ADVANTAGE), HOWEVER IT ARISES AND ON ANY THEORY OF LIABILITY, WHETHER IN -AN ACTION FOR CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE) -OR OTHERWISE, WHETHER OR NOT YOU OR ORIGINAL CONTRIBUTOR HAS BEEN -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE AND NOTWITHSTANDING THE -FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. - -*8. Miscellaneous.* - -8.1 Trademark. - -You shall not use any Trademark unless You and Original Contributor -execute a copy of the Commercial Use and Trademark License Agreement -attached hereto as Attachment D. Except as expressly provided in the -License, You are granted no right, title or license to, or interest in, -any Trademarks. Whether or not You and Original Contributor enter into -the Trademark License, You agree not to (i) challenge Original -Contributor's ownership or use of Trademarks; (ii) attempt to register -any Trademarks, or any mark or logo substantially similar thereto; or -(iii) incorporate any Trademarks into Your own trademarks, product -names, service marks, company names, or domain names. - -8.2 Integration. - -This License represents the complete agreement concerning the subject -matter hereof. - -8.3 Assignment. - -Original Contributor may assign this License, and its rights and -obligations hereunder, in its sole discretion. You may assign the -Research Use portions of this License and the TCK license to a third -party upon prior written notice to Original Contributor (which may be -provided electronically via the Community Web-Server). You may not -assign the Commercial Use and Trademark license, the Add-On Technology -License, or the Add-On Technology Source Code Porting License, including -by way of merger (regardless of whether You are the surviving entity) or -acquisition, without Original Contributor's prior written consent. - -8.4 Severability. - -If any provision of this License is held to be unenforceable, such -provision shall be reformed only to the extent necessary to make it -enforceable. Notwithstanding the foregoing, if You are prohibited by law -from fully and specifically complying with Sections 2.2 or 3, this -License will immediately terminate and You must immediately discontinue -any use of Covered Code. - -8.5 Governing Law. - -This License shall be governed by the laws of the United States and the -State of Washington, as applied to contracts entered into and to be -performed in Washington between Washington residents. The application of -the United Nations Convention on Contracts for the International Sale of -Goods is expressly excluded. You agree that the state and federal courts -located in Seattle, Washington have exclusive jurisdiction over any -claim relating to the License, including contract and tort claims. - -8.6 Dispute Resolution. - -a) Arbitration. Any dispute arising out of or relating to this License -shall be finally settled by arbitration as set out herein, except that -either party may bring any action, in a court of competent jurisdiction -(which jurisdiction shall be exclusive), with respect to any dispute -relating to such party's Intellectual Property Rights or with respect to -Your compliance with the TCK license. Arbitration shall be administered: -(i) by the American Arbitration Association (AAA), (ii) in accordance -with the rules of the United Nations Commission on International Trade -Law (UNCITRAL) (the "Rules") in effect at the time of arbitration as -modified herein; and (iii) the arbitrator will apply the substantive -laws of Washington and the United States. Judgment upon the award -rendered by the arbitrator may be entered in any court having -jurisdiction to enforce such award. - -b) Arbitration language, venue and damages. All arbitration proceedings -shall be conducted in English by a single arbitrator selected in -accordance with the Rules, who must be fluent in English and be either a -retired judge or practicing attorney having at least ten (10) years -litigation experience and be reasonably familiar with the technology -matters relative to the dispute. Unless otherwise agreed, arbitration -venue shall be in Seattle, Washington. The arbitrator may award monetary -damages only and nothing shall preclude either party from seeking -provisional or emergency relief from a court of competent jurisdiction. -The arbitrator shall have no authority to award damages in excess of -those permitted in this License and any such award in excess is void. -All awards will be payable in U.S. dollars and may include, for the -prevailing party (i) pre-judgment award interest, (ii) reasonable -attorneys' fees incurred in connection with the arbitration, and (iii) -reasonable costs and expenses incurred in enforcing the award. The -arbitrator will order each party to produce identified documents and -respond to no more than twenty-five single question interrogatories. - -8.7 Construction. - -Any law or regulation, which provides that the language of a contract -shall be construed against the drafter, shall not apply to this License. - -8.8 U.S. Government End Users. - -The Covered Code is a "commercial item," as that term is defined in 48 -C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" -and "commercial computer software documentation," as such terms are used -in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and -48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government -End Users acquire Covered Code with only those rights set forth herein. -You agree to pass this notice to our licensees. - -8.9 Marketing Activities. - -Licensee hereby grants Original Contributor a non-exclusive, -non-transferable, limited license to use the Licensee's company name and -logo ("Licensee Marks") in any presentations, press releases, or -marketing materials solely for the purpose of identifying Licensee as a -member of the Helix Community. Licensee shall provide samples of -Licensee Marks to Original Contributor upon request by Original -Contributor. Original Contributor acknowledges that the Licensee Marks -are the trademarks of Licensee. Original Contributor shall not use the -Licensee Marks in a way that may imply that Original Contributor is an -agency or branch of Licensee. Original Contributor understands and -agrees that the use of any Licensee Marks in connection with this -Agreement shall not create any right, title or interest, in, or to the -Licensee Marks or any Licensee trademarks and that all such use and -goodwill associated with any such trademarks will inure to the benefit -of Licensee. Further the Original Contributor will stop usage of the -Licensee Marks upon Licensee's request. - -8.10 Press Announcements. - -You may make press announcements or other public statements regarding -this License without the prior written consent of the Original -Contributor, if Your statement is limited to announcing the licensing of -the Covered Code or the availability of Your Product and its -compatibility with the Covered Code. All other public announcements -regarding this license require the prior written consent of the Original -Contributor. Consent requests are welcome at press@helixcommunity.org. - -8.11 International Use. - -a) Export/Import laws. Covered Code is subject to U.S. export control -laws and may be subject to export or import regulations in other -countries. Each party agrees to comply strictly with all such laws and -regulations and acknowledges their responsibility to obtain such -licenses to export, re-export, or import as may be required. You agree -to pass these obligations to Your licensees. - -b) Intellectual Property Protection. Due to limited intellectual -property protection and enforcement in certain countries, You agree not -to redistribute the Original Code, Upgraded Code, TCK and Specifications -to any country on the list of restricted countries on the Community Web -Server. - -8.12 Language. - -This License is in the English language only, which language shall be -controlling in all respects, and all versions of this License in any -other language shall be for accommodation only and shall not be binding -on the parties to this License. All communications and notices made or -given pursuant to this License, and all documentation and support to be -provided, unless otherwise noted, shall be in the English language. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH REALNETWORKS, INC. IF YOU ARE AGREEING -TO THIS LICENSE ON BEHALF OF A COMPANY, YOU REPRESENT THAT YOU ARE -AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. WHETHER YOU ARE ACTING -ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, YOU MUST BE OF MAJORITY -AGE AND BE OTHERWISE COMPETENT TO ENTER INTO CONTRACTS. IF YOU DO NOT -MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY OF THE TERMS AND -CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON TO EXIT. - - - GLOSSARY - -1. *"Added Value"* means code which: - -(i) has a principal purpose which is substantially different from that -of the stand-alone Technology; - -(ii) represents a significant functional and value enhancement to the -Technology; - -(iii) operates in conjunction with the Technology; and - -(iv) is not marketed as a technology which replaces or substitutes for -the Technology - -2. "*Applicable Patent Rights*" mean: (a) in the case where Original -Contributor is the grantor of rights, claims of patents that (i) are now -or hereafter acquired, owned by or assigned to Original Contributor and -(ii) are necessarily infringed by using or making the Original Code or -Upgraded Code, including Modifications provided by Original Contributor, -alone and not in combination with other software or hardware; and (b) in -the case where Licensee is the grantor of rights, claims of patents that -(i) are now or hereafter acquired, owned by or assigned to Licensee and -(ii) are infringed (directly or indirectly) by using or making -Licensee's Modifications or Error Corrections, taken alone or in -combination with Covered Code. - -3. "*Application Programming Interfaces (APIs)"* means the interfaces, -associated header files, service provider interfaces, and protocols that -enable a device, application, Operating System, or other program to -obtain services from or make requests of (or provide services in -response to requests from) other programs, and to use, benefit from, or -rely on the resources, facilities, and capabilities of the relevant -programs using the APIs. APIs includes the technical documentation -describing the APIs, the Source Code constituting the API, and any -Header Files used with the APIs. - -4. "*Commercial Use*" means any use (internal or external), copying, -sublicensing or distribution (internal or external), directly or -indirectly of Covered Code by You other than Your Research Use of -Covered Code within Your business or organization or in conjunction with -other Licensees with equivalent Research Use rights. Commercial Use -includes any use of the Covered Code for direct or indirect commercial -or strategic gain, advantage or other business purpose. Any Commercial -Use requires execution of Attachment D by You and Original Contributor. - -5. "*Community Code*" means the Original Code, Upgraded Code, Error -Corrections, Shared Modifications, or any combination thereof. - -6. "*Community Webserver(s)"* means the webservers designated by -Original Contributor for access to the Original Code, Upgraded Code, TCK -and Specifications and for posting Error Corrections and Shared -Modifications. - -7. "*Compliant Covered Code*" means Covered Code that complies with the -requirements of the TCK. - -8. "*Contributor*" means each Licensee that creates or contributes to -the creation of any Error Correction or Shared Modification. - -9. "*Covered Code*" means the Original Code, Upgraded Code, -Modifications, or any combination thereof. - -10. "*Error Correction*" means any change made to Community Code which -conforms to the Specification and corrects the adverse effect of a -failure of Community Code to perform any function set forth in or -required by the Specifications. - -11. "*Executable*" means Covered Code that has been converted from -Source Code to the preferred form for execution by a computer or digital -processor (e.g. binary form). - -12. "*Extension(s)"* means any additional Interfaces developed by or for -You which: (i) are designed for use with the Technology; (ii) constitute -an API for a library of computing functions or services; and (iii) are -disclosed or otherwise made available to third party software developers -for the purpose of developing software which invokes such additional -Interfaces. The foregoing shall not apply to software developed by Your -subcontractors to be exclusively used by You. - -13. "*Header File(s)"* means that portion of the Source Code that -provides the names and types of member functions, data members, class -definitions, and interface definitions necessary to implement the APIs -for the Covered Code. Header Files include, files specifically -designated by Original Contributor as Header Files. Header Files do not -include the code necessary to implement the functionality underlying the -Interface. - -14. *"Helix DNA Server Technology"* means the program(s) that implement -the Helix Universal Server streaming engine for the Technology as -defined in the Specification. - -15. *"Helix DNA Client Technology"* means the Covered Code that -implements the RealOne Player engine as defined in the Specification. - -16. *"Helix DNA Producer Technology"* means the Covered Code that -implements the Helix Producer engine as defined in the Specification. - -17. *"Helix DNA Technology"* means the Helix DNA Server Technology, the -Helix DNA Client Technology, the Helix DNA Producer Technology and other -Helix technologies designated by Original Contributor. - -18. "*Intellectual Property Rights*" means worldwide statutory and -common law rights associated solely with (i) Applicable Patent Rights; -(ii) works of authorship including copyrights, copyright applications, -copyright registrations and "moral rights"; (iii) the protection of -trade and industrial secrets and confidential information; and (iv) -divisions, continuations, renewals, and re-issuances of the foregoing -now existing or acquired in the future. - -19. *"Interface*" means interfaces, functions, properties, class -definitions, APIs, Header Files, GUIDs, V-Tables, and/or protocols -allowing one piece of software, firmware or hardware to communicate or -interoperate with another piece of software, firmware or hardware. - -20. "*Internal Deployment Use*" means use of Compliant Covered Code -(excluding Research Use) within Your business or organization only by -Your employees and/or agents on behalf of Your business or organization, -but not to provide services, including content distribution, to third -parties, subject to execution of Attachment D by You and Original -Contributor, if required. - -21. "*Licensee*" means any party that has entered into and has in effect -a version of this License with Original Contributor. - -22. "*MIME type*" means a description of what type of media or other -content is in a file, including by way of example but not limited to -'audio/x-pn-realaudio-plugin.' - -23. "*Modification(s)"* means (i) any addition to, deletion from and/or -change to the substance and/or structure of the Covered Code, including -Interfaces; (ii) the combination of any Covered Code and any previous -Modifications; (iii) any new file or other representation of computer -program statements that contains any portion of Covered Code; and/or -(iv) any new Source Code implementing any portion of the Specifications. - -24. "*MP3 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Picture Experts Group known as MPEG-1 Audio Layer-3 or MP3, -including but not limited to all past and future versions, profiles, -extensions, parts and amendments relating to the MP3 specification. - -25. "*MPEG-4 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Pictures Experts Group known as MPEG-4, including but not -limited to all past and future versions, profiles, extensions, parts and -amendments relating to the MPEG-4 specification. - -26. "*Original Code*" means the initial Source Code for the Technology -as described on the Community Web Server. - -27. "*Original Contributor*" means RealNetworks, Inc., its affiliates -and its successors and assigns. - -28. "*Original Contributor MIME Type*" means the MIME registry, browser -preferences, or local file/protocol associations invoking any Helix DNA -Client-based application, including the RealOne Player, for playback of -RealAudio, RealVideo, other RealMedia MIME types or datatypes (e.g., -.ram, .rnx, .rpm, .ra, .rm, .rp, .rt, .rf, .prx, .mpe, .rmp, .rmj, .rav, -.rjs, .rmx, .rjt, .rms), and any other Original Contributor-specific or -proprietary MIME types that Original Contributor may introduce in the -future. - -29. "*Personal Use*" means use of Covered Code by an individual solely -for his or her personal, private and non-commercial purposes. An -individual's use of Covered Code in his or her capacity as an officer, -employee, member, independent contractor or agent of a corporation, -business or organization (commercial or non-commercial) does not qualify -as Personal Use. - -30. "*RealMedia File Format*" means the file format designed and -developed by RealNetworks for storing multimedia data and used to store -RealAudio and RealVideo encoded streams. Valid RealMedia File Format -extensions include: .rm, .rmj, .rmc, .rmvb, .rms. - -31. "*RCSL Webpage*" means the RealNetworks Community Source License -webpage located at https://www.helixcommunity.org/content/rcsl or such -other URL that Original Contributor may designate from time to time. - -32. "*Reformatted Specifications*" means any revision to the -Specifications which translates or reformats the Specifications (as for -example in connection with Your documentation) but which does not alter, -subset or superset * *the functional or operational aspects of the -Specifications. - -33. "*Research Use*" means use and distribution of Covered Code only for -Your Personal Use, research or development use and expressly excludes -Internal Deployment Use and Commercial Use. Research Use also includes -use of Covered Code to teach individuals how to use Covered Code. - -34. "*Shared Modifications*" means Modifications that You distribute or -use for a Commercial Use, in addition to any Modifications provided by -You, at Your option, pursuant to Section 2.2, or received by You from a -Contributor pursuant to Section 2.3. - -35. "*Source Code*" means the preferred form of the Covered Code for -making modifications to it, including all modules it contains, plus any -associated interface definition files, scripts used to control -compilation and installation of an Executable, or source code -differential comparisons against either the Original Code or another -well known, available Covered Code of the Contributor's choice. The -Source Code can be in a compressed or archival form, provided the -appropriate decompression or de-archiving software is widely available -for no charge. - -36. "*Specifications*" means the specifications for the Technology and -other documentation, as designated on the Community Web Server, as may -be revised by Original Contributor from time to time. - -37. "*Trademarks*" means Original Contributor's trademarks and logos, -including, but not limited to, RealNetworks, RealAudio, RealVideo, -RealOne, RealSystem, SureStream, Helix, Helix DNA and other trademarks -whether now used or adopted in the future. - -38. "*Technology*" means the technology described in Attachment B, and -Upgrades. - -39. "*Technology Compatibility Kit"* or *"TCK*" means the test programs, -procedures, acceptance criteria and/or other requirements, designated by -Original Contributor for use in verifying compliance of Covered Code -with the Specifications, in conjunction with the Original Code and -Upgraded Code. Original Contributor may, in its sole discretion and from -time to time, revise a TCK to correct errors and/or omissions and in -connection with Upgrades. - -40. "*Upgrade(s)"* means new versions of Technology designated -exclusively by Original Contributor as an "Upgrade" and released by -Original Contributor from time to time under the terms of the License. - -41. "*Upgraded Code*" means the Source Code and/or Executables for -Upgrades, possibly including Modifications made by Contributors. - -42. *"User's Guide"* means the users guide for the TCK which Original -Contributor makes available to You to provide direction in how to run -the TCK and properly interpret the results, as may be revised by -Original Contributor from time to time. - -43. "*You(r)*" means an individual, or a legal entity acting by and -through an individual or individuals, exercising rights either under -this License or under a future version of this License issued pursuant -to Section 4.1. For legal entities, "You(r)" includes any entity that by -majority voting interest controls, is controlled by, or is under common -control with You. - -44. "*Your Products*" means any (i) hardware products You distribute -integrating the Covered Code; (ii) any software products You distribute -with the Covered Code that utilize the APIs of the Covered Code; or -(iii) any services You provide using the Covered Code. - - - ATTACHMENT A - -REQUIRED NOTICES - - - ATTACHMENT A-1 - -REQUIRED IN ALL CASES - -Notice to be included in header file of all Error Corrections and Shared -Modifications: - -Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved. - -The contents of this file, and the files included with this file, are -subject to the current version of RealNetworks Community Source License -Version 1.1 (the "License"). You may not use this file except in -compliance with the License executed by both You and RealNetworks. You -may obtain a copy of the License at * -https://www.helixcommunity.org/content/rcsl.* You may also obtain a copy -of the License by contacting RealNetworks directly. Please see the -License for the rights, obligations and limitations governing use of the -contents of the file. - -This file is part of the Helix DNA technology. RealNetworks, Inc., is -the developer of the Original code and owns the copyrights in the -portions it created. - -This file, and the files included with this file, are distributed on an -'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, -AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT -LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): - -_______________________________________________ - -Technology Compatibility Kit Test Suite(s) Location: - -________________________________ - - - ATTACHMENT A-2 - -SAMPLE LICENSEE CERTIFICATION - -"By clicking the `Agree' button below, You certify that You are a -Licensee in good standing under the RealNetworks Community Source -License, ("License") and that Your access, use and distribution of code -and information You may obtain at this site is subject to the License. -If You are not a Licensee under the RealNetworks Community Source -License You agree not to download, copy or use the Helix DNA technology. - - - ATTACHMENT A-3 - -REQUIRED STUDENT NOTIFICATION - -"This software and related documentation has been obtained by Your -educational institution subject to the RealNetworks Community Source -License. You have been provided access to the software and related -documentation for use only in connection with your course work and -research activities as a matriculated student of Your educational -institution. Any other use is expressly prohibited. - -THIS SOFTWARE AND RELATED DOCUMENTATION CONTAINS PROPRIETARY MATERIAL OF -REALNETWORKS, INC, WHICH ARE PROTECTED BY VARIOUS INTELLECTUAL PROPERTY -RIGHTS. - -You may not use this file except in compliance with the License. You may -obtain a copy of the License on the web at -https://www.helixcommunity.org/content/rcsl. - -* -* - - - ATTACHMENT B - -Description of Technology - -Helix DNA, which consists of Helix DNA Client, Helix DNA Server and -Helix DNA Producer. - -Description of "Technology" - -Helix DNA Technology v1.0 as described on the Community Web Server. - - - ATTACHMENT C - -TECHNOLOGY COMPATIBILITY KIT LICENSE - -The following license is effective for the *Helix DNA* Technology -Compatibility Kit - as described on the Community Web Server. The -Technology Compatibility Kit(s) for the Technology specified in -Attachment B may be accessed at the Community Web Server. - -1. TCK License. - -1.1 Grants to use TCK - -Subject to the terms and restrictions set forth below and the -RealNetworks Community Source License, and the Research Use license, -Original Contributor grants to You a worldwide, non-exclusive, -non-transferable license, to the extent of Original Contributor's -Intellectual Property Rights in the TCK (without the right to -sublicense), to use the TCK to develop and test Covered Code. - -1.2 TCK Use Restrictions. - -You are not authorized to create derivative works of the TCK or use the -TCK to test any implementation of the Specification that is not Covered -Code. You may not publish Your test results or make claims of -comparative compatibility with respect to other implementations of the -Specification. In consideration for the license grant in Section 1.1 -above You agree not to develop Your own tests that are intended to -validate conformation with the Specification. - -2. Test Results. - -You agree to provide to Original Contributor or the third party test -facility if applicable, Your test results that demonstrate that Covered -Code is Compliant Covered Code and that Original Contributor may publish -or otherwise distribute such test results. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH THE ORIGINAL CONTRIBUTOR, REALNETWORKS, -INC. IF YOU ARE AGREEING TO THIS LICENSE ON BEHALF OF A COMPANY, YOU -REPRESENT THAT YOU ARE AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. -WHETHER YOU ARE ACTING ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, -YOU MUST BE OF MAJORITY AGE AND BE OTHERWISE COMPETENT TO ENTER INTO -CONTRACTS. IF YOU DO NOT MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY -OF THE TERMS AND CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON -TO EXIT. - -*ACCEPT / REJECT -* - -* -* - -*To agree to the R&D/academic terms of this license, please register - on the site -- -you will then be given a chance to agree to the clickwrap RCSL - -R&D License - -and gain access to the RCSL-licensed source code. To build or deploy -commercial applications based on the RCSL, you will need to agree to the -Commercial Use license attachments -* - - - diff --git a/bsp/stm32_radio/mp3/real/projects/armads/RPSL.txt b/bsp/stm32_radio/mp3/real/projects/armads/RPSL.txt deleted file mode 100644 index d040a45205..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/armads/RPSL.txt +++ /dev/null @@ -1,518 +0,0 @@ -RealNetworks Public Source License Version 1.0 -(Rev. Date October 28, 2002) - -1. General Definitions. This License applies to any program or other work which -RealNetworks, Inc., or any other entity that elects to use this license, -("Licensor") makes publicly available and which contains a notice placed by -Licensor identifying such program or work as "Original Code" and stating that it -is subject to the terms of this RealNetworks Public Source License version 1.0 -(or subsequent version thereof) ("License"). You are not required to accept this -License. However, nothing else grants You permission to use, copy, modify or -distribute the software or its derivative works. These actions are prohibited by -law if You do not accept this License. Therefore, by modifying, copying or -distributing the software (or any work based on the software), You indicate your -acceptance of this License to do so, and all its terms and conditions. In -addition, you agree to the terms of this License by clicking the Accept button -or downloading the software. As used in this License: - -1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the -grantor of rights, claims of patents that (i) are now or hereafter acquired, -owned by or assigned to Licensor and (ii) are necessarily infringed by using or -making the Original Code alone and not in combination with other software or -hardware; and (b) in the case where You are the grantor of rights, claims of -patents that (i) are now or hereafter acquired, owned by or assigned to You and -(ii) are infringed (directly or indirectly) by using or making Your -Modifications, taken alone or in combination with Original Code. - -1.2 "Compatible Source License" means any one of the licenses listed on Exhibit -B or at https://www.helixcommunity.org/content/complicense or other licenses -specifically identified by Licensor in writing. Notwithstanding any term to the -contrary in any Compatible Source License, any code covered by any Compatible -Source License that is used with Covered Code must be made readily available in -Source Code format for royalty-free use under the terms of the Compatible Source -License or this License. - -1.3 "Contributor" means any person or entity that creates or contributes to the -creation of Modifications. - -1.4 "Covered Code" means the Original Code, Modifications, the combination of -Original Code and any Modifications, and/or any respective portions thereof. - -1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for -Your internal research and development (R&D) and/or Personal Use, and includes -without limitation, any and all internal use or distribution of Covered Code -within Your business or organization except for R&D use and/or Personal Use, as -well as direct or indirect sublicensing or distribution of Covered Code by You -to any third party in any form or manner. - -1.6 "Derivative Work" means either the Covered Code or any derivative work under -United States copyright law, and including any work containing or including any -portion of the Covered Code or Modifications, either verbatim or with -modifications and/or translated into another language. Derivative Work also -includes any work which combines any portion of Covered Code or Modifications -with code not otherwise governed by the terms of this License. - -1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be -accessed or used by anyone other than You, used to provide any services to -anyone other than You, or used in any way to deliver any content to anyone other -than You, whether the Covered Code is distributed to those parties, made -available as an application intended for use over a computer network, or used to -provide services or otherwise deliver content to anyone other than You. - -1.8. "Interface" means interfaces, functions, properties, class definitions, -APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of -software, firmware or hardware to communicate or interoperate with another piece -of software, firmware or hardware. - -1.9 "Modifications" mean any addition to, deletion from, and/or change to, the -substance and/or structure of the Original Code, any previous Modifications, the -combination of Original Code and any previous Modifications, and/or any -respective portions thereof. When code is released as a series of files, a -Modification is: (a) any addition to or deletion from the contents of a file -containing Covered Code; and/or (b) any new file or other representation of -computer program statements that contains any part of Covered Code. - -1.10 "Original Code" means (a) the Source Code of a program or other work as -originally made available by Licensor under this License, including the Source -Code of any updates or upgrades to such programs or works made available by -Licensor under this License, and that has been expressly identified by Licensor -as such in the header file(s) of such work; and (b) the object code compiled -from such Source Code and originally made available by Licensor under this -License. - -1.11 "Personal Use" means use of Covered Code by an individual solely for his or -her personal, private and non-commercial purposes. An individual's use of -Covered Code in his or her capacity as an officer, employee, member, independent -contractor or agent of a corporation, business or organization (commercial or -non-commercial) does not qualify as Personal Use. - -1.12 "Source Code" means the human readable form of a program or other work that -is suitable for making modifications to it, including all modules it contains, -plus any associated interface definition files, scripts used to control -compilation and installation of an executable (object code). - -1.13 "You" or "Your" means an individual or a legal entity exercising rights -under this License. For legal entities, "You" or "Your" includes any entity -which controls, is controlled by, or is under common control with, You, where -"control" means (a) the power, direct or indirect, to cause the direction or -management of such entity, whether by contract or otherwise, or (b) ownership of -fifty percent (50%) or more of the outstanding shares or beneficial ownership of -such entity. - -2. Permitted Uses; Conditions & Restrictions. Subject to the terms and -conditions of this License, Licensor hereby grants You, effective on the date -You accept this License (via downloading or using Covered Code or otherwise -indicating your acceptance of this License), a worldwide, royalty-free, -non-exclusive copyright license, to the extent of Licensor's copyrights cover -the Original Code, to do the following: - -2.1 You may reproduce, display, perform, modify and Deploy Covered Code, -provided that in each instance: - -(a) You must retain and reproduce in all copies of Original Code the copyright -and other proprietary notices and disclaimers of Licensor as they appear in the -Original Code, and keep intact all notices in the Original Code that refer to -this License; - -(b) You must include a copy of this License with every copy of Source Code of -Covered Code and documentation You distribute, and You may not offer or impose -any terms on such Source Code that alter or restrict this License or the -recipients' rights hereunder, except as permitted under Section 6; - -(c) You must duplicate, to the extent it does not already exist, the notice in -Exhibit A in each file of the Source Code of all Your Modifications, and cause -the modified files to carry prominent notices stating that You changed the files -and the date of any change; - -(d) You must make Source Code of all Your Externally Deployed Modifications -publicly available under the terms of this License, including the license grants -set forth in Section 3 below, for as long as you Deploy the Covered Code or -twelve (12) months from the date of initial Deployment, whichever is longer. You -should preferably distribute the Source Code of Your Deployed Modifications -electronically (e.g. download from a web site); and - -(e) if You Deploy Covered Code in object code, executable form only, You must -include a prominent notice, in the code itself as well as in related -documentation, stating that Source Code of the Covered Code is available under -the terms of this License with information on how and where to obtain such -Source Code. You must also include the Object Code Notice set forth in Exhibit A -in the "about" box or other appropriate place where other copyright notices are -placed, including any packaging materials. - -2.2 You expressly acknowledge and agree that although Licensor and each -Contributor grants the licenses to their respective portions of the Covered Code -set forth herein, no assurances are provided by Licensor or any Contributor that -the Covered Code does not infringe the patent or other intellectual property -rights of any other entity. Licensor and each Contributor disclaim any liability -to You for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, You hereby assume sole responsibility to -secure any other intellectual property rights needed, if any. For example, if a -third party patent license is required to allow You to make, use, sell, import -or offer for sale the Covered Code, it is Your responsibility to acquire such -license(s). - -2.3 Subject to the terms and conditions of this License, Licensor hereby grants -You, effective on the date You accept this License (via downloading or using -Covered Code or otherwise indicating your acceptance of this License), a -worldwide, royalty-free, perpetual, non-exclusive patent license under -Licensor's Applicable Patent Rights to make, use, sell, offer for sale and -import the Covered Code, provided that in each instance you comply with the -terms of this License. - -3. Your Grants. In consideration of, and as a condition to, the licenses granted -to You under this License: - -(a) You grant to Licensor and all third parties a non-exclusive, perpetual, -irrevocable, royalty free license under Your Applicable Patent Rights and other -intellectual property rights owned or controlled by You, to make, sell, offer -for sale, use, import, reproduce, display, perform, modify, distribute and -Deploy Your Modifications of the same scope and extent as Licensor's licenses -under Sections 2.1 and 2.2; and - -(b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide, -royalty-free, perpetual and irrevocable license, under Your Applicable Patent -Rights and other intellectual property rights owned or controlled by You, to -make, use, sell, offer for sale, import, reproduce, display, perform, -distribute, modify or have modified (for Licensor and/or its subsidiaries), -sublicense and distribute Your Modifications, in any form and for any purpose, -through multiple tiers of distribution. - -(c) You agree not use any information derived from Your use and review of the -Covered Code, including but not limited to any algorithms or inventions that may -be contained in the Covered Code, for the purpose of asserting any of Your -patent rights, or assisting a third party to assert any of its patent rights, -against Licensor or any Contributor. - -4. Derivative Works. You may create a Derivative Work by combining Covered Code -with other code not otherwise governed by the terms of this License and -distribute the Derivative Work as an integrated product. In each such instance, -You must make sure the requirements of this License are fulfilled for the -Covered Code or any portion thereof, including all Modifications. - -4.1 You must cause any Derivative Work that you distribute, publish or -Externally Deploy, that in whole or in part contains or is derived from the -Covered Code or any part thereof, to be licensed as a whole at no charge to all -third parties under the terms of this License and no other license except as -provided in Section 4.2. You also must make Source Code available for the -Derivative Work under the same terms as Modifications, described in Sections 2 -and 3, above. - -4.2 Compatible Source Licenses. Software modules that have been independently -developed without any use of Covered Code and which contain no portion of the -Covered Code, Modifications or other Derivative Works, but are used or combined -in any way wtih the Covered Code or any Derivative Work to form a larger -Derivative Work, are exempt from the conditions described in Section 4.1 but -only to the extent that: the software module, including any software that is -linked to, integrated with, or part of the same applications as, the software -module by any method must be wholly subject to one of the Compatible Source -Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the -terms of this License. Thus, the entire Derivative Work must be licensed under a -combination of the RPSL (for Covered Code) and a Compatible Source License for -any independently developed software modules within the Derivative Work. The -foregoing requirement applies even if the Compatible Source License would -ordinarily allow the software module to link with, or form larger works with, -other software that is not subject to the Compatible Source License. For -example, although the Mozilla Public License v1.1 allows Mozilla code to be -combined with proprietary software that is not subject to the MPL, if -MPL-licensed code is used with Covered Code the MPL-licensed code could not be -combined or linked with any code not governed by the MPL. The general intent of -this section 4.2 is to enable use of Covered Code with applications that are -wholly subject to an acceptable open source license. You are responsible for -determining whether your use of software with Covered Code is allowed under Your -license to such software. - -4.3 Mere aggregation of another work not based on the Covered Code with the -Covered Code (or with a work based on the Covered Code) on a volume of a storage -or distribution medium does not bring the other work under the scope of this -License. If You deliver the Covered Code for combination and/or integration with -an application previously provided by You (for example, via automatic updating -technology), such combination and/or integration constitutes a Derivative Work -subject to the terms of this License. - -5. Exclusions From License Grant. Nothing in this License shall be deemed to -grant any rights to trademarks, copyrights, patents, trade secrets or any other -intellectual property of Licensor or any Contributor except as expressly stated -herein. No right is granted to the trademarks of Licensor or any Contributor -even if such marks are included in the Covered Code. Nothing in this License -shall be interpreted to prohibit Licensor from licensing under different terms -from this License any code that Licensor otherwise would have a right to -license. Modifications, Derivative Works and/or any use or combination of -Covered Code with other technology provided by Licensor or third parties may -require additional patent licenses from Licensor which Licensor may grant in its -sole discretion. No patent license is granted separate from the Original Code or -combinations of the Original Code with other software or hardware. - -5.1. Trademarks. This License does not grant any rights to use the trademarks or -trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any -trademark or trade name belonging to any Contributor. No Licensor Marks may be -used to endorse or promote products derived from the Original Code other than as -permitted by the Licensor Trademark Policy defined in Exhibit C. - -6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, -support, indemnity or liability obligations and/or other rights consistent with -the scope of the license granted herein ("Additional Terms") to one or more -recipients of Covered Code. However, You may do so only on Your own behalf and -as Your sole responsibility, and not on behalf of Licensor or any Contributor. -You must obtain the recipient's agreement that any such Additional Terms are -offered by You alone, and You hereby agree to indemnify, defend and hold -Licensor and every Contributor harmless for any liability incurred by or claims -asserted against Licensor or such Contributor by reason of any such Additional -Terms. - -7. Versions of the License. Licensor may publish revised and/or new versions of -this License from time to time. Each version will be given a distinguishing -version number. Once Original Code has been published under a particular version -of this License, You may continue to use it under the terms of that version. You -may also choose to use such Original Code under the terms of any subsequent -version of this License published by Licensor. No one other than Licensor has -the right to modify the terms applicable to Covered Code created under this -License. - -8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part -pre-release, untested, or not fully tested works. The Covered Code may contain -errors that could cause failures or loss of data, and may be incomplete or -contain inaccuracies. You expressly acknowledge and agree that use of the -Covered Code, or any portion thereof, is at Your sole and entire risk. THE -COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF -ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS -"LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY -DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF -SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET -ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH -CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE -COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR -REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR -ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR -WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR -AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You -acknowledge that the Covered Code is not intended for use in high risk -activities, including, but not limited to, the design, construction, operation -or maintenance of nuclear facilities, aircraft navigation, aircraft -communication systems, or air traffic control machines in which case the failure -of the Covered Code could lead to death, personal injury, or severe physical or -environmental damage. Licensor disclaims any express or implied warranty of -fitness for such uses. - -9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT -SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR -YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER -UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT -LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH -CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND -NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME -JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR -CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event -shall Licensor's total liability to You for all damages (other than as may be -required by applicable law) under this License exceed the amount of ten dollars -($10.00). - -10. Ownership. Subject to the licenses granted under this License, each -Contributor retains all rights, title and interest in and to any Modifications -made by such Contributor. Licensor retains all rights, title and interest in and -to the Original Code and any Modifications made by or on behalf of Licensor -("Licensor Modifications"), and such Licensor Modifications will not be -automatically subject to this License. Licensor may, at its sole discretion, -choose to license such Licensor Modifications under this License, or on -different terms from those contained in this License or may choose not to -license them at all. - -11. Termination. - -11.1 Term and Termination. The term of this License is perpetual unless -terminated as provided below. This License and the rights granted hereunder will -terminate: - -(a) automatically without notice from Licensor if You fail to comply with any -term(s) of this License and fail to cure such breach within 30 days of becoming -aware of such breach; - -(b) immediately in the event of the circumstances described in Section 12.5(b); -or - -(c) automatically without notice from Licensor if You, at any time during the -term of this License, commence an action for patent infringement against -Licensor (including by cross-claim or counter claim in a lawsuit); - -(d) upon written notice from Licensor if You, at any time during the term of -this License, commence an action for patent infringement against any third party -alleging that the Covered Code itself (excluding combinations with other -software or hardware) infringes any patent (including by cross-claim or counter -claim in a lawsuit). - -11.2 Effect of Termination. Upon termination, You agree to immediately stop any -further use, reproduction, modification, sublicensing and distribution of the -Covered Code and to destroy all copies of the Covered Code that are in your -possession or control. All sublicenses to the Covered Code which have been -properly granted prior to termination shall survive any termination of this -License. Provisions which, by their nature, should remain in effect beyond the -termination of this License shall survive, including but not limited to Sections -3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for -compensation, indemnity or damages of any sort solely as a result of terminating -this License in accordance with its terms, and termination of this License will -be without prejudice to any other right or remedy of any party. - -12. Miscellaneous. - -12.1 Government End Users. The Covered Code is a "commercial item" as defined in -FAR 2.101. Government software and technical data rights in the Covered Code -include only those rights customarily provided to the public as defined in this -License. This customary commercial license in technical data and software is -provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer -Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical -Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software -or Computer Software Documentation). Accordingly, all U.S. Government End Users -acquire Covered Code with only those rights set forth herein. - -12.2 Relationship of Parties. This License will not be construed as creating an -agency, partnership, joint venture or any other form of legal association -between or among You, Licensor or any Contributor, and You will not represent to -the contrary, whether expressly, by implication, appearance or otherwise. - -12.3 Independent Development. Nothing in this License will impair Licensor's -right to acquire, license, develop, have others develop for it, market and/or -distribute technology or products that perform the same or similar functions as, -or otherwise compete with, Modifications, Derivative Works, technology or -products that You may develop, produce, market or distribute. - -12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any -provision of this License will not be deemed a waiver of future enforcement of -that or any other provision. Any law or regulation which provides that the -language of a contract shall be construed against the drafter will not apply to -this License. - -12.5 Severability. (a) If for any reason a court of competent jurisdiction finds -any provision of this License, or portion thereof, to be unenforceable, that -provision of the License will be enforced to the maximum extent permissible so -as to effect the economic benefits and intent of the parties, and the remainder -of this License will continue in full force and effect. (b) Notwithstanding the -foregoing, if applicable law prohibits or restricts You from fully and/or -specifically complying with Sections 2 and/or 3 or prevents the enforceability -of either of those Sections, this License will immediately terminate and You -must immediately discontinue any use of the Covered Code and destroy all copies -of it that are in your possession or control. - -12.6 Dispute Resolution. Any litigation or other dispute resolution between You -and Licensor relating to this License shall take place in the Seattle, -Washington, and You and Licensor hereby consent to the personal jurisdiction of, -and venue in, the state and federal courts within that District with respect to -this License. The application of the United Nations Convention on Contracts for -the International Sale of Goods is expressly excluded. - -12.7 Export/Import Laws. This software is subject to all export and import laws -and restrictions and regulations of the country in which you receive the Covered -Code and You are solely responsible for ensuring that You do not export, -re-export or import the Covered Code or any direct product thereof in violation -of any such restrictions, laws or regulations, or without all necessary -authorizations. - -12.8 Entire Agreement; Governing Law. This License constitutes the entire -agreement between the parties with respect to the subject matter hereof. This -License shall be governed by the laws of the United States and the State of -Washington. - -Where You are located in the province of Quebec, Canada, the following clause -applies: The parties hereby confirm that they have requested that this License -and all related documents be drafted in English. Les parties ont exigé -que le présent contrat et tous les documents connexes soient -rédigés en anglais. - - EXHIBIT A. - -"Copyright © 1995-2002 -RealNetworks, Inc. and/or its licensors. All Rights Reserved. - -The contents of this file, and the files included with this file, are subject to -the current version of the RealNetworks Public Source License Version 1.0 (the -"RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have -licensed the file under the RealNetworks Community Source License Version 1.0 -(the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which -case the RCSL will apply. You may also obtain the license terms directly from -RealNetworks. You may not use this file except in compliance with the RPSL or, -if you have a valid RCSL with RealNetworks applicable to this file, the RCSL. -Please see the applicable RPSL or RCSL for the rights, obligations and -limitations governing use of the contents of the file. - -This file is part of the Helix DNA Technology. RealNetworks is the developer of -the Original code and owns the copyrights in the portions it created. - -This file, and the files included with this file, is distributed and made -available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR -IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING -WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): ____________________________________ - -Technology Compatibility Kit Test -Suite(s) Location (if licensed under the RCSL): ______________________________ - -Object Code Notice: Helix DNA Client technology included. Copyright (c) -RealNetworks, Inc., 1995-2002. All rights reserved. - - - EXHIBIT B - -Compatible Source Licenses for the RealNetworks Public Source License. The -following list applies to the most recent version of the license as of October -25, 2002, unless otherwise indicated. - -* Academic Free License -* Apache Software License -* Apple Public Source License -* Artistic license -* Attribution Assurance Licenses -* BSD license -* Common Public License (1) -* Eiffel Forum License -* GNU General Public License (GPL) (1) -* GNU Library or "Lesser" General Public License (LGPL) (1) -* IBM Public License -* Intel Open Source License -* Jabber Open Source License -* MIT license -* MITRE Collaborative Virtual Workspace License (CVW License) -* Motosoto License -* Mozilla Public License 1.0 (MPL) -* Mozilla Public License 1.1 (MPL) -* Nokia Open Source License -* Open Group Test Suite License -* Python Software Foundation License -* Ricoh Source Code Public License -* Sun Industry Standards Source License (SISSL) -* Sun Public License -* University of Illinois/NCSA Open Source License -* Vovida Software License v. 1.0 -* W3C License -* X.Net License -* Zope Public License -* zlib/libpng license - -(1) Note: because this license contains certain reciprocal licensing terms that -purport to extend to independently developed code, You may be prohibited under -the terms of this otherwise compatible license from using code licensed under -its terms with Covered Code because Covered Code may only be licensed under the -RealNetworks Public Source License. Any attempt to apply non RPSL license terms, -including without limitation the GPL, to Covered Code is expressly forbidden. -You are responsible for ensuring that Your use of Compatible Source Licensed -code does not violate either the RPSL or the Compatible Source License. - -The latest version of this list can be found at: -https://www.helixcommunity.org/content/complicense - - EXHIBIT C - -RealNetworks' Trademark policy. - -RealNetworks defines the following trademarks collectively as "Licensor -Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem", -"RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other -trademarks or trade names belonging to RealNetworks. - -RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks -except as permitted by and in strict compliance at all times with RealNetworks' -third party trademark usage guidelines which are posted at -http://www.realnetworks.com/info/helixlogo.html. - diff --git a/bsp/stm32_radio/mp3/real/projects/armads/mp3dec.mcp b/bsp/stm32_radio/mp3/real/projects/armads/mp3dec.mcp deleted file mode 100644 index 3651bdd9c91a6e0cacd425ef6187ce0498615871..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190427 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 Xu>Ra5ksWX*-4P7!bh)yNp1tz_^nLDN diff --git a/bsp/stm32_radio/mp3/real/projects/armads/testwrap.mcp b/bsp/stm32_radio/mp3/real/projects/armads/testwrap.mcp deleted file mode 100644 index a2be24b0bd62ccb8ecafd89ac7eff2582d6c3006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191044 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. - ------------------------------------------------------------------------- - - - REALNETWORKS COMMUNITY SOURCE LICENSE - -Version 1.2 (Rev. Date: January 22, 2003). - - - RECITALS - -Original Contributor has developed Specifications, Source Code -implementations and Executables of certain Technology; and - -Original Contributor desires to license the Technology to a large -community to facilitate research, innovation and product development -while maintaining compatibility of such products with the Technology as -delivered by Original Contributor; and - -Original Contributor desires to license certain Trademarks for the -purpose of branding products that are compatible with the relevant -Technology delivered by Original Contributor; and - -You desire to license the Technology and possibly certain Trademarks -from Original Contributor on the terms and conditions specified in this -License. - -In consideration for the mutual covenants contained herein, You and -Original Contributor agree as follows: - - - AGREEMENT - -*1. Introduction.* - -The RealNetworks Community Source License ("RCSL") and effective -attachments ("License") may include five distinct licenses: - -i) Research Use license -- License plus Attachments A, B and C only. - -ii) Commercial Use and Trademark License, which may be for Internal -Deployment Use or external distribution, or both -- License plus -Attachments A, B, C, and D. - -iii) Technology Compatibility Kit (TCK) license -- Attachment C. - -iv) Add-On Technology License (Executable) Commercial Use License --Attachment F. - -v) Add-On Technology Source Code Porting and Optimization -License-Attachment G. - -The Research Use license is effective when You click and accept this -License. The TCK is effective when You click and accept this License, -unless otherwise specified in the TCK attachments. The Commercial Use -and Trademark, Add-On Technology License, and the Add-On Technology -Source Code Porting and Optimization licenses must each be signed by You -and Original Contributor to become effective. Once effective, these -licenses and the associated requirements and responsibilities are -cumulative. Capitalized terms used in this License are defined in the -Glossary. - -*2. License Grants.* - -2.1 Original Contributor Grant. - -Subject to Your compliance with Sections 3, 8.10 and Attachment A of -this License, Original Contributor grants to You a worldwide, -royalty-free, non-exclusive license, to the extent of Original -Contributor's Intellectual Property Rights covering the Original Code, -Upgraded Code and Specifications, to do the following: - -(a) Research Use License: - -(i) use, reproduce and modify the Original Code, Upgraded Code and -Specifications to create Modifications and Reformatted Specifications -for Research Use by You; - -(ii) publish and display Original Code, Upgraded Code and Specifications -with, or as part of Modifications, as permitted under Section 3.1(b) below; - -(iii) reproduce and distribute copies of Original Code and Upgraded Code -to Licensees and students for Research Use by You; - -(iv) compile, reproduce and distribute Original Code and Upgraded Code -in Executable form, and Reformatted Specifications to anyone for -Research Use by You. - -(b) Other than the licenses expressly granted in this License, Original -Contributor retains all right, title, and interest in Original Code and -Upgraded Code and Specifications. - -2.2 Your Grants. - -(a) To Other Licensees. You hereby grant to each Licensee a license to -Your Error Corrections and Shared Modifications, of the same scope and -extent as Original Contributor's licenses under Section 2.1 a) above -relative to Research Use and Attachment D relative to Commercial Use. - -(b) To Original Contributor. You hereby grant to Original Contributor a -worldwide, royalty-free, non-exclusive, perpetual and irrevocable -license, to the extent of Your Intellectual Property Rights covering -Your Error Corrections, Shared Modifications and Reformatted -Specifications, to use, reproduce, modify, display and distribute Your -Error Corrections, Shared Modifications and Reformatted Specifications, -in any form, including the right to sublicense such rights through -multiple tiers of distribution. - -(c) Other than the licenses expressly granted in Sections 2.2(a) and (b) -above, and the restrictions set forth in Section 3.1(d)(iv) below, You -retain all right, title, and interest in Your Error Corrections, Shared -Modifications and Reformatted Specifications. - -2.3 Contributor Modifications. - -You may use, reproduce, modify, display and distribute Contributor Error -Corrections, Shared Modifications and Reformatted Specifications, -obtained by You under this License, to the same scope and extent as with -Original Code, Upgraded Code and Specifications. - -2.4 Subcontracting. - -You may deliver the Source Code of Covered Code to other Licensees -having at least a Research Use license, for the sole purpose of -furnishing development services to You in connection with Your rights -granted in this License. All such Licensees must execute appropriate -documents with respect to such work consistent with the terms of this -License, and acknowledging their work-made-for-hire status or assigning -exclusive right to the work product and associated Intellectual Property -Rights to You. - -*3. Requirements and Responsibilities*. - -3.1 Research Use License. - -As a condition of exercising the rights granted under Section 2.1(a) -above, You agree to comply with the following: - -(a) Your Contribution to the Community. All Error Corrections and Shared -Modifications which You create or contribute to are automatically -subject to the licenses granted under Section 2.2 above. You are -encouraged to license all of Your other Modifications under Section 2.2 -as Shared Modifications, but are not required to do so. You agree to -notify Original Contributor of any errors in the Specification. - -(b) Source Code Availability. You agree to provide all Your Error -Corrections to Original Contributor as soon as reasonably practicable -and, in any event, prior to Internal Deployment Use or Commercial Use, -if applicable. Original Contributor may, at its discretion, post Source -Code for Your Error Corrections and Shared Modifications on the -Community Webserver. You may also post Error Corrections and Shared -Modifications on a web-server of Your choice; provided, that You must -take reasonable precautions to ensure that only Licensees have access to -such Error Corrections and Shared Modifications. Such precautions shall -include, without limitation, a password protection scheme limited to -Licensees and a click-on, download certification of Licensee status -required of those attempting to download from the server. An example of -an acceptable certification is attached as Attachment A-2. - -(c) Notices. All Error Corrections and Shared Modifications You create -or contribute to must include a file documenting the additions and -changes You made and the date of such additions and changes. You must -also include the notice set forth in Attachment A-1 in the file header. -If it is not possible to put the notice in a particular Source Code file -due to its structure, then You must include the notice in a location -(such as a relevant directory file), where a recipient would be most -likely to look for such a notice. - -(d) Redistribution. - -(i) Source. Covered Code may be distributed in Source Code form only to -another Licensee (except for students as provided below). You may not -offer or impose any terms on any Covered Code that alter the rights, -requirements, or responsibilities of such Licensee. You may distribute -Covered Code to students for use in connection with their course work -and research projects undertaken at accredited educational institutions. -Such students need not be Licensees, but must be given a copy of the -notice set forth in Attachment A-3 and such notice must also be included -in a file header or prominent location in the Source Code made available -to such students. - -(ii) Executable. You may distribute Executable version(s) of Covered -Code to Licensees and other third parties only for the purpose of -evaluation and comment in connection with Research Use by You and under -a license of Your choice, but which limits use of such Executable -version(s) of Covered Code only to that purpose. - -(iii) Modified Class, Interface and Package Naming. In connection with -Research Use by You only, You may use Original Contributor's class, -Interface and package names only to accurately reference or invoke the -Source Code files You modify. Original Contributor grants to You a -limited license to the extent necessary for such purposes. - -(iv) You expressly agree that any distribution, in whole or in part, of -Modifications developed by You shall only be done pursuant to the terms -and conditions of this License. - -(e) Extensions. - -(i) Covered Code. You may not include any Source Code of Community Code -in any Extensions. You may include the compiled Header Files of -Community Code in an Extension provided that Your use of the Covered -Code, including Heading Files, complies with the Commercial Use License, -the TCK and all other terms of this License. - -(ii) Publication. No later than the date on which You first distribute -such Extension for Commercial Use, You must publish to the industry, on -a non-confidential basis and free of all copyright restrictions with -respect to reproduction and use, an accurate and current specification -for any Extension. In addition, You must make available an appropriate -test suite, pursuant to the same rights as the specification, -sufficiently detailed to allow any third party reasonably skilled in the -technology to produce implementations of the Extension compatible with -the specification. Such test suites must be made available as soon as -reasonably practicable but, in no event, later than ninety (90) days -after Your first Commercial Use of the Extension. You must use -reasonable efforts to promptly clarify and correct the specification and -the test suite upon written request by Original Contributor. - -(iii) Open. You agree to refrain from enforcing any Intellectual -Property Rights You may have covering any interface(s) of Your -Extension, which would prevent the implementation of such interface(s) -by Original Contributor or any Licensee. This obligation does not -prevent You from enforcing any Intellectual Property Right You have that -would otherwise be infringed by an implementation of Your Extension. - -(iv) Interface Modifications and Naming. You may not modify or add to -the GUID space * * "xxxxxxxx-0901-11d1-8B06-00A024406D59" or any other -GUID space designated by Original Contributor. You may not modify any -Interface prefix provided with the Covered Code or any other prefix -designated by Original Contributor.* * - -* * - -(f) You agree that any Specifications provided to You by Original -Contributor are confidential and proprietary information of Original -Contributor. You must maintain the confidentiality of the Specifications -and may not disclose them to any third party without Original -Contributor's prior written consent. You may only use the Specifications -under the terms of this License and only for the purpose of implementing -the terms of this License with respect to Covered Code. You agree not -use, copy or distribute any such Specifications except as provided in -writing by Original Contributor. - -3.2 Commercial Use License. - -You may not make Commercial Use of any Covered Code unless You and -Original Contributor have executed a copy of the Commercial Use and -Trademark License attached as Attachment D. - -*4. Versions of the License.* - -4.1 License Versions. - -Original Contributor may publish revised versions of the License from -time to time. Each version will be given a distinguishing version number. - -4.2 Effect. - -Once a particular version of Covered Code has been provided under a -version of the License, You may always continue to use such Covered Code -under the terms of that version of the License. You may also choose to -use such Covered Code under the terms of any subsequent version of the -License. No one other than Original Contributor has the right to -promulgate License versions. - -4.3 Multiple-Licensed Code. - -Original Contributor may designate portions of the Covered Code as -"Multiple-Licensed." "Multiple-Licensed" means that the Original -Contributor permits You to utilize those designated portions of the -Covered Code under Your choice of this License or the alternative -license(s), if any, specified by the Original Contributor in an -Attachment to this License. - -*5. Disclaimer of Warranty.* - -5.1 COVERED CODE PROVIDED AS IS. - -COVERED CODE IS PROVIDED UNDER THIS LICENSE "AS IS," WITHOUT WARRANTY OF -ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, -WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT -FOR A PARTICULAR PURPOSE OR NON-INFRINGING. YOU AGREE TO BEAR THE ENTIRE -RISK IN CONNECTION WITH YOUR USE AND DISTRIBUTION OF COVERED CODE UNDER -THIS LICENSE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART -OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER -EXCEPT SUBJECT TO THIS DISCLAIMER. - -5.2 Not Designed for High Risk Activities. - -You acknowledge that Original Code, Upgraded Code and Specifications are -not designed or intended for use in high risk activities including, but -not limited to: (i) on-line control of aircraft, air traffic, aircraft -navigation or aircraft communications; or (ii) in the design, -construction, operation or maintenance of any nuclear facility. Original -Contributor disclaims any express or implied warranty of fitness for -such uses. - -*6. Termination.* - -6.1 By You. - -You may terminate this Research Use license at anytime by providing -written notice to Original Contributor. - -6.2 By Original Contributor. - -This License and the rights granted hereunder will terminate: - -(i) automatically if You fail to comply with the terms of this License -and fail to cure such breach within 30 days of receipt of written notice -of the breach; - -(ii) immediately in the event of circumstances specified in Sections 7.1 -and 8.4; or - -(iii) at Original Contributor's discretion upon any action initiated by -You (including by cross-claim or counter claim) alleging that use or -distribution by Original Contributor or any Licensee, of Original Code, -Upgraded Code, Error Corrections, Shared Modifications or Specifications -infringe a patent owned or controlled by You. - -6.3 Effective of Termination. - -Upon termination, You agree to discontinue use of and destroy all copies -of Covered Code in Your possession. All sublicenses to the Covered Code -which You have properly granted shall survive any termination of this -License. Provisions that, by their nature, should remain in effect -beyond the termination of this License shall survive including, without -limitation, Sections 2.2, 3, 5, 7 and 8. - -6.4 No Compensation. - -Each party waives and releases the other from any claim to compensation -or indemnity for permitted or lawful termination of the business -relationship established by this License. - -*7. Liability.* - -7.1 Infringement. Should any of the Original Code, Upgraded Code, TCK or -Specifications ("Materials") become the subject of a claim of -infringement, Original Contributor may, at its sole option, (i) attempt -to procure the rights necessary for You to continue using the Materials, -(ii) modify the Materials so that they are no longer infringing, or -(iii) terminate Your right to use the Materials, immediately upon -written notice, and refund to You the amount, if any, having then -actually been paid by You to Original Contributor for the Original Code, -Upgraded Code and TCK, depreciated on a straight line, five year basis. - -7.2 LIMITATION OF LIABILITY. TO THE FULL EXTENT ALLOWED BY APPLICABLE -LAW, ORIGINAL CONTRIBUTOR'S LIABILITY TO YOU FOR CLAIMS RELATING TO THIS -LICENSE, WHETHER FOR BREACH OR IN TORT, SHALL BE LIMITED TO ONE HUNDRED -PERCENT (100%) OF THE AMOUNT HAVING THEN ACTUALLY BEEN PAID BY YOU TO -ORIGINAL CONTRIBUTOR FOR ALL COPIES LICENSED HEREUNDER OF THE PARTICULAR -ITEMS GIVING RISE TO SUCH CLAIM, IF ANY, DURING THE TWELVE MONTHS -PRECEDING THE CLAIMED BREACH. IN NO EVENT WILL YOU (RELATIVE TO YOUR -SHARED MODIFICATIONS OR ERROR CORRECTIONS) OR ORIGINAL CONTRIBUTOR BE -LIABLE FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL -DAMAGES IN CONNECTION WITH OR RISING OUT OF THIS LICENSE (INCLUDING, -WITHOUT LIMITATION, LOSS OF PROFITS, USE, DATA, OR OTHER ECONOMIC -ADVANTAGE), HOWEVER IT ARISES AND ON ANY THEORY OF LIABILITY, WHETHER IN -AN ACTION FOR CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE) -OR OTHERWISE, WHETHER OR NOT YOU OR ORIGINAL CONTRIBUTOR HAS BEEN -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE AND NOTWITHSTANDING THE -FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. - -*8. Miscellaneous.* - -8.1 Trademark. - -You shall not use any Trademark unless You and Original Contributor -execute a copy of the Commercial Use and Trademark License Agreement -attached hereto as Attachment D. Except as expressly provided in the -License, You are granted no right, title or license to, or interest in, -any Trademarks. Whether or not You and Original Contributor enter into -the Trademark License, You agree not to (i) challenge Original -Contributor's ownership or use of Trademarks; (ii) attempt to register -any Trademarks, or any mark or logo substantially similar thereto; or -(iii) incorporate any Trademarks into Your own trademarks, product -names, service marks, company names, or domain names. - -8.2 Integration. - -This License represents the complete agreement concerning the subject -matter hereof. - -8.3 Assignment. - -Original Contributor may assign this License, and its rights and -obligations hereunder, in its sole discretion. You may assign the -Research Use portions of this License and the TCK license to a third -party upon prior written notice to Original Contributor (which may be -provided electronically via the Community Web-Server). You may not -assign the Commercial Use and Trademark license, the Add-On Technology -License, or the Add-On Technology Source Code Porting License, including -by way of merger (regardless of whether You are the surviving entity) or -acquisition, without Original Contributor's prior written consent. - -8.4 Severability. - -If any provision of this License is held to be unenforceable, such -provision shall be reformed only to the extent necessary to make it -enforceable. Notwithstanding the foregoing, if You are prohibited by law -from fully and specifically complying with Sections 2.2 or 3, this -License will immediately terminate and You must immediately discontinue -any use of Covered Code. - -8.5 Governing Law. - -This License shall be governed by the laws of the United States and the -State of Washington, as applied to contracts entered into and to be -performed in Washington between Washington residents. The application of -the United Nations Convention on Contracts for the International Sale of -Goods is expressly excluded. You agree that the state and federal courts -located in Seattle, Washington have exclusive jurisdiction over any -claim relating to the License, including contract and tort claims. - -8.6 Dispute Resolution. - -a) Arbitration. Any dispute arising out of or relating to this License -shall be finally settled by arbitration as set out herein, except that -either party may bring any action, in a court of competent jurisdiction -(which jurisdiction shall be exclusive), with respect to any dispute -relating to such party's Intellectual Property Rights or with respect to -Your compliance with the TCK license. Arbitration shall be administered: -(i) by the American Arbitration Association (AAA), (ii) in accordance -with the rules of the United Nations Commission on International Trade -Law (UNCITRAL) (the "Rules") in effect at the time of arbitration as -modified herein; and (iii) the arbitrator will apply the substantive -laws of Washington and the United States. Judgment upon the award -rendered by the arbitrator may be entered in any court having -jurisdiction to enforce such award. - -b) Arbitration language, venue and damages. All arbitration proceedings -shall be conducted in English by a single arbitrator selected in -accordance with the Rules, who must be fluent in English and be either a -retired judge or practicing attorney having at least ten (10) years -litigation experience and be reasonably familiar with the technology -matters relative to the dispute. Unless otherwise agreed, arbitration -venue shall be in Seattle, Washington. The arbitrator may award monetary -damages only and nothing shall preclude either party from seeking -provisional or emergency relief from a court of competent jurisdiction. -The arbitrator shall have no authority to award damages in excess of -those permitted in this License and any such award in excess is void. -All awards will be payable in U.S. dollars and may include, for the -prevailing party (i) pre-judgment award interest, (ii) reasonable -attorneys' fees incurred in connection with the arbitration, and (iii) -reasonable costs and expenses incurred in enforcing the award. The -arbitrator will order each party to produce identified documents and -respond to no more than twenty-five single question interrogatories. - -8.7 Construction. - -Any law or regulation, which provides that the language of a contract -shall be construed against the drafter, shall not apply to this License. - -8.8 U.S. Government End Users. - -The Covered Code is a "commercial item," as that term is defined in 48 -C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" -and "commercial computer software documentation," as such terms are used -in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and -48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government -End Users acquire Covered Code with only those rights set forth herein. -You agree to pass this notice to our licensees. - -8.9 Marketing Activities. - -Licensee hereby grants Original Contributor a non-exclusive, -non-transferable, limited license to use the Licensee's company name and -logo ("Licensee Marks") in any presentations, press releases, or -marketing materials solely for the purpose of identifying Licensee as a -member of the Helix Community. Licensee shall provide samples of -Licensee Marks to Original Contributor upon request by Original -Contributor. Original Contributor acknowledges that the Licensee Marks -are the trademarks of Licensee. Original Contributor shall not use the -Licensee Marks in a way that may imply that Original Contributor is an -agency or branch of Licensee. Original Contributor understands and -agrees that the use of any Licensee Marks in connection with this -Agreement shall not create any right, title or interest, in, or to the -Licensee Marks or any Licensee trademarks and that all such use and -goodwill associated with any such trademarks will inure to the benefit -of Licensee. Further the Original Contributor will stop usage of the -Licensee Marks upon Licensee's request. - -8.10 Press Announcements. - -You may make press announcements or other public statements regarding -this License without the prior written consent of the Original -Contributor, if Your statement is limited to announcing the licensing of -the Covered Code or the availability of Your Product and its -compatibility with the Covered Code. All other public announcements -regarding this license require the prior written consent of the Original -Contributor. Consent requests are welcome at press@helixcommunity.org. - -8.11 International Use. - -a) Export/Import laws. Covered Code is subject to U.S. export control -laws and may be subject to export or import regulations in other -countries. Each party agrees to comply strictly with all such laws and -regulations and acknowledges their responsibility to obtain such -licenses to export, re-export, or import as may be required. You agree -to pass these obligations to Your licensees. - -b) Intellectual Property Protection. Due to limited intellectual -property protection and enforcement in certain countries, You agree not -to redistribute the Original Code, Upgraded Code, TCK and Specifications -to any country on the list of restricted countries on the Community Web -Server. - -8.12 Language. - -This License is in the English language only, which language shall be -controlling in all respects, and all versions of this License in any -other language shall be for accommodation only and shall not be binding -on the parties to this License. All communications and notices made or -given pursuant to this License, and all documentation and support to be -provided, unless otherwise noted, shall be in the English language. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH REALNETWORKS, INC. IF YOU ARE AGREEING -TO THIS LICENSE ON BEHALF OF A COMPANY, YOU REPRESENT THAT YOU ARE -AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. WHETHER YOU ARE ACTING -ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, YOU MUST BE OF MAJORITY -AGE AND BE OTHERWISE COMPETENT TO ENTER INTO CONTRACTS. IF YOU DO NOT -MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY OF THE TERMS AND -CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON TO EXIT. - - - GLOSSARY - -1. *"Added Value"* means code which: - -(i) has a principal purpose which is substantially different from that -of the stand-alone Technology; - -(ii) represents a significant functional and value enhancement to the -Technology; - -(iii) operates in conjunction with the Technology; and - -(iv) is not marketed as a technology which replaces or substitutes for -the Technology - -2. "*Applicable Patent Rights*" mean: (a) in the case where Original -Contributor is the grantor of rights, claims of patents that (i) are now -or hereafter acquired, owned by or assigned to Original Contributor and -(ii) are necessarily infringed by using or making the Original Code or -Upgraded Code, including Modifications provided by Original Contributor, -alone and not in combination with other software or hardware; and (b) in -the case where Licensee is the grantor of rights, claims of patents that -(i) are now or hereafter acquired, owned by or assigned to Licensee and -(ii) are infringed (directly or indirectly) by using or making -Licensee's Modifications or Error Corrections, taken alone or in -combination with Covered Code. - -3. "*Application Programming Interfaces (APIs)"* means the interfaces, -associated header files, service provider interfaces, and protocols that -enable a device, application, Operating System, or other program to -obtain services from or make requests of (or provide services in -response to requests from) other programs, and to use, benefit from, or -rely on the resources, facilities, and capabilities of the relevant -programs using the APIs. APIs includes the technical documentation -describing the APIs, the Source Code constituting the API, and any -Header Files used with the APIs. - -4. "*Commercial Use*" means any use (internal or external), copying, -sublicensing or distribution (internal or external), directly or -indirectly of Covered Code by You other than Your Research Use of -Covered Code within Your business or organization or in conjunction with -other Licensees with equivalent Research Use rights. Commercial Use -includes any use of the Covered Code for direct or indirect commercial -or strategic gain, advantage or other business purpose. Any Commercial -Use requires execution of Attachment D by You and Original Contributor. - -5. "*Community Code*" means the Original Code, Upgraded Code, Error -Corrections, Shared Modifications, or any combination thereof. - -6. "*Community Webserver(s)"* means the webservers designated by -Original Contributor for access to the Original Code, Upgraded Code, TCK -and Specifications and for posting Error Corrections and Shared -Modifications. - -7. "*Compliant Covered Code*" means Covered Code that complies with the -requirements of the TCK. - -8. "*Contributor*" means each Licensee that creates or contributes to -the creation of any Error Correction or Shared Modification. - -9. "*Covered Code*" means the Original Code, Upgraded Code, -Modifications, or any combination thereof. - -10. "*Error Correction*" means any change made to Community Code which -conforms to the Specification and corrects the adverse effect of a -failure of Community Code to perform any function set forth in or -required by the Specifications. - -11. "*Executable*" means Covered Code that has been converted from -Source Code to the preferred form for execution by a computer or digital -processor (e.g. binary form). - -12. "*Extension(s)"* means any additional Interfaces developed by or for -You which: (i) are designed for use with the Technology; (ii) constitute -an API for a library of computing functions or services; and (iii) are -disclosed or otherwise made available to third party software developers -for the purpose of developing software which invokes such additional -Interfaces. The foregoing shall not apply to software developed by Your -subcontractors to be exclusively used by You. - -13. "*Header File(s)"* means that portion of the Source Code that -provides the names and types of member functions, data members, class -definitions, and interface definitions necessary to implement the APIs -for the Covered Code. Header Files include, files specifically -designated by Original Contributor as Header Files. Header Files do not -include the code necessary to implement the functionality underlying the -Interface. - -14. *"Helix DNA Server Technology"* means the program(s) that implement -the Helix Universal Server streaming engine for the Technology as -defined in the Specification. - -15. *"Helix DNA Client Technology"* means the Covered Code that -implements the RealOne Player engine as defined in the Specification. - -16. *"Helix DNA Producer Technology"* means the Covered Code that -implements the Helix Producer engine as defined in the Specification. - -17. *"Helix DNA Technology"* means the Helix DNA Server Technology, the -Helix DNA Client Technology, the Helix DNA Producer Technology and other -Helix technologies designated by Original Contributor. - -18. "*Intellectual Property Rights*" means worldwide statutory and -common law rights associated solely with (i) Applicable Patent Rights; -(ii) works of authorship including copyrights, copyright applications, -copyright registrations and "moral rights"; (iii) the protection of -trade and industrial secrets and confidential information; and (iv) -divisions, continuations, renewals, and re-issuances of the foregoing -now existing or acquired in the future. - -19. *"Interface*" means interfaces, functions, properties, class -definitions, APIs, Header Files, GUIDs, V-Tables, and/or protocols -allowing one piece of software, firmware or hardware to communicate or -interoperate with another piece of software, firmware or hardware. - -20. "*Internal Deployment Use*" means use of Compliant Covered Code -(excluding Research Use) within Your business or organization only by -Your employees and/or agents on behalf of Your business or organization, -but not to provide services, including content distribution, to third -parties, subject to execution of Attachment D by You and Original -Contributor, if required. - -21. "*Licensee*" means any party that has entered into and has in effect -a version of this License with Original Contributor. - -22. "*MIME type*" means a description of what type of media or other -content is in a file, including by way of example but not limited to -'audio/x-pn-realaudio-plugin.' - -23. "*Modification(s)"* means (i) any addition to, deletion from and/or -change to the substance and/or structure of the Covered Code, including -Interfaces; (ii) the combination of any Covered Code and any previous -Modifications; (iii) any new file or other representation of computer -program statements that contains any portion of Covered Code; and/or -(iv) any new Source Code implementing any portion of the Specifications. - -24. "*MP3 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Picture Experts Group known as MPEG-1 Audio Layer-3 or MP3, -including but not limited to all past and future versions, profiles, -extensions, parts and amendments relating to the MP3 specification. - -25. "*MPEG-4 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Pictures Experts Group known as MPEG-4, including but not -limited to all past and future versions, profiles, extensions, parts and -amendments relating to the MPEG-4 specification. - -26. "*Original Code*" means the initial Source Code for the Technology -as described on the Community Web Server. - -27. "*Original Contributor*" means RealNetworks, Inc., its affiliates -and its successors and assigns. - -28. "*Original Contributor MIME Type*" means the MIME registry, browser -preferences, or local file/protocol associations invoking any Helix DNA -Client-based application, including the RealOne Player, for playback of -RealAudio, RealVideo, other RealMedia MIME types or datatypes (e.g., -.ram, .rnx, .rpm, .ra, .rm, .rp, .rt, .rf, .prx, .mpe, .rmp, .rmj, .rav, -.rjs, .rmx, .rjt, .rms), and any other Original Contributor-specific or -proprietary MIME types that Original Contributor may introduce in the -future. - -29. "*Personal Use*" means use of Covered Code by an individual solely -for his or her personal, private and non-commercial purposes. An -individual's use of Covered Code in his or her capacity as an officer, -employee, member, independent contractor or agent of a corporation, -business or organization (commercial or non-commercial) does not qualify -as Personal Use. - -30. "*RealMedia File Format*" means the file format designed and -developed by RealNetworks for storing multimedia data and used to store -RealAudio and RealVideo encoded streams. Valid RealMedia File Format -extensions include: .rm, .rmj, .rmc, .rmvb, .rms. - -31. "*RCSL Webpage*" means the RealNetworks Community Source License -webpage located at https://www.helixcommunity.org/content/rcsl or such -other URL that Original Contributor may designate from time to time. - -32. "*Reformatted Specifications*" means any revision to the -Specifications which translates or reformats the Specifications (as for -example in connection with Your documentation) but which does not alter, -subset or superset * *the functional or operational aspects of the -Specifications. - -33. "*Research Use*" means use and distribution of Covered Code only for -Your Personal Use, research or development use and expressly excludes -Internal Deployment Use and Commercial Use. Research Use also includes -use of Covered Code to teach individuals how to use Covered Code. - -34. "*Shared Modifications*" means Modifications that You distribute or -use for a Commercial Use, in addition to any Modifications provided by -You, at Your option, pursuant to Section 2.2, or received by You from a -Contributor pursuant to Section 2.3. - -35. "*Source Code*" means the preferred form of the Covered Code for -making modifications to it, including all modules it contains, plus any -associated interface definition files, scripts used to control -compilation and installation of an Executable, or source code -differential comparisons against either the Original Code or another -well known, available Covered Code of the Contributor's choice. The -Source Code can be in a compressed or archival form, provided the -appropriate decompression or de-archiving software is widely available -for no charge. - -36. "*Specifications*" means the specifications for the Technology and -other documentation, as designated on the Community Web Server, as may -be revised by Original Contributor from time to time. - -37. "*Trademarks*" means Original Contributor's trademarks and logos, -including, but not limited to, RealNetworks, RealAudio, RealVideo, -RealOne, RealSystem, SureStream, Helix, Helix DNA and other trademarks -whether now used or adopted in the future. - -38. "*Technology*" means the technology described in Attachment B, and -Upgrades. - -39. "*Technology Compatibility Kit"* or *"TCK*" means the test programs, -procedures, acceptance criteria and/or other requirements, designated by -Original Contributor for use in verifying compliance of Covered Code -with the Specifications, in conjunction with the Original Code and -Upgraded Code. Original Contributor may, in its sole discretion and from -time to time, revise a TCK to correct errors and/or omissions and in -connection with Upgrades. - -40. "*Upgrade(s)"* means new versions of Technology designated -exclusively by Original Contributor as an "Upgrade" and released by -Original Contributor from time to time under the terms of the License. - -41. "*Upgraded Code*" means the Source Code and/or Executables for -Upgrades, possibly including Modifications made by Contributors. - -42. *"User's Guide"* means the users guide for the TCK which Original -Contributor makes available to You to provide direction in how to run -the TCK and properly interpret the results, as may be revised by -Original Contributor from time to time. - -43. "*You(r)*" means an individual, or a legal entity acting by and -through an individual or individuals, exercising rights either under -this License or under a future version of this License issued pursuant -to Section 4.1. For legal entities, "You(r)" includes any entity that by -majority voting interest controls, is controlled by, or is under common -control with You. - -44. "*Your Products*" means any (i) hardware products You distribute -integrating the Covered Code; (ii) any software products You distribute -with the Covered Code that utilize the APIs of the Covered Code; or -(iii) any services You provide using the Covered Code. - - - ATTACHMENT A - -REQUIRED NOTICES - - - ATTACHMENT A-1 - -REQUIRED IN ALL CASES - -Notice to be included in header file of all Error Corrections and Shared -Modifications: - -Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved. - -The contents of this file, and the files included with this file, are -subject to the current version of RealNetworks Community Source License -Version 1.1 (the "License"). You may not use this file except in -compliance with the License executed by both You and RealNetworks. You -may obtain a copy of the License at * -https://www.helixcommunity.org/content/rcsl.* You may also obtain a copy -of the License by contacting RealNetworks directly. Please see the -License for the rights, obligations and limitations governing use of the -contents of the file. - -This file is part of the Helix DNA technology. RealNetworks, Inc., is -the developer of the Original code and owns the copyrights in the -portions it created. - -This file, and the files included with this file, are distributed on an -'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, -AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT -LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): - -_______________________________________________ - -Technology Compatibility Kit Test Suite(s) Location: - -________________________________ - - - ATTACHMENT A-2 - -SAMPLE LICENSEE CERTIFICATION - -"By clicking the `Agree' button below, You certify that You are a -Licensee in good standing under the RealNetworks Community Source -License, ("License") and that Your access, use and distribution of code -and information You may obtain at this site is subject to the License. -If You are not a Licensee under the RealNetworks Community Source -License You agree not to download, copy or use the Helix DNA technology. - - - ATTACHMENT A-3 - -REQUIRED STUDENT NOTIFICATION - -"This software and related documentation has been obtained by Your -educational institution subject to the RealNetworks Community Source -License. You have been provided access to the software and related -documentation for use only in connection with your course work and -research activities as a matriculated student of Your educational -institution. Any other use is expressly prohibited. - -THIS SOFTWARE AND RELATED DOCUMENTATION CONTAINS PROPRIETARY MATERIAL OF -REALNETWORKS, INC, WHICH ARE PROTECTED BY VARIOUS INTELLECTUAL PROPERTY -RIGHTS. - -You may not use this file except in compliance with the License. You may -obtain a copy of the License on the web at -https://www.helixcommunity.org/content/rcsl. - -* -* - - - ATTACHMENT B - -Description of Technology - -Helix DNA, which consists of Helix DNA Client, Helix DNA Server and -Helix DNA Producer. - -Description of "Technology" - -Helix DNA Technology v1.0 as described on the Community Web Server. - - - ATTACHMENT C - -TECHNOLOGY COMPATIBILITY KIT LICENSE - -The following license is effective for the *Helix DNA* Technology -Compatibility Kit - as described on the Community Web Server. The -Technology Compatibility Kit(s) for the Technology specified in -Attachment B may be accessed at the Community Web Server. - -1. TCK License. - -1.1 Grants to use TCK - -Subject to the terms and restrictions set forth below and the -RealNetworks Community Source License, and the Research Use license, -Original Contributor grants to You a worldwide, non-exclusive, -non-transferable license, to the extent of Original Contributor's -Intellectual Property Rights in the TCK (without the right to -sublicense), to use the TCK to develop and test Covered Code. - -1.2 TCK Use Restrictions. - -You are not authorized to create derivative works of the TCK or use the -TCK to test any implementation of the Specification that is not Covered -Code. You may not publish Your test results or make claims of -comparative compatibility with respect to other implementations of the -Specification. In consideration for the license grant in Section 1.1 -above You agree not to develop Your own tests that are intended to -validate conformation with the Specification. - -2. Test Results. - -You agree to provide to Original Contributor or the third party test -facility if applicable, Your test results that demonstrate that Covered -Code is Compliant Covered Code and that Original Contributor may publish -or otherwise distribute such test results. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH THE ORIGINAL CONTRIBUTOR, REALNETWORKS, -INC. IF YOU ARE AGREEING TO THIS LICENSE ON BEHALF OF A COMPANY, YOU -REPRESENT THAT YOU ARE AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. -WHETHER YOU ARE ACTING ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, -YOU MUST BE OF MAJORITY AGE AND BE OTHERWISE COMPETENT TO ENTER INTO -CONTRACTS. IF YOU DO NOT MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY -OF THE TERMS AND CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON -TO EXIT. - -*ACCEPT / REJECT -* - -* -* - -*To agree to the R&D/academic terms of this license, please register - on the site -- -you will then be given a chance to agree to the clickwrap RCSL - -R&D License - -and gain access to the RCSL-licensed source code. To build or deploy -commercial applications based on the RCSL, you will need to agree to the -Commercial Use license attachments -* - - - diff --git a/bsp/stm32_radio/mp3/real/projects/armwince/RPSL.txt b/bsp/stm32_radio/mp3/real/projects/armwince/RPSL.txt deleted file mode 100644 index d040a45205..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/armwince/RPSL.txt +++ /dev/null @@ -1,518 +0,0 @@ -RealNetworks Public Source License Version 1.0 -(Rev. Date October 28, 2002) - -1. General Definitions. This License applies to any program or other work which -RealNetworks, Inc., or any other entity that elects to use this license, -("Licensor") makes publicly available and which contains a notice placed by -Licensor identifying such program or work as "Original Code" and stating that it -is subject to the terms of this RealNetworks Public Source License version 1.0 -(or subsequent version thereof) ("License"). You are not required to accept this -License. However, nothing else grants You permission to use, copy, modify or -distribute the software or its derivative works. These actions are prohibited by -law if You do not accept this License. Therefore, by modifying, copying or -distributing the software (or any work based on the software), You indicate your -acceptance of this License to do so, and all its terms and conditions. In -addition, you agree to the terms of this License by clicking the Accept button -or downloading the software. As used in this License: - -1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the -grantor of rights, claims of patents that (i) are now or hereafter acquired, -owned by or assigned to Licensor and (ii) are necessarily infringed by using or -making the Original Code alone and not in combination with other software or -hardware; and (b) in the case where You are the grantor of rights, claims of -patents that (i) are now or hereafter acquired, owned by or assigned to You and -(ii) are infringed (directly or indirectly) by using or making Your -Modifications, taken alone or in combination with Original Code. - -1.2 "Compatible Source License" means any one of the licenses listed on Exhibit -B or at https://www.helixcommunity.org/content/complicense or other licenses -specifically identified by Licensor in writing. Notwithstanding any term to the -contrary in any Compatible Source License, any code covered by any Compatible -Source License that is used with Covered Code must be made readily available in -Source Code format for royalty-free use under the terms of the Compatible Source -License or this License. - -1.3 "Contributor" means any person or entity that creates or contributes to the -creation of Modifications. - -1.4 "Covered Code" means the Original Code, Modifications, the combination of -Original Code and any Modifications, and/or any respective portions thereof. - -1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for -Your internal research and development (R&D) and/or Personal Use, and includes -without limitation, any and all internal use or distribution of Covered Code -within Your business or organization except for R&D use and/or Personal Use, as -well as direct or indirect sublicensing or distribution of Covered Code by You -to any third party in any form or manner. - -1.6 "Derivative Work" means either the Covered Code or any derivative work under -United States copyright law, and including any work containing or including any -portion of the Covered Code or Modifications, either verbatim or with -modifications and/or translated into another language. Derivative Work also -includes any work which combines any portion of Covered Code or Modifications -with code not otherwise governed by the terms of this License. - -1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be -accessed or used by anyone other than You, used to provide any services to -anyone other than You, or used in any way to deliver any content to anyone other -than You, whether the Covered Code is distributed to those parties, made -available as an application intended for use over a computer network, or used to -provide services or otherwise deliver content to anyone other than You. - -1.8. "Interface" means interfaces, functions, properties, class definitions, -APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of -software, firmware or hardware to communicate or interoperate with another piece -of software, firmware or hardware. - -1.9 "Modifications" mean any addition to, deletion from, and/or change to, the -substance and/or structure of the Original Code, any previous Modifications, the -combination of Original Code and any previous Modifications, and/or any -respective portions thereof. When code is released as a series of files, a -Modification is: (a) any addition to or deletion from the contents of a file -containing Covered Code; and/or (b) any new file or other representation of -computer program statements that contains any part of Covered Code. - -1.10 "Original Code" means (a) the Source Code of a program or other work as -originally made available by Licensor under this License, including the Source -Code of any updates or upgrades to such programs or works made available by -Licensor under this License, and that has been expressly identified by Licensor -as such in the header file(s) of such work; and (b) the object code compiled -from such Source Code and originally made available by Licensor under this -License. - -1.11 "Personal Use" means use of Covered Code by an individual solely for his or -her personal, private and non-commercial purposes. An individual's use of -Covered Code in his or her capacity as an officer, employee, member, independent -contractor or agent of a corporation, business or organization (commercial or -non-commercial) does not qualify as Personal Use. - -1.12 "Source Code" means the human readable form of a program or other work that -is suitable for making modifications to it, including all modules it contains, -plus any associated interface definition files, scripts used to control -compilation and installation of an executable (object code). - -1.13 "You" or "Your" means an individual or a legal entity exercising rights -under this License. For legal entities, "You" or "Your" includes any entity -which controls, is controlled by, or is under common control with, You, where -"control" means (a) the power, direct or indirect, to cause the direction or -management of such entity, whether by contract or otherwise, or (b) ownership of -fifty percent (50%) or more of the outstanding shares or beneficial ownership of -such entity. - -2. Permitted Uses; Conditions & Restrictions. Subject to the terms and -conditions of this License, Licensor hereby grants You, effective on the date -You accept this License (via downloading or using Covered Code or otherwise -indicating your acceptance of this License), a worldwide, royalty-free, -non-exclusive copyright license, to the extent of Licensor's copyrights cover -the Original Code, to do the following: - -2.1 You may reproduce, display, perform, modify and Deploy Covered Code, -provided that in each instance: - -(a) You must retain and reproduce in all copies of Original Code the copyright -and other proprietary notices and disclaimers of Licensor as they appear in the -Original Code, and keep intact all notices in the Original Code that refer to -this License; - -(b) You must include a copy of this License with every copy of Source Code of -Covered Code and documentation You distribute, and You may not offer or impose -any terms on such Source Code that alter or restrict this License or the -recipients' rights hereunder, except as permitted under Section 6; - -(c) You must duplicate, to the extent it does not already exist, the notice in -Exhibit A in each file of the Source Code of all Your Modifications, and cause -the modified files to carry prominent notices stating that You changed the files -and the date of any change; - -(d) You must make Source Code of all Your Externally Deployed Modifications -publicly available under the terms of this License, including the license grants -set forth in Section 3 below, for as long as you Deploy the Covered Code or -twelve (12) months from the date of initial Deployment, whichever is longer. You -should preferably distribute the Source Code of Your Deployed Modifications -electronically (e.g. download from a web site); and - -(e) if You Deploy Covered Code in object code, executable form only, You must -include a prominent notice, in the code itself as well as in related -documentation, stating that Source Code of the Covered Code is available under -the terms of this License with information on how and where to obtain such -Source Code. You must also include the Object Code Notice set forth in Exhibit A -in the "about" box or other appropriate place where other copyright notices are -placed, including any packaging materials. - -2.2 You expressly acknowledge and agree that although Licensor and each -Contributor grants the licenses to their respective portions of the Covered Code -set forth herein, no assurances are provided by Licensor or any Contributor that -the Covered Code does not infringe the patent or other intellectual property -rights of any other entity. Licensor and each Contributor disclaim any liability -to You for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, You hereby assume sole responsibility to -secure any other intellectual property rights needed, if any. For example, if a -third party patent license is required to allow You to make, use, sell, import -or offer for sale the Covered Code, it is Your responsibility to acquire such -license(s). - -2.3 Subject to the terms and conditions of this License, Licensor hereby grants -You, effective on the date You accept this License (via downloading or using -Covered Code or otherwise indicating your acceptance of this License), a -worldwide, royalty-free, perpetual, non-exclusive patent license under -Licensor's Applicable Patent Rights to make, use, sell, offer for sale and -import the Covered Code, provided that in each instance you comply with the -terms of this License. - -3. Your Grants. In consideration of, and as a condition to, the licenses granted -to You under this License: - -(a) You grant to Licensor and all third parties a non-exclusive, perpetual, -irrevocable, royalty free license under Your Applicable Patent Rights and other -intellectual property rights owned or controlled by You, to make, sell, offer -for sale, use, import, reproduce, display, perform, modify, distribute and -Deploy Your Modifications of the same scope and extent as Licensor's licenses -under Sections 2.1 and 2.2; and - -(b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide, -royalty-free, perpetual and irrevocable license, under Your Applicable Patent -Rights and other intellectual property rights owned or controlled by You, to -make, use, sell, offer for sale, import, reproduce, display, perform, -distribute, modify or have modified (for Licensor and/or its subsidiaries), -sublicense and distribute Your Modifications, in any form and for any purpose, -through multiple tiers of distribution. - -(c) You agree not use any information derived from Your use and review of the -Covered Code, including but not limited to any algorithms or inventions that may -be contained in the Covered Code, for the purpose of asserting any of Your -patent rights, or assisting a third party to assert any of its patent rights, -against Licensor or any Contributor. - -4. Derivative Works. You may create a Derivative Work by combining Covered Code -with other code not otherwise governed by the terms of this License and -distribute the Derivative Work as an integrated product. In each such instance, -You must make sure the requirements of this License are fulfilled for the -Covered Code or any portion thereof, including all Modifications. - -4.1 You must cause any Derivative Work that you distribute, publish or -Externally Deploy, that in whole or in part contains or is derived from the -Covered Code or any part thereof, to be licensed as a whole at no charge to all -third parties under the terms of this License and no other license except as -provided in Section 4.2. You also must make Source Code available for the -Derivative Work under the same terms as Modifications, described in Sections 2 -and 3, above. - -4.2 Compatible Source Licenses. Software modules that have been independently -developed without any use of Covered Code and which contain no portion of the -Covered Code, Modifications or other Derivative Works, but are used or combined -in any way wtih the Covered Code or any Derivative Work to form a larger -Derivative Work, are exempt from the conditions described in Section 4.1 but -only to the extent that: the software module, including any software that is -linked to, integrated with, or part of the same applications as, the software -module by any method must be wholly subject to one of the Compatible Source -Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the -terms of this License. Thus, the entire Derivative Work must be licensed under a -combination of the RPSL (for Covered Code) and a Compatible Source License for -any independently developed software modules within the Derivative Work. The -foregoing requirement applies even if the Compatible Source License would -ordinarily allow the software module to link with, or form larger works with, -other software that is not subject to the Compatible Source License. For -example, although the Mozilla Public License v1.1 allows Mozilla code to be -combined with proprietary software that is not subject to the MPL, if -MPL-licensed code is used with Covered Code the MPL-licensed code could not be -combined or linked with any code not governed by the MPL. The general intent of -this section 4.2 is to enable use of Covered Code with applications that are -wholly subject to an acceptable open source license. You are responsible for -determining whether your use of software with Covered Code is allowed under Your -license to such software. - -4.3 Mere aggregation of another work not based on the Covered Code with the -Covered Code (or with a work based on the Covered Code) on a volume of a storage -or distribution medium does not bring the other work under the scope of this -License. If You deliver the Covered Code for combination and/or integration with -an application previously provided by You (for example, via automatic updating -technology), such combination and/or integration constitutes a Derivative Work -subject to the terms of this License. - -5. Exclusions From License Grant. Nothing in this License shall be deemed to -grant any rights to trademarks, copyrights, patents, trade secrets or any other -intellectual property of Licensor or any Contributor except as expressly stated -herein. No right is granted to the trademarks of Licensor or any Contributor -even if such marks are included in the Covered Code. Nothing in this License -shall be interpreted to prohibit Licensor from licensing under different terms -from this License any code that Licensor otherwise would have a right to -license. Modifications, Derivative Works and/or any use or combination of -Covered Code with other technology provided by Licensor or third parties may -require additional patent licenses from Licensor which Licensor may grant in its -sole discretion. No patent license is granted separate from the Original Code or -combinations of the Original Code with other software or hardware. - -5.1. Trademarks. This License does not grant any rights to use the trademarks or -trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any -trademark or trade name belonging to any Contributor. No Licensor Marks may be -used to endorse or promote products derived from the Original Code other than as -permitted by the Licensor Trademark Policy defined in Exhibit C. - -6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, -support, indemnity or liability obligations and/or other rights consistent with -the scope of the license granted herein ("Additional Terms") to one or more -recipients of Covered Code. However, You may do so only on Your own behalf and -as Your sole responsibility, and not on behalf of Licensor or any Contributor. -You must obtain the recipient's agreement that any such Additional Terms are -offered by You alone, and You hereby agree to indemnify, defend and hold -Licensor and every Contributor harmless for any liability incurred by or claims -asserted against Licensor or such Contributor by reason of any such Additional -Terms. - -7. Versions of the License. Licensor may publish revised and/or new versions of -this License from time to time. Each version will be given a distinguishing -version number. Once Original Code has been published under a particular version -of this License, You may continue to use it under the terms of that version. You -may also choose to use such Original Code under the terms of any subsequent -version of this License published by Licensor. No one other than Licensor has -the right to modify the terms applicable to Covered Code created under this -License. - -8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part -pre-release, untested, or not fully tested works. The Covered Code may contain -errors that could cause failures or loss of data, and may be incomplete or -contain inaccuracies. You expressly acknowledge and agree that use of the -Covered Code, or any portion thereof, is at Your sole and entire risk. THE -COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF -ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS -"LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY -DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF -SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET -ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH -CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE -COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR -REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR -ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR -WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR -AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You -acknowledge that the Covered Code is not intended for use in high risk -activities, including, but not limited to, the design, construction, operation -or maintenance of nuclear facilities, aircraft navigation, aircraft -communication systems, or air traffic control machines in which case the failure -of the Covered Code could lead to death, personal injury, or severe physical or -environmental damage. Licensor disclaims any express or implied warranty of -fitness for such uses. - -9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT -SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR -YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER -UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT -LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH -CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND -NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME -JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR -CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event -shall Licensor's total liability to You for all damages (other than as may be -required by applicable law) under this License exceed the amount of ten dollars -($10.00). - -10. Ownership. Subject to the licenses granted under this License, each -Contributor retains all rights, title and interest in and to any Modifications -made by such Contributor. Licensor retains all rights, title and interest in and -to the Original Code and any Modifications made by or on behalf of Licensor -("Licensor Modifications"), and such Licensor Modifications will not be -automatically subject to this License. Licensor may, at its sole discretion, -choose to license such Licensor Modifications under this License, or on -different terms from those contained in this License or may choose not to -license them at all. - -11. Termination. - -11.1 Term and Termination. The term of this License is perpetual unless -terminated as provided below. This License and the rights granted hereunder will -terminate: - -(a) automatically without notice from Licensor if You fail to comply with any -term(s) of this License and fail to cure such breach within 30 days of becoming -aware of such breach; - -(b) immediately in the event of the circumstances described in Section 12.5(b); -or - -(c) automatically without notice from Licensor if You, at any time during the -term of this License, commence an action for patent infringement against -Licensor (including by cross-claim or counter claim in a lawsuit); - -(d) upon written notice from Licensor if You, at any time during the term of -this License, commence an action for patent infringement against any third party -alleging that the Covered Code itself (excluding combinations with other -software or hardware) infringes any patent (including by cross-claim or counter -claim in a lawsuit). - -11.2 Effect of Termination. Upon termination, You agree to immediately stop any -further use, reproduction, modification, sublicensing and distribution of the -Covered Code and to destroy all copies of the Covered Code that are in your -possession or control. All sublicenses to the Covered Code which have been -properly granted prior to termination shall survive any termination of this -License. Provisions which, by their nature, should remain in effect beyond the -termination of this License shall survive, including but not limited to Sections -3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for -compensation, indemnity or damages of any sort solely as a result of terminating -this License in accordance with its terms, and termination of this License will -be without prejudice to any other right or remedy of any party. - -12. Miscellaneous. - -12.1 Government End Users. The Covered Code is a "commercial item" as defined in -FAR 2.101. Government software and technical data rights in the Covered Code -include only those rights customarily provided to the public as defined in this -License. This customary commercial license in technical data and software is -provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer -Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical -Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software -or Computer Software Documentation). Accordingly, all U.S. Government End Users -acquire Covered Code with only those rights set forth herein. - -12.2 Relationship of Parties. This License will not be construed as creating an -agency, partnership, joint venture or any other form of legal association -between or among You, Licensor or any Contributor, and You will not represent to -the contrary, whether expressly, by implication, appearance or otherwise. - -12.3 Independent Development. Nothing in this License will impair Licensor's -right to acquire, license, develop, have others develop for it, market and/or -distribute technology or products that perform the same or similar functions as, -or otherwise compete with, Modifications, Derivative Works, technology or -products that You may develop, produce, market or distribute. - -12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any -provision of this License will not be deemed a waiver of future enforcement of -that or any other provision. Any law or regulation which provides that the -language of a contract shall be construed against the drafter will not apply to -this License. - -12.5 Severability. (a) If for any reason a court of competent jurisdiction finds -any provision of this License, or portion thereof, to be unenforceable, that -provision of the License will be enforced to the maximum extent permissible so -as to effect the economic benefits and intent of the parties, and the remainder -of this License will continue in full force and effect. (b) Notwithstanding the -foregoing, if applicable law prohibits or restricts You from fully and/or -specifically complying with Sections 2 and/or 3 or prevents the enforceability -of either of those Sections, this License will immediately terminate and You -must immediately discontinue any use of the Covered Code and destroy all copies -of it that are in your possession or control. - -12.6 Dispute Resolution. Any litigation or other dispute resolution between You -and Licensor relating to this License shall take place in the Seattle, -Washington, and You and Licensor hereby consent to the personal jurisdiction of, -and venue in, the state and federal courts within that District with respect to -this License. The application of the United Nations Convention on Contracts for -the International Sale of Goods is expressly excluded. - -12.7 Export/Import Laws. This software is subject to all export and import laws -and restrictions and regulations of the country in which you receive the Covered -Code and You are solely responsible for ensuring that You do not export, -re-export or import the Covered Code or any direct product thereof in violation -of any such restrictions, laws or regulations, or without all necessary -authorizations. - -12.8 Entire Agreement; Governing Law. This License constitutes the entire -agreement between the parties with respect to the subject matter hereof. This -License shall be governed by the laws of the United States and the State of -Washington. - -Where You are located in the province of Quebec, Canada, the following clause -applies: The parties hereby confirm that they have requested that this License -and all related documents be drafted in English. Les parties ont exigé -que le présent contrat et tous les documents connexes soient -rédigés en anglais. - - EXHIBIT A. - -"Copyright © 1995-2002 -RealNetworks, Inc. and/or its licensors. All Rights Reserved. - -The contents of this file, and the files included with this file, are subject to -the current version of the RealNetworks Public Source License Version 1.0 (the -"RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have -licensed the file under the RealNetworks Community Source License Version 1.0 -(the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which -case the RCSL will apply. You may also obtain the license terms directly from -RealNetworks. You may not use this file except in compliance with the RPSL or, -if you have a valid RCSL with RealNetworks applicable to this file, the RCSL. -Please see the applicable RPSL or RCSL for the rights, obligations and -limitations governing use of the contents of the file. - -This file is part of the Helix DNA Technology. RealNetworks is the developer of -the Original code and owns the copyrights in the portions it created. - -This file, and the files included with this file, is distributed and made -available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR -IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING -WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): ____________________________________ - -Technology Compatibility Kit Test -Suite(s) Location (if licensed under the RCSL): ______________________________ - -Object Code Notice: Helix DNA Client technology included. Copyright (c) -RealNetworks, Inc., 1995-2002. All rights reserved. - - - EXHIBIT B - -Compatible Source Licenses for the RealNetworks Public Source License. The -following list applies to the most recent version of the license as of October -25, 2002, unless otherwise indicated. - -* Academic Free License -* Apache Software License -* Apple Public Source License -* Artistic license -* Attribution Assurance Licenses -* BSD license -* Common Public License (1) -* Eiffel Forum License -* GNU General Public License (GPL) (1) -* GNU Library or "Lesser" General Public License (LGPL) (1) -* IBM Public License -* Intel Open Source License -* Jabber Open Source License -* MIT license -* MITRE Collaborative Virtual Workspace License (CVW License) -* Motosoto License -* Mozilla Public License 1.0 (MPL) -* Mozilla Public License 1.1 (MPL) -* Nokia Open Source License -* Open Group Test Suite License -* Python Software Foundation License -* Ricoh Source Code Public License -* Sun Industry Standards Source License (SISSL) -* Sun Public License -* University of Illinois/NCSA Open Source License -* Vovida Software License v. 1.0 -* W3C License -* X.Net License -* Zope Public License -* zlib/libpng license - -(1) Note: because this license contains certain reciprocal licensing terms that -purport to extend to independently developed code, You may be prohibited under -the terms of this otherwise compatible license from using code licensed under -its terms with Covered Code because Covered Code may only be licensed under the -RealNetworks Public Source License. Any attempt to apply non RPSL license terms, -including without limitation the GPL, to Covered Code is expressly forbidden. -You are responsible for ensuring that Your use of Compatible Source Licensed -code does not violate either the RPSL or the Compatible Source License. - -The latest version of this list can be found at: -https://www.helixcommunity.org/content/complicense - - EXHIBIT C - -RealNetworks' Trademark policy. - -RealNetworks defines the following trademarks collectively as "Licensor -Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem", -"RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other -trademarks or trade names belonging to RealNetworks. - -RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks -except as permitted by and in strict compliance at all times with RealNetworks' -third party trademark usage guidelines which are posted at -http://www.realnetworks.com/info/helixlogo.html. - diff --git a/bsp/stm32_radio/mp3/real/projects/armwince/mp3dec.vcp b/bsp/stm32_radio/mp3/real/projects/armwince/mp3dec.vcp deleted file mode 100644 index 7f8ab60dc6..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/armwince/mp3dec.vcp +++ /dev/null @@ -1,335 +0,0 @@ -# Microsoft eMbedded Visual Tools Project File - Name="mp3dec" - Package Owner=<4> -# Microsoft eMbedded Visual Tools Generated Build File, Format Version 6.02 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (WCE ARM) Static Library" 0x8504 - -CFG=mp3dec - Win32 (WCE ARM) Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "mp3dec.vcn". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "mp3dec.vcn" CFG="mp3dec - Win32 (WCE ARM) Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mp3dec - Win32 (WCE ARM) Release" (based on "Win32 (WCE ARM) Static Library") -!MESSAGE "mp3dec - Win32 (WCE ARM) Debug" (based on "Win32 (WCE ARM) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -# PROP ATL_Project 2 -CPP=xicle3 - -!IF "$(CFG)" == "mp3dec - Win32 (WCE ARM) Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "ARMRel" -# PROP BASE Intermediate_Dir "ARMRel" -# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" -# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "ARMRel" -# PROP Intermediate_Dir "ARMRel_obj" -# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" -# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "NDEBUG" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "_LIB" /YX /Oxs /M$(CECrtMT) /c -# ADD CPP /nologo /W3 /Zi /O2 /I "..\..\..\..\..\..\..\common\runtime\pub" /I "..\..\..\..\..\..\..\common\include" /I "..\..\..\pub" /D "NDEBUG" /D "_WINDOWS" /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "_LIB" /Oxs /M$(CECrtMT) /c -# SUBTRACT CPP /YX -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo - -!ELSEIF "$(CFG)" == "mp3dec - Win32 (WCE ARM) Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "ARMDbg" -# PROP BASE Intermediate_Dir "ARMDbg" -# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" -# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "ARMDbg" -# PROP Intermediate_Dir "ARMDbg" -# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" -# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "_LIB" /YX /M$(CECrtMTDebug) /c -# ADD CPP /nologo /W3 /Zi /Od /I "..\..\..\pub" /I "..\..\..\..\..\..\..\common\runtime\pub" /I "..\..\..\..\..\..\..\common\include" /D "DEBUG" /D "_WINDOWS" /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "_LIB" /M$(CECrtMTDebug) /c -# SUBTRACT CPP /YX -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo - -!ENDIF - -# Begin Target - -# Name "mp3dec - Win32 (WCE ARM) Release" -# Name "mp3dec - Win32 (WCE ARM) Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Group "general" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\mp3dec.c -DEP_CPP_MP3DE=\ - "..\..\..\..\..\..\..\common\include\hxbastsd.h"\ - "..\..\..\..\..\..\..\common\include\hxtypes.h"\ - "..\..\..\..\..\..\..\common\include\platform\symbian\symbiantypes.h"\ - "..\..\..\..\..\..\..\common\runtime\pub\hlxclib\stdlib.h"\ - "..\..\..\..\..\..\..\common\runtime\pub\hlxclib\string.h"\ - "..\..\..\..\..\..\..\common\runtime\pub\platform\openwave\hx_op_stdc.h"\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - -NODEP_CPP_MP3DE=\ - "..\..\..\..\..\..\..\common\include\types\vxTypesOld.h"\ - "..\..\..\..\..\..\..\common\include\vxWorks.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\..\mp3tabs.c -DEP_CPP_MP3TA=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - -# End Source File -# End Group -# Begin Group "csource" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\bitstream.c -DEP_CPP_BITST=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\assembly.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\buffers.c -DEP_CPP_BUFFE=\ - "..\..\..\..\..\..\..\common\include\hxbastsd.h"\ - "..\..\..\..\..\..\..\common\include\hxtypes.h"\ - "..\..\..\..\..\..\..\common\include\platform\symbian\symbiantypes.h"\ - "..\..\..\..\..\..\..\common\runtime\pub\hlxclib\stdlib.h"\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\coder.h"\ - -NODEP_CPP_BUFFE=\ - "..\..\..\..\..\..\..\common\include\types\vxTypesOld.h"\ - "..\..\..\..\..\..\..\common\include\vxWorks.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\dct32.c -DEP_CPP_DCT32=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\assembly.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\dequant.c -DEP_CPP_DEQUA=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\assembly.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\dqchan.c -DEP_CPP_DQCHA=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\assembly.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\huffman.c -DEP_CPP_HUFFM=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\hufftabs.c -DEP_CPP_HUFFT=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\imdct.c -DEP_CPP_IMDCT=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\assembly.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\scalfact.c -DEP_CPP_SCALF=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\stproc.c -DEP_CPP_STPRO=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\assembly.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\subband.c -DEP_CPP_SUBBA=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\assembly.h"\ - "..\..\coder.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\trigtabs.c -DEP_CPP_TRIGT=\ - "..\..\..\pub\mp3common.h"\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\statname.h"\ - "..\..\coder.h"\ - -# End Source File -# End Group -# Begin Group "assembly" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\arm\asmmisc.s - -!IF "$(CFG)" == "mp3dec - Win32 (WCE ARM) Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Performing Custom Build Step on $(InputPath) -IntDir=.\ARMRel_obj -InputPath=..\..\arm\asmmisc.s -InputName=asmmisc - -"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - "$(EVCROOT)\wce300\bin\armasm" $(InputPath) $(IntDir)\$(InputName).obj - -# End Custom Build - -!ELSEIF "$(CFG)" == "mp3dec - Win32 (WCE ARM) Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Performing Custom Build Step on $(InputPath) -IntDir=.\ARMDbg -InputPath=..\..\arm\asmmisc.s -InputName=asmmisc - -"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - "$(EVCROOT)\wce300\bin\armasm" $(InputPath) $(IntDir)\$(InputName).obj - -# End Custom Build - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\..\arm\asmpoly.s - -!IF "$(CFG)" == "mp3dec - Win32 (WCE ARM) Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build -IntDir=.\ARMRel_obj -InputPath=..\..\arm\asmpoly.s -InputName=asmpoly - -"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - "$(EVCROOT)\wce300\bin\armasm" $(InputPath) $(IntDir)\$(InputName).obj - -# End Custom Build - -!ELSEIF "$(CFG)" == "mp3dec - Win32 (WCE ARM) Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build -IntDir=.\ARMDbg -InputPath=..\..\arm\asmpoly.s -InputName=asmpoly - -"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - "$(EVCROOT)\wce300\bin\armasm" $(InputPath) $(IntDir)\$(InputName).obj - -# End Custom Build - -!ENDIF - -# End Source File -# End Group -# End Group -# End Target -# End Project diff --git a/bsp/stm32_radio/mp3/real/projects/armwince/mp3dec.vcw b/bsp/stm32_radio/mp3/real/projects/armwince/mp3dec.vcw deleted file mode 100644 index bec791e769..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/armwince/mp3dec.vcw +++ /dev/null @@ -1,44 +0,0 @@ -Microsoft eMbedded Visual Tools Workspace File, Format Version 3.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "mp3dec"=.\mp3dec.vcp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "testwrap"=.\testwrap.vcp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name mp3dec - End Project Dependency -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/bsp/stm32_radio/mp3/real/projects/armwince/testwrap.vcp b/bsp/stm32_radio/mp3/real/projects/armwince/testwrap.vcp deleted file mode 100644 index 8f1a8d5e47..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/armwince/testwrap.vcp +++ /dev/null @@ -1,146 +0,0 @@ -# Microsoft eMbedded Visual Tools Project File - Name="testwrap" - Package Owner=<4> -# Microsoft eMbedded Visual Tools Generated Build File, Format Version 6.02 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (WCE ARM) Application" 0x8501 - -CFG=testwrap - Win32 (WCE ARM) Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "testwrap.vcn". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "testwrap.vcn" CFG="testwrap - Win32 (WCE ARM) Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "testwrap - Win32 (WCE ARM) Release" (based on "Win32 (WCE ARM) Application") -!MESSAGE "testwrap - Win32 (WCE ARM) Debug" (based on "Win32 (WCE ARM) Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -# PROP ATL_Project 2 -CPP=xicle3 -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "testwrap - Win32 (WCE ARM) Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "ARMRel" -# PROP BASE Intermediate_Dir "ARMRel" -# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" -# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "ARMRel" -# PROP Intermediate_Dir "ARMRel" -# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" -# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r -# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "NDEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r -# ADD BASE CPP /nologo /W3 /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /YX /Oxs /M$(CECrtMT) /c -# ADD CPP /nologo /W3 /Zi /O2 /I "..\..\..\pub" /I "..\..\..\testwrap" /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /YX /Oxs /M$(CECrtMT) /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=xilinke3 -# ADD BASE LINK32 commctrl.lib coredll.lib aygshell.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM -# ADD LINK32 commctrl.lib coredll.lib aygshell.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM - -!ELSEIF "$(CFG)" == "testwrap - Win32 (WCE ARM) Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "ARMDbg" -# PROP BASE Intermediate_Dir "ARMDbg" -# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" -# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "ARMDbg" -# PROP Intermediate_Dir "ARMDbg" -# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}" -# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}" -# PROP Target_Dir "" -# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r -# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "DEBUG" /d "$(CePlatform)" /d "ARM" /d "_ARM_" /r -# ADD BASE CPP /nologo /W3 /Zi /Od /D "DEBUG" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /YX /M$(CECrtMTDebug) /c -# ADD CPP /nologo /W3 /Zi /Od /I "..\..\..\pub" /I "..\..\..\testwrap" /D "DEBUG" /D "ARM" /D "_ARM_" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /YX /M$(CECrtMTDebug) /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=xilinke3 -# ADD BASE LINK32 commctrl.lib coredll.lib aygshell.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM -# ADD LINK32 commctrl.lib coredll.lib aygshell.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /entry:"WinMainCRTStartup" /debug /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM - -!ENDIF - -# Begin Target - -# Name "testwrap - Win32 (WCE ARM) Release" -# Name "testwrap - Win32 (WCE ARM) Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\..\testwrap\debug.c -DEP_CPP_DEBUG=\ - "..\..\..\testwrap\debug.h"\ - -NODEP_CPP_DEBUG=\ - "..\..\..\testwrap\fortify.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\..\mpadecobj.cpp -DEP_CPP_MPADE=\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\mpadecobjfixpt.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\..\testwrap\timing.c -DEP_CPP_TIMIN=\ - "..\..\..\testwrap\timing.h"\ - -# End Source File -# Begin Source File - -SOURCE=..\..\..\testwrap\winmain.cpp -DEP_CPP_WINMA=\ - "..\..\..\pub\mp3dec.h"\ - "..\..\..\pub\mpadecobjfixpt.h"\ - "..\..\..\testwrap\debug.h"\ - "..\..\..\testwrap\timing.h"\ - -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/bsp/stm32_radio/mp3/real/projects/visualc/LICENSE.txt b/bsp/stm32_radio/mp3/real/projects/visualc/LICENSE.txt deleted file mode 100644 index 12e5372a9f..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/visualc/LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ - Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. - - The contents of this directory, and (except where otherwise - indicated) the directories included within this directory, are - subject to the current version of the RealNetworks Public Source - License (the "RPSL") available at RPSL.txt in this directory, unless - you have licensed the directory under the current version of the - RealNetworks Community Source License (the "RCSL") available at - RCSL.txt in this directory, in which case the RCSL will apply. You - may also obtain the license terms directly from RealNetworks. You - may not use the files in this directory except in compliance with the - RPSL or, if you have a valid RCSL with RealNetworks applicable to - this directory, the RCSL. Please see the applicable RPSL or RCSL for - the rights, obligations and limitations governing use of the contents - of the directory. - - This directory is part of the Helix DNA Technology. RealNetworks is - the developer of the Original Code and owns the copyrights in the - portions it created. - - This directory, and the directories included with this directory, are - distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY - OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY - DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - QUIET ENJOYMENT OR NON-INFRINGEMENT. - - Technology Compatibility Kit Test Suite(s) Location: - http://www.helixcommunity.org/content/tck - diff --git a/bsp/stm32_radio/mp3/real/projects/visualc/RCSL.txt b/bsp/stm32_radio/mp3/real/projects/visualc/RCSL.txt deleted file mode 100644 index a809759a32..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/visualc/RCSL.txt +++ /dev/null @@ -1,948 +0,0 @@ -The RCSL is made up of a base agreement and a few Attachments. - -For Research and Development use, you agree to the terms of the -RCSL R&D License (base RCSL and Attachments A, B, and C) - -For Commercial Use (either distribution or internal commercial -deployment) of the Helix DNA with or without support for RealNetworks' -RealAudio and RealVideo Add-on Technology, you agree to the -terms of the same RCSL R&D license -and execute one or more additional Commercial Use License attachments -. - ------------------------------------------------------------------------- - - - REALNETWORKS COMMUNITY SOURCE LICENSE - -Version 1.2 (Rev. Date: January 22, 2003). - - - RECITALS - -Original Contributor has developed Specifications, Source Code -implementations and Executables of certain Technology; and - -Original Contributor desires to license the Technology to a large -community to facilitate research, innovation and product development -while maintaining compatibility of such products with the Technology as -delivered by Original Contributor; and - -Original Contributor desires to license certain Trademarks for the -purpose of branding products that are compatible with the relevant -Technology delivered by Original Contributor; and - -You desire to license the Technology and possibly certain Trademarks -from Original Contributor on the terms and conditions specified in this -License. - -In consideration for the mutual covenants contained herein, You and -Original Contributor agree as follows: - - - AGREEMENT - -*1. Introduction.* - -The RealNetworks Community Source License ("RCSL") and effective -attachments ("License") may include five distinct licenses: - -i) Research Use license -- License plus Attachments A, B and C only. - -ii) Commercial Use and Trademark License, which may be for Internal -Deployment Use or external distribution, or both -- License plus -Attachments A, B, C, and D. - -iii) Technology Compatibility Kit (TCK) license -- Attachment C. - -iv) Add-On Technology License (Executable) Commercial Use License --Attachment F. - -v) Add-On Technology Source Code Porting and Optimization -License-Attachment G. - -The Research Use license is effective when You click and accept this -License. The TCK is effective when You click and accept this License, -unless otherwise specified in the TCK attachments. The Commercial Use -and Trademark, Add-On Technology License, and the Add-On Technology -Source Code Porting and Optimization licenses must each be signed by You -and Original Contributor to become effective. Once effective, these -licenses and the associated requirements and responsibilities are -cumulative. Capitalized terms used in this License are defined in the -Glossary. - -*2. License Grants.* - -2.1 Original Contributor Grant. - -Subject to Your compliance with Sections 3, 8.10 and Attachment A of -this License, Original Contributor grants to You a worldwide, -royalty-free, non-exclusive license, to the extent of Original -Contributor's Intellectual Property Rights covering the Original Code, -Upgraded Code and Specifications, to do the following: - -(a) Research Use License: - -(i) use, reproduce and modify the Original Code, Upgraded Code and -Specifications to create Modifications and Reformatted Specifications -for Research Use by You; - -(ii) publish and display Original Code, Upgraded Code and Specifications -with, or as part of Modifications, as permitted under Section 3.1(b) below; - -(iii) reproduce and distribute copies of Original Code and Upgraded Code -to Licensees and students for Research Use by You; - -(iv) compile, reproduce and distribute Original Code and Upgraded Code -in Executable form, and Reformatted Specifications to anyone for -Research Use by You. - -(b) Other than the licenses expressly granted in this License, Original -Contributor retains all right, title, and interest in Original Code and -Upgraded Code and Specifications. - -2.2 Your Grants. - -(a) To Other Licensees. You hereby grant to each Licensee a license to -Your Error Corrections and Shared Modifications, of the same scope and -extent as Original Contributor's licenses under Section 2.1 a) above -relative to Research Use and Attachment D relative to Commercial Use. - -(b) To Original Contributor. You hereby grant to Original Contributor a -worldwide, royalty-free, non-exclusive, perpetual and irrevocable -license, to the extent of Your Intellectual Property Rights covering -Your Error Corrections, Shared Modifications and Reformatted -Specifications, to use, reproduce, modify, display and distribute Your -Error Corrections, Shared Modifications and Reformatted Specifications, -in any form, including the right to sublicense such rights through -multiple tiers of distribution. - -(c) Other than the licenses expressly granted in Sections 2.2(a) and (b) -above, and the restrictions set forth in Section 3.1(d)(iv) below, You -retain all right, title, and interest in Your Error Corrections, Shared -Modifications and Reformatted Specifications. - -2.3 Contributor Modifications. - -You may use, reproduce, modify, display and distribute Contributor Error -Corrections, Shared Modifications and Reformatted Specifications, -obtained by You under this License, to the same scope and extent as with -Original Code, Upgraded Code and Specifications. - -2.4 Subcontracting. - -You may deliver the Source Code of Covered Code to other Licensees -having at least a Research Use license, for the sole purpose of -furnishing development services to You in connection with Your rights -granted in this License. All such Licensees must execute appropriate -documents with respect to such work consistent with the terms of this -License, and acknowledging their work-made-for-hire status or assigning -exclusive right to the work product and associated Intellectual Property -Rights to You. - -*3. Requirements and Responsibilities*. - -3.1 Research Use License. - -As a condition of exercising the rights granted under Section 2.1(a) -above, You agree to comply with the following: - -(a) Your Contribution to the Community. All Error Corrections and Shared -Modifications which You create or contribute to are automatically -subject to the licenses granted under Section 2.2 above. You are -encouraged to license all of Your other Modifications under Section 2.2 -as Shared Modifications, but are not required to do so. You agree to -notify Original Contributor of any errors in the Specification. - -(b) Source Code Availability. You agree to provide all Your Error -Corrections to Original Contributor as soon as reasonably practicable -and, in any event, prior to Internal Deployment Use or Commercial Use, -if applicable. Original Contributor may, at its discretion, post Source -Code for Your Error Corrections and Shared Modifications on the -Community Webserver. You may also post Error Corrections and Shared -Modifications on a web-server of Your choice; provided, that You must -take reasonable precautions to ensure that only Licensees have access to -such Error Corrections and Shared Modifications. Such precautions shall -include, without limitation, a password protection scheme limited to -Licensees and a click-on, download certification of Licensee status -required of those attempting to download from the server. An example of -an acceptable certification is attached as Attachment A-2. - -(c) Notices. All Error Corrections and Shared Modifications You create -or contribute to must include a file documenting the additions and -changes You made and the date of such additions and changes. You must -also include the notice set forth in Attachment A-1 in the file header. -If it is not possible to put the notice in a particular Source Code file -due to its structure, then You must include the notice in a location -(such as a relevant directory file), where a recipient would be most -likely to look for such a notice. - -(d) Redistribution. - -(i) Source. Covered Code may be distributed in Source Code form only to -another Licensee (except for students as provided below). You may not -offer or impose any terms on any Covered Code that alter the rights, -requirements, or responsibilities of such Licensee. You may distribute -Covered Code to students for use in connection with their course work -and research projects undertaken at accredited educational institutions. -Such students need not be Licensees, but must be given a copy of the -notice set forth in Attachment A-3 and such notice must also be included -in a file header or prominent location in the Source Code made available -to such students. - -(ii) Executable. You may distribute Executable version(s) of Covered -Code to Licensees and other third parties only for the purpose of -evaluation and comment in connection with Research Use by You and under -a license of Your choice, but which limits use of such Executable -version(s) of Covered Code only to that purpose. - -(iii) Modified Class, Interface and Package Naming. In connection with -Research Use by You only, You may use Original Contributor's class, -Interface and package names only to accurately reference or invoke the -Source Code files You modify. Original Contributor grants to You a -limited license to the extent necessary for such purposes. - -(iv) You expressly agree that any distribution, in whole or in part, of -Modifications developed by You shall only be done pursuant to the terms -and conditions of this License. - -(e) Extensions. - -(i) Covered Code. You may not include any Source Code of Community Code -in any Extensions. You may include the compiled Header Files of -Community Code in an Extension provided that Your use of the Covered -Code, including Heading Files, complies with the Commercial Use License, -the TCK and all other terms of this License. - -(ii) Publication. No later than the date on which You first distribute -such Extension for Commercial Use, You must publish to the industry, on -a non-confidential basis and free of all copyright restrictions with -respect to reproduction and use, an accurate and current specification -for any Extension. In addition, You must make available an appropriate -test suite, pursuant to the same rights as the specification, -sufficiently detailed to allow any third party reasonably skilled in the -technology to produce implementations of the Extension compatible with -the specification. Such test suites must be made available as soon as -reasonably practicable but, in no event, later than ninety (90) days -after Your first Commercial Use of the Extension. You must use -reasonable efforts to promptly clarify and correct the specification and -the test suite upon written request by Original Contributor. - -(iii) Open. You agree to refrain from enforcing any Intellectual -Property Rights You may have covering any interface(s) of Your -Extension, which would prevent the implementation of such interface(s) -by Original Contributor or any Licensee. This obligation does not -prevent You from enforcing any Intellectual Property Right You have that -would otherwise be infringed by an implementation of Your Extension. - -(iv) Interface Modifications and Naming. You may not modify or add to -the GUID space * * "xxxxxxxx-0901-11d1-8B06-00A024406D59" or any other -GUID space designated by Original Contributor. You may not modify any -Interface prefix provided with the Covered Code or any other prefix -designated by Original Contributor.* * - -* * - -(f) You agree that any Specifications provided to You by Original -Contributor are confidential and proprietary information of Original -Contributor. You must maintain the confidentiality of the Specifications -and may not disclose them to any third party without Original -Contributor's prior written consent. You may only use the Specifications -under the terms of this License and only for the purpose of implementing -the terms of this License with respect to Covered Code. You agree not -use, copy or distribute any such Specifications except as provided in -writing by Original Contributor. - -3.2 Commercial Use License. - -You may not make Commercial Use of any Covered Code unless You and -Original Contributor have executed a copy of the Commercial Use and -Trademark License attached as Attachment D. - -*4. Versions of the License.* - -4.1 License Versions. - -Original Contributor may publish revised versions of the License from -time to time. Each version will be given a distinguishing version number. - -4.2 Effect. - -Once a particular version of Covered Code has been provided under a -version of the License, You may always continue to use such Covered Code -under the terms of that version of the License. You may also choose to -use such Covered Code under the terms of any subsequent version of the -License. No one other than Original Contributor has the right to -promulgate License versions. - -4.3 Multiple-Licensed Code. - -Original Contributor may designate portions of the Covered Code as -"Multiple-Licensed." "Multiple-Licensed" means that the Original -Contributor permits You to utilize those designated portions of the -Covered Code under Your choice of this License or the alternative -license(s), if any, specified by the Original Contributor in an -Attachment to this License. - -*5. Disclaimer of Warranty.* - -5.1 COVERED CODE PROVIDED AS IS. - -COVERED CODE IS PROVIDED UNDER THIS LICENSE "AS IS," WITHOUT WARRANTY OF -ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, -WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT -FOR A PARTICULAR PURPOSE OR NON-INFRINGING. YOU AGREE TO BEAR THE ENTIRE -RISK IN CONNECTION WITH YOUR USE AND DISTRIBUTION OF COVERED CODE UNDER -THIS LICENSE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART -OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER -EXCEPT SUBJECT TO THIS DISCLAIMER. - -5.2 Not Designed for High Risk Activities. - -You acknowledge that Original Code, Upgraded Code and Specifications are -not designed or intended for use in high risk activities including, but -not limited to: (i) on-line control of aircraft, air traffic, aircraft -navigation or aircraft communications; or (ii) in the design, -construction, operation or maintenance of any nuclear facility. Original -Contributor disclaims any express or implied warranty of fitness for -such uses. - -*6. Termination.* - -6.1 By You. - -You may terminate this Research Use license at anytime by providing -written notice to Original Contributor. - -6.2 By Original Contributor. - -This License and the rights granted hereunder will terminate: - -(i) automatically if You fail to comply with the terms of this License -and fail to cure such breach within 30 days of receipt of written notice -of the breach; - -(ii) immediately in the event of circumstances specified in Sections 7.1 -and 8.4; or - -(iii) at Original Contributor's discretion upon any action initiated by -You (including by cross-claim or counter claim) alleging that use or -distribution by Original Contributor or any Licensee, of Original Code, -Upgraded Code, Error Corrections, Shared Modifications or Specifications -infringe a patent owned or controlled by You. - -6.3 Effective of Termination. - -Upon termination, You agree to discontinue use of and destroy all copies -of Covered Code in Your possession. All sublicenses to the Covered Code -which You have properly granted shall survive any termination of this -License. Provisions that, by their nature, should remain in effect -beyond the termination of this License shall survive including, without -limitation, Sections 2.2, 3, 5, 7 and 8. - -6.4 No Compensation. - -Each party waives and releases the other from any claim to compensation -or indemnity for permitted or lawful termination of the business -relationship established by this License. - -*7. Liability.* - -7.1 Infringement. Should any of the Original Code, Upgraded Code, TCK or -Specifications ("Materials") become the subject of a claim of -infringement, Original Contributor may, at its sole option, (i) attempt -to procure the rights necessary for You to continue using the Materials, -(ii) modify the Materials so that they are no longer infringing, or -(iii) terminate Your right to use the Materials, immediately upon -written notice, and refund to You the amount, if any, having then -actually been paid by You to Original Contributor for the Original Code, -Upgraded Code and TCK, depreciated on a straight line, five year basis. - -7.2 LIMITATION OF LIABILITY. TO THE FULL EXTENT ALLOWED BY APPLICABLE -LAW, ORIGINAL CONTRIBUTOR'S LIABILITY TO YOU FOR CLAIMS RELATING TO THIS -LICENSE, WHETHER FOR BREACH OR IN TORT, SHALL BE LIMITED TO ONE HUNDRED -PERCENT (100%) OF THE AMOUNT HAVING THEN ACTUALLY BEEN PAID BY YOU TO -ORIGINAL CONTRIBUTOR FOR ALL COPIES LICENSED HEREUNDER OF THE PARTICULAR -ITEMS GIVING RISE TO SUCH CLAIM, IF ANY, DURING THE TWELVE MONTHS -PRECEDING THE CLAIMED BREACH. IN NO EVENT WILL YOU (RELATIVE TO YOUR -SHARED MODIFICATIONS OR ERROR CORRECTIONS) OR ORIGINAL CONTRIBUTOR BE -LIABLE FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL -DAMAGES IN CONNECTION WITH OR RISING OUT OF THIS LICENSE (INCLUDING, -WITHOUT LIMITATION, LOSS OF PROFITS, USE, DATA, OR OTHER ECONOMIC -ADVANTAGE), HOWEVER IT ARISES AND ON ANY THEORY OF LIABILITY, WHETHER IN -AN ACTION FOR CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE) -OR OTHERWISE, WHETHER OR NOT YOU OR ORIGINAL CONTRIBUTOR HAS BEEN -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE AND NOTWITHSTANDING THE -FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. - -*8. Miscellaneous.* - -8.1 Trademark. - -You shall not use any Trademark unless You and Original Contributor -execute a copy of the Commercial Use and Trademark License Agreement -attached hereto as Attachment D. Except as expressly provided in the -License, You are granted no right, title or license to, or interest in, -any Trademarks. Whether or not You and Original Contributor enter into -the Trademark License, You agree not to (i) challenge Original -Contributor's ownership or use of Trademarks; (ii) attempt to register -any Trademarks, or any mark or logo substantially similar thereto; or -(iii) incorporate any Trademarks into Your own trademarks, product -names, service marks, company names, or domain names. - -8.2 Integration. - -This License represents the complete agreement concerning the subject -matter hereof. - -8.3 Assignment. - -Original Contributor may assign this License, and its rights and -obligations hereunder, in its sole discretion. You may assign the -Research Use portions of this License and the TCK license to a third -party upon prior written notice to Original Contributor (which may be -provided electronically via the Community Web-Server). You may not -assign the Commercial Use and Trademark license, the Add-On Technology -License, or the Add-On Technology Source Code Porting License, including -by way of merger (regardless of whether You are the surviving entity) or -acquisition, without Original Contributor's prior written consent. - -8.4 Severability. - -If any provision of this License is held to be unenforceable, such -provision shall be reformed only to the extent necessary to make it -enforceable. Notwithstanding the foregoing, if You are prohibited by law -from fully and specifically complying with Sections 2.2 or 3, this -License will immediately terminate and You must immediately discontinue -any use of Covered Code. - -8.5 Governing Law. - -This License shall be governed by the laws of the United States and the -State of Washington, as applied to contracts entered into and to be -performed in Washington between Washington residents. The application of -the United Nations Convention on Contracts for the International Sale of -Goods is expressly excluded. You agree that the state and federal courts -located in Seattle, Washington have exclusive jurisdiction over any -claim relating to the License, including contract and tort claims. - -8.6 Dispute Resolution. - -a) Arbitration. Any dispute arising out of or relating to this License -shall be finally settled by arbitration as set out herein, except that -either party may bring any action, in a court of competent jurisdiction -(which jurisdiction shall be exclusive), with respect to any dispute -relating to such party's Intellectual Property Rights or with respect to -Your compliance with the TCK license. Arbitration shall be administered: -(i) by the American Arbitration Association (AAA), (ii) in accordance -with the rules of the United Nations Commission on International Trade -Law (UNCITRAL) (the "Rules") in effect at the time of arbitration as -modified herein; and (iii) the arbitrator will apply the substantive -laws of Washington and the United States. Judgment upon the award -rendered by the arbitrator may be entered in any court having -jurisdiction to enforce such award. - -b) Arbitration language, venue and damages. All arbitration proceedings -shall be conducted in English by a single arbitrator selected in -accordance with the Rules, who must be fluent in English and be either a -retired judge or practicing attorney having at least ten (10) years -litigation experience and be reasonably familiar with the technology -matters relative to the dispute. Unless otherwise agreed, arbitration -venue shall be in Seattle, Washington. The arbitrator may award monetary -damages only and nothing shall preclude either party from seeking -provisional or emergency relief from a court of competent jurisdiction. -The arbitrator shall have no authority to award damages in excess of -those permitted in this License and any such award in excess is void. -All awards will be payable in U.S. dollars and may include, for the -prevailing party (i) pre-judgment award interest, (ii) reasonable -attorneys' fees incurred in connection with the arbitration, and (iii) -reasonable costs and expenses incurred in enforcing the award. The -arbitrator will order each party to produce identified documents and -respond to no more than twenty-five single question interrogatories. - -8.7 Construction. - -Any law or regulation, which provides that the language of a contract -shall be construed against the drafter, shall not apply to this License. - -8.8 U.S. Government End Users. - -The Covered Code is a "commercial item," as that term is defined in 48 -C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" -and "commercial computer software documentation," as such terms are used -in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and -48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government -End Users acquire Covered Code with only those rights set forth herein. -You agree to pass this notice to our licensees. - -8.9 Marketing Activities. - -Licensee hereby grants Original Contributor a non-exclusive, -non-transferable, limited license to use the Licensee's company name and -logo ("Licensee Marks") in any presentations, press releases, or -marketing materials solely for the purpose of identifying Licensee as a -member of the Helix Community. Licensee shall provide samples of -Licensee Marks to Original Contributor upon request by Original -Contributor. Original Contributor acknowledges that the Licensee Marks -are the trademarks of Licensee. Original Contributor shall not use the -Licensee Marks in a way that may imply that Original Contributor is an -agency or branch of Licensee. Original Contributor understands and -agrees that the use of any Licensee Marks in connection with this -Agreement shall not create any right, title or interest, in, or to the -Licensee Marks or any Licensee trademarks and that all such use and -goodwill associated with any such trademarks will inure to the benefit -of Licensee. Further the Original Contributor will stop usage of the -Licensee Marks upon Licensee's request. - -8.10 Press Announcements. - -You may make press announcements or other public statements regarding -this License without the prior written consent of the Original -Contributor, if Your statement is limited to announcing the licensing of -the Covered Code or the availability of Your Product and its -compatibility with the Covered Code. All other public announcements -regarding this license require the prior written consent of the Original -Contributor. Consent requests are welcome at press@helixcommunity.org. - -8.11 International Use. - -a) Export/Import laws. Covered Code is subject to U.S. export control -laws and may be subject to export or import regulations in other -countries. Each party agrees to comply strictly with all such laws and -regulations and acknowledges their responsibility to obtain such -licenses to export, re-export, or import as may be required. You agree -to pass these obligations to Your licensees. - -b) Intellectual Property Protection. Due to limited intellectual -property protection and enforcement in certain countries, You agree not -to redistribute the Original Code, Upgraded Code, TCK and Specifications -to any country on the list of restricted countries on the Community Web -Server. - -8.12 Language. - -This License is in the English language only, which language shall be -controlling in all respects, and all versions of this License in any -other language shall be for accommodation only and shall not be binding -on the parties to this License. All communications and notices made or -given pursuant to this License, and all documentation and support to be -provided, unless otherwise noted, shall be in the English language. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH REALNETWORKS, INC. IF YOU ARE AGREEING -TO THIS LICENSE ON BEHALF OF A COMPANY, YOU REPRESENT THAT YOU ARE -AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. WHETHER YOU ARE ACTING -ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, YOU MUST BE OF MAJORITY -AGE AND BE OTHERWISE COMPETENT TO ENTER INTO CONTRACTS. IF YOU DO NOT -MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY OF THE TERMS AND -CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON TO EXIT. - - - GLOSSARY - -1. *"Added Value"* means code which: - -(i) has a principal purpose which is substantially different from that -of the stand-alone Technology; - -(ii) represents a significant functional and value enhancement to the -Technology; - -(iii) operates in conjunction with the Technology; and - -(iv) is not marketed as a technology which replaces or substitutes for -the Technology - -2. "*Applicable Patent Rights*" mean: (a) in the case where Original -Contributor is the grantor of rights, claims of patents that (i) are now -or hereafter acquired, owned by or assigned to Original Contributor and -(ii) are necessarily infringed by using or making the Original Code or -Upgraded Code, including Modifications provided by Original Contributor, -alone and not in combination with other software or hardware; and (b) in -the case where Licensee is the grantor of rights, claims of patents that -(i) are now or hereafter acquired, owned by or assigned to Licensee and -(ii) are infringed (directly or indirectly) by using or making -Licensee's Modifications or Error Corrections, taken alone or in -combination with Covered Code. - -3. "*Application Programming Interfaces (APIs)"* means the interfaces, -associated header files, service provider interfaces, and protocols that -enable a device, application, Operating System, or other program to -obtain services from or make requests of (or provide services in -response to requests from) other programs, and to use, benefit from, or -rely on the resources, facilities, and capabilities of the relevant -programs using the APIs. APIs includes the technical documentation -describing the APIs, the Source Code constituting the API, and any -Header Files used with the APIs. - -4. "*Commercial Use*" means any use (internal or external), copying, -sublicensing or distribution (internal or external), directly or -indirectly of Covered Code by You other than Your Research Use of -Covered Code within Your business or organization or in conjunction with -other Licensees with equivalent Research Use rights. Commercial Use -includes any use of the Covered Code for direct or indirect commercial -or strategic gain, advantage or other business purpose. Any Commercial -Use requires execution of Attachment D by You and Original Contributor. - -5. "*Community Code*" means the Original Code, Upgraded Code, Error -Corrections, Shared Modifications, or any combination thereof. - -6. "*Community Webserver(s)"* means the webservers designated by -Original Contributor for access to the Original Code, Upgraded Code, TCK -and Specifications and for posting Error Corrections and Shared -Modifications. - -7. "*Compliant Covered Code*" means Covered Code that complies with the -requirements of the TCK. - -8. "*Contributor*" means each Licensee that creates or contributes to -the creation of any Error Correction or Shared Modification. - -9. "*Covered Code*" means the Original Code, Upgraded Code, -Modifications, or any combination thereof. - -10. "*Error Correction*" means any change made to Community Code which -conforms to the Specification and corrects the adverse effect of a -failure of Community Code to perform any function set forth in or -required by the Specifications. - -11. "*Executable*" means Covered Code that has been converted from -Source Code to the preferred form for execution by a computer or digital -processor (e.g. binary form). - -12. "*Extension(s)"* means any additional Interfaces developed by or for -You which: (i) are designed for use with the Technology; (ii) constitute -an API for a library of computing functions or services; and (iii) are -disclosed or otherwise made available to third party software developers -for the purpose of developing software which invokes such additional -Interfaces. The foregoing shall not apply to software developed by Your -subcontractors to be exclusively used by You. - -13. "*Header File(s)"* means that portion of the Source Code that -provides the names and types of member functions, data members, class -definitions, and interface definitions necessary to implement the APIs -for the Covered Code. Header Files include, files specifically -designated by Original Contributor as Header Files. Header Files do not -include the code necessary to implement the functionality underlying the -Interface. - -14. *"Helix DNA Server Technology"* means the program(s) that implement -the Helix Universal Server streaming engine for the Technology as -defined in the Specification. - -15. *"Helix DNA Client Technology"* means the Covered Code that -implements the RealOne Player engine as defined in the Specification. - -16. *"Helix DNA Producer Technology"* means the Covered Code that -implements the Helix Producer engine as defined in the Specification. - -17. *"Helix DNA Technology"* means the Helix DNA Server Technology, the -Helix DNA Client Technology, the Helix DNA Producer Technology and other -Helix technologies designated by Original Contributor. - -18. "*Intellectual Property Rights*" means worldwide statutory and -common law rights associated solely with (i) Applicable Patent Rights; -(ii) works of authorship including copyrights, copyright applications, -copyright registrations and "moral rights"; (iii) the protection of -trade and industrial secrets and confidential information; and (iv) -divisions, continuations, renewals, and re-issuances of the foregoing -now existing or acquired in the future. - -19. *"Interface*" means interfaces, functions, properties, class -definitions, APIs, Header Files, GUIDs, V-Tables, and/or protocols -allowing one piece of software, firmware or hardware to communicate or -interoperate with another piece of software, firmware or hardware. - -20. "*Internal Deployment Use*" means use of Compliant Covered Code -(excluding Research Use) within Your business or organization only by -Your employees and/or agents on behalf of Your business or organization, -but not to provide services, including content distribution, to third -parties, subject to execution of Attachment D by You and Original -Contributor, if required. - -21. "*Licensee*" means any party that has entered into and has in effect -a version of this License with Original Contributor. - -22. "*MIME type*" means a description of what type of media or other -content is in a file, including by way of example but not limited to -'audio/x-pn-realaudio-plugin.' - -23. "*Modification(s)"* means (i) any addition to, deletion from and/or -change to the substance and/or structure of the Covered Code, including -Interfaces; (ii) the combination of any Covered Code and any previous -Modifications; (iii) any new file or other representation of computer -program statements that contains any portion of Covered Code; and/or -(iv) any new Source Code implementing any portion of the Specifications. - -24. "*MP3 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Picture Experts Group known as MPEG-1 Audio Layer-3 or MP3, -including but not limited to all past and future versions, profiles, -extensions, parts and amendments relating to the MP3 specification. - -25. "*MPEG-4 Patents*" means any patents necessary to make, use or sell -technology implementing any portion of the specification developed by -the Moving Pictures Experts Group known as MPEG-4, including but not -limited to all past and future versions, profiles, extensions, parts and -amendments relating to the MPEG-4 specification. - -26. "*Original Code*" means the initial Source Code for the Technology -as described on the Community Web Server. - -27. "*Original Contributor*" means RealNetworks, Inc., its affiliates -and its successors and assigns. - -28. "*Original Contributor MIME Type*" means the MIME registry, browser -preferences, or local file/protocol associations invoking any Helix DNA -Client-based application, including the RealOne Player, for playback of -RealAudio, RealVideo, other RealMedia MIME types or datatypes (e.g., -.ram, .rnx, .rpm, .ra, .rm, .rp, .rt, .rf, .prx, .mpe, .rmp, .rmj, .rav, -.rjs, .rmx, .rjt, .rms), and any other Original Contributor-specific or -proprietary MIME types that Original Contributor may introduce in the -future. - -29. "*Personal Use*" means use of Covered Code by an individual solely -for his or her personal, private and non-commercial purposes. An -individual's use of Covered Code in his or her capacity as an officer, -employee, member, independent contractor or agent of a corporation, -business or organization (commercial or non-commercial) does not qualify -as Personal Use. - -30. "*RealMedia File Format*" means the file format designed and -developed by RealNetworks for storing multimedia data and used to store -RealAudio and RealVideo encoded streams. Valid RealMedia File Format -extensions include: .rm, .rmj, .rmc, .rmvb, .rms. - -31. "*RCSL Webpage*" means the RealNetworks Community Source License -webpage located at https://www.helixcommunity.org/content/rcsl or such -other URL that Original Contributor may designate from time to time. - -32. "*Reformatted Specifications*" means any revision to the -Specifications which translates or reformats the Specifications (as for -example in connection with Your documentation) but which does not alter, -subset or superset * *the functional or operational aspects of the -Specifications. - -33. "*Research Use*" means use and distribution of Covered Code only for -Your Personal Use, research or development use and expressly excludes -Internal Deployment Use and Commercial Use. Research Use also includes -use of Covered Code to teach individuals how to use Covered Code. - -34. "*Shared Modifications*" means Modifications that You distribute or -use for a Commercial Use, in addition to any Modifications provided by -You, at Your option, pursuant to Section 2.2, or received by You from a -Contributor pursuant to Section 2.3. - -35. "*Source Code*" means the preferred form of the Covered Code for -making modifications to it, including all modules it contains, plus any -associated interface definition files, scripts used to control -compilation and installation of an Executable, or source code -differential comparisons against either the Original Code or another -well known, available Covered Code of the Contributor's choice. The -Source Code can be in a compressed or archival form, provided the -appropriate decompression or de-archiving software is widely available -for no charge. - -36. "*Specifications*" means the specifications for the Technology and -other documentation, as designated on the Community Web Server, as may -be revised by Original Contributor from time to time. - -37. "*Trademarks*" means Original Contributor's trademarks and logos, -including, but not limited to, RealNetworks, RealAudio, RealVideo, -RealOne, RealSystem, SureStream, Helix, Helix DNA and other trademarks -whether now used or adopted in the future. - -38. "*Technology*" means the technology described in Attachment B, and -Upgrades. - -39. "*Technology Compatibility Kit"* or *"TCK*" means the test programs, -procedures, acceptance criteria and/or other requirements, designated by -Original Contributor for use in verifying compliance of Covered Code -with the Specifications, in conjunction with the Original Code and -Upgraded Code. Original Contributor may, in its sole discretion and from -time to time, revise a TCK to correct errors and/or omissions and in -connection with Upgrades. - -40. "*Upgrade(s)"* means new versions of Technology designated -exclusively by Original Contributor as an "Upgrade" and released by -Original Contributor from time to time under the terms of the License. - -41. "*Upgraded Code*" means the Source Code and/or Executables for -Upgrades, possibly including Modifications made by Contributors. - -42. *"User's Guide"* means the users guide for the TCK which Original -Contributor makes available to You to provide direction in how to run -the TCK and properly interpret the results, as may be revised by -Original Contributor from time to time. - -43. "*You(r)*" means an individual, or a legal entity acting by and -through an individual or individuals, exercising rights either under -this License or under a future version of this License issued pursuant -to Section 4.1. For legal entities, "You(r)" includes any entity that by -majority voting interest controls, is controlled by, or is under common -control with You. - -44. "*Your Products*" means any (i) hardware products You distribute -integrating the Covered Code; (ii) any software products You distribute -with the Covered Code that utilize the APIs of the Covered Code; or -(iii) any services You provide using the Covered Code. - - - ATTACHMENT A - -REQUIRED NOTICES - - - ATTACHMENT A-1 - -REQUIRED IN ALL CASES - -Notice to be included in header file of all Error Corrections and Shared -Modifications: - -Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved. - -The contents of this file, and the files included with this file, are -subject to the current version of RealNetworks Community Source License -Version 1.1 (the "License"). You may not use this file except in -compliance with the License executed by both You and RealNetworks. You -may obtain a copy of the License at * -https://www.helixcommunity.org/content/rcsl.* You may also obtain a copy -of the License by contacting RealNetworks directly. Please see the -License for the rights, obligations and limitations governing use of the -contents of the file. - -This file is part of the Helix DNA technology. RealNetworks, Inc., is -the developer of the Original code and owns the copyrights in the -portions it created. - -This file, and the files included with this file, are distributed on an -'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, -AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT -LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): - -_______________________________________________ - -Technology Compatibility Kit Test Suite(s) Location: - -________________________________ - - - ATTACHMENT A-2 - -SAMPLE LICENSEE CERTIFICATION - -"By clicking the `Agree' button below, You certify that You are a -Licensee in good standing under the RealNetworks Community Source -License, ("License") and that Your access, use and distribution of code -and information You may obtain at this site is subject to the License. -If You are not a Licensee under the RealNetworks Community Source -License You agree not to download, copy or use the Helix DNA technology. - - - ATTACHMENT A-3 - -REQUIRED STUDENT NOTIFICATION - -"This software and related documentation has been obtained by Your -educational institution subject to the RealNetworks Community Source -License. You have been provided access to the software and related -documentation for use only in connection with your course work and -research activities as a matriculated student of Your educational -institution. Any other use is expressly prohibited. - -THIS SOFTWARE AND RELATED DOCUMENTATION CONTAINS PROPRIETARY MATERIAL OF -REALNETWORKS, INC, WHICH ARE PROTECTED BY VARIOUS INTELLECTUAL PROPERTY -RIGHTS. - -You may not use this file except in compliance with the License. You may -obtain a copy of the License on the web at -https://www.helixcommunity.org/content/rcsl. - -* -* - - - ATTACHMENT B - -Description of Technology - -Helix DNA, which consists of Helix DNA Client, Helix DNA Server and -Helix DNA Producer. - -Description of "Technology" - -Helix DNA Technology v1.0 as described on the Community Web Server. - - - ATTACHMENT C - -TECHNOLOGY COMPATIBILITY KIT LICENSE - -The following license is effective for the *Helix DNA* Technology -Compatibility Kit - as described on the Community Web Server. The -Technology Compatibility Kit(s) for the Technology specified in -Attachment B may be accessed at the Community Web Server. - -1. TCK License. - -1.1 Grants to use TCK - -Subject to the terms and restrictions set forth below and the -RealNetworks Community Source License, and the Research Use license, -Original Contributor grants to You a worldwide, non-exclusive, -non-transferable license, to the extent of Original Contributor's -Intellectual Property Rights in the TCK (without the right to -sublicense), to use the TCK to develop and test Covered Code. - -1.2 TCK Use Restrictions. - -You are not authorized to create derivative works of the TCK or use the -TCK to test any implementation of the Specification that is not Covered -Code. You may not publish Your test results or make claims of -comparative compatibility with respect to other implementations of the -Specification. In consideration for the license grant in Section 1.1 -above You agree not to develop Your own tests that are intended to -validate conformation with the Specification. - -2. Test Results. - -You agree to provide to Original Contributor or the third party test -facility if applicable, Your test results that demonstrate that Covered -Code is Compliant Covered Code and that Original Contributor may publish -or otherwise distribute such test results. - -PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE -"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND -CONDITIONS OF THIS LICENSE WITH THE ORIGINAL CONTRIBUTOR, REALNETWORKS, -INC. IF YOU ARE AGREEING TO THIS LICENSE ON BEHALF OF A COMPANY, YOU -REPRESENT THAT YOU ARE AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. -WHETHER YOU ARE ACTING ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, -YOU MUST BE OF MAJORITY AGE AND BE OTHERWISE COMPETENT TO ENTER INTO -CONTRACTS. IF YOU DO NOT MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY -OF THE TERMS AND CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON -TO EXIT. - -*ACCEPT / REJECT -* - -* -* - -*To agree to the R&D/academic terms of this license, please register - on the site -- -you will then be given a chance to agree to the clickwrap RCSL - -R&D License - -and gain access to the RCSL-licensed source code. To build or deploy -commercial applications based on the RCSL, you will need to agree to the -Commercial Use license attachments -* - - - diff --git a/bsp/stm32_radio/mp3/real/projects/visualc/RPSL.txt b/bsp/stm32_radio/mp3/real/projects/visualc/RPSL.txt deleted file mode 100644 index d040a45205..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/visualc/RPSL.txt +++ /dev/null @@ -1,518 +0,0 @@ -RealNetworks Public Source License Version 1.0 -(Rev. Date October 28, 2002) - -1. General Definitions. This License applies to any program or other work which -RealNetworks, Inc., or any other entity that elects to use this license, -("Licensor") makes publicly available and which contains a notice placed by -Licensor identifying such program or work as "Original Code" and stating that it -is subject to the terms of this RealNetworks Public Source License version 1.0 -(or subsequent version thereof) ("License"). You are not required to accept this -License. However, nothing else grants You permission to use, copy, modify or -distribute the software or its derivative works. These actions are prohibited by -law if You do not accept this License. Therefore, by modifying, copying or -distributing the software (or any work based on the software), You indicate your -acceptance of this License to do so, and all its terms and conditions. In -addition, you agree to the terms of this License by clicking the Accept button -or downloading the software. As used in this License: - -1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the -grantor of rights, claims of patents that (i) are now or hereafter acquired, -owned by or assigned to Licensor and (ii) are necessarily infringed by using or -making the Original Code alone and not in combination with other software or -hardware; and (b) in the case where You are the grantor of rights, claims of -patents that (i) are now or hereafter acquired, owned by or assigned to You and -(ii) are infringed (directly or indirectly) by using or making Your -Modifications, taken alone or in combination with Original Code. - -1.2 "Compatible Source License" means any one of the licenses listed on Exhibit -B or at https://www.helixcommunity.org/content/complicense or other licenses -specifically identified by Licensor in writing. Notwithstanding any term to the -contrary in any Compatible Source License, any code covered by any Compatible -Source License that is used with Covered Code must be made readily available in -Source Code format for royalty-free use under the terms of the Compatible Source -License or this License. - -1.3 "Contributor" means any person or entity that creates or contributes to the -creation of Modifications. - -1.4 "Covered Code" means the Original Code, Modifications, the combination of -Original Code and any Modifications, and/or any respective portions thereof. - -1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for -Your internal research and development (R&D) and/or Personal Use, and includes -without limitation, any and all internal use or distribution of Covered Code -within Your business or organization except for R&D use and/or Personal Use, as -well as direct or indirect sublicensing or distribution of Covered Code by You -to any third party in any form or manner. - -1.6 "Derivative Work" means either the Covered Code or any derivative work under -United States copyright law, and including any work containing or including any -portion of the Covered Code or Modifications, either verbatim or with -modifications and/or translated into another language. Derivative Work also -includes any work which combines any portion of Covered Code or Modifications -with code not otherwise governed by the terms of this License. - -1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be -accessed or used by anyone other than You, used to provide any services to -anyone other than You, or used in any way to deliver any content to anyone other -than You, whether the Covered Code is distributed to those parties, made -available as an application intended for use over a computer network, or used to -provide services or otherwise deliver content to anyone other than You. - -1.8. "Interface" means interfaces, functions, properties, class definitions, -APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of -software, firmware or hardware to communicate or interoperate with another piece -of software, firmware or hardware. - -1.9 "Modifications" mean any addition to, deletion from, and/or change to, the -substance and/or structure of the Original Code, any previous Modifications, the -combination of Original Code and any previous Modifications, and/or any -respective portions thereof. When code is released as a series of files, a -Modification is: (a) any addition to or deletion from the contents of a file -containing Covered Code; and/or (b) any new file or other representation of -computer program statements that contains any part of Covered Code. - -1.10 "Original Code" means (a) the Source Code of a program or other work as -originally made available by Licensor under this License, including the Source -Code of any updates or upgrades to such programs or works made available by -Licensor under this License, and that has been expressly identified by Licensor -as such in the header file(s) of such work; and (b) the object code compiled -from such Source Code and originally made available by Licensor under this -License. - -1.11 "Personal Use" means use of Covered Code by an individual solely for his or -her personal, private and non-commercial purposes. An individual's use of -Covered Code in his or her capacity as an officer, employee, member, independent -contractor or agent of a corporation, business or organization (commercial or -non-commercial) does not qualify as Personal Use. - -1.12 "Source Code" means the human readable form of a program or other work that -is suitable for making modifications to it, including all modules it contains, -plus any associated interface definition files, scripts used to control -compilation and installation of an executable (object code). - -1.13 "You" or "Your" means an individual or a legal entity exercising rights -under this License. For legal entities, "You" or "Your" includes any entity -which controls, is controlled by, or is under common control with, You, where -"control" means (a) the power, direct or indirect, to cause the direction or -management of such entity, whether by contract or otherwise, or (b) ownership of -fifty percent (50%) or more of the outstanding shares or beneficial ownership of -such entity. - -2. Permitted Uses; Conditions & Restrictions. Subject to the terms and -conditions of this License, Licensor hereby grants You, effective on the date -You accept this License (via downloading or using Covered Code or otherwise -indicating your acceptance of this License), a worldwide, royalty-free, -non-exclusive copyright license, to the extent of Licensor's copyrights cover -the Original Code, to do the following: - -2.1 You may reproduce, display, perform, modify and Deploy Covered Code, -provided that in each instance: - -(a) You must retain and reproduce in all copies of Original Code the copyright -and other proprietary notices and disclaimers of Licensor as they appear in the -Original Code, and keep intact all notices in the Original Code that refer to -this License; - -(b) You must include a copy of this License with every copy of Source Code of -Covered Code and documentation You distribute, and You may not offer or impose -any terms on such Source Code that alter or restrict this License or the -recipients' rights hereunder, except as permitted under Section 6; - -(c) You must duplicate, to the extent it does not already exist, the notice in -Exhibit A in each file of the Source Code of all Your Modifications, and cause -the modified files to carry prominent notices stating that You changed the files -and the date of any change; - -(d) You must make Source Code of all Your Externally Deployed Modifications -publicly available under the terms of this License, including the license grants -set forth in Section 3 below, for as long as you Deploy the Covered Code or -twelve (12) months from the date of initial Deployment, whichever is longer. You -should preferably distribute the Source Code of Your Deployed Modifications -electronically (e.g. download from a web site); and - -(e) if You Deploy Covered Code in object code, executable form only, You must -include a prominent notice, in the code itself as well as in related -documentation, stating that Source Code of the Covered Code is available under -the terms of this License with information on how and where to obtain such -Source Code. You must also include the Object Code Notice set forth in Exhibit A -in the "about" box or other appropriate place where other copyright notices are -placed, including any packaging materials. - -2.2 You expressly acknowledge and agree that although Licensor and each -Contributor grants the licenses to their respective portions of the Covered Code -set forth herein, no assurances are provided by Licensor or any Contributor that -the Covered Code does not infringe the patent or other intellectual property -rights of any other entity. Licensor and each Contributor disclaim any liability -to You for claims brought by any other entity based on infringement of -intellectual property rights or otherwise. As a condition to exercising the -rights and licenses granted hereunder, You hereby assume sole responsibility to -secure any other intellectual property rights needed, if any. For example, if a -third party patent license is required to allow You to make, use, sell, import -or offer for sale the Covered Code, it is Your responsibility to acquire such -license(s). - -2.3 Subject to the terms and conditions of this License, Licensor hereby grants -You, effective on the date You accept this License (via downloading or using -Covered Code or otherwise indicating your acceptance of this License), a -worldwide, royalty-free, perpetual, non-exclusive patent license under -Licensor's Applicable Patent Rights to make, use, sell, offer for sale and -import the Covered Code, provided that in each instance you comply with the -terms of this License. - -3. Your Grants. In consideration of, and as a condition to, the licenses granted -to You under this License: - -(a) You grant to Licensor and all third parties a non-exclusive, perpetual, -irrevocable, royalty free license under Your Applicable Patent Rights and other -intellectual property rights owned or controlled by You, to make, sell, offer -for sale, use, import, reproduce, display, perform, modify, distribute and -Deploy Your Modifications of the same scope and extent as Licensor's licenses -under Sections 2.1 and 2.2; and - -(b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide, -royalty-free, perpetual and irrevocable license, under Your Applicable Patent -Rights and other intellectual property rights owned or controlled by You, to -make, use, sell, offer for sale, import, reproduce, display, perform, -distribute, modify or have modified (for Licensor and/or its subsidiaries), -sublicense and distribute Your Modifications, in any form and for any purpose, -through multiple tiers of distribution. - -(c) You agree not use any information derived from Your use and review of the -Covered Code, including but not limited to any algorithms or inventions that may -be contained in the Covered Code, for the purpose of asserting any of Your -patent rights, or assisting a third party to assert any of its patent rights, -against Licensor or any Contributor. - -4. Derivative Works. You may create a Derivative Work by combining Covered Code -with other code not otherwise governed by the terms of this License and -distribute the Derivative Work as an integrated product. In each such instance, -You must make sure the requirements of this License are fulfilled for the -Covered Code or any portion thereof, including all Modifications. - -4.1 You must cause any Derivative Work that you distribute, publish or -Externally Deploy, that in whole or in part contains or is derived from the -Covered Code or any part thereof, to be licensed as a whole at no charge to all -third parties under the terms of this License and no other license except as -provided in Section 4.2. You also must make Source Code available for the -Derivative Work under the same terms as Modifications, described in Sections 2 -and 3, above. - -4.2 Compatible Source Licenses. Software modules that have been independently -developed without any use of Covered Code and which contain no portion of the -Covered Code, Modifications or other Derivative Works, but are used or combined -in any way wtih the Covered Code or any Derivative Work to form a larger -Derivative Work, are exempt from the conditions described in Section 4.1 but -only to the extent that: the software module, including any software that is -linked to, integrated with, or part of the same applications as, the software -module by any method must be wholly subject to one of the Compatible Source -Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the -terms of this License. Thus, the entire Derivative Work must be licensed under a -combination of the RPSL (for Covered Code) and a Compatible Source License for -any independently developed software modules within the Derivative Work. The -foregoing requirement applies even if the Compatible Source License would -ordinarily allow the software module to link with, or form larger works with, -other software that is not subject to the Compatible Source License. For -example, although the Mozilla Public License v1.1 allows Mozilla code to be -combined with proprietary software that is not subject to the MPL, if -MPL-licensed code is used with Covered Code the MPL-licensed code could not be -combined or linked with any code not governed by the MPL. The general intent of -this section 4.2 is to enable use of Covered Code with applications that are -wholly subject to an acceptable open source license. You are responsible for -determining whether your use of software with Covered Code is allowed under Your -license to such software. - -4.3 Mere aggregation of another work not based on the Covered Code with the -Covered Code (or with a work based on the Covered Code) on a volume of a storage -or distribution medium does not bring the other work under the scope of this -License. If You deliver the Covered Code for combination and/or integration with -an application previously provided by You (for example, via automatic updating -technology), such combination and/or integration constitutes a Derivative Work -subject to the terms of this License. - -5. Exclusions From License Grant. Nothing in this License shall be deemed to -grant any rights to trademarks, copyrights, patents, trade secrets or any other -intellectual property of Licensor or any Contributor except as expressly stated -herein. No right is granted to the trademarks of Licensor or any Contributor -even if such marks are included in the Covered Code. Nothing in this License -shall be interpreted to prohibit Licensor from licensing under different terms -from this License any code that Licensor otherwise would have a right to -license. Modifications, Derivative Works and/or any use or combination of -Covered Code with other technology provided by Licensor or third parties may -require additional patent licenses from Licensor which Licensor may grant in its -sole discretion. No patent license is granted separate from the Original Code or -combinations of the Original Code with other software or hardware. - -5.1. Trademarks. This License does not grant any rights to use the trademarks or -trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any -trademark or trade name belonging to any Contributor. No Licensor Marks may be -used to endorse or promote products derived from the Original Code other than as -permitted by the Licensor Trademark Policy defined in Exhibit C. - -6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, -support, indemnity or liability obligations and/or other rights consistent with -the scope of the license granted herein ("Additional Terms") to one or more -recipients of Covered Code. However, You may do so only on Your own behalf and -as Your sole responsibility, and not on behalf of Licensor or any Contributor. -You must obtain the recipient's agreement that any such Additional Terms are -offered by You alone, and You hereby agree to indemnify, defend and hold -Licensor and every Contributor harmless for any liability incurred by or claims -asserted against Licensor or such Contributor by reason of any such Additional -Terms. - -7. Versions of the License. Licensor may publish revised and/or new versions of -this License from time to time. Each version will be given a distinguishing -version number. Once Original Code has been published under a particular version -of this License, You may continue to use it under the terms of that version. You -may also choose to use such Original Code under the terms of any subsequent -version of this License published by Licensor. No one other than Licensor has -the right to modify the terms applicable to Covered Code created under this -License. - -8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part -pre-release, untested, or not fully tested works. The Covered Code may contain -errors that could cause failures or loss of data, and may be incomplete or -contain inaccuracies. You expressly acknowledge and agree that use of the -Covered Code, or any portion thereof, is at Your sole and entire risk. THE -COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF -ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS -"LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY -DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF -SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET -ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH -CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE -COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR -REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR -ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR -WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR -AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You -acknowledge that the Covered Code is not intended for use in high risk -activities, including, but not limited to, the design, construction, operation -or maintenance of nuclear facilities, aircraft navigation, aircraft -communication systems, or air traffic control machines in which case the failure -of the Covered Code could lead to death, personal injury, or severe physical or -environmental damage. Licensor disclaims any express or implied warranty of -fitness for such uses. - -9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT -SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR -YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER -UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT -LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH -CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND -NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME -JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR -CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event -shall Licensor's total liability to You for all damages (other than as may be -required by applicable law) under this License exceed the amount of ten dollars -($10.00). - -10. Ownership. Subject to the licenses granted under this License, each -Contributor retains all rights, title and interest in and to any Modifications -made by such Contributor. Licensor retains all rights, title and interest in and -to the Original Code and any Modifications made by or on behalf of Licensor -("Licensor Modifications"), and such Licensor Modifications will not be -automatically subject to this License. Licensor may, at its sole discretion, -choose to license such Licensor Modifications under this License, or on -different terms from those contained in this License or may choose not to -license them at all. - -11. Termination. - -11.1 Term and Termination. The term of this License is perpetual unless -terminated as provided below. This License and the rights granted hereunder will -terminate: - -(a) automatically without notice from Licensor if You fail to comply with any -term(s) of this License and fail to cure such breach within 30 days of becoming -aware of such breach; - -(b) immediately in the event of the circumstances described in Section 12.5(b); -or - -(c) automatically without notice from Licensor if You, at any time during the -term of this License, commence an action for patent infringement against -Licensor (including by cross-claim or counter claim in a lawsuit); - -(d) upon written notice from Licensor if You, at any time during the term of -this License, commence an action for patent infringement against any third party -alleging that the Covered Code itself (excluding combinations with other -software or hardware) infringes any patent (including by cross-claim or counter -claim in a lawsuit). - -11.2 Effect of Termination. Upon termination, You agree to immediately stop any -further use, reproduction, modification, sublicensing and distribution of the -Covered Code and to destroy all copies of the Covered Code that are in your -possession or control. All sublicenses to the Covered Code which have been -properly granted prior to termination shall survive any termination of this -License. Provisions which, by their nature, should remain in effect beyond the -termination of this License shall survive, including but not limited to Sections -3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for -compensation, indemnity or damages of any sort solely as a result of terminating -this License in accordance with its terms, and termination of this License will -be without prejudice to any other right or remedy of any party. - -12. Miscellaneous. - -12.1 Government End Users. The Covered Code is a "commercial item" as defined in -FAR 2.101. Government software and technical data rights in the Covered Code -include only those rights customarily provided to the public as defined in this -License. This customary commercial license in technical data and software is -provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer -Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical -Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software -or Computer Software Documentation). Accordingly, all U.S. Government End Users -acquire Covered Code with only those rights set forth herein. - -12.2 Relationship of Parties. This License will not be construed as creating an -agency, partnership, joint venture or any other form of legal association -between or among You, Licensor or any Contributor, and You will not represent to -the contrary, whether expressly, by implication, appearance or otherwise. - -12.3 Independent Development. Nothing in this License will impair Licensor's -right to acquire, license, develop, have others develop for it, market and/or -distribute technology or products that perform the same or similar functions as, -or otherwise compete with, Modifications, Derivative Works, technology or -products that You may develop, produce, market or distribute. - -12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any -provision of this License will not be deemed a waiver of future enforcement of -that or any other provision. Any law or regulation which provides that the -language of a contract shall be construed against the drafter will not apply to -this License. - -12.5 Severability. (a) If for any reason a court of competent jurisdiction finds -any provision of this License, or portion thereof, to be unenforceable, that -provision of the License will be enforced to the maximum extent permissible so -as to effect the economic benefits and intent of the parties, and the remainder -of this License will continue in full force and effect. (b) Notwithstanding the -foregoing, if applicable law prohibits or restricts You from fully and/or -specifically complying with Sections 2 and/or 3 or prevents the enforceability -of either of those Sections, this License will immediately terminate and You -must immediately discontinue any use of the Covered Code and destroy all copies -of it that are in your possession or control. - -12.6 Dispute Resolution. Any litigation or other dispute resolution between You -and Licensor relating to this License shall take place in the Seattle, -Washington, and You and Licensor hereby consent to the personal jurisdiction of, -and venue in, the state and federal courts within that District with respect to -this License. The application of the United Nations Convention on Contracts for -the International Sale of Goods is expressly excluded. - -12.7 Export/Import Laws. This software is subject to all export and import laws -and restrictions and regulations of the country in which you receive the Covered -Code and You are solely responsible for ensuring that You do not export, -re-export or import the Covered Code or any direct product thereof in violation -of any such restrictions, laws or regulations, or without all necessary -authorizations. - -12.8 Entire Agreement; Governing Law. This License constitutes the entire -agreement between the parties with respect to the subject matter hereof. This -License shall be governed by the laws of the United States and the State of -Washington. - -Where You are located in the province of Quebec, Canada, the following clause -applies: The parties hereby confirm that they have requested that this License -and all related documents be drafted in English. Les parties ont exigé -que le présent contrat et tous les documents connexes soient -rédigés en anglais. - - EXHIBIT A. - -"Copyright © 1995-2002 -RealNetworks, Inc. and/or its licensors. All Rights Reserved. - -The contents of this file, and the files included with this file, are subject to -the current version of the RealNetworks Public Source License Version 1.0 (the -"RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have -licensed the file under the RealNetworks Community Source License Version 1.0 -(the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which -case the RCSL will apply. You may also obtain the license terms directly from -RealNetworks. You may not use this file except in compliance with the RPSL or, -if you have a valid RCSL with RealNetworks applicable to this file, the RCSL. -Please see the applicable RPSL or RCSL for the rights, obligations and -limitations governing use of the contents of the file. - -This file is part of the Helix DNA Technology. RealNetworks is the developer of -the Original code and owns the copyrights in the portions it created. - -This file, and the files included with this file, is distributed and made -available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR -IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING -WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - -Contributor(s): ____________________________________ - -Technology Compatibility Kit Test -Suite(s) Location (if licensed under the RCSL): ______________________________ - -Object Code Notice: Helix DNA Client technology included. Copyright (c) -RealNetworks, Inc., 1995-2002. All rights reserved. - - - EXHIBIT B - -Compatible Source Licenses for the RealNetworks Public Source License. The -following list applies to the most recent version of the license as of October -25, 2002, unless otherwise indicated. - -* Academic Free License -* Apache Software License -* Apple Public Source License -* Artistic license -* Attribution Assurance Licenses -* BSD license -* Common Public License (1) -* Eiffel Forum License -* GNU General Public License (GPL) (1) -* GNU Library or "Lesser" General Public License (LGPL) (1) -* IBM Public License -* Intel Open Source License -* Jabber Open Source License -* MIT license -* MITRE Collaborative Virtual Workspace License (CVW License) -* Motosoto License -* Mozilla Public License 1.0 (MPL) -* Mozilla Public License 1.1 (MPL) -* Nokia Open Source License -* Open Group Test Suite License -* Python Software Foundation License -* Ricoh Source Code Public License -* Sun Industry Standards Source License (SISSL) -* Sun Public License -* University of Illinois/NCSA Open Source License -* Vovida Software License v. 1.0 -* W3C License -* X.Net License -* Zope Public License -* zlib/libpng license - -(1) Note: because this license contains certain reciprocal licensing terms that -purport to extend to independently developed code, You may be prohibited under -the terms of this otherwise compatible license from using code licensed under -its terms with Covered Code because Covered Code may only be licensed under the -RealNetworks Public Source License. Any attempt to apply non RPSL license terms, -including without limitation the GPL, to Covered Code is expressly forbidden. -You are responsible for ensuring that Your use of Compatible Source Licensed -code does not violate either the RPSL or the Compatible Source License. - -The latest version of this list can be found at: -https://www.helixcommunity.org/content/complicense - - EXHIBIT C - -RealNetworks' Trademark policy. - -RealNetworks defines the following trademarks collectively as "Licensor -Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem", -"RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other -trademarks or trade names belonging to RealNetworks. - -RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks -except as permitted by and in strict compliance at all times with RealNetworks' -third party trademark usage guidelines which are posted at -http://www.realnetworks.com/info/helixlogo.html. - diff --git a/bsp/stm32_radio/mp3/real/projects/visualc/mp3dec.dsp b/bsp/stm32_radio/mp3/real/projects/visualc/mp3dec.dsp deleted file mode 100644 index f6b3bd9b11..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/visualc/mp3dec.dsp +++ /dev/null @@ -1,158 +0,0 @@ -# Microsoft Developer Studio Project File - Name="mp3dec" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=mp3dec - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "mp3dec.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "mp3dec.mak" CFG="mp3dec - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mp3dec - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "mp3dec - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "mp3dec - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "release" -# PROP Intermediate_Dir "rel_obj" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\..\..\..\..\common\include" /I "..\.." /I "..\..\..\pub" /I "..\..\..\..\..\..\..\common\runtime\pub" /D "NDEBUG" /D "REL_ENABLE_ASSERTS" /D "_WINDOWS" /D "_LIB" /D "WIN32" /D "_MBCS" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "mp3dec - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "debug" -# PROP Intermediate_Dir "debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\..\..\..\..\common\include" /I "..\.." /I "..\..\..\pub" /I "..\..\..\..\..\..\..\common\runtime\pub" /D "_DEBUG" /D "_LIB" /D "WIN32" /D "_MBCS" /D "_WINDOWS" /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "mp3dec - Win32 Release" -# Name "mp3dec - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Group "general" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\mp3dec.c -# End Source File -# Begin Source File - -SOURCE=..\..\..\mp3tabs.c -# End Source File -# End Group -# Begin Group "csource" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\bitstream.c -# End Source File -# Begin Source File - -SOURCE=..\..\buffers.c -# End Source File -# Begin Source File - -SOURCE=..\..\dct32.c -# End Source File -# Begin Source File - -SOURCE=..\..\dequant.c -# End Source File -# Begin Source File - -SOURCE=..\..\dqchan.c -# End Source File -# Begin Source File - -SOURCE=..\..\huffman.c -# End Source File -# Begin Source File - -SOURCE=..\..\hufftabs.c -# End Source File -# Begin Source File - -SOURCE=..\..\imdct.c -# End Source File -# Begin Source File - -SOURCE=..\..\polyphase.c -# End Source File -# Begin Source File - -SOURCE=..\..\scalfact.c -# End Source File -# Begin Source File - -SOURCE=..\..\stproc.c -# End Source File -# Begin Source File - -SOURCE=..\..\subband.c -# End Source File -# Begin Source File - -SOURCE=..\..\trigtabs.c -# End Source File -# End Group -# End Group -# End Target -# End Project diff --git a/bsp/stm32_radio/mp3/real/projects/visualc/mp3dec.dsw b/bsp/stm32_radio/mp3/real/projects/visualc/mp3dec.dsw deleted file mode 100644 index 07eac13918..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/visualc/mp3dec.dsw +++ /dev/null @@ -1,44 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "mp3dec"=.\mp3dec.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "testwrap"=.\testwrap.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name mp3dec - End Project Dependency -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/bsp/stm32_radio/mp3/real/projects/visualc/testwrap.dsp b/bsp/stm32_radio/mp3/real/projects/visualc/testwrap.dsp deleted file mode 100644 index c149b155d5..0000000000 --- a/bsp/stm32_radio/mp3/real/projects/visualc/testwrap.dsp +++ /dev/null @@ -1,174 +0,0 @@ -# Microsoft Developer Studio Project File - Name="testwrap" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=testwrap - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "testwrap.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "testwrap.mak" CFG="testwrap - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "testwrap - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "testwrap - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "testwrap - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "release" -# PROP Intermediate_Dir "rel_obj" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\pub" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "HELIX_FEATURE_AUDIO_MPA_LAYER3" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"release\mp3dec.exe" - -!ELSEIF "$(CFG)" == "testwrap - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "debug" -# PROP Intermediate_Dir "debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\pub" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "HELIX_FEATURE_AUDIO_MPA_LAYER3" /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"debug\mp3dec.exe" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "testwrap - Win32 Release" -# Name "testwrap - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Group "cppwrapper" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\mpadecobj.cpp - -!IF "$(CFG)" == "testwrap - Win32 Release" - -# ADD CPP /I "..\..\..\testwrap\cppshim" - -!ELSEIF "$(CFG)" == "testwrap - Win32 Debug" - -# PROP Exclude_From_Build 1 -# ADD CPP /I "..\..\..\testwrap\cppshim" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\..\..\testwrap\winmain.cpp - -!IF "$(CFG)" == "testwrap - Win32 Release" - -!ELSEIF "$(CFG)" == "testwrap - Win32 Debug" - -# PROP Exclude_From_Build 1 - -!ENDIF - -# End Source File -# End Group -# Begin Group "cwrapper" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\..\testwrap\main.c - -!IF "$(CFG)" == "testwrap - Win32 Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "testwrap - Win32 Debug" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\..\..\testwrap\timing.c - -!IF "$(CFG)" == "testwrap - Win32 Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "testwrap - Win32 Debug" - -!ENDIF - -# End Source File -# End Group -# Begin Source File - -SOURCE=..\..\..\testwrap\debug.c - -!IF "$(CFG)" == "testwrap - Win32 Release" - -!ELSEIF "$(CFG)" == "testwrap - Win32 Debug" - -!ENDIF - -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/bsp/stm32_radio/mp3/real/scalfact.c b/bsp/stm32_radio/mp3/real/scalfact.c deleted file mode 100644 index ca921ebff4..0000000000 --- a/bsp/stm32_radio/mp3/real/scalfact.c +++ /dev/null @@ -1,391 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * scalfact.c - scalefactor unpacking functions - **************************************************************************************/ - -#include "coder.h" - -/* scale factor lengths (num bits) */ -static const char SFLenTab[16][2] = { - {0, 0}, {0, 1}, - {0, 2}, {0, 3}, - {3, 0}, {1, 1}, - {1, 2}, {1, 3}, - {2, 1}, {2, 2}, - {2, 3}, {3, 1}, - {3, 2}, {3, 3}, - {4, 2}, {4, 3}, -}; - -/************************************************************************************** - * Function: UnpackSFMPEG1 - * - * Description: unpack MPEG 1 scalefactors from bitstream - * - * Inputs: BitStreamInfo, SideInfoSub, ScaleFactorInfoSub structs for this - * granule/channel - * vector of scfsi flags from side info, length = 4 (MAX_SCFBD) - * index of current granule - * ScaleFactorInfoSub from granule 0 (for granule 1, if scfsi[i] is set, - * then we just replicate the scale factors from granule 0 in the - * i'th set of scalefactor bands) - * - * Outputs: updated BitStreamInfo struct - * scalefactors in sfis (short and/or long arrays, as appropriate) - * - * Return: none - * - * Notes: set order of short blocks to s[band][window] instead of s[window][band] - * so that we index through consectutive memory locations when unpacking - * (make sure dequantizer follows same convention) - * Illegal Intensity Position = 7 (always) for MPEG1 scale factors - **************************************************************************************/ -static void UnpackSFMPEG1(BitStreamInfo *bsi, SideInfoSub *sis, ScaleFactorInfoSub *sfis, int *scfsi, int gr, ScaleFactorInfoSub *sfisGr0) -{ - int sfb; - int slen0, slen1; - - /* these can be 0, so make sure GetBits(bsi, 0) returns 0 (no >> 32 or anything) */ - slen0 = (int)SFLenTab[sis->sfCompress][0]; - slen1 = (int)SFLenTab[sis->sfCompress][1]; - - if (sis->blockType == 2) { - /* short block, type 2 (implies winSwitchFlag == 1) */ - if (sis->mixedBlock) { - /* do long block portion */ - for (sfb = 0; sfb < 8; sfb++) - sfis->l[sfb] = (char)GetBits(bsi, slen0); - sfb = 3; - } else { - /* all short blocks */ - sfb = 0; - } - - for ( ; sfb < 6; sfb++) { - sfis->s[sfb][0] = (char)GetBits(bsi, slen0); - sfis->s[sfb][1] = (char)GetBits(bsi, slen0); - sfis->s[sfb][2] = (char)GetBits(bsi, slen0); - } - - for ( ; sfb < 12; sfb++) { - sfis->s[sfb][0] = (char)GetBits(bsi, slen1); - sfis->s[sfb][1] = (char)GetBits(bsi, slen1); - sfis->s[sfb][2] = (char)GetBits(bsi, slen1); - } - - /* last sf band not transmitted */ - sfis->s[12][0] = sfis->s[12][1] = sfis->s[12][2] = 0; - } else { - /* long blocks, type 0, 1, or 3 */ - if(gr == 0) { - /* first granule */ - for (sfb = 0; sfb < 11; sfb++) - sfis->l[sfb] = (char)GetBits(bsi, slen0); - for (sfb = 11; sfb < 21; sfb++) - sfis->l[sfb] = (char)GetBits(bsi, slen1); - return; - } else { - /* second granule - * scfsi: 0 = different scalefactors for each granule, 1 = copy sf's from granule 0 into granule 1 - * for block type == 2, scfsi is always 0 - */ - sfb = 0; - if(scfsi[0]) for( ; sfb < 6 ; sfb++) sfis->l[sfb] = sfisGr0->l[sfb]; - else for( ; sfb < 6 ; sfb++) sfis->l[sfb] = (char)GetBits(bsi, slen0); - if(scfsi[1]) for( ; sfb <11 ; sfb++) sfis->l[sfb] = sfisGr0->l[sfb]; - else for( ; sfb <11 ; sfb++) sfis->l[sfb] = (char)GetBits(bsi, slen0); - if(scfsi[2]) for( ; sfb <16 ; sfb++) sfis->l[sfb] = sfisGr0->l[sfb]; - else for( ; sfb <16 ; sfb++) sfis->l[sfb] = (char)GetBits(bsi, slen1); - if(scfsi[3]) for( ; sfb <21 ; sfb++) sfis->l[sfb] = sfisGr0->l[sfb]; - else for( ; sfb <21 ; sfb++) sfis->l[sfb] = (char)GetBits(bsi, slen1); - } - /* last sf band not transmitted */ - sfis->l[21] = 0; - sfis->l[22] = 0; - } -} - -/* NRTab[size + 3*is_right][block type][partition] - * block type index: 0 = (bt0,bt1,bt3), 1 = bt2 non-mixed, 2 = bt2 mixed - * partition: scale factor groups (sfb1 through sfb4) - * for block type = 2 (mixed or non-mixed) / by 3 is rolled into this table - * (for 3 short blocks per long block) - * see 2.4.3.2 in MPEG 2 (low sample rate) spec - * stuff rolled into this table: - * NRTab[x][1][y] --> (NRTab[x][1][y]) / 3 - * NRTab[x][2][>=1] --> (NRTab[x][2][>=1]) / 3 (first partition is long block) - */ -static const char NRTab[6][3][4] = { - /* non-intensity stereo */ - { {6, 5, 5, 5}, - {3, 3, 3, 3}, /* includes / 3 */ - {6, 3, 3, 3}, /* includes / 3 except for first entry */ - }, - { {6, 5, 7, 3}, - {3, 3, 4, 2}, - {6, 3, 4, 2}, - }, - { {11, 10, 0, 0}, - {6, 6, 0, 0}, - {6, 3, 6, 0}, /* spec = [15,18,0,0], but 15 = 6L + 9S, so move 9/3=3 into col 1, 18/3=6 into col 2 and adj. slen[1,2] below */ - }, - /* intensity stereo, right chan */ - { {7, 7, 7, 0}, - {4, 4, 4, 0}, - {6, 5, 4, 0}, - }, - { {6, 6, 6, 3}, - {4, 3, 3, 2}, - {6, 4, 3, 2}, - }, - { {8, 8, 5, 0}, - {5, 4, 3, 0}, - {6, 6, 3, 0}, - } -}; - -/************************************************************************************** - * Function: UnpackSFMPEG2 - * - * Description: unpack MPEG 2 scalefactors from bitstream - * - * Inputs: BitStreamInfo, SideInfoSub, ScaleFactorInfoSub structs for this - * granule/channel - * index of current granule and channel - * ScaleFactorInfoSub from this granule - * modeExt field from frame header, to tell whether intensity stereo is on - * ScaleFactorJS struct for storing IIP info used in Dequant() - * - * Outputs: updated BitStreamInfo struct - * scalefactors in sfis (short and/or long arrays, as appropriate) - * updated intensityScale and preFlag flags - * - * Return: none - * - * Notes: Illegal Intensity Position = (2^slen) - 1 for MPEG2 scale factors - * - * TODO: optimize the / and % stuff (only do one divide, get modulo x - * with (x / m) * m, etc.) - **************************************************************************************/ -static void UnpackSFMPEG2(BitStreamInfo *bsi, SideInfoSub *sis, ScaleFactorInfoSub *sfis, int gr, int ch, int modeExt, ScaleFactorJS *sfjs) -{ - - int i, sfb, sfcIdx, btIdx, nrIdx, iipTest; - int slen[4], nr[4]; - int sfCompress, preFlag, intensityScale; - - sfCompress = sis->sfCompress; - preFlag = 0; - intensityScale = 0; - - /* stereo mode bits (1 = on): bit 1 = mid-side on/off, bit 0 = intensity on/off */ - if (! ((modeExt & 0x01) && (ch == 1)) ) { - /* in other words: if ((modeExt & 0x01) == 0 || ch == 0) */ - if (sfCompress < 400) { - /* max slen = floor[(399/16) / 5] = 4 */ - slen[0] = (sfCompress >> 4) / 5; - slen[1]= (sfCompress >> 4) % 5; - slen[2]= (sfCompress & 0x0f) >> 2; - slen[3]= (sfCompress & 0x03); - sfcIdx = 0; - } else if (sfCompress < 500) { - /* max slen = floor[(99/4) / 5] = 4 */ - sfCompress -= 400; - slen[0] = (sfCompress >> 2) / 5; - slen[1]= (sfCompress >> 2) % 5; - slen[2]= (sfCompress & 0x03); - slen[3]= 0; - sfcIdx = 1; - } else { - /* max slen = floor[11/3] = 3 (sfCompress = 9 bits in MPEG2) */ - sfCompress -= 500; - slen[0] = sfCompress / 3; - slen[1] = sfCompress % 3; - slen[2] = slen[3] = 0; - if (sis->mixedBlock) { - /* adjust for long/short mix logic (see comment above in NRTab[] definition) */ - slen[2] = slen[1]; - slen[1] = slen[0]; - } - preFlag = 1; - sfcIdx = 2; - } - } else { - /* intensity stereo ch = 1 (right) */ - intensityScale = sfCompress & 0x01; - sfCompress >>= 1; - if (sfCompress < 180) { - /* max slen = floor[35/6] = 5 (from mod 36) */ - slen[0] = (sfCompress / 36); - slen[1] = (sfCompress % 36) / 6; - slen[2] = (sfCompress % 36) % 6; - slen[3] = 0; - sfcIdx = 3; - } else if (sfCompress < 244) { - /* max slen = floor[63/16] = 3 */ - sfCompress -= 180; - slen[0] = (sfCompress & 0x3f) >> 4; - slen[1] = (sfCompress & 0x0f) >> 2; - slen[2] = (sfCompress & 0x03); - slen[3] = 0; - sfcIdx = 4; - } else { - /* max slen = floor[11/3] = 3 (max sfCompress >> 1 = 511/2 = 255) */ - sfCompress -= 244; - slen[0] = (sfCompress / 3); - slen[1] = (sfCompress % 3); - slen[2] = slen[3] = 0; - sfcIdx = 5; - } - } - - /* set index based on block type: (0,1,3) --> 0, (2 non-mixed) --> 1, (2 mixed) ---> 2 */ - btIdx = 0; - if (sis->blockType == 2) - btIdx = (sis->mixedBlock ? 2 : 1); - for (i = 0; i < 4; i++) - nr[i] = (int)NRTab[sfcIdx][btIdx][i]; - - /* save intensity stereo scale factor info */ - if( (modeExt & 0x01) && (ch == 1) ) { - for (i = 0; i < 4; i++) { - sfjs->slen[i] = slen[i]; - sfjs->nr[i] = nr[i]; - } - sfjs->intensityScale = intensityScale; - } - sis->preFlag = preFlag; - - /* short blocks */ - if(sis->blockType == 2) { - if(sis->mixedBlock) { - /* do long block portion */ - iipTest = (1 << slen[0]) - 1; - for (sfb=0; sfb < 6; sfb++) { - sfis->l[sfb] = (char)GetBits(bsi, slen[0]); - } - sfb = 3; /* start sfb for short */ - nrIdx = 1; - } else { - /* all short blocks, so start nr, sfb at 0 */ - sfb = 0; - nrIdx = 0; - } - - /* remaining short blocks, sfb just keeps incrementing */ - for ( ; nrIdx <= 3; nrIdx++) { - iipTest = (1 << slen[nrIdx]) - 1; - for (i=0; i < nr[nrIdx]; i++, sfb++) { - sfis->s[sfb][0] = (char)GetBits(bsi, slen[nrIdx]); - sfis->s[sfb][1] = (char)GetBits(bsi, slen[nrIdx]); - sfis->s[sfb][2] = (char)GetBits(bsi, slen[nrIdx]); - } - } - /* last sf band not transmitted */ - sfis->s[12][0] = sfis->s[12][1] = sfis->s[12][2] = 0; - } else { - /* long blocks */ - sfb = 0; - for (nrIdx = 0; nrIdx <= 3; nrIdx++) { - iipTest = (1 << slen[nrIdx]) - 1; - for(i=0; i < nr[nrIdx]; i++, sfb++) { - sfis->l[sfb] = (char)GetBits(bsi, slen[nrIdx]); - } - } - /* last sf band not transmitted */ - sfis->l[21] = sfis->l[22] = 0; - - } -} - -/************************************************************************************** - * Function: UnpackScaleFactors - * - * Description: parse the fields of the MP3 scale factor data section - * - * Inputs: MP3DecInfo structure filled by UnpackFrameHeader() and UnpackSideInfo() - * buffer pointing to the MP3 scale factor data - * pointer to bit offset (0-7) indicating starting bit in buf[0] - * number of bits available in data buffer - * index of current granule and channel - * - * Outputs: updated platform-specific ScaleFactorInfo struct - * updated bitOffset - * - * Return: length (in bytes) of scale factor data, -1 if null input pointers - **************************************************************************************/ -int UnpackScaleFactors(MP3DecInfo *mp3DecInfo, unsigned char *buf, int *bitOffset, int bitsAvail, int gr, int ch) -{ - int bitsUsed; - unsigned char *startBuf; - BitStreamInfo bitStreamInfo, *bsi; - FrameHeader *fh; - SideInfo *si; - ScaleFactorInfo *sfi; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->FrameHeaderPS || !mp3DecInfo->SideInfoPS || !mp3DecInfo->ScaleFactorInfoPS) - return -1; - fh = ((FrameHeader *)(mp3DecInfo->FrameHeaderPS)); - si = ((SideInfo *)(mp3DecInfo->SideInfoPS)); - sfi = ((ScaleFactorInfo *)(mp3DecInfo->ScaleFactorInfoPS)); - - /* init GetBits reader */ - startBuf = buf; - bsi = &bitStreamInfo; - SetBitstreamPointer(bsi, (bitsAvail + *bitOffset + 7) / 8, buf); - if (*bitOffset) - GetBits(bsi, *bitOffset); - - if (fh->ver == MPEG1) - UnpackSFMPEG1(bsi, &si->sis[gr][ch], &sfi->sfis[gr][ch], si->scfsi[ch], gr, &sfi->sfis[0][ch]); - else - UnpackSFMPEG2(bsi, &si->sis[gr][ch], &sfi->sfis[gr][ch], gr, ch, fh->modeExt, &sfi->sfjs); - - mp3DecInfo->part23Length[gr][ch] = si->sis[gr][ch].part23Length; - - bitsUsed = CalcBitsUsed(bsi, buf, *bitOffset); - buf += (bitsUsed + *bitOffset) >> 3; - *bitOffset = (bitsUsed + *bitOffset) & 0x07; - - return (buf - startBuf); -} - diff --git a/bsp/stm32_radio/mp3/real/stproc.c b/bsp/stm32_radio/mp3/real/stproc.c deleted file mode 100644 index 4f6a751b49..0000000000 --- a/bsp/stm32_radio/mp3/real/stproc.c +++ /dev/null @@ -1,296 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * stproc.c - mid-side and intensity (MPEG1 and MPEG2) stereo processing - **************************************************************************************/ - -#include "coder.h" -#include "assembly.h" - -/************************************************************************************** - * Function: MidSideProc - * - * Description: sum-difference stereo reconstruction - * - * Inputs: vector x with dequantized samples from left and right channels - * number of non-zero samples (MAX of left and right) - * assume 1 guard bit in input - * guard bit mask (left and right channels) - * - * Outputs: updated sample vector x - * updated guard bit mask - * - * Return: none - * - * Notes: assume at least 1 GB in input - **************************************************************************************/ -void MidSideProc(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, int mOut[2]) -{ - int i, xr, xl, mOutL, mOutR; - - /* L = (M+S)/sqrt(2), R = (M-S)/sqrt(2) - * NOTE: 1/sqrt(2) done in DequantChannel() - see comments there - */ - mOutL = mOutR = 0; - for(i = 0; i < nSamps; i++) { - xl = x[0][i]; - xr = x[1][i]; - x[0][i] = xl + xr; - x[1][i] = xl - xr; - mOutL |= FASTABS(x[0][i]); - mOutR |= FASTABS(x[1][i]); - } - mOut[0] |= mOutL; - mOut[1] |= mOutR; -} - -/************************************************************************************** - * Function: IntensityProcMPEG1 - * - * Description: intensity stereo processing for MPEG1 - * - * Inputs: vector x with dequantized samples from left and right channels - * number of non-zero samples in left channel - * valid FrameHeader struct - * two each of ScaleFactorInfoSub, CriticalBandInfo structs (both channels) - * flags indicating midSide on/off, mixedBlock on/off - * guard bit mask (left and right channels) - * - * Outputs: updated sample vector x - * updated guard bit mask - * - * Return: none - * - * Notes: assume at least 1 GB in input - * - * TODO: combine MPEG1/2 into one function (maybe) - * make sure all the mixed-block and IIP logic is right - **************************************************************************************/ -void IntensityProcMPEG1(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, - CriticalBandInfo *cbi, int midSideFlag, int mixFlag, int mOut[2]) -{ - int i=0, j=0, n=0, cb=0, w=0; - int sampsLeft, isf, mOutL, mOutR, xl, xr; - int fl, fr, fls[3], frs[3]; - int cbStartL=0, cbStartS=0, cbEndL=0, cbEndS=0; - int *isfTab; - - /* NOTE - this works fine for mixed blocks, as long as the switch point starts in the - * short block section (i.e. on or after sample 36 = sfBand->l[8] = 3*sfBand->s[3] - * is this a safe assumption? - * TODO - intensity + mixed not quite right (diff = 11 on he_mode) - * figure out correct implementation (spec ambiguous about when to do short block reorder) - */ - if (cbi[1].cbType == 0) { - /* long block */ - cbStartL = cbi[1].cbEndL + 1; - cbEndL = cbi[0].cbEndL + 1; - cbStartS = cbEndS = 0; - i = fh->sfBand->l[cbStartL]; - } else if (cbi[1].cbType == 1 || cbi[1].cbType == 2) { - /* short or mixed block */ - cbStartS = cbi[1].cbEndSMax + 1; - cbEndS = cbi[0].cbEndSMax + 1; - cbStartL = cbEndL = 0; - i = 3 * fh->sfBand->s[cbStartS]; - } - - sampsLeft = nSamps - i; /* process to length of left */ - isfTab = (int *)ISFMpeg1[midSideFlag]; - mOutL = mOutR = 0; - - /* long blocks */ - for (cb = cbStartL; cb < cbEndL && sampsLeft > 0; cb++) { - isf = sfis->l[cb]; - if (isf == 7) { - fl = ISFIIP[midSideFlag][0]; - fr = ISFIIP[midSideFlag][1]; - } else { - fl = isfTab[isf]; - fr = isfTab[6] - isfTab[isf]; - } - - n = fh->sfBand->l[cb + 1] - fh->sfBand->l[cb]; - for (j = 0; j < n && sampsLeft > 0; j++, i++) { - xr = MULSHIFT32(fr, x[0][i]) << 2; x[1][i] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fl, x[0][i]) << 2; x[0][i] = xl; mOutL |= FASTABS(xl); - sampsLeft--; - } - } - - /* short blocks */ - for (cb = cbStartS; cb < cbEndS && sampsLeft >= 3; cb++) { - for (w = 0; w < 3; w++) { - isf = sfis->s[cb][w]; - if (isf == 7) { - fls[w] = ISFIIP[midSideFlag][0]; - frs[w] = ISFIIP[midSideFlag][1]; - } else { - fls[w] = isfTab[isf]; - frs[w] = isfTab[6] - isfTab[isf]; - } - } - - n = fh->sfBand->s[cb + 1] - fh->sfBand->s[cb]; - for (j = 0; j < n && sampsLeft >= 3; j++, i+=3) { - xr = MULSHIFT32(frs[0], x[0][i+0]) << 2; x[1][i+0] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fls[0], x[0][i+0]) << 2; x[0][i+0] = xl; mOutL |= FASTABS(xl); - xr = MULSHIFT32(frs[1], x[0][i+1]) << 2; x[1][i+1] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fls[1], x[0][i+1]) << 2; x[0][i+1] = xl; mOutL |= FASTABS(xl); - xr = MULSHIFT32(frs[2], x[0][i+2]) << 2; x[1][i+2] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fls[2], x[0][i+2]) << 2; x[0][i+2] = xl; mOutL |= FASTABS(xl); - sampsLeft -= 3; - } - } - mOut[0] = mOutL; - mOut[1] = mOutR; - - return; -} - -/************************************************************************************** - * Function: IntensityProcMPEG2 - * - * Description: intensity stereo processing for MPEG2 - * - * Inputs: vector x with dequantized samples from left and right channels - * number of non-zero samples in left channel - * valid FrameHeader struct - * two each of ScaleFactorInfoSub, CriticalBandInfo structs (both channels) - * ScaleFactorJS struct with joint stereo info from UnpackSFMPEG2() - * flags indicating midSide on/off, mixedBlock on/off - * guard bit mask (left and right channels) - * - * Outputs: updated sample vector x - * updated guard bit mask - * - * Return: none - * - * Notes: assume at least 1 GB in input - * - * TODO: combine MPEG1/2 into one function (maybe) - * make sure all the mixed-block and IIP logic is right - * probably redo IIP logic to be simpler - **************************************************************************************/ -void IntensityProcMPEG2(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, - CriticalBandInfo *cbi, ScaleFactorJS *sfjs, int midSideFlag, int mixFlag, int mOut[2]) -{ - int i, j, k, n, r, cb, w; - int fl, fr, mOutL, mOutR, xl, xr; - int sampsLeft; - int isf, sfIdx, tmp, il[23]; - int *isfTab; - int cbStartL, cbStartS, cbEndL, cbEndS; - - isfTab = (int *)ISFMpeg2[sfjs->intensityScale][midSideFlag]; - mOutL = mOutR = 0; - - /* fill buffer with illegal intensity positions (depending on slen) */ - for (k = r = 0; r < 4; r++) { - tmp = (1 << sfjs->slen[r]) - 1; - for (j = 0; j < sfjs->nr[r]; j++, k++) - il[k] = tmp; - } - - if (cbi[1].cbType == 0) { - /* long blocks */ - il[21] = il[22] = 1; - cbStartL = cbi[1].cbEndL + 1; /* start at end of right */ - cbEndL = cbi[0].cbEndL + 1; /* process to end of left */ - i = fh->sfBand->l[cbStartL]; - sampsLeft = nSamps - i; - - for(cb = cbStartL; cb < cbEndL; cb++) { - sfIdx = sfis->l[cb]; - if (sfIdx == il[cb]) { - fl = ISFIIP[midSideFlag][0]; - fr = ISFIIP[midSideFlag][1]; - } else { - isf = (sfis->l[cb] + 1) >> 1; - fl = isfTab[(sfIdx & 0x01 ? isf : 0)]; - fr = isfTab[(sfIdx & 0x01 ? 0 : isf)]; - } - n = MIN(fh->sfBand->l[cb + 1] - fh->sfBand->l[cb], sampsLeft); - - for(j = 0; j < n; j++, i++) { - xr = MULSHIFT32(fr, x[0][i]) << 2; x[1][i] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fl, x[0][i]) << 2; x[0][i] = xl; mOutL |= FASTABS(xl); - } - - /* early exit once we've used all the non-zero samples */ - sampsLeft -= n; - if (sampsLeft == 0) - break; - } - } else { - /* short or mixed blocks */ - il[12] = 1; - - for(w = 0; w < 3; w++) { - cbStartS = cbi[1].cbEndS[w] + 1; /* start at end of right */ - cbEndS = cbi[0].cbEndS[w] + 1; /* process to end of left */ - i = 3 * fh->sfBand->s[cbStartS] + w; - - /* skip through sample array by 3, so early-exit logic would be more tricky */ - for(cb = cbStartS; cb < cbEndS; cb++) { - sfIdx = sfis->s[cb][w]; - if (sfIdx == il[cb]) { - fl = ISFIIP[midSideFlag][0]; - fr = ISFIIP[midSideFlag][1]; - } else { - isf = (sfis->s[cb][w] + 1) >> 1; - fl = isfTab[(sfIdx & 0x01 ? isf : 0)]; - fr = isfTab[(sfIdx & 0x01 ? 0 : isf)]; - } - n = fh->sfBand->s[cb + 1] - fh->sfBand->s[cb]; - - for(j = 0; j < n; j++, i+=3) { - xr = MULSHIFT32(fr, x[0][i]) << 2; x[1][i] = xr; mOutR |= FASTABS(xr); - xl = MULSHIFT32(fl, x[0][i]) << 2; x[0][i] = xl; mOutL |= FASTABS(xl); - } - } - } - } - mOut[0] = mOutL; - mOut[1] = mOutR; - - return; -} - diff --git a/bsp/stm32_radio/mp3/real/subband.c b/bsp/stm32_radio/mp3/real/subband.c deleted file mode 100644 index c0e6c3dce6..0000000000 --- a/bsp/stm32_radio/mp3/real/subband.c +++ /dev/null @@ -1,96 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * subband.c - subband transform (synthesis filterbank implemented via 32-point DCT - * followed by polyphase filter) - **************************************************************************************/ - -#include "coder.h" -#include "assembly.h" - -/************************************************************************************** - * Function: Subband - * - * Description: do subband transform on all the blocks in one granule, all channels - * - * Inputs: filled MP3DecInfo structure, after calling IMDCT for all channels - * vbuf[ch] and vindex[ch] must be preserved between calls - * - * Outputs: decoded PCM data, interleaved LRLRLR... if stereo - * - * Return: 0 on success, -1 if null input pointers - **************************************************************************************/ -int Subband(MP3DecInfo *mp3DecInfo, short *pcmBuf) -{ - int b; - HuffmanInfo *hi; - IMDCTInfo *mi; - SubbandInfo *sbi; - - /* validate pointers */ - if (!mp3DecInfo || !mp3DecInfo->HuffmanInfoPS || !mp3DecInfo->IMDCTInfoPS || !mp3DecInfo->SubbandInfoPS) - return -1; - - hi = (HuffmanInfo *)mp3DecInfo->HuffmanInfoPS; - mi = (IMDCTInfo *)(mp3DecInfo->IMDCTInfoPS); - sbi = (SubbandInfo*)(mp3DecInfo->SubbandInfoPS); - - if (mp3DecInfo->nChans == 2) { - /* stereo */ - for (b = 0; b < BLOCK_SIZE; b++) { - FDCT32(mi->outBuf[0][b], sbi->vbuf + 0*32, sbi->vindex, (b & 0x01), mi->gb[0]); - FDCT32(mi->outBuf[1][b], sbi->vbuf + 1*32, sbi->vindex, (b & 0x01), mi->gb[1]); - PolyphaseStereo(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef); - sbi->vindex = (sbi->vindex - (b & 0x01)) & 7; - pcmBuf += (2 * NBANDS); - } - } else { - /* mono */ - for (b = 0; b < BLOCK_SIZE; b++) { - FDCT32(mi->outBuf[0][b], sbi->vbuf + 0*32, sbi->vindex, (b & 0x01), mi->gb[0]); - PolyphaseMono(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef); - sbi->vindex = (sbi->vindex - (b & 0x01)) & 7; - pcmBuf += NBANDS; - } - } - - return 0; -} - diff --git a/bsp/stm32_radio/mp3/real/trigtabs.c b/bsp/stm32_radio/mp3/real/trigtabs.c deleted file mode 100644 index d3a1d8cc11..0000000000 --- a/bsp/stm32_radio/mp3/real/trigtabs.c +++ /dev/null @@ -1,311 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: RCSL 1.0/RPSL 1.0 - * - * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. - * - * The contents of this file, and the files included with this file, are - * subject to the current version of the RealNetworks Public Source License - * Version 1.0 (the "RPSL") available at - * http://www.helixcommunity.org/content/rpsl unless you have licensed - * the file under the RealNetworks Community Source License Version 1.0 - * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, - * in which case the RCSL will apply. You may also obtain the license terms - * directly from RealNetworks. You may not use this file except in - * compliance with the RPSL or, if you have a valid RCSL with RealNetworks - * applicable to this file, the RCSL. Please see the applicable RPSL or - * RCSL for the rights, obligations and limitations governing use of the - * contents of the file. - * - * This file is part of the Helix DNA Technology. RealNetworks is the - * developer of the Original Code and owns the copyrights in the portions - * it created. - * - * This file, and the files included with this file, is distributed and made - * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * - * Technology Compatibility Kit Test Suite(s) Location: - * http://www.helixcommunity.org/content/tck - * - * Contributor(s): - * - * ***** END LICENSE BLOCK ***** */ - -/************************************************************************************** - * Fixed-point MP3 decoder - * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com) - * June 2003 - * - * trigtabs.c - global ROM tables for pre-calculated trig coefficients - **************************************************************************************/ - -#include "coder.h" - -/* post-IMDCT window, win[blockType][i] - * format = Q31 - * Fused sin window with final stage of IMDCT - * includes 1/sqrt(2) scaling, since we scale by sqrt(2) in dequant in order - * for fast IMDCT36 to be usable - * - * for(i=0;i<9;i++) win[0][i] = sin(pi/36 *(i+0.5)); - * for(i=9;i<36;i++) win[0][i] = -sin(pi/36 *(i+0.5)); - * - * for(i=0;i<9;i++) win[1][i] = sin(pi/36 *(i+0.5)); - * for(i=9;i<18;i++) win[1][i] = -sin(pi/36 *(i+0.5)); - * for(i=18;i<24;i++) win[1][i] = -1; - * for(i=24;i<30;i++) win[1][i] = -sin(pi/12 *(i+0.5-18)); - * for(i=30;i<36;i++) win[1][i] = 0; - * - * for(i=0;i<6;i++) win[3][i] = 0; - * for(i=6;i<9;i++) win[3][i] = sin(pi/12 *(i+0.5-6)); - * for(i=9;i<12;i++) win[3][i] = -sin(pi/12 *(i+0.5-6)); - * for(i=12;i<18;i++) win[3][i] = -1; - * for(i=18;i<36;i++) win[3][i] = -sin(pi/36*(i+0.5)); - * - * for(i=0;i<3;i++) win[2][i] = sin(pi/12*(i+0.5)); - * for(i=3;i<12;i++) win[2][i] = -sin(pi/12*(i+0.5)); - * for(i=12;i<36;i++) win[2][i] = 0; - * - * for (i = 0; i < 4; i++) { - * if (i == 2) { - * win[i][8] *= cos(pi/12 * (0+0.5)); - * win[i][9] *= cos(pi/12 * (0+0.5)); - * win[i][7] *= cos(pi/12 * (1+0.5)); - * win[i][10] *= cos(pi/12 * (1+0.5)); - * win[i][6] *= cos(pi/12 * (2+0.5)); - * win[i][11] *= cos(pi/12 * (2+0.5)); - * win[i][0] *= cos(pi/12 * (3+0.5)); - * win[i][5] *= cos(pi/12 * (3+0.5)); - * win[i][1] *= cos(pi/12 * (4+0.5)); - * win[i][4] *= cos(pi/12 * (4+0.5)); - * win[i][2] *= cos(pi/12 * (5+0.5)); - * win[i][3] *= cos(pi/12 * (5+0.5)); - * } else { - * for (j = 0; j < 9; j++) { - * win[i][8-j] *= cos(pi/36 * (17-j+0.5)); - * win[i][9+j] *= cos(pi/36 * (17-j+0.5)); - * } - * for (j = 0; j < 9; j++) { - * win[i][18+8-j] *= cos(pi/36 * (j+0.5)); - * win[i][18+9+j] *= cos(pi/36 * (j+0.5)); - * } - * } - * } - * for (i = 0; i < 4; i++) - * for (j = 0; j < 36; j++) - * win[i][j] *= 1.0 / sqrt(2); - */ -const int imdctWin[4][36] = { - { - 0x02aace8b, 0x07311c28, 0x0a868fec, 0x0c913b52, 0x0d413ccd, 0x0c913b52, 0x0a868fec, 0x07311c28, - 0x02aace8b, 0xfd16d8dd, 0xf6a09e66, 0xef7a6275, 0xe7dbc161, 0xe0000000, 0xd8243e9f, 0xd0859d8b, - 0xc95f619a, 0xc2e92723, 0xbd553175, 0xb8cee3d8, 0xb5797014, 0xb36ec4ae, 0xb2bec333, 0xb36ec4ae, - 0xb5797014, 0xb8cee3d8, 0xbd553175, 0xc2e92723, 0xc95f619a, 0xd0859d8b, 0xd8243e9f, 0xe0000000, - 0xe7dbc161, 0xef7a6275, 0xf6a09e66, 0xfd16d8dd, - }, - { - 0x02aace8b, 0x07311c28, 0x0a868fec, 0x0c913b52, 0x0d413ccd, 0x0c913b52, 0x0a868fec, 0x07311c28, - 0x02aace8b, 0xfd16d8dd, 0xf6a09e66, 0xef7a6275, 0xe7dbc161, 0xe0000000, 0xd8243e9f, 0xd0859d8b, - 0xc95f619a, 0xc2e92723, 0xbd44ef14, 0xb831a052, 0xb3aa3837, 0xafb789a4, 0xac6145bb, 0xa9adecdc, - 0xa864491f, 0xad1868f0, 0xb8431f49, 0xc8f42236, 0xdda8e6b1, 0xf47755dc, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - }, - { - 0x07311c28, 0x0d413ccd, 0x07311c28, 0xf6a09e66, 0xe0000000, 0xc95f619a, 0xb8cee3d8, 0xb2bec333, - 0xb8cee3d8, 0xc95f619a, 0xe0000000, 0xf6a09e66, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - }, - { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x028e9709, 0x04855ec0, - 0x026743a1, 0xfcde2c10, 0xf515dc82, 0xec93e53b, 0xe4c880f8, 0xdd5d0b08, 0xd63510b7, 0xcf5e834a, - 0xc8e6b562, 0xc2da4105, 0xbd553175, 0xb8cee3d8, 0xb5797014, 0xb36ec4ae, 0xb2bec333, 0xb36ec4ae, - 0xb5797014, 0xb8cee3d8, 0xbd553175, 0xc2e92723, 0xc95f619a, 0xd0859d8b, 0xd8243e9f, 0xe0000000, - 0xe7dbc161, 0xef7a6275, 0xf6a09e66, 0xfd16d8dd, - }, -}; - -/* indexing = [mid-side off/on][intensity scale factor] - * format = Q30, range = [0.0, 1.414] - * - * mid-side off: - * ISFMpeg1[0][i] = tan(i*pi/12) / [1 + tan(i*pi/12)] (left scalefactor) - * = 1 / [1 + tan(i*pi/12)] (right scalefactor) - * - * mid-side on: - * ISFMpeg1[1][i] = sqrt(2) * ISFMpeg1[0][i] - * - * output L = ISFMpeg1[midSide][isf][0] * input L - * output R = ISFMpeg1[midSide][isf][1] * input L - * - * obviously left scalefactor + right scalefactor = 1 (m-s off) or sqrt(2) (m-s on) - * so just store left and calculate right as 1 - left - * (can derive as right = ISFMpeg1[x][6] - left) - * - * if mid-side enabled, multiply joint stereo scale factors by sqrt(2) - * - we scaled whole spectrum by 1/sqrt(2) in Dequant for the M+S/sqrt(2) in MidSideProc - * - but the joint stereo part of the spectrum doesn't need this, so we have to undo it - * - * if scale factor is and illegal intensity position, this becomes a passthrough - * - gain = [1, 0] if mid-side off, since L is coded directly and R = 0 in this region - * - gain = [1, 1] if mid-side on, since L = (M+S)/sqrt(2), R = (M-S)/sqrt(2) - * - and since S = 0 in the joint stereo region (above NZB right) then L = R = M * 1.0 - */ -const int ISFMpeg1[2][7] = { - {0x00000000, 0x0d8658ba, 0x176cf5d0, 0x20000000, 0x28930a2f, 0x3279a745, 0x40000000}, - {0x00000000, 0x13207f5c, 0x2120fb83, 0x2d413ccc, 0x39617e16, 0x4761fa3d, 0x5a827999} -}; - -/* indexing = [intensity scale on/off][mid-side off/on][intensity scale factor] - * format = Q30, range = [0.0, 1.414] - * - * if (isf == 0) kl = 1.0 kr = 1.0 - * else if (isf & 0x01 == 0x01) kl = i0^((isf+1)/2), kr = 1.0 - * else if (isf & 0x01 == 0x00) kl = 1.0, kr = i0^(isf/2) - * - * if (intensityScale == 1) i0 = 1/sqrt(2) = 0x2d413ccc (Q30) - * else i0 = 1/sqrt(sqrt(2)) = 0x35d13f32 (Q30) - * - * see comments for ISFMpeg1 (just above) regarding scaling, sqrt(2), etc. - * - * compress the MPEG2 table using the obvious identities above... - * for isf = [0, 1, 2, ... 30], let sf = table[(isf+1) >> 1] - * - if isf odd, L = sf*L, R = tab[0]*R - * - if isf even, L = tab[0]*L, R = sf*R - */ -const int ISFMpeg2[2][2][16] = { -{ - { - /* intensityScale off, mid-side off */ - 0x40000000, 0x35d13f32, 0x2d413ccc, 0x260dfc14, 0x1fffffff, 0x1ae89f99, 0x16a09e66, 0x1306fe0a, - 0x0fffffff, 0x0d744fcc, 0x0b504f33, 0x09837f05, 0x07ffffff, 0x06ba27e6, 0x05a82799, 0x04c1bf82, - }, - { - /* intensityScale off, mid-side on */ - 0x5a827999, 0x4c1bf827, 0x3fffffff, 0x35d13f32, 0x2d413ccc, 0x260dfc13, 0x1fffffff, 0x1ae89f99, - 0x16a09e66, 0x1306fe09, 0x0fffffff, 0x0d744fcc, 0x0b504f33, 0x09837f04, 0x07ffffff, 0x06ba27e6, - }, -}, -{ - { - /* intensityScale on, mid-side off */ - 0x40000000, 0x2d413ccc, 0x20000000, 0x16a09e66, 0x10000000, 0x0b504f33, 0x08000000, 0x05a82799, - 0x04000000, 0x02d413cc, 0x02000000, 0x016a09e6, 0x01000000, 0x00b504f3, 0x00800000, 0x005a8279, - }, - /* intensityScale on, mid-side on */ - { - 0x5a827999, 0x3fffffff, 0x2d413ccc, 0x1fffffff, 0x16a09e66, 0x0fffffff, 0x0b504f33, 0x07ffffff, - 0x05a82799, 0x03ffffff, 0x02d413cc, 0x01ffffff, 0x016a09e6, 0x00ffffff, 0x00b504f3, 0x007fffff, - } -} -}; - -/* indexing = [intensity scale on/off][left/right] - * format = Q30, range = [0.0, 1.414] - * - * illegal intensity position scalefactors (see comments on ISFMpeg1) - */ -const int ISFIIP[2][2] = { - {0x40000000, 0x00000000}, /* mid-side off */ - {0x40000000, 0x40000000}, /* mid-side on */ -}; - -const unsigned char uniqueIDTab[8] = {0x5f, 0x4b, 0x43, 0x5f, 0x5f, 0x4a, 0x52, 0x5f}; - -/* anti-alias coefficients - see spec Annex B, table 3-B.9 - * csa[0][i] = CSi, csa[1][i] = CAi - * format = Q31 - */ -const int csa[8][2] = { - {0x6dc253f0, 0xbe2500aa}, - {0x70dcebe4, 0xc39e4949}, - {0x798d6e73, 0xd7e33f4a}, - {0x7ddd40a7, 0xe8b71176}, - {0x7f6d20b7, 0xf3e4fe2f}, - {0x7fe47e40, 0xfac1a3c7}, - {0x7ffcb263, 0xfe2ebdc6}, - {0x7fffc694, 0xff86c25d}, -}; - -/* format = Q30, range = [0.0981, 1.9976] - * - * n = 16; - * k = 0; - * for(i=0; i<5; i++, n=n/2) { - * for(p=0; p -#include - -#include "netbuffer.h" -#include "player_ui.h" -#include "player_bg.h" - -#define MP3_DECODE_MP_CNT 2 -#define MP3_DECODE_MP_SZ 2560 - -static rt_uint8_t mempool[(MP3_DECODE_MP_SZ * 2 + 4)* 2]; // 5k x 2 -static struct rt_mempool _mp; -static rt_bool_t is_inited = RT_FALSE; - -rt_size_t sbuf_get_size() -{ - return MP3_DECODE_MP_SZ * 2; -} - -void sbuf_init() -{ - rt_mp_init(&_mp, "mp3", &mempool[0], sizeof(mempool), MP3_DECODE_MP_SZ * 2); -} - -void* sbuf_alloc() -{ - if (is_inited == RT_FALSE) - { - sbuf_init(); - is_inited = RT_TRUE; - } - - return (rt_uint16_t*)rt_mp_alloc(&_mp, RT_WAITING_FOREVER); -} - -void sbuf_release(void* ptr) -{ - rt_mp_free(ptr); -} - -#if STM32_EXT_SRAM -/* netbuf worker stat */ -#define NETBUF_STAT_STOPPED 0 -#define NETBUF_STAT_BUFFERING 1 -#define NETBUF_STAT_SUSPEND 2 -#define NETBUF_STAT_STOPPING 3 - -/* net buffer module */ -struct net_buffer -{ - /* read index and save index in the buffer */ - rt_size_t read_index, save_index; - - /* buffer data and size of buffer */ - rt_uint8_t* buffer_data; - rt_size_t data_length; - rt_size_t size; - - /* buffer ready water mater */ - rt_uint32_t ready_wm, resume_wm; - rt_bool_t is_wait_ready; - rt_sem_t wait_ready, wait_resume; - - /* netbuf worker stat */ - rt_uint8_t stat; -}; -struct net_buffer_job -{ - rt_size_t (*fetch)(rt_uint8_t* ptr, rt_size_t len, void* parameter); - void (*close)(void* parameter); - - void* parameter; -}; - -static struct net_buffer _netbuf; -static rt_mq_t _netbuf_mq = RT_NULL; - -/* netbuf worker public API */ -rt_size_t net_buf_read(rt_uint8_t* buffer, rt_size_t length) -{ - rt_size_t data_length, read_index; - rt_uint32_t level; - - data_length = _netbuf.data_length; - - if ((data_length == 0) && - (_netbuf.stat == NETBUF_STAT_BUFFERING || _netbuf.stat == NETBUF_STAT_SUSPEND)) - { - rt_err_t result; - - /* buffer is not ready. */ - _netbuf.is_wait_ready = RT_TRUE; - rt_kprintf("wait ready, data len: %d, stat %d\n", data_length, _netbuf.stat); - /* set buffer status to buffering */ - player_set_buffer_status(RT_TRUE); - result = rt_sem_take(_netbuf.wait_ready, RT_WAITING_FOREVER); - - /* take semaphore failed, netbuf worker is stopped */ - if (result != RT_EOK) return 0; - } - - /* get read and save index */ - read_index = _netbuf.read_index; - /* re-get data legnth */ - data_length = _netbuf.data_length; - - /* set the length */ - if (length > data_length) length = data_length; - - // rt_kprintf("data len: %d, read idx %d\n", data_length, read_index); - if (data_length > 0) - { - /* copy buffer */ - if (_netbuf.size - read_index > length) - { - rt_memcpy(buffer, &_netbuf.buffer_data[read_index], - length); - _netbuf.read_index += length; - } - else - { - rt_memcpy(buffer, &_netbuf.buffer_data[read_index], - _netbuf.size - read_index); - rt_memcpy(&buffer[_netbuf.size - read_index], - &_netbuf.buffer_data[0], - length - (_netbuf.size - read_index)); - _netbuf.read_index = length - (_netbuf.size - read_index); - } - - level = rt_hw_interrupt_disable(); - _netbuf.data_length -= length; - data_length = _netbuf.data_length; - - if ((_netbuf.stat == NETBUF_STAT_SUSPEND) && data_length < _netbuf.resume_wm) - { - _netbuf.stat = NETBUF_STAT_BUFFERING; - rt_hw_interrupt_enable(level); - - /* resume netbuf worker */ - rt_kprintf("stat[suspend] -> buffering\n"); - rt_sem_release(_netbuf.wait_resume); - } - else - { - rt_hw_interrupt_enable(level); - } - } - - return length; -} - -int net_buf_start_job(rt_size_t (*fetch)(rt_uint8_t* ptr, rt_size_t len, void* parameter), - void (*close)(void* parameter), - void* parameter) -{ - struct net_buffer_job job; - rt_uint32_t level; - - /* job message */ - job.fetch = fetch; - job.close = close; - job.parameter = parameter; - - level = rt_hw_interrupt_disable(); - /* check netbuf worker is stopped */ - if (_netbuf.stat == NETBUF_STAT_STOPPED) - { - /* change stat to buffering if netbuf stopped */ - _netbuf.stat = NETBUF_STAT_BUFFERING; - rt_hw_interrupt_enable(level); - - rt_kprintf("stat[stoppped] -> buffering\n"); - - rt_mq_send(_netbuf_mq, (void*)&job, sizeof(struct net_buffer_job)); - return 0; - } - rt_hw_interrupt_enable(level); - - return -1; -} - -void net_buf_stop_job() -{ - rt_uint32_t level; - - level = rt_hw_interrupt_disable(); - if (_netbuf.stat == NETBUF_STAT_SUSPEND) - { - /* resume the net buffer worker */ - rt_sem_release(_netbuf.wait_resume); - _netbuf.stat = NETBUF_STAT_STOPPING; - rt_kprintf("stat[suspend] -> stopping\n"); - - } - else if (_netbuf.stat == NETBUF_STAT_BUFFERING) - { - /* netbuf worker is working, set stat to stopping */ - _netbuf.stat = NETBUF_STAT_STOPPING; - rt_kprintf("stat[buffering] -> stopping\n"); - } - rt_hw_interrupt_enable(level); -} - -static void net_buf_do_stop(struct net_buffer_job* job) -{ - /* source closed */ - job->close(job->parameter); - - /* set stat to stopped */ - _netbuf.stat = NETBUF_STAT_STOPPED; - rt_kprintf("stat -> stopped\n"); - if (_netbuf.is_wait_ready == RT_TRUE) - { - /* resume the wait for buffer task */ - _netbuf.is_wait_ready = RT_FALSE; - rt_sem_release(_netbuf.wait_ready); - } - /* reset buffer stat */ - _netbuf.data_length = 0; - _netbuf.read_index = 0 ; - _netbuf.save_index = 0; - - rt_kprintf("job done\n"); -} - -#define NETBUF_BLOCK_SIZE 4096 -static void net_buf_do_job(struct net_buffer_job* job) -{ - rt_uint32_t level; - rt_size_t read_length, data_length; - rt_uint8_t *ptr; - - ptr = rt_malloc(NETBUF_BLOCK_SIZE); - - while (1) - { - if (_netbuf.stat == NETBUF_STAT_STOPPING) - { - net_buf_do_stop(job); - break; - } - - /* fetch data buffer */ - read_length = job->fetch(ptr, NETBUF_BLOCK_SIZE, job->parameter); - if (read_length <= 0) - { - net_buf_do_stop(job); - break; - } - else - { - /* got data length in the buffer */ - data_length = _netbuf.data_length; - - /* check avaible buffer to save */ - if ((_netbuf.size - data_length) < read_length) - { - rt_err_t result, level; - - /* no free space yet, suspend itself */ - rt_kprintf("stat[buffering] -> suspend, avaible room %d\n", data_length); - level = rt_hw_interrupt_disable(); - _netbuf.stat = NETBUF_STAT_SUSPEND; - rt_hw_interrupt_enable(level); - result = rt_sem_take(_netbuf.wait_resume, RT_WAITING_FOREVER); - if (result != RT_EOK) - { - /* stop net buffer worker */ - net_buf_do_stop(job); - break; - } - } - - /* there are enough free space to fetch data */ - if ((_netbuf.size - _netbuf.save_index) < read_length) - { - rt_memcpy(&_netbuf.buffer_data[_netbuf.save_index], - ptr, _netbuf.size - _netbuf.save_index); - rt_memcpy(&_netbuf.buffer_data[0], - ptr + (_netbuf.size - _netbuf.save_index), - read_length - (_netbuf.size - _netbuf.save_index)); - - /* move save index */ - _netbuf.save_index = read_length - (_netbuf.size - _netbuf.save_index); - } - else - { - rt_memcpy(&_netbuf.buffer_data[_netbuf.save_index], - ptr, read_length); - - /* move save index */ - _netbuf.save_index += read_length; - if (_netbuf.save_index >= _netbuf.size) _netbuf.save_index = 0; - } - - level = rt_hw_interrupt_disable(); - _netbuf.data_length += read_length; - data_length = _netbuf.data_length; - rt_hw_interrupt_enable(level); - } - - // rt_kprintf("buffering ... %d %c\n", (data_length * 100) / _netbuf.size, '%'); - - /* set buffer position */ - player_set_position(data_length); - - if ((_netbuf.stat == NETBUF_STAT_BUFFERING) - && (data_length >= _netbuf.ready_wm) - && _netbuf.is_wait_ready == RT_TRUE) - { - /* notify the thread for waitting buffer ready */ - rt_kprintf("resume wait buffer\n"); - - _netbuf.is_wait_ready = RT_FALSE; - /* set buffer status to playing */ - player_set_buffer_status(RT_FALSE); - rt_sem_release(_netbuf.wait_ready); - } - } - - /* release fetch buffer */ - rt_free(ptr); -} - -static void net_buf_thread_entry(void* parameter) -{ - rt_err_t result; - struct net_buffer_job job; - - while (1) - { - /* get a job */ - result = rt_mq_recv(_netbuf_mq, (void*)&job, sizeof(struct net_buffer_job), RT_WAITING_FOREVER); - if (result == RT_EOK) - { - /* set stat to buffering */ - if (_netbuf.stat == NETBUF_STAT_BUFFERING) - { - /* reset data length and read/save index */ - _netbuf.data_length = 0; - _netbuf.read_index = _netbuf.save_index = 0; - - /* perform the job */ - net_buf_do_job(&job); - } - } - } -} - -void net_buf_init(rt_size_t size) -{ - rt_thread_t tid; - - /* init net buffer structure */ - _netbuf.read_index = _netbuf.save_index = 0; - _netbuf.size = size; /* net buffer size */ - - /* allocate buffer */ - _netbuf.buffer_data = rt_malloc(_netbuf.size); - _netbuf.data_length = 0; - - /* set ready and resume water mater */ - _netbuf.ready_wm = _netbuf.size * 90/100; - _netbuf.resume_wm = _netbuf.size * 80/100; - - /* set init stat */ - _netbuf.stat = NETBUF_STAT_STOPPED; - rt_kprintf("stat -> stopped\n"); - - _netbuf.wait_ready = rt_sem_create("nready", 0, RT_IPC_FLAG_FIFO); - _netbuf.wait_resume = rt_sem_create("nresum", 0, RT_IPC_FLAG_FIFO); - _netbuf.is_wait_ready = RT_FALSE; - - /* crate message queue */ - _netbuf_mq = rt_mq_create("njob", sizeof(struct net_buffer_job), - 4, RT_IPC_FLAG_FIFO); - - /* create net buffer thread */ - tid = rt_thread_create("nbuf", - net_buf_thread_entry, RT_NULL, - 1024, 22, 5); - if (tid != RT_NULL) - rt_thread_startup(tid); -} -#endif diff --git a/bsp/stm32_radio/netbuffer.h b/bsp/stm32_radio/netbuffer.h deleted file mode 100644 index d9f9e7865d..0000000000 --- a/bsp/stm32_radio/netbuffer.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __NET_BUF_H__ -#define __NET_BUF_H__ - -#include -#include "board.h" - -/* SRAM buffer pool routine */ -rt_size_t sbuf_get_size(void); -void* sbuf_alloc(void); -void sbuf_release(void* ptr); - -#if STM32_EXT_SRAM -/* net buffer routine */ -void net_buf_init(rt_size_t size); - -rt_size_t net_buf_read(rt_uint8_t* buffer, rt_size_t length); - -int net_buf_start_job(rt_size_t (*fetch)(rt_uint8_t* ptr, rt_size_t len, void* parameter), - void (*close)(void* parameter), - void* parameter); -void net_buf_stop_job(void); - -#endif - -#endif diff --git a/bsp/stm32_radio/network.xpm b/bsp/stm32_radio/network.xpm deleted file mode 100644 index 6e47ce1fa6..0000000000 --- a/bsp/stm32_radio/network.xpm +++ /dev/null @@ -1,172 +0,0 @@ -/* XPM */ -static char * network_xpm[] = { -"24 24 145 2", -" c None", -". c #6C6E6A", -"+ c #676965", -"@ c #6B6D6A", -"# c #C6C8C4", -"$ c #F0F1F0", -"% c #F1F1F0", -"& c #C8CAC6", -"* c #646662", -"= c #446795", -"- c #27508B", -"; c #2A538D", -"> c #2E558F", -", c #315890", -"' c #355B92", -") c #385E94", -"! c #3C6196", -"~ c #5C7BA2", -"{ c #F2F3F2", -"] c #626460", -"^ c #F2F2F2", -"/ c #3E6297", -"( c #86ACD5", -"_ c #88AED6", -": c #8BB0D7", -"< c #8DB1D7", -"[ c #8CB1D7", -"} c #8CB0D6", -"| c #8DAED6", -"1 c #5B7AA7", -"2 c #F4F4F4", -"3 c #61635F", -"4 c #30578F", -"5 c #88ADD6", -"6 c #8EB1D7", -"7 c #92B3D8", -"8 c #96B6D8", -"9 c #92B2D6", -"0 c #8CADD3", -"a c #84A7CF", -"b c #5F615D", -"c c #204A87", -"d c #6694C7", -"e c #6391C5", -"f c #618FC3", -"g c #5E8CC1", -"h c #5B8ABF", -"i c #5887BD", -"j c #5684BB", -"k c #5D5F5B", -"l c #5D8CC0", -"m c #5A89BE", -"n c #5886BD", -"o c #5584BB", -"p c #5281B9", -"q c #4F7FB7", -"r c #4D7CB5", -"s c #5C5E5A", -"t c #5482BA", -"u c #5180B8", -"v c #4F7EB6", -"w c #4C7BB4", -"x c #4979B2", -"y c #4676B1", -"z c #4373AF", -"A c #5A5C58", -"B c #406492", -"C c #31527F", -"D c #656D70", -"E c #5E605B", -"F c #C3C4C1", -"G c #80827F", -"H c #C8CAC7", -"I c #545651", -"J c #5E605C", -"K c #6A6E68", -"L c #72756F", -"M c #7B7E79", -"N c #848781", -"O c #8D908A", -"P c #969993", -"Q c #9FA29C", -"R c #416593", -"S c #244E89", -"T c #29518C", -"U c #2D558E", -"V c #325991", -"W c #375C93", -"X c #3B6096", -"Y c #5D7BA3", -"Z c #555753", -"` c #D0D2CE", -" . c #BBBEB7", -".. c #BABDB6", -"+. c #F2F2F1", -"@. c #345A92", -"#. c #81A8D3", -"$. c #83ABD4", -"%. c #8AAFD6", -"&. c #8FB3D8", -"*. c #92B4DA", -"=. c #5978A6", -"-. c #D2D4D1", -";. c #2C548E", -">. c #85ACD5", -",. c #92B5DA", -"'. c #98B9DB", -"). c #95B6DA", -"!. c #90B2D7", -"~. c #88ACD3", -"{. c #464644", -"]. c #719ECE", -"^. c #6E9BCC", -"/. c #6A98C9", -"(. c #6794C7", -"_. c #608EC2", -":. c #5C8BC0", -"<. c #757773", -"[. c #DADAD9", -"}. c #6391C4", -"|. c #5F8DC2", -"1. c #5C8ABF", -"2. c #5181B8", -"3. c #7F817C", -"4. c #ECECEA", -"5. c #5B89BF", -"6. c #5483BA", -"7. c #4D7DB6", -"8. c #4A7AB3", -"9. c #4776B1", -"0. c #80827D", -"a. c #EEEEEC", -"b. c #3F6392", -"c. c #82847F", -"d. c #848680", -"e. c #7F817D", -"f. c #7D7F7B", -"g. c #666863", -"h. c #A8ACA5", -"i. c #B1B3AC", -"j. c #E1E1DE", -"k. c #EDEDEB", -"l. c #E0E0DE", -"m. c #565854", -"n. c #767874", -" ", -" . + + + + + + + + + . ", -" @ # $ % % % % % % % $ & @ ", -" * $ = - ; > , ' ) ! ~ { * ", -" ] ^ / ( _ : < [ } | 1 2 ] ", -" 3 % 4 5 6 7 8 9 0 a ) % 3 ", -" b % c d e f g h i j c % b ", -" k % c l m n o p q r c % k ", -" s % c t u v w x y z c % s ", -" A $ B c c c c c c C D + + + + + + + + + . ", -" E F $ % % % % % % G # $ % % % % % % % $ H @ ", -" I J K L M N O P Q * $ R c S T U V W X Y { * ", -" Z ` .............] +.@.#.$.( %.[ &.*.=.2 ] ", -" Z -.+.+.+.+.+.+.+.3 % ;.>.: ,.'.).!.~.W % 3 ", -" {.Z Z Z Z Z Z Z Z b % c ].^./.(.e _.:.c % b ", -" <.[.<. k % c d }.|.1.i o 2.c % k ", -" 3.4.3. s % c 5.i 6.u 7.8.9.c % s ", -" 0.a.0. A $ B c c c c c c c b.$ A ", -" c...c. E F $ % % % % % % % $ F E ", -" 0.a.0.d.0.e.f.g.J K L M N O P Q h.i.J I ", -" 0.j.a...a.k.l.m.` ............... .` Z ", -" 0.0.c.0.3.n.Z -.+.+.+.+.+.+.+.+.+.-.Z ", -" {.Z Z Z Z Z Z Z Z Z Z Z {. ", -" "}; diff --git a/bsp/stm32_radio/network_disconnect.xpm b/bsp/stm32_radio/network_disconnect.xpm deleted file mode 100644 index 4b9ba17e15..0000000000 --- a/bsp/stm32_radio/network_disconnect.xpm +++ /dev/null @@ -1,98 +0,0 @@ -/* XPM */ -static char * network_disconnect_xpm[] = { -"24 24 71 1", -" c None", -". c #191918", -"+ c #181817", -"@ c #808080", -"# c #EDEDED", -"$ c #6B6B6A", -"% c #161615", -"& c #D8D8D8", -"* c #484848", -"= c #A4A4A4", -"- c #E6E6E6", -"; c #F3F3F3", -"> c #F5F5F6", -", c #C0C0C5", -"' c #F3F3F4", -") c #F0F0F0", -"! c #B7B4C3", -"~ c #B7B5C4", -"{ c #F5F5F5", -"] c #A19DB2", -"^ c #EEEEEE", -"/ c #B6B4C3", -"( c #B7B5C3", -"_ c #B3B1C1", -": c #B5B3C1", -"< c #EAEAEB", -"[ c #EFEFEF", -"} c #A19EB2", -"| c #A09CB1", -"1 c #928FA2", -"2 c #676571", -"3 c #D3D3D3", -"4 c #2A2A2A", -"5 c #090909", -"6 c #8B8B8B", -"7 c #0F0F0E", -"8 c #2A2A29", -"9 c #70706F", -"0 c #898988", -"a c #A8A8A8", -"b c #0E0E0D", -"c c #D1D1D1", -"d c #ECECEC", -"e c #EBEBEB", -"f c #D9D9D9", -"g c #C1C1C1", -"h c #B7B7B7", -"i c #BCBCBC", -"j c #141413", -"k c #7F7F7E", -"l c #B6B6B5", -"m c #C8C8C7", -"n c #C0C0C0", -"o c #949494", -"p c #E5E5E5", -"q c #5D5D5C", -"r c #242423", -"s c #9A9A99", -"t c #C8C8C8", -"u c #C5C5C5", -"v c #E8E8E8", -"w c #BABABA", -"x c #DEDEDE", -"y c #D5D5D5", -"z c #C2C2C2", -"A c #B3B3B3", -"B c #909090", -"C c #B6B6B6", -"D c #C4C4C4", -"E c #1F1F1D", -"F c #000000", -" ", -" .........+ ", -" +@#########$% ", -" .#&*******=-. ", -" .;*>,,>,,'*). ", -" .)*!~~~>{]*). ", -" .^*/(_:<<]*[. ", -" .^*}}|}<<]*^. ", -" .#*]]]]]12.........+ ", -" .;3*****4@#########$% ", -" 56######.#&*******=-. ", -" 7890aaaa.;*>,,>,,'*). ", -" b;)cdeee.)*!~~~>{]*). ", -" bfghiiii.^*/(_:<<]*[. ", -" j........^*}}|}<<]*^. ", -" klk .#*]]]]]]]*#. ", -" kmk .;3*******n#. ", -" k3k 56#########o. ", -" kpk 7890aaaa09q.r ", -" kpskkkkb;)cdeeetuuv. ", -" kwxyzABbfghiiiiCcyD. ", -" kkkkkkE...........F ", -" ", -" "}; diff --git a/bsp/stm32_radio/picture.c b/bsp/stm32_radio/picture.c deleted file mode 100644 index 99dcdca972..0000000000 --- a/bsp/stm32_radio/picture.c +++ /dev/null @@ -1,283 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include - -#define PICTURE_DIR "/pictures" - -enum picture_view_mode -{ - VIEW_SINGLE_MODE, - VIEW_DIR_MODE, - VIEW_FN_LIST_MODE -}; - -static rtgui_view_t* picture_view = RT_NULL; -static enum picture_view_mode view_mode = VIEW_SINGLE_MODE; - -/* current picture file name */ -static char current_fn[32] = {0}; -static const char** picture_fn_list; -static rt_uint8_t picture_fn_list_size, picture_fn_list_current; - -static void picture_show_prev() -{ - DIR* dir; - struct dirent* entry; - rt_bool_t is_last; - char fn[32]; - - fn[0] = '\0'; - is_last = RT_FALSE; - - dir = opendir(PICTURE_DIR); - if (dir == RT_NULL) - { - rt_kprintf("open directory failed\n"); - return; - } - - do - { - entry = readdir(dir); - if (entry != RT_NULL) - { - if (strstr(entry->d_name, ".hdc") != RT_NULL || - strstr(entry->d_name, ".HDC") != RT_NULL) - { - /* it's a HDC image */ - if ((strcmp(entry->d_name, current_fn) == 0) && - is_last != RT_TRUE) - { - if (fn[0] == '\0') - { - /* it should be the last image */ - is_last = RT_TRUE; - } - else - { - /* display image */ - strcpy(current_fn, fn); - rtgui_widget_update(RTGUI_WIDGET(picture_view)); - closedir(dir); - return; - } - } - strcpy(fn, entry->d_name); - } - } - } while(entry != RT_NULL); - - /* close directory */ - closedir(dir); - - if ((is_last == RT_TRUE) && fn[0] != '\0') - { - strcpy(current_fn, fn); - rtgui_widget_update(RTGUI_WIDGET(picture_view)); - } -} - -static void picture_show_next() -{ - DIR* dir; - struct dirent* entry; - rt_bool_t found, has_image; - - found = RT_FALSE; has_image = RT_FALSE; - -__restart: - dir = opendir(PICTURE_DIR); - if (dir == RT_NULL) - { - rt_kprintf("open directory failed\n"); - return; - } - - do - { - entry = readdir(dir); - if (entry != RT_NULL) - { - if (strstr(entry->d_name, ".hdc") != RT_NULL || - strstr(entry->d_name, ".HDC") != RT_NULL) - { - /* this directory includes image */ - has_image = RT_TRUE; - - if (found == RT_TRUE || current_fn[0] == '\0') - { - strcpy(current_fn, entry->d_name); - rtgui_widget_update(RTGUI_WIDGET(picture_view)); - - closedir(dir); - return; - } - - /* it's a HDC image */ - if (strcmp(entry->d_name, current_fn) == 0) - found = RT_TRUE; - } - } - } while(entry != RT_NULL); - - /* close directory */ - closedir(dir); - - if (has_image != RT_TRUE) return; - current_fn[0] = '\0'; - goto __restart; -} - -static rt_bool_t picture_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) -{ - if (event->type == RTGUI_EVENT_PAINT) - { - struct rtgui_dc* dc; - struct rtgui_rect rect; - struct rtgui_image* image; - char fn[32]; - - dc = rtgui_dc_begin_drawing(widget); - if (dc == RT_NULL) return RT_FALSE; - rtgui_widget_get_rect(widget, &rect); - - /* open image */ - rt_snprintf(fn, sizeof(fn), "%s/%s", PICTURE_DIR, current_fn); - image = rtgui_image_create_from_file("hdc", - fn, RT_FALSE); - if (image != RT_NULL) - { - /* blit image */ - rtgui_image_blit(image, dc, &rect); - /* destroy image */ - rtgui_image_destroy(image); - } - else - { - rtgui_dc_fill_rect(dc, &rect); - rtgui_dc_draw_text(dc, "ûÓÐÎļþ±»´ò¿ª", &rect); - } - rtgui_dc_end_drawing(dc); - - return RT_FALSE; - } - else if (event->type == RTGUI_EVENT_KBD) - { - struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; - if (ekbd->type == RTGUI_KEYDOWN) - { - switch (ekbd->key) - { - case RTGUIK_RIGHT: - if (view_mode == VIEW_DIR_MODE) picture_show_next(); - else if (view_mode == VIEW_FN_LIST_MODE) - { - picture_fn_list_current ++; - if (picture_fn_list_current == picture_fn_list_size) - { - picture_fn_list_current = 0; - } - strcpy(current_fn, picture_fn_list[picture_fn_list_current]); - rtgui_widget_update(RTGUI_WIDGET(picture_view)); - } - break; - case RTGUIK_LEFT: - if (view_mode == VIEW_DIR_MODE) picture_show_prev(); - else if (view_mode == VIEW_FN_LIST_MODE) - { - if (picture_fn_list_current == 0) - { - picture_fn_list_current = picture_fn_list_size - 1; - } - else picture_fn_list_current --; - - strcpy(current_fn, picture_fn_list[picture_fn_list_current]); - rtgui_widget_update(RTGUI_WIDGET(picture_view)); - } - break; - case RTGUIK_RETURN: - { - rtgui_view_t* view; - - view = RTGUI_VIEW(widget); - - /* close this view */ - current_fn[0] = '\0'; - - /* end of modal */ - rtgui_view_end_modal(view, RTGUI_MODAL_OK); - picture_view = RT_NULL; - } - break; - } - } - return RT_FALSE; - } - - return rtgui_view_event_handler(widget, event); -} - -rtgui_view_t *picture_view_create(struct rtgui_workbench* workbench) -{ - /* create picture view */ - picture_view = rtgui_view_create("Picture Presentation"); - rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view), - picture_view_event_handler); - - rtgui_workbench_add_view(workbench, picture_view); - /* this view can be focused */ - RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; - - /* show next picture */ - picture_show_next(); - - view_mode = VIEW_DIR_MODE; - - return picture_view; -} - -rtgui_view_t *picture_view_create_view_file(struct rtgui_workbench* workbench, - const char* filename) -{ - strcpy(current_fn, filename); - - /* create picture view */ - picture_view = rtgui_view_create("Picture Presentation"); - rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view), - picture_view_event_handler); - - rtgui_workbench_add_view(workbench, picture_view); - /* this view can be focused */ - RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; - - view_mode = VIEW_SINGLE_MODE; - - return picture_view; -} - -rtgui_view_t *picture_view_create_view_list(struct rtgui_workbench* workbench, - const char* list[], rt_uint8_t size) -{ - picture_fn_list = list; - picture_fn_list_size = size; - picture_fn_list_current = 0; - strcpy(current_fn, picture_fn_list[picture_fn_list_current]); - - /* create picture view */ - picture_view = rtgui_view_create("Picture Presentation"); - rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view), - picture_view_event_handler); - - rtgui_workbench_add_view(workbench, picture_view); - /* this view can be focused */ - RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; - - view_mode = VIEW_FN_LIST_MODE; - - return picture_view; -} diff --git a/bsp/stm32_radio/picture.h b/bsp/stm32_radio/picture.h deleted file mode 100644 index 867b9837ec..0000000000 --- a/bsp/stm32_radio/picture.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __PICTURE_H__ -#define __PICTURE_H__ - -rtgui_view_t *picture_view_create(struct rtgui_workbench* workbench); -rtgui_view_t *picture_view_create_view_file(struct rtgui_workbench* workbench, const char* fn); -rtgui_view_t *picture_view_create_view_list(struct rtgui_workbench* workbench, const char* list[], rt_uint8_t size); - -#endif diff --git a/bsp/stm32_radio/play.hdh b/bsp/stm32_radio/play.hdh deleted file mode 100644 index 276852cabc..0000000000 --- a/bsp/stm32_radio/play.hdh +++ /dev/null @@ -1,107 +0,0 @@ -static const unsigned char play_hdh[] = { - 0x48, 0x44, 0x43, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0x9d, 0xae, 0xdf, 0xef, 0xbf, 0xe7, 0xbf, 0xe7, - 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, - 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, - 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, - 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0x9d, 0xae, - 0x9d, 0xae, 0xdf, 0xef, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0xdf, 0xef, 0x9d, 0xae, 0x7d, 0xae, 0xbf, 0xef, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0xbf, 0xef, 0x7d, 0xae, 0x7d, 0xae, 0xbf, 0xe7, 0x7f, 0xd7, 0x7f, 0xd7, - 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, - 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, - 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, - 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0xbf, 0xe7, 0x7d, 0xae, - 0x7d, 0xa6, 0xbf, 0xe7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, - 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x7a, 0x6d, 0x1a, 0x4d, 0x1a, 0x4d, - 0x7a, 0x6d, 0x5f, 0xd7, 0x5f, 0xd7, 0x7a, 0x6d, 0x1a, 0x4d, 0x1a, 0x4d, - 0x7a, 0x6d, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, - 0x5f, 0xd7, 0x5f, 0xd7, 0xbf, 0xe7, 0x7d, 0xa6, 0x5d, 0xa6, 0x9f, 0xe7, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, - 0x5f, 0xcf, 0xf9, 0x4c, 0x7c, 0x55, 0x7c, 0x55, 0xf9, 0x4c, 0x5f, 0xcf, - 0x5f, 0xcf, 0xf9, 0x4c, 0x7c, 0x55, 0x7c, 0x55, 0xf9, 0x4c, 0x5f, 0xcf, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, - 0x9f, 0xe7, 0x5d, 0xa6, 0x5d, 0xa6, 0x9f, 0xdf, 0x5f, 0xcf, 0x5f, 0xcf, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0xf9, 0x4c, - 0x5b, 0x55, 0x5b, 0x55, 0xf9, 0x4c, 0x5f, 0xcf, 0x5f, 0xcf, 0xf9, 0x4c, - 0x5b, 0x55, 0x5b, 0x55, 0xf9, 0x4c, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x9f, 0xdf, 0x5d, 0xa6, - 0x5c, 0xa6, 0x9f, 0xdf, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, - 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0xd9, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, - 0xd9, 0x4c, 0x3f, 0xc7, 0x3f, 0xc7, 0xd9, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, - 0xd9, 0x4c, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, - 0x3f, 0xc7, 0x3f, 0xc7, 0x9f, 0xdf, 0x5c, 0xa6, 0x3c, 0xa6, 0x7f, 0xdf, - 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, - 0x3e, 0xc7, 0xb8, 0x44, 0x1a, 0x4d, 0x1a, 0x4d, 0xb8, 0x44, 0x3e, 0xc7, - 0x3e, 0xc7, 0xb8, 0x44, 0x1a, 0x4d, 0x1a, 0x4d, 0xb8, 0x44, 0x3e, 0xc7, - 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, - 0x7f, 0xdf, 0x3c, 0xa6, 0x3c, 0x9e, 0x7f, 0xd7, 0x1e, 0xbf, 0x1e, 0xbf, - 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x98, 0x3c, - 0xfa, 0x44, 0xfa, 0x44, 0x98, 0x3c, 0x1e, 0xbf, 0x1e, 0xbf, 0x98, 0x3c, - 0xfa, 0x44, 0xfa, 0x44, 0x98, 0x3c, 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, - 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x7f, 0xd7, 0x3c, 0x9e, - 0x1c, 0x9e, 0x7f, 0xd7, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0x77, 0x3c, 0xd9, 0x3c, 0xd9, 0x3c, - 0x77, 0x3c, 0xfe, 0xbe, 0xfe, 0xbe, 0x77, 0x3c, 0xd9, 0x3c, 0xd9, 0x3c, - 0x77, 0x3c, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0x7f, 0xd7, 0x1c, 0x9e, 0x1c, 0x9e, 0x5e, 0xcf, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0x56, 0x34, 0x98, 0x3c, 0x98, 0x3c, 0x56, 0x34, 0xfe, 0xbe, - 0xfe, 0xbe, 0x56, 0x34, 0x98, 0x3c, 0x98, 0x3c, 0x56, 0x34, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0x5e, 0xcf, 0x1c, 0x9e, 0xfc, 0x95, 0x5e, 0xcf, 0xfe, 0xb6, 0xfe, 0xb6, - 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0x36, 0x34, - 0x78, 0x34, 0x78, 0x34, 0x36, 0x34, 0xfe, 0xb6, 0xfe, 0xb6, 0x36, 0x34, - 0x78, 0x34, 0x78, 0x34, 0x36, 0x34, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, - 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0x5e, 0xcf, 0xfc, 0x95, - 0xfb, 0x95, 0x3e, 0xcf, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, - 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0xf5, 0x2b, 0x57, 0x34, 0x57, 0x34, - 0xf5, 0x2b, 0xde, 0xb6, 0xde, 0xb6, 0xf5, 0x2b, 0x57, 0x34, 0x57, 0x34, - 0xf5, 0x2b, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, - 0xde, 0xb6, 0xde, 0xb6, 0x3e, 0xcf, 0xfb, 0x95, 0xdb, 0x95, 0x3e, 0xc7, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, - 0xbe, 0xae, 0xd5, 0x2b, 0x36, 0x2c, 0x36, 0x2c, 0xd5, 0x2b, 0xbe, 0xae, - 0xbe, 0xae, 0xd5, 0x2b, 0x36, 0x2c, 0x36, 0x2c, 0xd5, 0x2b, 0xbe, 0xae, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, - 0x3e, 0xc7, 0xdb, 0x95, 0xdb, 0x95, 0x3e, 0xc7, 0xbe, 0xae, 0xbe, 0xae, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0x56, 0x44, - 0xd4, 0x23, 0xd4, 0x23, 0x56, 0x44, 0xbe, 0xae, 0xbe, 0xae, 0x56, 0x44, - 0xd4, 0x23, 0xd4, 0x23, 0x56, 0x44, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0x3e, 0xc7, 0xdb, 0x95, - 0xdb, 0x8d, 0x1e, 0xc7, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x1e, 0xc7, 0xdb, 0x8d, 0xbb, 0x8d, 0x1e, 0xbf, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x1e, 0xbf, 0xbb, 0x8d, 0xbb, 0x8d, 0x1e, 0xbf, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x1e, 0xbf, 0xbb, 0x8d, - 0xbb, 0x8d, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xbb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, -}; diff --git a/bsp/stm32_radio/play_list.c b/bsp/stm32_radio/play_list.c deleted file mode 100644 index 32c7d1d002..0000000000 --- a/bsp/stm32_radio/play_list.c +++ /dev/null @@ -1,103 +0,0 @@ -#include "play_list.h" -#include "player_ui.h" -#include "mp3.h" - -#include - -static struct play_item **play_list = RT_NULL; -static rt_uint16_t play_list_size = 0; -static rt_int16_t play_list_current = 0; - -void play_list_clear() -{ - rt_uint32_t index; - - for (index = 0; index < play_list_size; index ++) - { - rt_free(play_list[index]->fn); - rt_free(play_list[index]); - - play_list[index] = RT_NULL; - } - - rt_free(play_list); - play_list = RT_NULL; - play_list_size = 0; -} - -char* play_list_start() -{ - play_list_current = 0; - return play_list[play_list_current]->fn; -} - -rt_bool_t play_list_is_end() -{ - if ((play_list_current == play_list_size - 1) || - play_list_size == 0) - return RT_TRUE; - - return RT_FALSE; -} - -rt_uint32_t play_list_items(void) -{ - return play_list_size; -} - -struct play_item* play_list_item(rt_uint32_t n) -{ - if (n > play_list_size) return RT_NULL; - return play_list[n]; -} - -void play_list_append(char* fn) -{ - play_list_size ++; - if (play_list == RT_NULL) - play_list = (struct play_item**) rt_malloc (play_list_size * sizeof(struct play_item*)); - else - play_list = (struct play_item**) rt_realloc(play_list, play_list_size * sizeof(struct play_item*)); - - play_list[play_list_size - 1] = (struct play_item*)rt_malloc(sizeof(struct play_item)); - if (strstr(fn, ".mp3") != RT_NULL || - strstr(fn, ".MP3") != RT_NULL) - { - struct tag_info info; - - memset(&info, 0, sizeof(info)); - mp3_get_info(fn, &info); - if (info.title[0] == '\0') - rt_snprintf(play_list[play_list_size - 1]->title, sizeof(play_list[play_list_size - 1]->title), - "<δ֪ÃûÒôÀÖ>"); - else - strcpy(play_list[play_list_size - 1]->title, info.title); - - play_list[play_list_size - 1]->fn = rt_strdup(fn); - play_list[play_list_size - 1]->duration = info.duration; - } - else - { - rt_snprintf(play_list[play_list_size - 1]->title, sizeof(play_list[play_list_size - 1]->title), - "<δ֪ÃûÒôÀÖ>"); - play_list[play_list_size - 1]->fn = rt_strdup(fn); - play_list[play_list_size - 1]->duration = 0; - } -} - -char* play_list_next() -{ - if (play_list_current < play_list_size - 1) play_list_current ++; - return play_list[play_list_current]->fn; -} - -char* play_list_prev() -{ - if (play_list_current > 0) play_list_current --; - return play_list[play_list_current]->fn; -} - -char* play_list_current_item() -{ - return play_list[play_list_current]->fn; -} diff --git a/bsp/stm32_radio/play_list.h b/bsp/stm32_radio/play_list.h deleted file mode 100644 index f7aa05382f..0000000000 --- a/bsp/stm32_radio/play_list.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __PLAY_LIST_H__ -#define __PLAY_LIST_H__ - -#include - -struct play_item -{ - char title[40]; - char *fn; - rt_uint32_t duration; -}; - -void play_list_clear(void); - -char* play_list_start(void); -rt_bool_t play_list_is_end(void); -rt_uint32_t play_list_items(void); -struct play_item* play_list_item(rt_uint32_t n); - -void play_list_append(char* fn); -char* play_list_next(void); -char* play_list_prev(void); -char* play_list_current_item(void); - -#endif diff --git a/bsp/stm32_radio/player_bg.c b/bsp/stm32_radio/player_bg.c deleted file mode 100644 index 6a037fc531..0000000000 --- a/bsp/stm32_radio/player_bg.c +++ /dev/null @@ -1,105 +0,0 @@ -#include "player_bg.h" -#include "player_ui.h" -#include "mp3.h" - -#include - -rt_bool_t is_playing = RT_FALSE; -static rt_mq_t player_thread_mq; -static struct rt_thread player_thread_tid; -static rt_uint8_t player_thread_stack[0x400]; - -rt_bool_t player_is_playing() -{ - return is_playing; -} - -void player_play_req(const char* fn) -{ - struct player_request request; - request.type = PLAYER_REQUEST_PLAY_SINGLE_FILE; - strncpy(request.fn, fn, sizeof(request.fn)); - - /* send to message queue */ - rt_mq_send(player_thread_mq, (void*)&request, sizeof(struct player_request)); -} - -void player_stop_req() -{ - is_playing = RT_FALSE; -} - -void player_thread(void* parameter) -{ - rt_err_t result; - struct player_request request; - - while(1) - { - /* get request from message queue */ - result = rt_mq_recv(player_thread_mq, (void*)&request, - sizeof(struct player_request), RT_WAITING_FOREVER); - if (result == RT_EOK) - { - switch (request.type) - { - case PLAYER_REQUEST_PLAY_SINGLE_FILE: - if ((strstr(request.fn, ".mp3") != RT_NULL) || - (strstr(request.fn, ".MP3") != RT_NULL)) - { - is_playing = RT_TRUE; - player_notify_play(); - - /* get music tag information */ - mp3(request.fn); - - player_notify_stop(); - is_playing = RT_FALSE; - } - else if ((strstr(request.fn, ".wav") != RT_NULL) || - (strstr(request.fn, ".WAV") != RT_NULL)) - { - is_playing = RT_TRUE; - player_notify_play(); - wav(request.fn); - player_notify_stop(); - is_playing = RT_FALSE; - } - else if ((strstr(request.fn, "http://") == request.fn || - (strstr(request.fn, "HTTP://") == request.fn ))) - { - is_playing = RT_TRUE; - player_notify_play(); - ice_mp3(request.fn); - /* notfiy net buffer worker to stop */ - net_buf_stop_job(); - player_notify_stop(); - is_playing = RT_FALSE; - } - break; - } - } - } -} - -void player_init() -{ - rt_err_t result; - - /* create player thread */ - player_thread_mq = rt_mq_create("player", sizeof(struct player_request), - 8, RT_IPC_FLAG_FIFO); - RT_ASSERT(player_thread_mq != RT_NULL); - - result = rt_thread_init(&player_thread_tid, "ply_bg", player_thread, RT_NULL, - player_thread_stack, sizeof(player_thread_stack), - 20, 5); - - if (result != RT_EOK) rt_kprintf("player thread init failed\n"); - else - { - rt_thread_startup(&player_thread_tid); - player_ui_init(); - } -} - diff --git a/bsp/stm32_radio/player_bg.h b/bsp/stm32_radio/player_bg.h deleted file mode 100644 index 6329d6d6bb..0000000000 --- a/bsp/stm32_radio/player_bg.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __PLAYER_BG_H__ -#define __PLAYER_BG_H__ - -#include - -enum PLAYER_REQUEST_TYPE -{ - PLAYER_REQUEST_PLAY_SINGLE_FILE, - PLAYER_REQUEST_PLAY_LIST, - PLAYER_REQUEST_STOP, - PLAYER_REQUEST_FREEZE, - PLAYER_REQUEST_UPDATE_RADIO_LIST, -}; - -struct player_request -{ - enum PLAYER_REQUEST_TYPE type; - char fn[64]; -}; - -/* get player background status */ -rt_bool_t player_is_playing(void); -/* player background thread init */ -void player_init(void); - -/* send a stop request to player background thread */ -void player_stop_req(void); -/* send a play request to player background thread */ -void player_play_req(const char* fn); - -#endif - diff --git a/bsp/stm32_radio/player_ui.c b/bsp/stm32_radio/player_ui.c deleted file mode 100644 index ad6ad51acc..0000000000 --- a/bsp/stm32_radio/player_ui.c +++ /dev/null @@ -1,966 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include "mp3.h" -#include "picture.h" -#include "player_ui.h" -#include "player_bg.h" -#include "play_list.h" -#include "station_list.h" - -#include "play.hdh" -#include "stop.hdh" - -#define RADIO_FN "/radio.pls" - -const static char *time_bg_xpm[] = -{ - "48 20 7 1", - ". c #007DC6", - "+ c #0079C6", - "@ c #0079BD", - "# c #0075BD", - "$ c #0071BD", - "% c #0071B5", - "& c #006DB5", - "................................................", - "................................................", - "................................................", - "................................................", - "................................................", - "++++++++++++++++++++++++++++++++++++++++++++++++", - "++++++++++++++++++++++++++++++++++++++++++++++++", - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", - "################################################", - "################################################", - "################################################", - "################################################", - "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", - "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", - "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", - "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", - "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", - "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", - "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" -}; - -static struct rtgui_view* home_view; -static struct rtgui_list_view* function_view; -static struct rtgui_workbench* workbench; -static rtgui_timer_t* info_timer; -static rt_thread_t player_ui_tid = RT_NULL; -static enum PLAYER_MODE player_mode = PLAYER_STOP; -static enum PLAYER_STEP next_step = PLAYER_STEP_STOP; -static struct tag_info tinfo; -static rt_uint32_t play_time; -static rtgui_image_t *time_bg_image; - -void player_play_file(const char* fn); -void player_play_url(const char* url); - -static void info_timer_timeout(rtgui_timer_t* timer, void* parameter) -{ - struct rtgui_dc* dc; - rtgui_color_t saved; - - dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(home_view)); - if (dc == RT_NULL) return ; - - saved = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)); - - RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = RTGUI_RGB(206, 231, 255); - rtgui_dc_draw_hline(dc, 14, 14 + (tinfo.position * 212) / tinfo.duration, 75); - - if ((player_mode == PLAYER_PLAY_RADIO) && ((tinfo.position * 212 + 14)/tinfo.duration) < 226) - { - RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = RTGUI_RGB(82, 199, 16); - rtgui_dc_draw_hline(dc, 14 + (tinfo.position * 212) / tinfo.duration, 226, 75); - } - RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = saved; - - if (player_mode == PLAYER_PLAY_FILE) - { - rtgui_rect_t rect; - char line[32]; - - play_time++; - rt_snprintf(line, sizeof(line), "%3d:%02d", play_time / 60, play_time % 60); - - rect.x1 = 172; - rect.y1 = 39; - rect.x2 = 220; - rect.y2 = 59; - rtgui_image_blit(time_bg_image, dc, &rect); - rtgui_dc_draw_text(dc, line, &rect); - } - - rtgui_dc_end_drawing(dc); -} - -static void player_update_tag_info(struct rtgui_dc* dc) -{ - rtgui_rect_t rect; - char line[32]; - rtgui_color_t saved; - rtgui_image_t *background; - - saved = rtgui_dc_get_color(dc); - rtgui_dc_set_color(dc, black); - - rect.x1 = 0; - rect.y1 = 0; - rect.x2 = 240; - rect.y2 = 65; - /* draw background */ - background = rtgui_image_create_from_file("hdc", "/resource/bg.hdc", RT_FALSE); - if (background != RT_NULL) - { - rtgui_image_blit(background, dc, &rect); - rtgui_image_destroy(background); - - background = RT_NULL; - } - else - { - rtgui_dc_fill_rect(dc, &rect); - } - - /* draw playing information */ - rect.x1 = 28; - rect.y1 = 12; - rect.x2 = 220; - rect.y2 = rect.y1 + 16; - if (player_mode == PLAYER_STOP) - { - rt_snprintf(line, sizeof(line), "ÍøÂçÊÕÒô»ú"); - rtgui_dc_draw_text(dc, line, &rect); - } - else - rtgui_dc_draw_text(dc, tinfo.title, &rect); - - rect.x1 = 28; - rect.y1 = 39; - rect.x2 = 220; - rect.y2 = 59; - if (player_mode == PLAYER_STOP) - { - rt_snprintf(line, sizeof(line), "radio.rt-thread.org"); - rtgui_dc_draw_text(dc, line, &rect); - } - else - rtgui_dc_draw_text(dc, tinfo.artist, &rect); - - if ((tinfo.duration != 0) && player_mode == PLAYER_PLAY_FILE) - { - play_time = 0; - - rect.x1 = 172; - rt_snprintf(line, sizeof(line), " 0:00"); - rtgui_dc_draw_text(dc, line, &rect); - } - - rtgui_dc_set_color(dc, saved); -} - -static rt_uint32_t read_line(int fd, char* line, rt_uint32_t line_size) -{ - char *pos, *next; - rt_uint32_t length; - - length = read(fd, line, line_size); - if (length > 0) - { - pos = strstr(line, "\r\n"); - if (pos == RT_NULL) - { - pos = strstr(line, "\n"); - next = pos ++; - } - else next = pos + 2; - - if (pos != RT_NULL) - { - *pos = '\0'; - - /* move back */ - lseek(fd, -(length - (next - line)), SEEK_CUR); - - length = pos - line; - } - else length = 0; - } - - return length; -} - -static void function_play_radio(void* parameter) -{ - struct station_list* list; - struct station_item* item; - - list = station_list_create(RADIO_FN); - if (list != RT_NULL) - { - item = station_list_select(list, workbench); - if (item != RT_NULL) - { - player_play_url(item->url); - } - - station_list_destroy(list); - } -} - -static void function_radio_list_update(void* parameter) -{ - extern void update_radio_list_req(void); - extern void update_radio_thread(void* parameter); - extern rt_mq_t update_radio_mq; - rt_thread_t update_radio_list_thread; - - rtgui_view_t *view; - extern rtgui_view_t* update_radio_list_view_create(rtgui_workbench_t* workbench); - - if(update_radio_mq == RT_NULL) - { - update_radio_mq = rt_mq_create("updateRadioList", sizeof(struct player_request), - 1, RT_IPC_FLAG_FIFO); - RT_ASSERT(update_radio_mq != RT_NULL); - - update_radio_list_thread = rt_thread_create("update_bg", update_radio_thread, RT_NULL, - 1024 ,20, 5); - - if (update_radio_list_thread == RT_NULL) rt_kprintf("updateRadioList thread init failed\n"); - else - { - rt_thread_startup(update_radio_list_thread); - update_radio_list_req(); - } - } - - view = update_radio_list_view_create(workbench); - if (view != RT_NULL) - { - rtgui_view_show(view, RT_FALSE); - } - - return; -} - -static void function_filelist(void* parameter) -{ - rtgui_rect_t rect; - rtgui_filelist_view_t *view; - - rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); - view = rtgui_filelist_view_create(workbench, "/", "*.*", &rect); - if (view != RT_NULL) - { - if (rtgui_view_show(RTGUI_VIEW(view), RT_TRUE) == RTGUI_MODAL_OK) - { - char fn[64]; - - /* get open file */ - rt_snprintf(fn, 64, "%s/%s", view->current_directory, - view->items[view->current_item].name); - - if (strstr(view->items[view->current_item].name , ".mp3") != RT_NULL || - strstr(view->items[view->current_item].name , ".MP3") != RT_NULL || - strstr(view->items[view->current_item].name , ".wav") != RT_NULL || - strstr(view->items[view->current_item].name , ".WAV") != RT_NULL) - { - /* clear old play list */ - play_list_clear(); - play_list_append(fn); - - player_mode = PLAYER_PLAY_FILE; - next_step = PLAYER_STEP_STOP; - player_play_file(play_list_start()); - } - else if (strstr(view->items[view->current_item].name , ".m3u") != RT_NULL || - strstr(view->items[view->current_item].name , ".M3U") != RT_NULL) - { - /* read all of music filename to a list */ - int fd; - char line[64]; - - fd = open(fn, O_RDONLY, 0); - if (fd >= 0) - { - rt_uint32_t length; - - length = read_line(fd, line, sizeof(line)); - /* clear old play list */ - play_list_clear(); - - do - { - length = read_line(fd, line, sizeof(line)); - if (length > 0) - { - if (strstr(line, "http:") != RT_NULL) - { - play_list_append(line); - } - else if (line[0] != '/') - { - rt_snprintf(fn, sizeof(fn), "%s/%s", view->current_directory, line); - play_list_append(fn); - } - else play_list_append(line); - } - } - while (length > 0); - - close(fd); - - if (play_list_items() > 0) - { - player_mode = PLAYER_PLAY_FILE; - next_step = PLAYER_STEP_NEXT; - player_play_file(play_list_start()); - } - } - } - } - - /* destroy view */ - rtgui_filelist_view_destroy(view); - } - - return; -} - -static void function_device(void* parameter) -{ - rtgui_view_t *view; - extern rtgui_view_t* device_view_create(rtgui_workbench_t* workbench); - - view = device_view_create(workbench); - if (view != RT_NULL) - { - rtgui_view_show(view, RT_FALSE); - } - - return; -} - -static void function_player(void* parameter) -{ - rtgui_view_show(home_view, RT_FALSE); - return; -} - -static void function_show_picure(void* parameter) -{ - rtgui_view_t *view; - - view = picture_view_create(workbench); - if (view != RT_NULL) - { - rtgui_view_show(view, RT_TRUE); - rtgui_view_destroy(view); - } - - return; -} - -void function_action(void* parameter) -{ - rt_kprintf("item action!\n"); - return; -} - -void function_cable(void* parameter) -{ - extern void USB_cable(void); - USB_cable(); -} - -const struct rtgui_list_item function_list[] = -{ - {"Ñ¡Ôñµç̨", RT_NULL, function_play_radio, RT_NULL}, - {"¸üеç̨", RT_NULL, function_radio_list_update, RT_NULL}, - {"²¥·ÅÎļþ", RT_NULL, function_filelist, RT_NULL}, - {"ä¯ÀÀͼƬ", RT_NULL, function_show_picure, RT_NULL}, - {"É豸ÐÅÏ¢", RT_NULL, function_device, RT_NULL}, - {"Ñ¡ÏîÉèÖÃ", RT_NULL, function_action, RT_NULL}, - {"USB Áª»ú", RT_NULL, function_cable, RT_NULL}, - {"·µ»Ø²¥·ÅÆ÷", RT_NULL, function_player, RT_NULL}, -}; - -void player_set_position(rt_uint32_t position) -{ - if (player_mode != PLAYER_PLAY_RADIO) - { - tinfo.position = position / (tinfo.bit_rate / 8); - } - else - { - tinfo.position = position; - } -} - -void player_set_title(const char* title) -{ - strncpy(tinfo.title, title, 40); -} - -void player_set_buffer_status(rt_bool_t buffering) -{ - if (buffering == RT_TRUE) - strncpy(tinfo.artist, "»º³åÖÐ...", 40); - else - strncpy(tinfo.artist, "²¥·ÅÖÐ...", 40); -} - -enum PLAYER_MODE player_get_mode() -{ - return player_mode; -} - -void player_play_file(const char* fn) -{ - struct rtgui_dc* dc; - rtgui_color_t saved; - rt_bool_t is_mp3; - - is_mp3 = RT_FALSE; - - if (strstr(fn, ".mp3") != RT_NULL || - strstr(fn, ".MP3") != RT_NULL) - is_mp3 = RT_TRUE; - else if (strstr(fn, ".wav") != RT_NULL || - strstr(fn, ".wav") != RT_NULL) - is_mp3 = RT_FALSE; - else return; /* not supported audio format */ - - if (is_mp3 == RT_TRUE) - { - /* get music tag information */ - mp3_get_info(fn, &tinfo); - if (tinfo.title[0] == '\0') - rt_snprintf(tinfo.title, sizeof(tinfo.title), "<δ֪ÃûÒôÀÖ>"); - } - else - { - /* wav file */ - rt_snprintf(tinfo.title, sizeof(tinfo.title), "<δ֪ÃûÒôÀÖ>"); - rt_snprintf(tinfo.artist, sizeof(tinfo.title), ""); - - tinfo.duration = 0; - } - - /* set player mode */ - player_mode = PLAYER_PLAY_FILE; - - dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(home_view)); - if (dc != RT_NULL) - { - rtgui_rect_t play_rect; - rtgui_image_t *button; - - /* update tag information */ - player_update_tag_info(dc); - - /* reset progress bar */ - saved = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)); - RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = RTGUI_RGB(82, 199, 16); - rtgui_dc_draw_hline(dc, 14, 226, 75); - RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(home_view)) = saved; - - /* update play button */ - button = rtgui_image_create_from_mem("hdc", - play_hdh, sizeof(play_hdh), RT_FALSE); - play_rect.x1 = 32; - play_rect.y1 = 92; - play_rect.x2 = 61; - play_rect.y2 = 114; - rtgui_image_blit(button, dc, &play_rect); - rtgui_image_destroy(button); - - rtgui_dc_end_drawing(dc); - } - - rtgui_view_show(home_view, RT_FALSE); - - player_play_req(fn); -} - -void player_play_url(const char* url) -{ - struct rtgui_dc* dc; - - /* set music tag information */ - strncpy(tinfo.title, "ÍøÂçµç̨", 40); - player_set_buffer_status(RT_TRUE); - tinfo.duration = 320 * 1024; /* 320 k */ - - /* set player mode */ - player_mode = PLAYER_PLAY_RADIO; - - dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(home_view)); - if (dc != RT_NULL) - { - rtgui_rect_t play_rect; - rtgui_image_t *button; - - /* update tag information */ - player_update_tag_info(dc); - - /* update play button */ - button = rtgui_image_create_from_mem("hdc", - play_hdh, sizeof(play_hdh), RT_FALSE); - play_rect.x1 = 32; - play_rect.y1 = 92; - play_rect.x2 = 61; - play_rect.y2 = 114; - rtgui_image_blit(button, dc, &play_rect); - rtgui_image_destroy(button); - - rtgui_dc_end_drawing(dc); - } - - rtgui_view_show(home_view, RT_FALSE); - - player_play_req(url); -} - -static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) -{ - if (event->type == RTGUI_EVENT_PAINT) - { - struct rtgui_dc* dc; - struct rtgui_rect rect; - rtgui_color_t saved; - rtgui_image_t *background; - - dc = rtgui_dc_begin_drawing(widget); - if (dc == RT_NULL) return RT_FALSE; - rtgui_widget_get_rect(widget, &rect); - saved = RTGUI_WIDGET_FOREGROUND(widget); - - /* draw background */ - background = rtgui_image_create_from_file("hdc", "/resource/bg.hdc", RT_FALSE); - if (background != RT_NULL) - { - rtgui_image_t *play; - rtgui_rect_t play_rect; - - rtgui_image_blit(background, dc, &rect); - rtgui_image_destroy(background); - - background = RT_NULL; - - if (player_mode == PLAYER_STOP) - play = rtgui_image_create_from_mem("hdc", stop_hdh, sizeof(stop_hdh), RT_FALSE); - else - play = rtgui_image_create_from_mem("hdc", play_hdh, sizeof(play_hdh), RT_FALSE); - play_rect.x1 = 32; - play_rect.y1 = 92; - play_rect.x2 = 61; - play_rect.y2 = 114; - rtgui_image_blit(play, dc, &play_rect); - rtgui_image_destroy(play); - } - else - { - rtgui_dc_fill_rect(dc, &rect); - } - - /* draw playing information */ - rtgui_dc_set_color(dc, black); - { - char line[32]; - - rect.x1 = 28; - rect.y1 = 12; - rect.x2 = 220; - rect.y2 = rect.y1 + 16; - if (player_mode == PLAYER_STOP) - { - rt_snprintf(line, sizeof(line), "ÍøÂçÊÕÒô»ú"); - rtgui_dc_draw_text(dc, line, &rect); - } - else - rtgui_dc_draw_text(dc, tinfo.title, &rect); - - rect.x1 = 28; - rect.y1 = 39; - rect.x2 = 170; - rect.y2 = 59; - if (player_mode == PLAYER_STOP) - { - rect.x2 = 220; - rt_snprintf(line, sizeof(line), "radio.rt-thread.org"); - rtgui_dc_draw_text(dc, line, &rect); - } - else - rtgui_dc_draw_text(dc, tinfo.artist, &rect); - - if ((tinfo.duration != 0) && (player_mode == PLAYER_PLAY_FILE)) - { - rt_uint32_t t = player_mode == PLAYER_STOP ? tinfo.duration : play_time; - - rect.x1 = 172; - rect.x2 = 220; - rt_snprintf(line, sizeof(line), "%3d:%02d", t / 60, t % 60); - rtgui_dc_draw_text(dc, line, &rect); - } - } - - RTGUI_WIDGET_FOREGROUND(widget) = RTGUI_RGB(82, 199, 16); - rtgui_dc_draw_hline(dc, 14, 226, 75); - - RTGUI_WIDGET_FOREGROUND(widget) = saved; - - if (player_mode == PLAYER_PLAY_FILE) - { - char line[32]; - rt_uint32_t index; - struct play_item* item; - - rect.x1 = 20; - rect.y1 = 150; - rect.x2 = 170; - rect.y2 = 168; - for (index = 0; index < play_list_items() && index < 8; index ++) - { - item = play_list_item(index); - rtgui_dc_draw_text(dc, item->title, &rect); - - rect.x1 = 172; - rect.x2 = 220; - rt_snprintf(line, sizeof(line), "%3d:%02d", item->duration / 60, item->duration % 60); - rtgui_dc_draw_text(dc, line, &rect); - - /* move to next item */ - rect.x1 = 20; - rect.x2 = 170; - rect.y1 += 18; - rect.y2 += 18; - } - } - rtgui_dc_end_drawing(dc); - - return RT_FALSE; - } - else if (event->type == RTGUI_EVENT_KBD) - { - struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; - if (ekbd->type == RTGUI_KEYDOWN) - { - switch (ekbd->key) - { - case RTGUIK_RIGHT: - if (player_mode == PLAYER_PLAY_FILE && play_list_items() > 0) - { - player_stop_req(); - next_step = PLAYER_STEP_NEXT; - } - break; - - case RTGUIK_LEFT: - if (player_mode == PLAYER_PLAY_FILE && play_list_items() > 0) - { - player_stop_req(); - next_step = PLAYER_STEP_PREV; - } - break; - - case RTGUIK_RETURN: - if (player_is_playing() == RT_TRUE) - { - player_stop_req(); - next_step = PLAYER_STEP_STOP; - } - else - { - if ((player_mode == PLAYER_STOP) && (play_list_items() > 0)) - { - next_step = PLAYER_STEP_NEXT; - player_play_file(play_list_current_item()); - } - } - break; - - case RTGUIK_DOWN: - rtgui_view_show(RTGUI_VIEW(function_view), RT_FALSE); - break; - } - } - return RT_FALSE; - } - else if (event->type == RTGUI_EVENT_COMMAND) - { - struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event; - - switch (ecmd->command_id) - { - case PLAYER_REQUEST_PLAY_SINGLE_FILE: - case PLAYER_REQUEST_PLAY_LIST: - rtgui_timer_start(info_timer); - break; - - case PLAYER_REQUEST_STOP: - { - rtgui_timer_stop(info_timer); - - switch (next_step) - { - case PLAYER_STEP_STOP: -// #define TEST_MODE -#ifdef TEST_MODE - player_play_file(play_list_start()); - next_step = PLAYER_STEP_STOP; -#else - { - struct rtgui_dc* dc; - rtgui_color_t saved; - rtgui_image_t *button; - rtgui_rect_t play_rect; - - player_mode = PLAYER_STOP; - - dc = rtgui_dc_begin_drawing(widget); - if (dc == RT_NULL) return RT_FALSE; - - player_update_tag_info(dc); - - saved = RTGUI_WIDGET_FOREGROUND(widget); - - RTGUI_WIDGET_FOREGROUND(widget) = RTGUI_RGB(82, 199, 16); - rtgui_dc_draw_hline(dc, 14, 226, 75); - - /* update play button */ - button = rtgui_image_create_from_mem("hdc", stop_hdh, sizeof(stop_hdh), RT_FALSE); - play_rect.x1 = 32; - play_rect.y1 = 92; - play_rect.x2 = 61; - play_rect.y2 = 114; - rtgui_image_blit(button, dc, &play_rect); - rtgui_image_destroy(button); - - RTGUI_WIDGET_FOREGROUND(widget) = saved; - rtgui_dc_end_drawing(dc); - } -#endif - break; - - case PLAYER_STEP_NEXT: - if (play_list_is_end() == RT_TRUE) - { - struct rtgui_dc* dc; - rtgui_color_t saved; - rtgui_image_t *button; - rtgui_rect_t play_rect; - - /* set stat */ - next_step = PLAYER_STEP_STOP; - player_mode = PLAYER_STOP; - - /* update UI */ - dc = rtgui_dc_begin_drawing(widget); - if (dc == RT_NULL) return RT_FALSE; - - player_update_tag_info(dc); - - saved = RTGUI_WIDGET_FOREGROUND(widget); - - RTGUI_WIDGET_FOREGROUND(widget) = RTGUI_RGB(82, 199, 16); - rtgui_dc_draw_hline(dc, 14, 226, 75); - - /* update play button */ - button = rtgui_image_create_from_mem("hdc", - stop_hdh, sizeof(stop_hdh), RT_FALSE); - play_rect.x1 = 32; - play_rect.y1 = 92; - play_rect.x2 = 61; - play_rect.y2 = 114; - rtgui_image_blit(button, dc, &play_rect); - rtgui_image_destroy(button); - - RTGUI_WIDGET_FOREGROUND(widget) = saved; - rtgui_dc_end_drawing(dc); - } - else - { - player_play_file(play_list_next()); - next_step = PLAYER_STEP_NEXT; - } - break; - - case PLAYER_STEP_PREV: - player_play_file(play_list_prev()); - next_step = PLAYER_STEP_NEXT; - break; - }; - } - break; - - case PLAYER_REQUEST_FREEZE: - { - /* stop play */ - if (player_is_playing() == RT_TRUE) - { - player_stop_req(); - next_step = PLAYER_STEP_STOP; - } - - /* delay some tick */ - rt_thread_delay(50); - - /* show a modal view */ - { - rtgui_view_t *view; - rtgui_label_t *label; - rtgui_rect_t rect = {0, 0, 150, 150}, container_rect; - - rtgui_graphic_driver_get_default_rect(&container_rect); - /* set centre */ - rtgui_rect_moveto_align(&container_rect, &rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); - view = rtgui_view_create("USB"); - rtgui_workbench_add_view(workbench, view); - - /* set container to window rect */ - container_rect = rect; - - rect.x1 = 0; - rect.y1 = 0; - rect.x2 = 120; - rect.y2 = 20; - label = rtgui_label_create("USB Áª»úÖÐ..."); - rtgui_rect_moveto_align(&container_rect, &rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL); - rtgui_widget_set_rect(RTGUI_WIDGET(label), &rect); - rtgui_container_add_child(RTGUI_CONTAINER(view), RTGUI_WIDGET(label)); - - rtgui_view_show(view, RT_TRUE); - /* never reach hear */ - } - } - default: - break; - } - - return RT_FALSE; - } - - return rtgui_view_event_handler(widget, event); -} - -rt_bool_t player_workbench_event_handler(rtgui_widget_t *widget, rtgui_event_t *event) -{ - if (event->type == RTGUI_EVENT_KBD) - { - struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; - if (((ekbd->type == RTGUI_KEYUP) && ekbd->key == RTGUIK_HOME) - && !RTGUI_WORKBENCH_IS_MODAL_MODE(workbench)) - { - /* active home view */ - if (workbench->current_view != home_view) - { - rtgui_view_show(home_view, RT_FALSE); - return RT_FALSE; - } - } - } - - return rtgui_workbench_event_handler(widget, event); -} - -static void player_entry(void* parameter) -{ - rt_mq_t mq; - rtgui_rect_t rect; - - mq = rt_mq_create("ply_ui", 256, 4, RT_IPC_FLAG_FIFO); - rtgui_thread_register(rt_thread_self(), mq); - - /* create information timer */ - info_timer = rtgui_timer_create(RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC, info_timer_timeout, RT_NULL); - - time_bg_image = rtgui_image_create_from_mem("xpm", (rt_uint8_t *) time_bg_xpm, sizeof(time_bg_xpm), RT_TRUE); - - workbench = rtgui_workbench_create("main", "workbench"); - if (workbench == RT_NULL) return; - rtgui_widget_set_event_handler(RTGUI_WIDGET(workbench), player_workbench_event_handler); - - /* add home view */ - home_view = rtgui_view_create("Home"); - rtgui_widget_set_event_handler(RTGUI_WIDGET(home_view), home_view_event_handler); - - rtgui_workbench_add_view(workbench, home_view); - /* this view can be focused */ - RTGUI_WIDGET(home_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; - /* set widget focus */ - rtgui_widget_focus(RTGUI_WIDGET(home_view)); - - rtgui_view_show(home_view, RT_FALSE); - - /* add function view */ - rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); - function_view = rtgui_list_view_create(function_list, - sizeof(function_list)/sizeof(struct rtgui_list_item), - &rect); - rtgui_workbench_add_view(workbench, RTGUI_VIEW(function_view)); - - rtgui_workbench_event_loop(workbench); - - rtgui_thread_deregister(rt_thread_self()); - rt_mq_delete(mq); -} - -void player_notify_play(void) -{ - struct rtgui_event_command ecmd; - RTGUI_EVENT_COMMAND_INIT(&ecmd); - ecmd.type = RTGUI_CMD_USER_INT; - ecmd.command_id = PLAYER_REQUEST_PLAY_SINGLE_FILE; - - rtgui_thread_send(player_ui_tid, &ecmd.parent, sizeof(ecmd)); -} - -void player_notify_stop() -{ - struct rtgui_event_command ecmd; - RTGUI_EVENT_COMMAND_INIT(&ecmd); - ecmd.type = RTGUI_CMD_USER_INT; - ecmd.command_id = PLAYER_REQUEST_STOP; - - rtgui_thread_send(player_ui_tid, &ecmd.parent, sizeof(ecmd)); -} - -void player_ui_init() -{ - player_ui_tid = rt_thread_create("ply_ui", player_entry, RT_NULL, - 4096, 25, 5); - if (player_ui_tid != RT_NULL) - rt_thread_startup(player_ui_tid); -} - -void player_ui_freeze() -{ - struct rtgui_event_command ecmd; - - /* check whether UI starts. */ - if (home_view == RT_NULL || workbench == RT_NULL) return; - - RTGUI_EVENT_COMMAND_INIT(&ecmd); - ecmd.type = RTGUI_CMD_USER_INT; - ecmd.command_id = PLAYER_REQUEST_FREEZE; - - rtgui_thread_send(player_ui_tid, &ecmd.parent, sizeof(ecmd)); -} - diff --git a/bsp/stm32_radio/player_ui.h b/bsp/stm32_radio/player_ui.h deleted file mode 100644 index 27ff3e6ed2..0000000000 --- a/bsp/stm32_radio/player_ui.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __PLAYER_H__ -#define __PLAYER_H__ - -#include - -/* music tag information structure */ -struct tag_info -{ - char title [40]; /* music title */ - char artist[40]; /* music artist */ - - rt_uint32_t duration; /* music total duration (second) */ - rt_uint32_t position; /* music current position (second) */ - - rt_uint32_t bit_rate; /* bit rate */ - rt_uint32_t sampling; /* sampling */ - rt_uint32_t data_start; /* start position of data */ -}; - -enum PLAYER_CMD -{ - PLAYER_CMD_START, - PLAYER_CMD_STOP -}; - -enum PLAYER_MODE -{ - PLAYER_STOP, - PLAYER_PLAY_FILE, - PLAYER_PLAY_RADIO, -}; - -enum PLAYER_STEP -{ - PLAYER_STEP_STOP, - PLAYER_STEP_PREV, - PLAYER_STEP_NEXT, -}; - -/* init player ui */ -void player_ui_init(void); -void player_ui_freeze(void); - -/* notification function, which invoked by player background thread */ -void player_notify_play(void); -void player_notify_stop(void); - -/* set player information */ -void player_set_position(rt_uint32_t position); -void player_set_title(const char* title); -void player_set_buffer_status(rt_bool_t buffering); - -/* get playing mode */ -enum PLAYER_MODE player_get_mode(void); - -#endif diff --git a/bsp/stm32_radio/project.Opt b/bsp/stm32_radio/project.Opt deleted file mode 100644 index 5fcf9f737e..0000000000 --- a/bsp/stm32_radio/project.Opt +++ /dev/null @@ -1,265 +0,0 @@ -### uVision2 Project, (C) Keil Software -### Do not modify ! - - cExt (*.c) - aExt (*.s*; *.src; *.a*) - oExt (*.obj) - lExt (*.lib) - tExt (*.txt; *.h; *.inc) - pExt (*.plm) - CppX (*.cpp) - DaveTm { 0,0,0,0,0,0,0,0 } - -Target (RT-Thread STM32 Radio), 0x0004 // Tools: 'ARM-ADS' -GRPOPT 1,(Startup),1,0,0 -GRPOPT 2,(Kernel),0,0,0 -GRPOPT 3,(STM32),0,0,0 -GRPOPT 4,(StdPeriph_Driver),0,0,0 -GRPOPT 5,(USB-FS-Device_Driver),0,0,0 -GRPOPT 6,(CMSIS),0,0,0 -GRPOPT 7,(finsh),0,0,0 -GRPOPT 8,(Filesystem),0,0,0 -GRPOPT 9,(LwIP),0,0,0 -GRPOPT 10,(mp3),0,0,0 -GRPOPT 11,(RTGUI),0,0,0 -GRPOPT 12,(Mass_Storage),0,0,0 - -OPTFFF 1,1,5,0,0,114,114,0,<.\rtconfig.h> { 44,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,226,255,255,255,0,0,0,0,0,0,0,0,133,2,0,0,218,0,0,0 } -OPTFFF 1,2,5,1124073474,0,19,34,0,<.\board.h> { 44,0,0,0,2,0,0,0,3,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,226,255,255,255,110,0,0,0,145,0,0,0,93,4,0,0,17,2,0,0 } -OPTFFF 1,3,5,0,0,0,0,0,<.\stm32f10x_conf.h> -OPTFFF 1,4,1,0,0,0,0,0,<.\application.c> -OPTFFF 1,5,1,0,0,0,0,0,<.\board.c> -OPTFFF 1,6,1,0,0,0,0,0,<.\startup.c> -OPTFFF 1,7,1,0,0,0,0,0,<.\stm32f10x_it.c> -OPTFFF 1,8,1,436207616,0,0,0,0,<.\usart.c> -OPTFFF 1,9,1,0,0,0,0,0,<.\sdcard.c> -OPTFFF 1,10,1,0,0,0,0,0,<.\rtc.c> -OPTFFF 1,11,1,0,0,0,0,0,<.\dm9000.c> -OPTFFF 1,12,1,889192448,0,0,0,0,<.\fsmc_nand.c> -OPTFFF 1,13,1,0,0,0,0,0,<.\fsmc_sram.c> -OPTFFF 1,14,1,0,0,0,0,0,<.\fmt0371\fmt0371.c> -OPTFFF 1,15,1,0,0,0,0,0,<.\http.c> -OPTFFF 1,16,1,0,0,0,0,0,<.\lcd.c> -OPTFFF 1,17,1,251658240,0,0,0,0,<.\mp3.c> -OPTFFF 1,18,1,369098752,0,0,0,0,<.\wav.c> -OPTFFF 1,19,1,285212672,0,0,0,0,<.\netbuffer.c> -OPTFFF 1,20,1,0,0,0,0,0,<.\key.c> -OPTFFF 1,21,1,0,0,0,0,0,<.\info.c> -OPTFFF 1,22,1,0,0,0,0,0,<.\device_info.c> -OPTFFF 1,23,1,0,0,0,0,0,<.\player_ui.c> -OPTFFF 1,24,1,0,0,0,0,0,<.\player_bg.c> -OPTFFF 1,25,1,0,0,0,0,0,<.\play_list.c> -OPTFFF 1,26,1,0,0,0,0,0,<.\codec.c> -OPTFFF 1,27,1,0,0,0,0,0,<.\spi_flash.c> -OPTFFF 1,28,1,0,0,0,0,0,<.\remote.c> -OPTFFF 1,29,1,0,0,0,0,0,<.\picture.c> -OPTFFF 1,30,1,0,0,0,0,0,<.\station_list.c> -OPTFFF 1,31,1,0,0,0,0,0,<.\ili9325\ili9325.c> -OPTFFF 1,32,1,0,0,0,0,0,<.\touch.c> -OPTFFF 1,33,1,0,0,0,0,0,<.\radio_list_update.c> -OPTFFF 2,34,1,0,0,0,0,0,<..\..\src\clock.c> -OPTFFF 2,35,1,0,0,0,0,0,<..\..\src\idle.c> -OPTFFF 2,36,1,0,0,0,0,0,<..\..\src\ipc.c> -OPTFFF 2,37,1,0,0,0,0,0,<..\..\src\mempool.c> -OPTFFF 2,38,1,0,0,0,0,0,<..\..\src\mem.c> -OPTFFF 2,39,1,0,0,0,0,0,<..\..\src\object.c> -OPTFFF 2,40,1,0,0,0,0,0,<..\..\src\scheduler.c> -OPTFFF 2,41,1,0,0,0,0,0,<..\..\src\thread.c> -OPTFFF 2,42,1,0,0,0,0,0,<..\..\src\timer.c> -OPTFFF 2,43,1,0,0,0,0,0,<..\..\src\irq.c> -OPTFFF 2,44,1,0,0,0,0,0,<..\..\src\kservice.c> -OPTFFF 2,45,1,0,0,0,0,0,<..\..\src\device.c> -OPTFFF 2,46,1,0,0,0,0,0,<..\..\src\slab.c> -OPTFFF 3,47,1,0,0,0,0,0,<..\..\libcpu\arm\stm32\stack.c> -OPTFFF 3,48,1,0,0,0,0,0,<..\..\libcpu\arm\stm32\interrupt.c> -OPTFFF 3,49,1,0,0,0,0,0,<..\..\libcpu\arm\stm32\cpu.c> -OPTFFF 3,50,1,0,0,0,0,0,<..\..\libcpu\arm\stm32\serial.c> -OPTFFF 3,51,2,0,0,0,0,0,<..\..\libcpu\arm\stm32\context_rvds.S> -OPTFFF 3,52,2,0,0,0,0,0,<..\..\libcpu\arm\stm32\start_rvds.s> -OPTFFF 3,53,1,0,0,0,0,0,<..\..\libcpu\arm\stm32\fault.c> -OPTFFF 3,54,2,0,0,0,0,0,<..\..\libcpu\arm\stm32\fault_rvds.S> -OPTFFF 4,55,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c> -OPTFFF 4,56,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_adc.c> -OPTFFF 4,57,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_bkp.c> -OPTFFF 4,58,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_can.c> -OPTFFF 4,59,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c> -OPTFFF 4,60,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c> -OPTFFF 4,61,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c> -OPTFFF 4,62,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c> -OPTFFF 4,63,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c> -OPTFFF 4,64,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c> -OPTFFF 4,65,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c> -OPTFFF 4,66,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c> -OPTFFF 4,67,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c> -OPTFFF 4,68,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c> -OPTFFF 4,69,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c> -OPTFFF 4,70,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c> -OPTFFF 4,71,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c> -OPTFFF 4,72,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c> -OPTFFF 4,73,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_spi.c> -OPTFFF 4,74,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c> -OPTFFF 4,75,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c> -OPTFFF 4,76,1,0,0,0,0,0,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c> -OPTFFF 5,77,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\otgd_fs_cal.c> -OPTFFF 5,78,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\otgd_fs_dev.c> -OPTFFF 5,79,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\otgd_fs_int.c> -OPTFFF 5,80,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\otgd_fs_pcd.c> -OPTFFF 5,81,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_core.c> -OPTFFF 5,82,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_init.c> -OPTFFF 5,83,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_int.c> -OPTFFF 5,84,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_mem.c> -OPTFFF 5,85,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_regs.c> -OPTFFF 5,86,1,0,0,0,0,0,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_sil.c> -OPTFFF 6,87,1,0,0,0,0,0,<.\Libraries\CMSIS\CM3\CoreSupport\core_cm3.c> -OPTFFF 6,88,1,0,0,0,0,0,<.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c> -OPTFFF 7,89,1,0,0,0,0,0,<..\..\finsh\finsh_compiler.c> -OPTFFF 7,90,1,0,0,0,0,0,<..\..\finsh\finsh_error.c> -OPTFFF 7,91,1,0,0,0,0,0,<..\..\finsh\finsh_heap.c> -OPTFFF 7,92,1,0,0,0,0,0,<..\..\finsh\finsh_init.c> -OPTFFF 7,93,1,0,0,0,0,0,<..\..\finsh\finsh_node.c> -OPTFFF 7,94,1,0,0,0,0,0,<..\..\finsh\finsh_ops.c> -OPTFFF 7,95,1,0,0,0,0,0,<..\..\finsh\finsh_parser.c> -OPTFFF 7,96,1,0,0,0,0,0,<..\..\finsh\finsh_token.c> -OPTFFF 7,97,1,0,0,0,0,0,<..\..\finsh\finsh_var.c> -OPTFFF 7,98,1,0,0,0,0,0,<..\..\finsh\finsh_vm.c> -OPTFFF 7,99,1,0,0,0,0,0,<..\..\finsh\shell.c> -OPTFFF 7,100,1,0,0,0,0,0,<..\..\finsh\symbol.c> -OPTFFF 7,101,1,0,0,0,0,0,<..\..\finsh\cmd.c> -OPTFFF 8,102,1,0,0,0,0,0,<..\..\filesystem\dfs\src\dfs_init.c> -OPTFFF 8,103,1,0,0,0,0,0,<..\..\filesystem\dfs\src\dfs_fs.c> -OPTFFF 8,104,1,0,0,0,0,0,<..\..\filesystem\dfs\src\dfs_raw.c> -OPTFFF 8,105,1,0,0,0,0,0,<..\..\filesystem\dfs\src\dfs_util.c> -OPTFFF 8,106,1,0,0,0,0,0,<..\..\filesystem\dfs\src\dfs_posix.c> -OPTFFF 8,107,1,0,0,0,0,0,<..\..\filesystem\dfs\filesystems\elmfat\dfs_elm.c> -OPTFFF 8,108,1,0,0,0,0,0,<..\..\filesystem\dfs\filesystems\elmfat\ff.c> -OPTFFF 9,109,1,0,0,0,0,0,<..\..\net\lwip\src\core\dhcp.c> -OPTFFF 9,110,1,0,0,0,0,0,<..\..\net\lwip\src\core\dns.c> -OPTFFF 9,111,1,0,0,0,0,0,<..\..\net\lwip\src\core\init.c> -OPTFFF 9,112,1,0,0,0,0,0,<..\..\net\lwip\src\core\memp.c> -OPTFFF 9,113,1,0,0,0,0,0,<..\..\net\lwip\src\core\netif.c> -OPTFFF 9,114,1,0,0,0,0,0,<..\..\net\lwip\src\core\pbuf.c> -OPTFFF 9,115,1,0,0,0,0,0,<..\..\net\lwip\src\core\raw.c> -OPTFFF 9,116,1,0,0,0,0,0,<..\..\net\lwip\src\core\stats.c> -OPTFFF 9,117,1,0,0,0,0,0,<..\..\net\lwip\src\core\sys.c> -OPTFFF 9,118,1,0,0,0,0,0,<..\..\net\lwip\src\core\tcp.c> -OPTFFF 9,119,1,0,0,0,0,0,<..\..\net\lwip\src\core\tcp_in.c> -OPTFFF 9,120,1,0,0,0,0,0,<..\..\net\lwip\src\core\tcp_out.c> -OPTFFF 9,121,1,0,0,0,0,0,<..\..\net\lwip\src\core\udp.c> -OPTFFF 9,122,1,0,0,0,0,0,<..\..\net\lwip\src\core\ipv4\autoip.c> -OPTFFF 9,123,1,0,0,0,0,0,<..\..\net\lwip\src\core\ipv4\icmp.c> -OPTFFF 9,124,1,0,0,0,0,0,<..\..\net\lwip\src\core\ipv4\igmp.c> -OPTFFF 9,125,1,0,0,0,0,0,<..\..\net\lwip\src\core\ipv4\inet.c> -OPTFFF 9,126,1,0,0,0,0,0,<..\..\net\lwip\src\core\ipv4\inet_chksum.c> -OPTFFF 9,127,1,0,0,0,0,0,<..\..\net\lwip\src\core\ipv4\ip.c> -OPTFFF 9,128,1,0,0,0,0,0,<..\..\net\lwip\src\core\ipv4\ip_addr.c> -OPTFFF 9,129,1,0,0,0,0,0,<..\..\net\lwip\src\core\ipv4\ip_frag.c> -OPTFFF 9,130,1,0,0,0,0,0,<..\..\net\lwip\src\core\snmp\msg_in.c> -OPTFFF 9,131,1,0,0,0,0,0,<..\..\net\lwip\src\core\snmp\msg_out.c> -OPTFFF 9,132,1,0,0,0,0,0,<..\..\net\lwip\src\api\api_lib.c> -OPTFFF 9,133,1,0,0,0,0,0,<..\..\net\lwip\src\api\api_msg.c> -OPTFFF 9,134,1,0,0,0,0,0,<..\..\net\lwip\src\api\err.c> -OPTFFF 9,135,1,0,0,0,0,0,<..\..\net\lwip\src\api\netbuf.c> -OPTFFF 9,136,1,0,0,0,0,0,<..\..\net\lwip\src\api\netdb.c> -OPTFFF 9,137,1,0,0,0,0,0,<..\..\net\lwip\src\api\netifapi.c> -OPTFFF 9,138,1,0,0,0,0,0,<..\..\net\lwip\src\api\tcpip.c> -OPTFFF 9,139,1,0,0,0,0,0,<..\..\net\lwip\src\netif\etharp.c> -OPTFFF 9,140,1,0,0,0,0,0,<..\..\net\lwip\src\netif\ethernetif.c> -OPTFFF 9,141,1,0,0,0,0,0,<..\..\net\lwip\src\netif\loopif.c> -OPTFFF 9,142,1,0,0,0,0,0,<..\..\net\lwip\src\arch\sys_arch_init.c> -OPTFFF 9,143,1,0,0,0,0,0,<..\..\net\lwip\src\arch\sys_arch.c> -OPTFFF 9,144,1,0,0,0,0,0,<..\..\net\lwip\src\api\sockets.c> -OPTFFF 10,145,1,0,0,0,0,0,<.\mp3\mp3dec.c> -OPTFFF 10,146,1,0,0,0,0,0,<.\mp3\mp3tabs.c> -OPTFFF 10,147,1,0,0,0,0,0,<.\mp3\real\bitstream.c> -OPTFFF 10,148,1,0,0,0,0,0,<.\mp3\real\buffers.c> -OPTFFF 10,149,1,0,0,0,0,0,<.\mp3\real\dct32.c> -OPTFFF 10,150,1,0,0,0,0,0,<.\mp3\real\dequant.c> -OPTFFF 10,151,1,0,0,0,0,0,<.\mp3\real\dqchan.c> -OPTFFF 10,152,1,0,0,0,0,0,<.\mp3\real\huffman.c> -OPTFFF 10,153,1,0,0,0,0,0,<.\mp3\real\hufftabs.c> -OPTFFF 10,154,1,0,0,0,0,0,<.\mp3\real\imdct.c> -OPTFFF 10,155,1,0,0,0,0,0,<.\mp3\real\scalfact.c> -OPTFFF 10,156,1,0,0,0,0,0,<.\mp3\real\stproc.c> -OPTFFF 10,157,1,0,0,0,0,0,<.\mp3\real\subband.c> -OPTFFF 10,158,1,0,0,0,0,0,<.\mp3\real\trigtabs.c> -OPTFFF 10,159,2,0,0,0,0,0,<.\mp3\real\arm\asmpoly_thumb2.s> -OPTFFF 10,160,2,0,0,0,0,0,<.\mp3\real\arm\asmmisc.s> -OPTFFF 11,161,1,0,0,0,0,0,<..\..\rtgui\common\rtgui_object.c> -OPTFFF 11,162,1,0,0,0,0,0,<..\..\rtgui\common\rtgui_system.c> -OPTFFF 11,163,1,0,0,0,0,0,<..\..\rtgui\common\rtgui_theme.c> -OPTFFF 11,164,1,0,0,0,0,0,<..\..\rtgui\common\asc12font.c> -OPTFFF 11,165,1,0,0,0,0,0,<..\..\rtgui\common\asc16font.c> -OPTFFF 11,166,1,0,0,0,0,0,<..\..\rtgui\common\color.c> -OPTFFF 11,167,1,0,0,0,0,0,<..\..\rtgui\common\dc.c> -OPTFFF 11,168,1,0,0,0,0,0,<..\..\rtgui\common\dc_buffer.c> -OPTFFF 11,169,1,0,0,0,0,0,<..\..\rtgui\common\dc_hw.c> -OPTFFF 11,170,1,0,0,0,0,0,<..\..\rtgui\common\filerw.c> -OPTFFF 11,171,1,0,0,0,0,0,<..\..\rtgui\common\font.c> -OPTFFF 11,172,1,0,0,0,0,0,<..\..\rtgui\common\image.c> -OPTFFF 11,173,1,0,0,0,0,0,<..\..\rtgui\common\image_xpm.c> -OPTFFF 11,174,1,0,0,0,0,0,<..\..\rtgui\common\image_hdc.c> -OPTFFF 11,175,1,0,0,0,0,0,<..\..\rtgui\common\region.c> -OPTFFF 11,176,1,0,0,0,0,0,<..\..\rtgui\server\server.c> -OPTFFF 11,177,1,0,0,0,0,0,<..\..\rtgui\server\driver.c> -OPTFFF 11,178,1,0,0,0,0,0,<..\..\rtgui\server\panel.c> -OPTFFF 11,179,1,0,0,0,0,0,<..\..\rtgui\widgets\widget.c> -OPTFFF 11,180,1,0,0,0,0,0,<..\..\rtgui\widgets\window.c> -OPTFFF 11,181,1,0,0,0,0,0,<..\..\rtgui\widgets\workbench.c> -OPTFFF 11,182,1,0,0,0,0,0,<..\..\rtgui\widgets\view.c> -OPTFFF 11,183,1,0,0,0,0,0,<..\..\rtgui\widgets\box.c> -OPTFFF 11,184,1,0,0,0,0,0,<..\..\rtgui\widgets\button.c> -OPTFFF 11,185,1,0,0,0,0,0,<..\..\rtgui\widgets\container.c> -OPTFFF 11,186,1,0,0,0,0,0,<..\..\rtgui\widgets\iconbox.c> -OPTFFF 11,187,1,0,0,0,0,0,<..\..\rtgui\widgets\label.c> -OPTFFF 11,188,1,0,0,0,0,0,<..\..\rtgui\widgets\textbox.c> -OPTFFF 11,189,1,0,0,0,0,0,<..\..\rtgui\widgets\title.c> -OPTFFF 11,190,1,0,0,0,0,0,<..\..\rtgui\widgets\toplevel.c> -OPTFFF 11,191,1,0,0,0,0,0,<..\..\rtgui\server\mouse.c> -OPTFFF 11,192,1,0,0,0,0,0,<..\..\rtgui\server\topwin.c> -OPTFFF 11,193,1,0,0,0,0,0,<..\..\rtgui\common\font_hz_file.c> -OPTFFF 11,194,1,0,0,0,0,0,<..\..\rtgui\common\hz16font.c> -OPTFFF 11,195,1,0,0,0,0,0,<..\..\rtgui\common\hz12font.c> -OPTFFF 11,196,1,0,0,0,0,0,<..\..\rtgui\widgets\list_view.c> -OPTFFF 11,197,1,0,0,0,0,0,<..\..\rtgui\widgets\filelist_view.c> -OPTFFF 12,198,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\hw_config.c> -OPTFFF 12,199,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\mass_mal.c> -OPTFFF 12,200,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\memory.c> -OPTFFF 12,201,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\usb_bot.c> -OPTFFF 12,202,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\scsi_data.c> -OPTFFF 12,203,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\usb_desc.c> -OPTFFF 12,204,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\usb_endp.c> -OPTFFF 12,205,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\usb_istr.c> -OPTFFF 12,206,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\usb_prop.c> -OPTFFF 12,207,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\usb_pwr.c> -OPTFFF 12,208,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\usb_scsi.c> -OPTFFF 12,209,1,0,0,0,0,0,<.\Libraries\Mass_Storage\src\usb_main.c> - - -TARGOPT 1, (RT-Thread STM32 Radio) - ADSCLK=8000000 - OPTTT 1,1,1,0 - OPTHX 1,65535,0,0,0 - OPTLX 79,66,8,<.\obj\> - OPTOX 16 - OPTLT 1,1,1,0,1,1,0,1,0,0,0,0 - OPTXL 1,1,1,1,1,1,1,0,0 - OPTFL 1,0,1 - OPTAX 255 - OPTDL (SARMCM3.DLL)()(DARMSTM.DLL)(-pSTM32F103ZE)(SARMCM3.DLL)()(TARMSTM.DLL)(-pSTM32F103ZE) - OPTDBG 49142,7,()()()()()()()()()() (Segger\JL2CM3.dll)()()() - OPTKEY 0,(DLGDARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(124=-1,-1,-1,-1,0)(125=-1,-1,-1,-1,0)(126=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)) - OPTKEY 0,(DLGTARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=60,91,584,445,0)(180=-1,-1,-1,-1,0)(120=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(123=-1,-1,-1,-1,0)(124=-1,-1,-1,-1,0)(125=-1,-1,-1,-1,0)(126=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)) - OPTKEY 0,(ARMDBGFLAGS)(-T0) - OPTKEY 0,(DLGUARM)((105=150,189,819,540,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)) - OPTKEY 0,(JL2CM3)(-U10000002 -O718 -S10 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TRE0 -FO27 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000) - OPTBB 0,0,406,1,134342740,0,0,0,0,1,()() - OPTWA 0,1,(_mp) - OPTWA 1,1,(_netbuf) - OPTWA 2,1,(decoder) - OPTMM 1,8,(text) - OPTMM 2,8,(mimeBuffer) - OPTDF 0x82 - OPTLE <> - OPTLC <> -EndOpt - diff --git a/bsp/stm32_radio/project.Uv2 b/bsp/stm32_radio/project.Uv2 deleted file mode 100644 index 7d601f3244..0000000000 --- a/bsp/stm32_radio/project.Uv2 +++ /dev/null @@ -1,385 +0,0 @@ -### uVision2 Project, (C) Keil Software -### Do not modify ! - -Target (RT-Thread STM32 Radio), 0x0004 // Tools: 'ARM-ADS' - -Group (Startup) -Group (Kernel) -Group (STM32) -Group (StdPeriph_Driver) -Group (USB-FS-Device_Driver) -Group (CMSIS) -Group (finsh) -Group (Filesystem) -Group (LwIP) -Group (mp3) -Group (RTGUI) -Group (Mass_Storage) - -File 1,5,<.\rtconfig.h> -File 1,5,<.\board.h> -File 1,5,<.\stm32f10x_conf.h> -File 1,1,<.\application.c> -File 1,1,<.\board.c> -File 1,1,<.\startup.c> -File 1,1,<.\stm32f10x_it.c> -File 1,1,<.\usart.c> -File 1,1,<.\sdcard.c> -File 1,1,<.\rtc.c> -File 1,1,<.\dm9000.c> -File 1,1,<.\fsmc_nand.c> -File 1,1,<.\fsmc_sram.c> -File 1,1,<.\fmt0371\fmt0371.c> -File 1,1,<.\http.c> -File 1,1,<.\lcd.c> -File 1,1,<.\mp3.c> -File 1,1,<.\wav.c> -File 1,1,<.\netbuffer.c> -File 1,1,<.\key.c> -File 1,1,<.\info.c> -File 1,1,<.\device_info.c> -File 1,1,<.\player_ui.c> -File 1,1,<.\player_bg.c> -File 1,1,<.\play_list.c> -File 1,1,<.\codec.c> -File 1,1,<.\spi_flash.c> -File 1,1,<.\remote.c> -File 1,1,<.\picture.c> -File 1,1,<.\station_list.c> -File 1,1,<.\ili9325\ili9325.c> -File 1,1,<.\touch.c> -File 1,1,<.\radio_list_update.c> -File 2,1,<..\..\src\clock.c> -File 2,1,<..\..\src\idle.c> -File 2,1,<..\..\src\ipc.c> -File 2,1,<..\..\src\mempool.c> -File 2,1,<..\..\src\mem.c> -File 2,1,<..\..\src\object.c> -File 2,1,<..\..\src\scheduler.c> -File 2,1,<..\..\src\thread.c> -File 2,1,<..\..\src\timer.c> -File 2,1,<..\..\src\irq.c> -File 2,1,<..\..\src\kservice.c> -File 2,1,<..\..\src\device.c> -File 2,1,<..\..\src\slab.c> -File 3,1,<..\..\libcpu\arm\stm32\stack.c> -File 3,1,<..\..\libcpu\arm\stm32\interrupt.c> -File 3,1,<..\..\libcpu\arm\stm32\cpu.c> -File 3,1,<..\..\libcpu\arm\stm32\serial.c> -File 3,2,<..\..\libcpu\arm\stm32\context_rvds.S> -File 3,2,<..\..\libcpu\arm\stm32\start_rvds.s> -File 3,1,<..\..\libcpu\arm\stm32\fault.c> -File 3,2,<..\..\libcpu\arm\stm32\fault_rvds.S> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\misc.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_adc.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_bkp.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_can.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_spi.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c> -File 4,1,<.\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\otgd_fs_cal.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\otgd_fs_dev.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\otgd_fs_int.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\otgd_fs_pcd.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_core.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_init.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_int.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_mem.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_regs.c> -File 5,1,<.\Libraries\STM32_USB-FS-Device_Driver\src\usb_sil.c> -File 6,1,<.\Libraries\CMSIS\CM3\CoreSupport\core_cm3.c> -File 6,1,<.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c> -File 7,1,<..\..\finsh\finsh_compiler.c> -File 7,1,<..\..\finsh\finsh_error.c> -File 7,1,<..\..\finsh\finsh_heap.c> -File 7,1,<..\..\finsh\finsh_init.c> -File 7,1,<..\..\finsh\finsh_node.c> -File 7,1,<..\..\finsh\finsh_ops.c> -File 7,1,<..\..\finsh\finsh_parser.c> -File 7,1,<..\..\finsh\finsh_token.c> -File 7,1,<..\..\finsh\finsh_var.c> -File 7,1,<..\..\finsh\finsh_vm.c> -File 7,1,<..\..\finsh\shell.c> -File 7,1,<..\..\finsh\symbol.c> -File 7,1,<..\..\finsh\cmd.c> -File 8,1,<..\..\filesystem\dfs\src\dfs_init.c> -File 8,1,<..\..\filesystem\dfs\src\dfs_fs.c> -File 8,1,<..\..\filesystem\dfs\src\dfs_raw.c> -File 8,1,<..\..\filesystem\dfs\src\dfs_util.c> -File 8,1,<..\..\filesystem\dfs\src\dfs_posix.c> -File 8,1,<..\..\filesystem\dfs\filesystems\elmfat\dfs_elm.c> -File 8,1,<..\..\filesystem\dfs\filesystems\elmfat\ff.c> -File 9,1,<..\..\net\lwip\src\core\dhcp.c> -File 9,1,<..\..\net\lwip\src\core\dns.c> -File 9,1,<..\..\net\lwip\src\core\init.c> -File 9,1,<..\..\net\lwip\src\core\memp.c> -File 9,1,<..\..\net\lwip\src\core\netif.c> -File 9,1,<..\..\net\lwip\src\core\pbuf.c> -File 9,1,<..\..\net\lwip\src\core\raw.c> -File 9,1,<..\..\net\lwip\src\core\stats.c> -File 9,1,<..\..\net\lwip\src\core\sys.c> -File 9,1,<..\..\net\lwip\src\core\tcp.c> -File 9,1,<..\..\net\lwip\src\core\tcp_in.c> -File 9,1,<..\..\net\lwip\src\core\tcp_out.c> -File 9,1,<..\..\net\lwip\src\core\udp.c> -File 9,1,<..\..\net\lwip\src\core\ipv4\autoip.c> -File 9,1,<..\..\net\lwip\src\core\ipv4\icmp.c> -File 9,1,<..\..\net\lwip\src\core\ipv4\igmp.c> -File 9,1,<..\..\net\lwip\src\core\ipv4\inet.c> -File 9,1,<..\..\net\lwip\src\core\ipv4\inet_chksum.c> -File 9,1,<..\..\net\lwip\src\core\ipv4\ip.c> -File 9,1,<..\..\net\lwip\src\core\ipv4\ip_addr.c> -File 9,1,<..\..\net\lwip\src\core\ipv4\ip_frag.c> -File 9,1,<..\..\net\lwip\src\core\snmp\msg_in.c> -File 9,1,<..\..\net\lwip\src\core\snmp\msg_out.c> -File 9,1,<..\..\net\lwip\src\api\api_lib.c> -File 9,1,<..\..\net\lwip\src\api\api_msg.c> -File 9,1,<..\..\net\lwip\src\api\err.c> -File 9,1,<..\..\net\lwip\src\api\netbuf.c> -File 9,1,<..\..\net\lwip\src\api\netdb.c> -File 9,1,<..\..\net\lwip\src\api\netifapi.c> -File 9,1,<..\..\net\lwip\src\api\tcpip.c> -File 9,1,<..\..\net\lwip\src\netif\etharp.c> -File 9,1,<..\..\net\lwip\src\netif\ethernetif.c> -File 9,1,<..\..\net\lwip\src\netif\loopif.c> -File 9,1,<..\..\net\lwip\src\arch\sys_arch_init.c> -File 9,1,<..\..\net\lwip\src\arch\sys_arch.c> -File 9,1,<..\..\net\lwip\src\api\sockets.c> -File 10,1,<.\mp3\mp3dec.c> -File 10,1,<.\mp3\mp3tabs.c> -File 10,1,<.\mp3\real\bitstream.c> -File 10,1,<.\mp3\real\buffers.c> -File 10,1,<.\mp3\real\dct32.c> -File 10,1,<.\mp3\real\dequant.c> -File 10,1,<.\mp3\real\dqchan.c> -File 10,1,<.\mp3\real\huffman.c> -File 10,1,<.\mp3\real\hufftabs.c> -File 10,1,<.\mp3\real\imdct.c> -File 10,1,<.\mp3\real\scalfact.c> -File 10,1,<.\mp3\real\stproc.c> -File 10,1,<.\mp3\real\subband.c> -File 10,1,<.\mp3\real\trigtabs.c> -File 10,2,<.\mp3\real\arm\asmpoly_thumb2.s> -File 10,2,<.\mp3\real\arm\asmmisc.s> -File 11,1,<..\..\rtgui\common\rtgui_object.c> -File 11,1,<..\..\rtgui\common\rtgui_system.c> -File 11,1,<..\..\rtgui\common\rtgui_theme.c> -File 11,1,<..\..\rtgui\common\asc12font.c> -File 11,1,<..\..\rtgui\common\asc16font.c> -File 11,1,<..\..\rtgui\common\color.c> -File 11,1,<..\..\rtgui\common\dc.c> -File 11,1,<..\..\rtgui\common\dc_buffer.c> -File 11,1,<..\..\rtgui\common\dc_hw.c> -File 11,1,<..\..\rtgui\common\filerw.c> -File 11,1,<..\..\rtgui\common\font.c> -File 11,1,<..\..\rtgui\common\image.c> -File 11,1,<..\..\rtgui\common\image_xpm.c> -File 11,1,<..\..\rtgui\common\image_hdc.c> -File 11,1,<..\..\rtgui\common\region.c> -File 11,1,<..\..\rtgui\server\server.c> -File 11,1,<..\..\rtgui\server\driver.c> -File 11,1,<..\..\rtgui\server\panel.c> -File 11,1,<..\..\rtgui\widgets\widget.c> -File 11,1,<..\..\rtgui\widgets\window.c> -File 11,1,<..\..\rtgui\widgets\workbench.c> -File 11,1,<..\..\rtgui\widgets\view.c> -File 11,1,<..\..\rtgui\widgets\box.c> -File 11,1,<..\..\rtgui\widgets\button.c> -File 11,1,<..\..\rtgui\widgets\container.c> -File 11,1,<..\..\rtgui\widgets\iconbox.c> -File 11,1,<..\..\rtgui\widgets\label.c> -File 11,1,<..\..\rtgui\widgets\textbox.c> -File 11,1,<..\..\rtgui\widgets\title.c> -File 11,1,<..\..\rtgui\widgets\toplevel.c> -File 11,1,<..\..\rtgui\server\mouse.c> -File 11,1,<..\..\rtgui\server\topwin.c> -File 11,1,<..\..\rtgui\common\font_hz_file.c> -File 11,1,<..\..\rtgui\common\hz16font.c> -File 11,1,<..\..\rtgui\common\hz12font.c> -File 11,1,<..\..\rtgui\widgets\list_view.c> -File 11,1,<..\..\rtgui\widgets\filelist_view.c> -File 12,1,<.\Libraries\Mass_Storage\src\hw_config.c> -File 12,1,<.\Libraries\Mass_Storage\src\mass_mal.c> -File 12,1,<.\Libraries\Mass_Storage\src\memory.c> -File 12,1,<.\Libraries\Mass_Storage\src\usb_bot.c> -File 12,1,<.\Libraries\Mass_Storage\src\scsi_data.c> -File 12,1,<.\Libraries\Mass_Storage\src\usb_desc.c> -File 12,1,<.\Libraries\Mass_Storage\src\usb_endp.c> -File 12,1,<.\Libraries\Mass_Storage\src\usb_istr.c> -File 12,1,<.\Libraries\Mass_Storage\src\usb_prop.c> -File 12,1,<.\Libraries\Mass_Storage\src\usb_pwr.c> -File 12,1,<.\Libraries\Mass_Storage\src\usb_scsi.c> -File 12,1,<.\Libraries\Mass_Storage\src\usb_main.c> - - -Options 1,0,0 // Target 'RT-Thread STM32 Radio' - Device (STM32F103ZE) - Vendor (STMicroelectronics) - Cpu (IRAM(0x20000000-0x2000FFFF) IROM(0x8000000-0x807FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3")) - FlashUt () - StupF ("STARTUP\ST\STM32F10x.s" ("STM32 Startup Code")) - FlashDR (UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000)) - DevID (4216) - Rgf (stm32f10x_lib.h) - Mem () - C () - A () - RL () - OH () - DBC_IFX () - DBC_CMS () - DBC_AMS () - DBC_LMS () - UseEnv=0 - EnvBin () - EnvInc () - EnvLib () - EnvReg (ST\STM32F10x\) - OrgReg (ST\STM32F10x\) - TgStat=16 - OutDir (.\obj\) - OutName (rtthread-stm32) - GenApp=1 - GenLib=0 - GenHex=0 - Debug=1 - Browse=0 - LstDir (.\obj\) - HexSel=1 - MG32K=0 - TGMORE=0 - RunUsr 0 0 <> - RunUsr 1 0 <> - BrunUsr 0 0 <> - BrunUsr 1 0 <> - CrunUsr 0 0 <> - CrunUsr 1 0 <> - SVCSID <> - GLFLAGS=1790 - ADSFLGA { 243,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ACPUTYP ("Cortex-M3") - RVDEV () - ADSTFLGA { 0,12,0,2,99,0,1,66,0,0,0,0,0,0,0,0,0,0,0,0 } - OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - OCMADSIRAM { 0,0,0,0,32,0,0,1,0 } - OCMADSIROM { 1,0,0,0,8,0,0,8,0 } - OCMADSXRAM { 0,0,0,0,0,0,0,0,0 } - OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,8,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,1,0,0,0,0,0,0,0,0,0,0 } - RV_STAVEC () - ADSCCFLG { 5,32,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ADSCMISC (--diag_suppress=870) - ADSCDEFN (USE_STDPERIPH_DRIVER, STM32F10X_HD,) - ADSCUDEF () - ADSCINCD (.;.\Libraries\CMSIS\CM3\CoreSupport;.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x;.\Libraries\STM32F10x_StdPeriph_Driver\inc;..\..\include;..\..\libcpu\arm\stm32;..\..\finsh;..\..\net\lwip\src;..\..\net\lwip\src\include;..\..\net\lwip\src\arch\include;..\..\net\lwip\src\include\ipv4;..\..\filesystem\dfs;..\..\filesystem\dfs\include;..\..\filesystem\dfs\filesystems\efsl\src\include;..\..\filesystem\dfs\filesystems\efsl\src\base\include;..\..\filesystem\dfs\filesystems\efsl\src\fs\vfat\include;..\..\rtgui\include;..\..\rtgui\common\libz) - ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ADSAMISC () - ADSADEFN () - ADSAUDEF () - ADSAINCD () - PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - IncBld=1 - AlwaysBuild=0 - GenAsm=0 - AsmAsm=0 - PublicsOnly=0 - StopCode=3 - CustArgs () - LibMods () - ADSLDFG { 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ADSLDTA (0x08000000) - ADSLDDA (0x20000000) - ADSLDSC () - ADSLDIB () - ADSLDIC () - ADSLDMC (--keep __fsym_* --keep __vsym_*) - ADSLDIF () - ADSLDDW () - OPTDL (SARMCM3.DLL)()(DARMSTM.DLL)(-pSTM32F103ZE)(SARMCM3.DLL)()(TARMSTM.DLL)(-pSTM32F103ZE) - OPTDBG 49142,7,()()()()()()()()()() (Segger\JL2CM3.dll)()()() - FLASH1 { 1,0,0,0,1,0,0,0,6,16,0,0,0,0,0,0,0,0,0,0 } - FLASH2 (Segger\JL2CM3.dll) - FLASH3 () - FLASH4 () -EndOpt - -Options 1,5,0 // Group 'USB-FS-Device_Driver' - PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - IncBld=2 - AlwaysBuild=2 - GenAsm=2 - AsmAsm=2 - PublicsOnly=2 - StopCode=11 - CustArgs () - LibMods () - ADSCCFLG { 2,84,85,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ADSCMISC () - ADSCDEFN () - ADSCUDEF () - ADSCINCD (.\Libraries\STM32_USB-FS-Device_Driver\inc;.\Libraries\Mass_Storage\inc) - ADSASFLG { 170,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ADSAMISC () - ADSADEFN () - ADSAUDEF () - ADSAINCD () -EndOpt - -Options 1,10,0 // Group 'mp3' - PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - IncBld=2 - AlwaysBuild=2 - GenAsm=2 - AsmAsm=2 - PublicsOnly=2 - StopCode=11 - CustArgs () - LibMods () - ADSCCFLG { 18,84,85,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ADSCMISC () - ADSCDEFN () - ADSCUDEF () - ADSCINCD (.\mp3\pub) - ADSASFLG { 170,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ADSAMISC () - ADSADEFN () - ADSAUDEF () - ADSAINCD () -EndOpt - -Options 1,12,0 // Group 'Mass_Storage' - PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - IncBld=2 - AlwaysBuild=2 - GenAsm=2 - AsmAsm=2 - PublicsOnly=2 - StopCode=11 - CustArgs () - LibMods () - ADSCCFLG { 2,84,85,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ADSCMISC () - ADSCDEFN () - ADSCUDEF () - ADSCINCD (.\Libraries\Mass_Storage\inc;.\Libraries\STM32_USB-FS-Device_Driver\inc) - ADSASFLG { 170,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } - ADSAMISC () - ADSADEFN () - ADSAUDEF () - ADSAINCD () -EndOpt - diff --git a/bsp/stm32_radio/radio_list_update.c b/bsp/stm32_radio/radio_list_update.c deleted file mode 100644 index 0a24fdecd3..0000000000 --- a/bsp/stm32_radio/radio_list_update.c +++ /dev/null @@ -1,368 +0,0 @@ -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include "http.h" -#include "player_bg.h" - -/* */ -#define RADIO_FN "/radio.pls" -#define RADIO_LIST_UPDATE_URL "http://radio.rt-thread.org/radio.pls" -/* */ - -/* */ -extern int http_read_line( int socket, char * buffer, int size ); -extern int http_is_error_header(char *mime_buf); -extern int http_resolve_address(struct sockaddr_in *server, const char * url, char *host_addr, char** request); -/* */ - -const char _radio_list_update_get[] = "GET %s HTTP/1.0\r\nHost: %s:%d\r\nUser-Agent: RT-Thread HTTP Agent\r\nConnection: close\r\n\r\n"; -rt_mq_t update_radio_mq = RT_NULL; -static struct rtgui_view* update_radio_list_view = RT_NULL; - -typedef enum -{ - UPDATE_RAIDO_LIST_PROC, - UPDATE_RADIO_LIST_CONNECT_FAILED, - UPDATE_RADIO_LIST_SUCCEED, -} UPDATE_RADIO_LIST_STATE; - -static UPDATE_RADIO_LIST_STATE update_radio_list_state; - -int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_addr, const char* url) -{ - int socket_handle; - int peer_handle; - int rc; - char mimeBuffer[256]; - - if((socket_handle = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP )) < 0) - { - rt_kprintf( "RLUS: SOCKET FAILED\n" ); - return -1; - } - - peer_handle = connect( socket_handle, (struct sockaddr *) server, sizeof(*server)); - if ( peer_handle < 0 ) - { - closesocket(socket_handle); - rt_kprintf( "RLUS: CONNECT FAILED %i\n", peer_handle ); - return -1; - } - - { - char *buf; - rt_uint32_t length; - - buf = rt_malloc (512); - if (*url) - length = rt_snprintf(buf, 512, _radio_list_update_get, url, host_addr, ntohs(server->sin_port)); - else - length = rt_snprintf(buf, 512, _radio_list_update_get, "/", host_addr, ntohs(server->sin_port)); - - rc = send(peer_handle, buf, length, 0); - rt_kprintf("radio list update request:\n%s", buf); - - /* release buffer */ - rt_free(buf); - } - /* read the header information */ - while ( 1 ) - { - // read a line from the header information. - rc = http_read_line(peer_handle, mimeBuffer, 100); - rt_kprintf(">>%s", mimeBuffer); - - if ( rc < 0 ) - { - closesocket(peer_handle); - return rc; - } - // End of headers is a blank line. exit. - if (rc == 0) break; - if ((rc == 2) && (mimeBuffer[0] == '\r')) break; - - if (strstr(mimeBuffer, "HTTP/1.")) - { - rc = http_is_error_header(mimeBuffer); - if(rc) - { - rt_kprintf("HTTP: status code = %d!\n", rc); - closesocket(peer_handle); - return -rc; - } - } - - if (strstr(mimeBuffer, "content-type:")) - { - /* check content-type */ - if (strstr(mimeBuffer, "text/plain") == RT_NULL) - { - rt_kprintf("radio list update content is not text/plain.\n"); - closesocket(peer_handle); - return -1; - } - } - - if (strstr(mimeBuffer, "Content-Type:")) - { - /* check content-type */ - if (strstr(mimeBuffer, "text/plain") == RT_NULL) - { - rt_kprintf("radio list update content is not text/plain.\n"); - closesocket(peer_handle); - return -1; - } - } - } - - return peer_handle; -} - -int radio_list_update_servicer_session_open(char* url) -{ - int peer_handle = -1; - struct sockaddr_in server; - char *request, host_addr[32]; - - if(http_resolve_address(&server, url, &host_addr[0], &request) != 0) - { - return -1; - } - rt_kprintf("connect to: %s...\n", host_addr); - - if((peer_handle = radio_list_update_servicer_connect(&server, host_addr, request)) < 0) - { - rt_kprintf("radio list update: failed to connect to '%s'!\n", host_addr); - } - return peer_handle; - -} -int update_radio_list(char* url) -{ - char *buf = NULL; - int peer_handle = 0; - int fd; - int rc; - - peer_handle = radio_list_update_servicer_session_open(url); - - if(peer_handle < 0) - { - return -1; - } - - fd = open(RADIO_FN, O_WRONLY | O_CREAT | O_TRUNC, 0); - if(fd < 0) - { - return -1; - } - buf = rt_malloc (512); - while ( 1 ) - { - // read a line from the header information. - rc = http_read_line(peer_handle, buf, 100); - - if ( rc < 0 ) break; - - // End of headers is a blank line. exit. - if (rc == 0) break; - if ((rc == 2) && (buf[0] == '\r')) break; - rt_kprintf(">>%s", buf); - - write(fd, buf, rc); - } - rt_free(buf); - - closesocket(peer_handle); - - if(close(fd) == 0) - { - rt_kprintf("Update radio list succeed \r\n"); - } - return 0; -} - -void update_radio_list_req(void) -{ - - struct player_request request; - extern rt_mq_t player_thread_mq; - char* ch = RT_NULL; - - update_radio_list_state = UPDATE_RAIDO_LIST_PROC; - request.type = PLAYER_REQUEST_UPDATE_RADIO_LIST; - ch = strcpy(request.fn, RADIO_LIST_UPDATE_URL); - - /* send to message queue */ - rt_mq_send(update_radio_mq, (void*)&request, sizeof(struct player_request)); - -} - -void update_radio_thread(void* parameter) -{ - rt_err_t result; - struct player_request request; - rt_thread_t update_radio_list_thread; - - - while(1) - { - /* get request from message queue */ - result = rt_mq_recv(update_radio_mq, (void*)&request, - sizeof(struct player_request), RT_WAITING_FOREVER); - if (result == RT_EOK) - { - switch (request.type) - { - - case PLAYER_REQUEST_UPDATE_RADIO_LIST: - if ((strstr(request.fn, "http://") == request.fn || - (strstr(request.fn, "HTTP://") == request.fn ))) - { - struct rtgui_event_command ecmd; - - if(update_radio_list(request.fn)==0) - { - update_radio_list_state = UPDATE_RADIO_LIST_SUCCEED; - } - else - { - update_radio_list_state = UPDATE_RADIO_LIST_CONNECT_FAILED; - } - RTGUI_EVENT_COMMAND_INIT(&ecmd); - ecmd.type = RTGUI_EVENT_PAINT; - ecmd.command_id = PLAYER_REQUEST_UPDATE_RADIO_LIST; - rtgui_thread_send(rt_thread_find("ply_ui"), &ecmd.parent, sizeof(ecmd)); - } - break; - } - } - rt_mq_delete(update_radio_mq); - update_radio_mq = RT_NULL; - update_radio_list_thread = rt_thread_self(); - rt_thread_delete(update_radio_list_thread); - } -} - -void drawing_update_state_info(struct rtgui_widget* widget) -{ - char* line; - struct rtgui_dc* dc; - struct rtgui_rect rect; - - line = rtgui_malloc(256); - if (line == RT_NULL) return ; - - dc = rtgui_dc_begin_drawing(widget); - if (dc == RT_NULL) - { - rt_free(line); - return; - } - - rtgui_widget_get_rect(widget, &rect); - - /* fill background */ - rtgui_dc_fill_rect(dc, &rect); - - rect.y2 = rect.y1 + 18; - switch(update_radio_list_state) - { - case UPDATE_RAIDO_LIST_PROC: - sprintf(line, "ÕýÔÚ¸üеç̨Áбí......"); - break ; - - case UPDATE_RADIO_LIST_CONNECT_FAILED: - sprintf(line, "¸üеç̨Áбíʧ°Ü,Çë·µ»Ø"); - break; - - case UPDATE_RADIO_LIST_SUCCEED: - sprintf(line, "¸üеç̨Áбí³É¹¦,Çë·µ»Ø"); - break; - } - - rtgui_dc_draw_text(dc, line, &rect); - - rtgui_dc_end_drawing(dc); - - rtgui_free(line); -} - -static rt_bool_t update_radio_list_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) -{ - switch (event->type) - { - case RTGUI_EVENT_COMMAND: - { - struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event; - switch(ecmd->type) - { - case RTGUI_EVENT_PAINT: - drawing_update_state_info(widget); - return RT_FALSE; - } - return RT_FALSE; - } - case RTGUI_EVENT_PAINT: - { - drawing_update_state_info(widget); - return RT_FALSE; - } - - case RTGUI_EVENT_KBD: - { - struct rtgui_event_kbd* ekbd; - - ekbd = (struct rtgui_event_kbd*)event; - if (ekbd->type == RTGUI_KEYDOWN && ekbd->key == RTGUIK_RETURN) - { - rtgui_workbench_t* workbench; - - workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(update_radio_list_view)->parent); - rtgui_workbench_remove_view(workbench, update_radio_list_view); - - rtgui_view_destroy(update_radio_list_view); - update_radio_list_view = RT_NULL; - } - } - return RT_FALSE; - } - - /* use parent event handler */ - return rtgui_view_event_handler(widget, event); -} - -rtgui_view_t *update_radio_list_view_create(rtgui_workbench_t* workbench) -{ - if (update_radio_list_view != RT_NULL) - { - rtgui_view_show(update_radio_list_view, RT_FALSE); - } - else - { - /* create a view */ - update_radio_list_view = rtgui_view_create("update radio list Info"); - /* set view event handler */ - rtgui_widget_set_event_handler(RTGUI_WIDGET(update_radio_list_view), update_radio_list_view_event_handler); - /* this view can be focused */ - RTGUI_WIDGET(update_radio_list_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; - - /* add view to workbench */ - rtgui_workbench_add_view(workbench, update_radio_list_view); - } - - return update_radio_list_view; -} - - diff --git a/bsp/stm32_radio/remote.c b/bsp/stm32_radio/remote.c deleted file mode 100644 index 40fb46f392..0000000000 --- a/bsp/stm32_radio/remote.c +++ /dev/null @@ -1,507 +0,0 @@ -/* -+---------------------------------------------------- -| -| ºìÍâ×Ôѧϰң¿Ø -| -| Chang Logs: -| Date Author Notes -| 2010-01-02 aozima The bate version. -| 2010-02-10 aozima change printf string ÖÐÎÄ to english. -| 2010-03-25 aozima add remote_fn define. -+---------------------------------------------------- -*/ - -#include -#include -#include - -/* ÖØ¶¨Òåprintf */ -#define printf rt_kprintf -/* ÉèÖÃÔÊÐíÆ«²î,µ¥Î»0.01ms */ -#define remote_deviation 15 -#define remote_code_len_max 100 -/* Ñù±¾±£´æÎļþÃûȫ·¾¶ */ -#define remote_fn "/resource/remote.txt" - -/* ºìÍâģʽ 0:ûÆô¶¯,1:×Ôѧϰ,2:Õý³£½âÂë */ -unsigned int rem_mode = 0; - -static unsigned int first_tick = 0; -static unsigned int rx_count = 0; -static unsigned short rm_code[remote_code_len_max]; - -struct rem_codes_typedef -{ - unsigned int len; - unsigned short rem_code[remote_code_len_max]; -}; -struct rem_codes_typedef * p_rem_code_src = RT_NULL; - -static const char str1[]="KEY_UP"; /* ÉÏ */ -static const char str2[]="KEY_DOWN"; /* Ï */ -static const char str3[]="KEY_LEFT"; /* ×ó */ -static const char str4[]="KEY_RIGHT"; /* ÓÒ */ -static const char str5[]="KEY_ENTER"; /* È·ÈÏ */ -static const char str6[]="KEY_RETURN"; /* ·µ»Ø */ -static const char * desc_key[6]= {str1,str2,str3,str4,str5,str6}; - - -/* tim5 configure */ -static void TIM5_Configuration(void) -{ - /* ʱÖÓ¼°·ÖƵÉèÖà */ - { - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - /* Time Base configuration */ - /* 72M/720 = 0.01ms */ - TIM_TimeBaseStructure.TIM_Prescaler = 720-1; - //¼ÆÊýģʽ:ÏòÉϼÆÊý - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseStructure.TIM_Period = 0xFFFF; - TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; - //ÖØÐ¼ÆÊýµÄÆðʼֵ - TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; - - TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); - } - - /* ²¶»ñÉèÖà */ - { - TIM_ICInitTypeDef TIM_ICInitStructure; - - TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;/* ÿ´Î¼ì²âµ½²¶»ñÊäÈë¾Í´¥·¢Ò»´Î²¶»ñ */ - TIM_ICInitStructure.TIM_ICFilter = 8;/* Â˲¨ */ - - TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;//Ñ¡ÔñͨµÀ3 - TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;//ϽµÑØ - TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//ͨµÀ·½ÏòÑ¡Ôñ - TIM_ICInit(TIM5, &TIM_ICInitStructure); - - TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;//Ñ¡ÔñͨµÀ3 - TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//ÉÏÉýÑØ - TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;//ͨµÀ·½ÏòÑ¡Ôñ - TIM_ICInit(TIM5, &TIM_ICInitStructure); - } - - /* ÊäÈë´¥·¢Ô´Ñ¡Ôñ:ÍⲿÊäÈë´¥·¢ */ - TIM_SelectInputTrigger(TIM5, TIM_TS_ETRF);//TIM_TS_ETRF Íⲿ´¥·¢ - /* ´Óģʽ-¸´Î»Ä£Ê½ */ - /* TIM_SlaveMode_Reset 4:Ñ¡ÖеĴ¥·¢ÊäÈë(TRGI)µÄÉÏÉýÑØÖØÐ³õʼ»¯¼ÆÊýÆ÷£¬²¢ÇÒ²úÉúÒ»¸ö¸üмĴæÆ÷µÄÐźŠ*/ - TIM_SelectSlaveMode(TIM5, TIM_SlaveMode_Reset); - TIM_SelectMasterSlaveMode(TIM5, TIM_MasterSlaveMode_Enable); - - /* TIM enable counter */ - TIM_Cmd(TIM5, ENABLE); - - /* Enable the CC3 and CC4 Interrupt Request */ - TIM_ITConfig(TIM5, TIM_IT_CC3, ENABLE); - TIM_ITConfig(TIM5, TIM_IT_CC4, ENABLE); -} - -static void NVIC_Configuration(void) -{ - NVIC_InitTypeDef NVIC_InitStructure; - - /* Enable the TIM5 global Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -} - -static void RCC_Configuration(void) -{ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); - - /* TIM5 clock enable */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); - - /* clock enable */ - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA ,ENABLE); -} - -static void GPIO_Configuration(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - /* TIM5 channel 3 pin (PA.02) configuration */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; - - GPIO_Init(GPIOA, &GPIO_InitStructure); -} - -void rem_start(void) -{ - RCC_Configuration(); - GPIO_Configuration(); - - /* configure TIM5 for remote and encoder */ - NVIC_Configuration(); - TIM5_Configuration(); - - p_rem_code_src = rt_malloc( sizeof(struct rem_codes_typedef)*6 ); - if( p_rem_code_src != RT_NULL) - { - rt_memset(p_rem_code_src,0, sizeof(struct rem_codes_typedef)*6 ); - - /* ½â¶ÁºìÍâÐÅÏ¢ */ - { - int fd,size; - char buf[7];/* Îļþ¶ÁÈ¡ÁÙʱ»º´æ #####\r\n */ - unsigned int i; - unsigned short tmp; - unsigned int read_index = 0; - unsigned int EOF_flag = 1; - - printf("\r\ndecode remote codes"); - fd = open(remote_fn,O_RDONLY,0); - if( fd>0 ) - { - printf("\r/resource/remote.txt open succeed"); - while( EOF_flag ) - { - /* ¶ÁÈ¡³¤¶È */ - size = read(fd,buf,7); - if( (size == 7) && (buf[5]=='\r') && buf[6]=='\n' ) - { - /* ת»»µÃµ½Ñù±¾Êý¾Ý³¤¶È */ - tmp = (buf[0]-'0')*10000 - + (buf[1]-'0')*1000 - + (buf[2]-'0')*100 - + (buf[3]-'0')*10 - + (buf[4]-'0'); - if( tmp<100 ) - { - unsigned int code_len = tmp; - p_rem_code_src[read_index].len = code_len; - /* Èç¹ûÑù±¾³¤¶È·ûºÏ ¾Í¿ªÊ¼´ÓÎļþ¶ÁÈ¡±àÂëÊý¾Ý */ - for(i=0; i 0 && p_rem_code_src[0].len < remote_code_len_max ) - { - /* ÉèÖù¤×÷ģʽΪÕý³£Ê¶±ðģʽ */ - rem_mode = 2; - printf("\r\ndecode succeed,The remote enable\r\n"); - } - else - { - /* ÉèÖù¤×÷ģʽΪÕý³£Ê¶±ðģʽ */ - rem_mode = 0; - printf("\r\nrem_codes decode fail,The remote disable\r\n"); - } - } - else - { - printf("\rrem_codes /resource/remote.txt open fail! fd:%d\r\nThe remote disbale.\r\nplease run rem_study()\r\n",fd); - } - close(fd); - }/* ½â¶ÁºìÍâÐÅÏ¢ */ - - } - else - { - rem_mode = 0; - printf("\r\nmalloc rem_codes[] fail!!!\r\nThe remote disable!"); - } -} - -#include -void rem_encoder(struct rtgui_event_kbd * p) -{ - struct rtgui_event_kbd * p_kbd_event = p; - - /* ¼ì²éÊÇ·ñÓÐÊý¾Ý±»²¶»ñ */ - if( (rem_mode==2) && (rt_tick_get()>first_tick+10) && (rx_count > 0) ) - { - /* ÊÖ¶¯ÇåÁãµÚÒ»¸ö²¶»ñ½á¹û */ - rm_code[0] = 0; - rx_count = 0; - - /* Æ¥Åä²¶»ñµÄÊý¾Ý */ - { - unsigned int tmp; - unsigned int err_flag = 0; - unsigned int rem_cmp_n = 6; - - /* Ñ­»·Æ¥ÅäËùÓÐKEY */ - while( rem_cmp_n ) - { - unsigned int tmp2 = p_rem_code_src[ 6-rem_cmp_n ].len; - //printf("\r\nrem_cmp_n:%d tmp2:%d",rem_cmp_n,tmp2); - if( tmp2 ) - { - - for(tmp=0; tmp p_rem_code_src[6-rem_cmp_n].rem_code[tmp]-remote_deviation)) ) - { - err_flag = 1; - } - } - } - else - { - err_flag = 1; - printf("\r\nThe rem codes len is 0."); - } - - if( err_flag==0 ) - { - /* ¶Ô±ÈÈ«²¿Êý¾Ý·ûºÏ */ - printf("\r\nmatch key: %s",desc_key[6-rem_cmp_n]); - switch( rem_cmp_n ) - { - case 6: - p_kbd_event->key = RTGUIK_UP; - break; - case 5: - p_kbd_event->key = RTGUIK_DOWN; - break; - case 4: - p_kbd_event->key = RTGUIK_LEFT; - break; - case 3: - p_kbd_event->key = RTGUIK_RIGHT; - break; - case 2: - p_kbd_event->key = RTGUIK_RETURN; - break; - case 1: - p_kbd_event->key = RTGUIK_HOME; - break; - default: - break; - } - rem_cmp_n = 0; - } - else - { - /* ¶Ô±È²»·ûºÏ,ÇåÁã´íÎó±êÖÂ,ÒÔ½øÐÐÏÂÒ»´Î¶Ô±È */ - err_flag = 0; - rem_cmp_n --; - } - - } - } - }//ºìÍâÒ£¿ØÆ¥Åä -} - -/* remote isr */ -void remote_isr(void) -{ - static unsigned int clr_flag = 1; - unsigned int tick_now = rt_tick_get(); - - /* ºìÍâÒ£¿ØÏ½µÑØ */ - if(TIM_GetITStatus(TIM5, TIM_IT_CC3) == SET) - { - switch( rem_mode ) - { - case 0://δÆô¶¯ - break; - case 1://×Ôѧϰ - if( (rx_count==0) || (rx_count>90) || (tick_now>first_tick+10) ) - { - //ÐèÒªÇå0 - rx_count = 0; - clr_flag = 1; - } - if( rx_count < remote_code_len_max ) - { - rm_code[rx_count++] = TIM_GetCapture3(TIM5); - } - break; - case 2://Õý³£½âÂë - if( (rx_count>90) || tick_now>first_tick+10 ) - { - rx_count = 0; - clr_flag = 1; - } - if(rx_count < remote_code_len_max ) - { - rm_code[rx_count++] = TIM_GetCapture3(TIM5); - } - break; - default: - rem_mode = 0;//ÉèÖÃģʽΪδÆô¶¯ - break; - } - TIM_ClearITPendingBit(TIM5, TIM_IT_CC3); - } - - /* ºìÍâÒ£¿ØÉÏÉýÑØ */ - if(TIM_GetITStatus(TIM5, TIM_IT_CC4) == SET) - { - switch( rem_mode ) - { - case 0://δÆô¶¯ - break; - case 1://×Ôѧϰ - if( rx_count < remote_code_len_max ) - { - rm_code[rx_count++] = TIM_GetCapture4(TIM5); - } - break; - case 2://Õý³£½âÂë - if( rx_count < remote_code_len_max ) - { - rm_code[rx_count++] = TIM_GetCapture4(TIM5); - } - break; - default: - rem_mode = 0;//ÉèÖÃģʽΪδÆô¶¯ - break; - } - TIM_ClearITPendingBit(TIM5, TIM_IT_CC4); - } - - //¸üÐÂʱ¼ä´Á - first_tick = tick_now; - //¼ì²âÊÇ·ñÐèÒªÖØÖüÆÊýÆ÷ - if( clr_flag ) - { - //ÖØÖüÆÊýÆ÷ - TIM_SetCounter(TIM5,0); - clr_flag = 0; - } -} - -#include -/* Æô¶¯ºìÍâѧϰ³ÌÐò */ -int rem_study(void) -{ - unsigned int i; - - int fd,size; - unsigned char tmp_buf[ (remote_code_len_max+1)*7 ]; - - rem_mode = 1; - rx_count = 0; - printf("\r\nremote studing....."); - fd = open(remote_fn,O_WRONLY | O_TRUNC,0); - if( !(fd<0) ) - { - printf("\r\n/resource/remote.txt create succeed."); - } - else - { - printf("\r/resource/remote.txt create fail.\r\nabort."); - return -1; - } - - /* ѧϰ6¸ö¼üÅÌ */ - for( i=0; i<6; i++) - { - unsigned int is_ok = 1; - printf("\r\npress key %s",desc_key[i]); - while( is_ok==1 ) - { - if( (rem_mode==1) && (rt_tick_get()>first_tick+10) && (rx_count > 0) ) - { - unsigned int a,b; - unsigned char * p = tmp_buf; - - printf("\r\n%s",desc_key[i]); - - b = rx_count; - p_rem_code_src[i].len = rx_count; - - /* TIM disable counter */ - TIM_Cmd(TIM5, DISABLE); - /* disable the CC3 and CC4 Interrupt Request */ - TIM_ITConfig(TIM5, TIM_IT_CC3, DISABLE); - TIM_ITConfig(TIM5, TIM_IT_CC4, DISABLE); - - p[0] = rx_count / 10000 +'0'; - rx_count = rx_count % 10000; - p[1] = rx_count / 1000 +'0'; - rx_count = rx_count % 1000; - p[2] = rx_count / 100 +'0'; - rx_count = rx_count % 100; - p[3] = rx_count / 10 +'0'; - rx_count = rx_count % 10; - p[4] = rx_count +'0'; - rx_count = 0; - p[5] = '\r'; - p[6] = '\n'; - p += 7; - - rm_code[0] = 0; - - for( a=0; aEWZ@?r;mB|E@jJ2oOsRgB1k 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 diff --git a/bsp/stm32_radio/resource/hzk12.fnt b/bsp/stm32_radio/resource/hzk12.fnt deleted file mode 100644 index 8f580a83e4df7482d00280c50a16595381495c98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196272 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

=Sx=Tf z3W}9E$xIaq57ZZNh5m))Z0IkTYBEIaK1u?7zA*@fw8ksapra$BSpekww`z#oX`-eMF(9EanRJu5(fa&p{`$ zRf-z@pV@nJiv!^@y-JaI36 zqtvnPhCY~jn_(FN#h~1MlZ{~Gxwm(zit(!CG5QZMKWc~cxEJ{@ zwGK6Z0^f##kGVcwH)>N4?m27yrpY|N(8o;CO5!@^d&xa}mOW{RFpCzh^j`2Wm)YWU zojr}?V!PHJPm_9;I@Fjm9@fDam3(QJKW?|Di{WGP6U^G{eIec^;j1WTnjLTVCCVws zp`2}2m-t>46-H&Vr`qH!dlo%NxK+%7`S6$h40@lv#+tG2D&u;co#{1Os^iun!~Vr$ zQ|!erb1_DX05#Mh5ewJLU~2Q3iFrhG3FHz_OLfvEa~1YO*%ME}yO4FFEbjyb{f&Lr zXRnk;a!dtg<7{B&7x1PteXrqZJKKLIptJ?_211^07HW5vEwgXo%+~M?%(ahfw}_?t ziI0TE@iu3?PbpU_p_VPIG7l{UrhO$b2QxOq8gl-;Z1IM2J`&HcC%Agrd>R zyfhe0V`RSHZkZVy*q;W7u_0TJAL`N%K#!VjhJQ6J(k6W`j#$qU&z=uD#;o%freDv1Xe4;8diA)$swjLWD>B$qZn{3p)W_@_Zd@I6oub2rBGIQuRCpR)+vyhv6CYl#kjP}_P7ri1?vT*CuN z-=+*^kHyD@JU`|m<{|Mu<+-2fxK1zXgcypj{e)y*?;2%nb2rBQ_Q&vJ;}v+k_AGJB8hvGzpI**2pFfq5gjGPuTeX%*@xX{}%@ zGu}O|lpvO*z21lS?vbzA&hT1zP^QVvXfN&e6UVd&`21ToIbYyo7heu}zAP{3Uoj+H z`=a8JDS3ZUH=&jd*q-)9k}){7^uSC0ntvsHIlks&{^j^)fNxOPAJ!E7{*`h*w)tPg zonebV8tCswyXP9;k#=~F8DMWY6%KL0&D&v;Dq zTQV{9D*st+pBI7No2zKvpO}S%c{nyY`q@bb=lM5;UT8bCJ<{ur@j>+e=_=uIB}%E2 zRvejUhUJj&UJ!4@xf$D~{rD%O9{44xQ4+UDh*J6epjAOnj9ROE$pB;=F zv?><2}zmy|vTFM}#foA*2+l+Rgo|E@Gv|3lLLzfp5@#fJ=KLdIk(BGg7eNA88 z4YJ3$Uj1vK-p_QxRpwiE#cQ0HW<~jieqB>=rPw~dtcY^8mTMV8q8-*ti*~0@X}`}a z(1YMD_BgmB|09$`+f?S_AkAU^U=?|bU?m5=9`pJcAI4RW_hJ?g`EJBm5jvQ?0)RTP zar7&FDXDra@>8uEQ|7}rXb97!!70UNyurL7oAev{CEb_42%7YOeok3VhQSR2oi=7X zaBZ9`C(9YB3$<;qqr>y)QF2Vo*+lrvtKu~kGkq2DoXkLdx7d+{Li9U02kUldGyz4_ z8?3R6!}2Iq*BmcmXy&hF-aT%-Ca#4Y5p|)(Amc3X#Lm2_j525BuK*^yOHT1x-KJU` zPOH$G-Qjb(7W~r|w2EHuuD~~jd^LWGw z8x!bcf^R^&%5N^9PYa9nQu!{PYc=|IKwpQAzVRJ)u02z90SXSJ*sm=fv$+8h ziFBkvXeD5!vRC4Kh0VcF0Uc+*5lS;H$559PCexVA=Vxh`FpclZIJG-tZ*i9_j-xi> zUn?^0HM2)2E1%4mbj5)~S*3 zouW(Vd-#v~=dw!QH0FPM2DIu7j7zy*um;(pV>agZ${zGD^=$h9NtY#JwOcXj^Zgm0 zVP|Q!Q;g^$K_vZ@a?F{*?|@v9K8AjR=LPzANQVmQImNP8ll@Vx#|oU6C?PRo>%ZyC zO24By=^Cx{v83#~5~AyIgdHl<);0*+LyrN2#OSa#NuT}=ej^4VL~TmzapX1O3Si;T zlay3phcNfrJowK)3%JT~To1T1!7N9~s{micl%nY8!Qqn8_U0eioVD=bF%M#@0GrBV0F zgJ~zQ;qRm^-V@FWT*ZidAlJE|-W2eF87JtSI9NDfC;w1t%#!szMwh1z;;2m-Xj%b^9si$l&`wrk?dkiS8@{eMD9Brzs z(!^1%z&}~T&?BG2*z62{f%@+aTY*36XH~P;o!FE4hgl=~?bpk{MNmx792#^=4!^_l z`7ZRtj`F=pc%LQhC@7D>-@ELeo#DTsoLV3sp6jFXdy#sKoz@bmA?`}~`TcTf`e^uQ z_;MP?^Yrhk#*uytId)2|THg>Fd--?t|IYBAc<)x!e>tAt1jwkzmf?k5B;kboRfX3k zub>H%2H`t629sMSzGpb6r^79ATrwP-me`xFPZm4F2Hl`sM~~kC+57ryxJ!#0q1j4iylhddOkSihJrPsPLGgRKT(^`I8|>v_5RfPNI!(^5i_LB zRlO`+9~QS259*Io4bR+HbcQbdyI|qsFklP8nGON2W}_L9 zr$7bg0T*_7pE93hh4)xP)DAcg8?G~VTMwORHz1rj?YnWc8*rH62mXF?bK0iFdvkSO z*>B7uk-fTc4tL|4t5M|m*6+$L^zt}3<8hge{sG+CIccju?BB+*=9wH5++ag8C(ZZ2@JsOD^ZbYeKQ0_u&Vsbje}NKuK|N^IoohjxRR5)B56- zm`x`{;{Ob1^m@J557?h7aV@2byc61)m*sr9!V5rNb$?QpQg8K{>1PTp81{fs9haZ! zjyMDQ;S*(#R4~;Z-}Hs{(|EQ%m56`Hg-4-Qhdf}9Qx~!uv;o!=ozxeVzDIFW8iI7+ ztk0n?SrTFp>wOjnuR)3hM&rHT{M1 zcC=Fu&G7++NGiMF^>Uie^A#RIF&5kIG!s(CAmo6V?%<1{du+4;>%h*uthMUC5&Lxt zY$N)aG!OM|O|RN1h84pjTTzSi<;Fx=3vvYHwTBX8qE0T(Q^t4GlZ~1{(&cLuGd&a< zR14NW1hXuk6Nc%JZ1FwvNoeP|4h`3{dyk(X|5InduLC~g4!RT8`s>iSzMk4~X0O-D z+d}O5w%=`c>)Xm}e3QY%Sn`)-Ve0eiu+lwjFxdYot;D>V!2W5PQ11#Yo~dU1Pu`N- zV*3(CgmvUPcUuix+=}rDno66XU^dfYyV~|gWW-3XqK}uLWfrp^DQ5`!3?m`XJqhSI zp-J%Boq7O&GozZBTU`ld{3hS(Tw4-xIv5#36K5f}Az11N4QBLDAdfegZVS(ZfpnpMMh8=)GHSOq zu|0R%(?*E6RR%a>`a;|$yJcJY58Gvrf!lw<9<&CdOw69kea37~(5>3c2z`5=U%oYM z)d!*7-{I4N0cf|nC9bxEXzc>@Yfpe>OncCur==~xo4cT^J1@MPs(eke?B5)iiM54( zXhi~Np>vB?!Z=znxmR?duoL}Axz(EtbR5rYHDa;`p?}?^oj4ZN^EV1CS$3;J>cTOv zhj@j46XnCMnVJ+UIlyAen85~NTmUt{?dj2S6t^dOyyTs;@f4f%yKa>c@K>Kj-RD5M zpoVjcY(pEF4SaF2QY39czfQA8{~X2}cogt_x14}pX_F&T1E6WZnoT@=SpbhF%J1}E zU1S588^gFm4!6fI27dWvT4)zzM4q#LyVw`nrOMeqxmG8kAo~T?$l6XZ2WWZjw0lOZ0!Da=Q zf{mD-kiqe#Uy~)ai?Kl0>9}@GY^Nm!e!0=^P1Nl^lqmJXj|lQU@PBNVF4X6FVO-Qc z)FkIQlpv0_`PFXJ;DzCMb?Ab;lj9)9Y!-TiJZ)tsohNZpC@E!WF;x81QqWkELOMkI(R<({fpl zx^X>Xj?x}kZR`Ab%vxGcqargrDA)n?KUd_q&z8hf(R0X8I;HoU0r^AlyC8Na-_8{- zm|ttXjM<-J7O!^dF%HI>(aYgLd1N#_^_=kgk4@n%e_k$zO+XvIfZJ|!p zyH1Hp@T^bfTc&y|)|BnaEAr63ly%o!w_*+6IvqB~d(uVvyV`;4eq2x2>{rkwcgZo} zHPFM*%5$AfjG;K&la zNw{67tDN?3j$3Xe;UfgVjnEGS+!N&g!-=}{sq3kM?*gV6E$t3Hm@CF6WW)Zr-)9KH%8{@b`BHF#B+AME z>LY$PFxPvO*?(xid?=3N_qNbcoTq;qq+tFldQY^X%{y@29_fK|8YmaHCFrdlzc7x3 zo;8pHg!q2)4!|D+tVo+?HbN!0S|yb1J+m`8K*g2JG9^Kv=ed0 zRlG+|lqQ>xmVO64(rkAW$HvQnpPKA+s~6;Fc4nczG=3CThY_^ka{s2R2^YskpAmjs z@cooM8Mg}0gA|mKjSA>(#KGt*dxUGq@i_DS`Y;-H#`$r6IHPD&#{E)KfakB48JG2{ z;(0*m?dY>Ri%b2^G~%nB6by3%rT3?c!!UaOIs0j1&SG+@i|r3=l?|irEg0c^J~l3r z_25*o?kOPYD8ON#%uJ#Rxz)7}uy{3|et-H2&X?F-aRC3n#x97!s|tQn2T(FR4JP*W zg*vnX-c;P_9Rh80x)c4h*d8_F4QeK+n?$}%!z$;nl+OfS?E-~y*>A+a`(#1P`5U=j zGqUsPUDhXAvZOceTBTkkN8l0Gd7bA&linHYq*pr9+jwJs>zJKo_BNuPsmWVHYrMmOU!2|*Bj6-nb@6KM zupT|A&1yh2aq3j6d9z#=ufR?}oZ~@FnZxA%*eqw`-k-|xxLT3OCAY_KVb&q;N!nuv zcEWR`^;pfR&mhMpLb`0`D*BdY%>4Gmxle&YIB&Y@1LP>p}*%B67xq@W5LlU zgOS4e@rfeS_J4p1Xf3ZM~95dRK0h;e=sf<#$8fgsO&QA>HNu(E%`&*BU)ul z*8&f&1r6C;Rurw(y|NW!{;F52-XoVuX|FCuOY2whWf8L zJ%=kh5%t?Wc8UM5g4yjZ1qQrSEe>KlGtMq`!+@QdFYz@#nzDTHCh+$%xh3t;iBBYc zX4d0sXH*VWW=DTA1*KpBjfVU_m$Em&!e8C?9Zm_ z2mwmml=_X3%c)OXXS^|XMdB}bmc~KtLmv!;KaS7%@#)=qlH2^XrFEVs+zB3Y!go0HRA63s6X%6r`k zt&x0A2>sPNMKgXTj%Mx71cXwvTSor^7MYo`3G;ETUaKdjWq^(B;YNt(BkTyez{W_qWI_Ce9Tl^mE#+>;N+fObUg$+;Lb9ZvHaOV0Pr5MYvb34| zsa0r0bIwA z)rbE08Q=g~uG!*FC&ygjFz{F9NIGx~DH;En@o>g;6`Zq0o!GM$wMi29SLK)`45e1kvdJ>C;2 zb@D#oGMP}vLTwa|&Uv>x5r1|leSE9+a5>|a0?rS`7Q4j8?9F(lT#^<6W{_7W^8QYH z$le6MyAv26K3)OUjMQ@?@{dwzS|2yqYq)~fU34`grK4qM>Q-?%%zfO2x-oOZ8S>Y{ z`BR4)@ZJ%U?>;U^3F7;b0t4aQ>GeqOlk@DyD4#fjZOg5y&TQA!X$|ngFgUVNGjL_p zz+H`JVHuNVIX-Rx|I&o3%WwrhXL~~spYC7wL+MN(1{E9g7XM&E%uw13j%cfYD?A)2 zU2OFRpN;zy)Kw}S1EC!=0;LLC{*(-ld%gyl&G{Dwo-F6Flj(zq?>x!+1MyYH53EVG z8~$x}Y`VicFame!0Hgx$J>GARq96KnrfvYgu|~fcLij#*WGpM72eTf}zWVt(+gb9u z@QuE{Frh~Sb1`hfnfRGcP**{EhCS5uh(y}g=KHNfxlYZCk@>ae!jC2ERjMQPD*OG* z2Cb=dV~m?*URs8hDtZdqLxX>{3}R%CiYsxRjuGs@sI0a|B|n4g4`}_(I#;0;k(x42 zWH2%B(ZcvLc0^;Q0lUthG5Bkj_56UR@PSC#=IceaJ8-=6tX+b0&WgLpf>!#gUSsB{ z#YV|$Bs3O?9`^x*_c`zcxp3}WL6mf1ccK*`@8ptZ#zyqdXlio8LYG`1mq+BjD$e(> z3hRHC1*hI=tDck?wQ^aaG<`Tt`UjIM%Xa)O^e3zp{wy%@Lg|YOWx4jn)>$kgnkzZvW*WD@S zF=G}pau=_pE%u;oMw}!0;Z}?#{ltbOXJKVtS;qf%Yrpl#i-2?T#!KaC%n!!Lwdos1 zeb~7eJJyFfu}0vOw|tr$skh=?9Oo>*cv>PebejDQN}(?@xp2}o_ILfMs6#W4 zaWB^qi`PfS3!EH25?M#`nY5)~mV(AI@7(rS@6b3*$f0FkW$o9C^o>|r0Wk7IMt|~H z5VMw+ir6UhPu_ukt|IRh+W+L>X8=LaVc2ZU9?t)Hpi=8_1}>FaY`5RHy;d_?d(k|d zoe0<27HAW5GUHzAC6=TYq&M~J_2FObB7^j7&j9A~HkCTE&p6*VlpFnLDu36?4~HYi zy`hAF6GJL8AB%YMMC$maJ%W~u+x431NQ)dB5ixAvLXTDYI@-Nv$kA~O_~b0u5{3ks zKhP(WpTlYLIzvpRU*z9OjaX0O+dkonz1Ilk6hop1ozp{!>!g1_folMqd@taey{T3G8`yKGXM@ft2m|Pa*aAM_3EZQ+ zHH_Zq!(4BXe?trA`#x#&YoUSOX0VgVDP=udbsluHTaCDay-ECeqg;mhd`lWqWDMiA z4i#L#{*qK+R)5H`k{fE$lHLKgG~atu6}P)CWiEFfFvoi5>|sqQFJ!$&)^JefqaWbG zvi!wzKhCWve`7Hl&mG2?&xx;ld)gU}!#CnFVms1n=v(X-+h(BGRx^#QqK<6B8P8;XL!6nUdfc$}0oImEw;yAtYsL@dTb!1Q(IM+JS;&P6*e7s7p=2<#@oC$`-t-CWuAD z)}D^{8fv-G=M@ELe>K9V6tr6nJL97$soxTZWW+uiz8N4NIjqHzaS*+NXmDMch;N7F z6LHASNz5~_8DjyBGVa}j9_vgh+kF|{aJsCBfFeI%z6wa@xMy4dOR{EabbfhvmYwPU z;)wl0iGLi+Op1|olzmr0NoAL5jc?dJHe9?Vt?{Se{{Oel^QWO_;5<_MbF?2E%9Qrv zz34CVO7^Ju2Q%Jb`TTK`A6}2yA!x%I%yQtncpT=-eTMJgUS>+8{ta3`m?rho-RS>1 z<+^6TlGf&osjOL}u97ZD3{CoMq+d?nm)nvw7;E5)>f{N(sOS=EZ&#!)sY7cg;7>cj zf933LsGA=G3}BU)P;>ICRiBtm`k1k2iMMilnCq___+gKqit=BKb-+50qx=kqd<(pL zu$Nw9mdoP`1I&kf366i5hP6lg66Yu_vb4`qQy79P?|n$lkIaj4N6{y=$=_!EK44!} z)*;t`Fj}?+rJKFmE=e2ZURz@uBKWRU(*w#3gp2jdVWgN&L>7MN|2Q zdf;*Rx1}rnmNbI-O1~^%(}MJZ7`{gsIX3_(?(;6pQ zdHz(8Vzpe6nzdQ~L5DE*SAdFe6f*y2=pB)ic7>P1PH>hFhU=7gSdn81(OPz&^R1Lz z52rG|(y;29HYrzh;2Hj^es4;C58$~)uL;a3-xhB0ace_42NP*VFYwh*jrN7b@+lcf zgf~WJ-3N)`J|i#k8ek88q~QE^q=)oj-KIOj*F%Ejd5lWr?1xrYd88(oI+}j{`$YW- zubwTBgXNL2uk?2s@tf^q33;&7$Bg-7u1Mbyj#p<2nEf4kTDnem;oPrW-()nEIt;@Z zI2Yp^$E>M@XTYl6pMK%=v!(@ZL0T;bBl9ffoSxrK+jM(+On;~i#T;Nmu3Iss|Dma> zFOHPw9kC0tSs$@&zRh2-ackBiUo8DPq(vfSIXPW#kANO@V7x1O0Up}Q zNLy#b1ipDKP-i+_pnC(<(!Y}%^}_W3q|{c;(aEzJ>>!C&aIA(NapV@U<}v12m(Y&z zGmPF~dIQIPU6J~<#gJKE;8TE}q#g;pXPAY!i8?%g8v5}bJjed*z!};QZ3gYUGl5Ht zU$qfGKF#tG-{_~Je=0d5dlOc;wNXl}0BNVN-58@z?AT&;AN1epk;rvy|HMx(*e>#u zmy2xZLwV_lhED)4$S5!{-ZH+ zW|lPo?V9SpP5uOH0VjGo(L-YcFyjnuh%SSv4kbN~v1A{D77F=_CTMTF?8DZg>-|cb zWycBn!A=1@u?4vm)fMgd`97r*ew)M(nQuK5RQ_0R!~Er1%*;oZttq{FwPF1|&pvs* z@<6KKmE|2yck8C2QK+A<#fz=SmY2sr23%7jARVbPU_Mvy&HNWfbGMQO@y&%hlQv z-XG2kSBEkE9n=;cdVq!&8w19mCVC0_xHG*Nw}C=!vme^uMEGi?ad-o)32O?x#ZSbn zr~gWWg2H+3LCQ7sKcv-!^81q1=9J%a4-?C8(~Y4zdQu^uY8X3|h!d^y*^dz;pRnGH zJe24~vkRFF;6)c1@0Mp+?rCxu9vt=06r1#gHK|5)6R;t&7#K640QZ6lEVsePIPOE3 zHES_@=7mP=Ty>yPKa>ao{69Bdk*cvY3&??+%zx>mw--l?*M$F3)MMU}-c|p~ZzUut zYJXU}^iK2~vrc1=y>bzrJQ#mdZaqrY#Q~ccXJCHIsZezXV5-eG zg$}^gy{TE}TaT>rI~Z*$h=)i$7CiSS~uPRK>aye^Op@g3)t&PjzE%FKcp7Z7ixUME= z?9iJ!A5^(5z@`l^efqP_@?EJ{+tVRAHMGT3V_W#|PJiZ_AzlF6YrvsrAnV91Tds5B zZMHTJYeyPItL8c+H9f3SG-|(|S{xnjQR-cf4yP8BF;qF1kl#XD(VnfqlEC+Y@w2&& zf=?xt5IcE-jEsFSzGRta?=wVGf|JkC#Mz(wrA4!UFTSU#-k;q98Oa`0D+ZnUKL-=_ z0m!ZZ_!#oPD=6o3?acswq^9SjJ$_P{Z*z1snJ!VH@XbkOxkw?rBJOM9H7o1ta$s=YF_!i25D&LL|18%othGvdq9{S(388~Wp;Ab~R zYbWmj-oX#+QfVC^jU?t2!Ah5LRV=xXFfaC??{eJ@ zvlHHMc7z>cHX@HpzGZU5Kti89U?ASX~x z+L>MgKA4%v;f%69+Jm?8jhQaPD*^4K-m%%}@$?}d2^)$Q+=K7a#4mNg_PyS#cZHs! zqDT0@)gaYWdIOe8s|2_mXL%VfG@#U6KJv)g5HN6)zc=hd`T2 zWn*X+*dL`Hn1Pmo`^zJ*8}z6|kF>qm2jV5r+&owIN3Z|0X*?vu0(r;Y1h-W6dM7x} z+tWtuXZT0M#v*gFc^wLRAMFI)+3AoCaAXAYpWwYWIBY|5lha1TBe(CTJnq0NcDp~L zXQY2X%UNe+bxG4o7$`ljW4R`-?@qKXJnAdb{J>mSD-ttEQByiY28^*s%{Wv4kZV-w z9~hN0JKkqkMaH+#@{q@FG}3ET{l`VUoFL>@Dyl`=G|4A425wmFx0wzLfbqasQR{HRrlKtI*4{W1Bod z`~-Mh1pbQjz0!u~dX-iS;dHczrD!-a~v;q2jZ?RpW4?`k^ z-lb!qCA=1f!$-rLp)V|lC9|!>&r(uSQd4TZay){hgR&lUgjpbvqu)2km>iHb=o3QD zn_+$!P1ghe&>LxfIH%x<&JX)-zWzb{H26B$O%vNlSUs4&f`8u|nUVZgX$+%OFN&=* z^+}(=>LQJ3J&%o2!v=k~JSty{Tk!umX;=o(2R*odRGNVvgQqX<&^s3Nwa{={O1-?AUgQRK>jXO2jGK7>U^ufJTUT%%^d2lXdQ zF;l4P=up^C<0;DLnS-J7ajg;1=c|x>KlaYw}|`8}Z)GwBDAW_h~oI9`yC{nzi8f*W~kQm4kD) z7CTn25lR=E6i_6Pa>$7w`#wf}kv$h_10-IplY^1@oycX8qHF-g zSSc%oaMh--VVvegtoM;>xMHjg^^jva2KxSbgnk>;eZStH8Wen@wE@mfk~TZf_Bf#= zufn-0^YBJnW~O=Cr|VLqHc5-#s?FAHZ=oeac9jn64YCQdJeR*eK2Vl^5O?Tj z%XvVGS?WIkXM{D5Fm+#JXz>SehMm#Jgm}0swScF%$Ufue7pu|Y2Cw)x(kAG}O|6Ug zH!7}pTnX&lBwXd~AB{eqj8Y?g<27j4U6%R8N&ZZocv;c%x6?du%{${m zcG#LDJ@MaX&j*$d2*=z-#!Jk1Znxk}uiq~DJZQoz=#z!vc^ORC+SBX@AvR$@l6R=$ z@~Bz674Uegv?t=w%DR_OLDbra)%hNFs~p-)h63yxqq-Y zMV9*4g%CiSOPfrSM*m6CBmL5C7y44UKu$nCIKNjby_v}|0aqH=)r4%Fuo7nM!})rD zCJe*@UuZwkZdnoGw+y+PI-XasFGu*G(#J%(r<+aqWN>ah}S?vkek5pR;W zB?(dJ-iPN;i)|=pi}Bosa}U;h4W! zAB!G9KU^W#;rZF9KjF0G7GjRQYmx%xWH=#=u823;R;%zcYtB{@5)s|(jO0EMd@Rd; zC6O0qyx3M?xXpsK!3wl4wPQw8hC7V9&kr9?KMd0`E-D{RrJYzO>X~{mUFt9&E=xl= zE{P*{6EN2hu-0D|h+&JD$xR9mRpC4#jl2w*MG2qev&cR2+y;nUg)>{kzNT%lvhvT9 z1&O?FkLA1~J$5jP~`{MtJAAaC^n6YhivuMhq+}lEQDHeEzBOIX=ssxb}FIk7x(m zo?4YuJ&y?CLA~bt6Y(rJ=HZ!{K!1RV_v@U*JfeHG9d}5N*eC3j%uTl8iW_)%e-(2L z`5Y6=_?DNRul{TapEmKKmQY09%(cremK$&%+7a|>rY}4rPXb!B(f4|LVqTyIKRf)W z0Iw;Na3Z({4pPQ9O~wCp@{x(B-YWyrlPvr)^u(UHBrFS0mYC!3o%)eVJHnZmXAkEK zaoxi7rqzs`L93kSd#zC`I!G8LHfCRuH=$o~_8MWV&JOvGkP~ZDKEe2LcwZUr+fMr~ ze0u9*lPd))@S(cG=N?LE>LpHEhuR$a?HD>CXIkR)0uIq-xv9Rv)zHcN~+Hu%`=+U znYQrE5zJe@n|r?ExB1J|`_=dwYV{faY`P6|y)Do(%&ZyeSsuy%8I8wCrC%jv_Sjc| zDcgYM|4qdIn>_Af**=vi)vdZBjVs~56~8ko0eNu)_5AQ_2-Ffi;FIwJtQG5;+m&@+ zw7`x77gDat<*@#h&L_*5%!EtLPtHuk{OjbFx!x1j$942NpoQxu^XjxPFPs((`m`oR z79Jf|Y8cmpKrlt$hA}w?<3EsOmovk0x zy=jxL_Fv+f9OaXdwWU6JTq&uat3N|Yr-4fps#49(-U8uhA1nUFDx@;Udr z#C#&!8Jr_A!Ye+v*sj~cF54Go%h};y>{vTauai1?L9%Bi`5LYnew{v!yRE;TEi2NE z@-?sG!m9h@0(nj5_^EcTGLHo20-&`A=gH_fj$xZ@(FL{z;{(s%_%O5>#Kcb;ixMy{_sMp_`@!|w~DWUXBFOiuC}6l(nmmq{!g1+O@aI^<%lxY7c_%>ao(CE$K?#v zaa_5PHyF~Pv`!l&uK+cbTP5GphUXQ$d;Z^xk!R4>M2=`zWWKgXaQ+!ed`u69twnWz zS9u@5*Na1mqR3 z`AI(4k<~FY74(y&?6g!iOGVYlkunpW0e_K_XT28bcxN)n`Rb{qy(N-g1zrWe$~>G+ zf~?-Y2pHjL@Yqi|?5_#lf1s@|V;^wvpFGnVacM`% zHDBhpq^;;vZYQJP>QNIzeMm`o)DyzXLg?q=c2;6?*&BVsD%Jt+rO_8&`AW!;gg8 zA?yRr^`H8*!t-3UW0ht)o!{8i@3SEMds#8HEpMw5Qk zr$t8j&P?Ru82{29TcK}!A(6{JS*V|)-#XbZQ;*%aUyl(Ovtd94HQ?QV zN71bBWwxYhZK^S&MIL?#33=FUnlOtA+e~@@nN-@-bd3Iw(ZWnIvfp@qKIc3s=aOeX z`8C$#vs0t54VUQqAY;w*#rl7y2A!^Bw#-{>x)LL|=xn@gQ)*JqyJk5ywPAG5gmeMk z*lV_2o0ZuUuF{uM6&(sn;TIbC=cs@lLTrXzj^G?oX$N0^1O88a@Kz$tMW3(^~PUp&YLJ!12wa$GU?<2Y-${kj{CQ`FWoA`q9>5Ke3upTI*Hh zRqbfaMn^#wk3ihX3w2 zt}Jqv{gG|QTXOk^nNN?xYxs`ap}-g?40^75_8*Ww9M}7I{JS73?!p zv%Z0mIh4k2-2OGJ0nPnFTI0;{Uul-0LzmklIlc>>>z!qOd^FAwtP_Y|@_7bIAy1G! zuFDa|cZ@koS`xEe?}~V-Es5q!&_la1Ui;<#(th!)Nc+XT=`|cFM|0NFnoPekVv$Uj zsaM3v$uilB9_f%ARSvzg00t86K7SBDDLW-wN80dvhxE%;=^1dV^p1jmln+_A&XQSp ze!g5IUn@(mo+td~E$5h=gt2xqMf*eu(e?g+2U^EG*w@L&zR&E@R1Ed~eYp@M|zeVV~}O zezzY^H%F|B5%Wx(dYyaZzaF!cmL)aHDR-lM5G#~Bxe@j<c1 zxsU%TZCw1f(#~~+-!V}VYs{RD)W!mtTH*AIJ255|nWDdnccENzQk2IRfu<}1gm?<{{M_}HU> zHOB1Q>2Kxw#pc(LAhh%r89)r6W--sybG^X#5WBO-G+;J!kpe-T*JD=mH`00orQ*Rf=XLcg= zLJlgAZ_C}>^le?8CZS*PG&jTM&Q(USUI31hGne%u)+UU=4-oaL@HXiw@nQv|)%q0h z4?wL3^q0VTec?>IDGkmtS^#scHZ zh?8hXZ}zvXPNDO{_50*`j7!PiCRjza3md(*@GeEA3@Zaq*?6Ze3TEFly<7XW1Eo;^ zTmvn1`~#MG=zwWO9|*&EEA=E_EZ`%Ar&@JL@4^56U$))`PS2{i8=hS@WV0aoATd=Iaqgx6gHfW3POQdHN z==cQ6Fcx;hub@{K>zbkq@GjUb$By2dA^(p8)Fa<9R1x!oDDO(`3^#?#!X4nk z<>AiIk6cEJ7Vzm#%#iN{=6oCQj1?8&uK@P@qwtEJqQ3;4e**ZQgbFc~_nYK&LD~HO zT+oNyRSn;^qu2UxO+4`z;vT?ulwVLox4PqaI?EVJmC|dC~&T zQJ^a6fgN0V3QFGFU5y)z@vZb?g{8+>V|uLDxb{?zHx&CdtjF`Lf016I-Ki{>5&zDl z5i2Q%S*vLzooqRNNNkOM zQsg?kNV*mAK~mlyN~&?(^g{p@ipxQqC{B^+2K&u+}H=ZPja2i?m30x(0hv zXs69rfBHxuor7qz9z&~D?Q7W<(?5wL@{eNVk5RsHw=ESpr|*&j@q?HZ zn!I8+hX4vN<}6c#QfV(o@&|yOV?EDv=eyz$Ljgr6|Ob?9X?knH! zj)Y@xZ}|HN-bcjEgFetlmi9Et;|Bt16x0>`;!8ZkP4)pBQ}bK^reGd}sb3!x?iZ%b zqsuPVE^u>(z*3p6)g3~*^1O)pJ|Eoai~E?1^(F4(TVh32z^n8ix}4;z5b}+_O4&z= zK1=zcUQlx$lgo6GT}&=mr(O(RwQ7&{r6x#T{xTrWm>=STL5 zPvM5V66#juIBa&DW?U1zCDHmxTS%+6Y76+xaq-&loIShWw{1XF7~$c0s?i& zsajs>L(0-EB@oGf@|ke@FfXO`2T*;$Y-v3S4GBWXpgPX!7+o+p0uJolr8H- zk1h&NYG3Ncvp4WWuO%t#!%@8gpYxv5YCXEnhYkC6BXJN*u1AmyQZi1+V)Pcv!Nu&C zRk2&rFu2;H-W!gMugJXHV~dfq2VxgeFGU{& zdejQa4LPFzQo3jWClQ61m@0*Mfxz8xh zu{KAfdOZLwq8^odw@N<1|1k8)69Ovm%OLXMNDckBFGvgQUu;?8ZtZ+dYe#DFGnudb zy)6nj84udIze@ANze zJ5iXP>wfg7%5PMlw|V~&XENL?Qtw?z-zc?$*`cu29I(E)8WN!o=3>|@rl#t?k{1$2 zC@Ih7FrO<<8PDPE`A)zmqPsH<`w@)ov2Mum0`1|vay(e<6P8|kf2{flG9AbA*>CX8 z#91D1!m;+~M-unxFb?7FnBq|Q?_x-oK$m{4So1O7?df%g_m7>UT-T_`!)bRIOON>e zV$dE?dOOk{F+Zsq1|}eA{Hlo@E3Z|aV~PmJNAHUY!r`eNIR2{M9lElFdkMQx;Z0n9 zr+^JrmdYZ*dr|B{Yl`S!^{%wiIj`&XOT8cK3uxy9dj(fU!7X>To1vuSR$gDrc0bDS zt$!Kbh`O-J8fB%=aEzan`zJUD;>?>Pw#o8mGSz>r9D~!IP(5p;&Z_qOoSwTc5uaXv zNv$#3`3av`YyX%Y3!jdbaHDd@#omQ`#Vs=Zv5`-XO>gkcT8dJUE@}|%S4>adaNY6| zNRs<`hr`Xln&ATY-tcO`iR58#xb`T#0r1`7*{~b%-QmM3_;YZ%`ltBrZ4I=AMqi0Ah^kRz8nm=7NO|dDMEnTAx zdLm+kw8|9g)i0-dWjVlPJm309C@q)g+7JD7`MiG151E-o+*D|*9q+NsAE9nz|ktcLk2wc_s`r@~|8zM{hQ{X#-0wyn;ImDo=TFR|$sDHwr(&dra8fxA zzZ5;%BD=<}3l}N*Un`U3P&h4O9WmlG7W7=l$z6V_kp7AB&&T{C#1p`}c|rO9L(!u> zptM7-^De7b!78rkmy1>Q*2ddKwjIyG@z z)Elk{@Ro#h>WkGrnCd*QS8~)sEnVRsEH+s$T0cEzeDz`JLA$pt_8V83=(&t>M!=_E zFIS~%oRcRUvj^oKp3m4ao1a!&r_Zu?>b`KLv%XZ}6ZH4!qR^vP!bY)ZoF0+)hNr?c z;LGJG12uF>{A%j5Sq43c)$vuX*9)ZLXn&3wU)>J~yBRcU&)`25)wH!)+eFo(*flhC*WA zZwUX!v{86HE%XDgwU=#^ZB0Wqgy*)j$)3TuYmG53BF|0UnRY0n3i7;$wT4KI@)F-p z+hx1ZJG>efuDbp*gmsX-{_>2h!bLwlqzl8oGZIS`57(y{CklSEc8_k2nI71yVNc$g z09TxU;T!d9mi#XJYMJkrv_*E5^l#Cx1O9pW3a}iz%C%9pMwV-Rnj?oXV%&{(V?RE} z!Y=z?wkmvHYy1Tnf<m1kke8AZL@Z}0$>QTat8e_jLCTjArt z(>S&v|LVCFwPnuvJR1JO6Z@Di_ER5&XUMU$J+9Ra=}5vJbKD2gKEtW%xc@OZc3=qn z1ZZc3x2u&;osL$MJHD%Mc*5fM_vq8HMtB~?lvG+Wt;1-~#1%V0r^@tH1B*7GN8z`X z=^GRGhhG9XS3S?u$KxdVgEIXa3X7C|z;J>RF76-yI`aK}nigPhjEE!wzG2NiuJSKB z{lH1b`=Q}m@B~HRbd9tKqyDw(5o*>^9JCJ$hQOZzoF#AOQpPipM*Blh^w@v;tB1d92bE9I6V#g zr!VH)>3q{_07V+mvp~A!g47ih{MWbyd*!umjry%XZ+6=vNvVaz75&O9@m=vnJU54P zW4~|k+mV{_O`r`(PrEev3?CD@J<(bX>La1pg&etW0rsV+W~l3;q8xu?_JmKso!%jD zqPON%dKh^u#D52PW1?j`UzFZAq5{ep|LXARFo5gRVF7B>yCT!Wo(P%UL)wuqOMNlY zPs1;bfd3lYtb`{5*Ajjh6?{Wo)2}Cv;KlMemlAKsXzaa?d0{v!mkM=nPk5CyM2&_@_%)tG`51AGji10F%D&< zch2JxDz`JI@}s`huxqF&|RkX?x&AWR6&Gig~9m8n@7_#k50QgeZ;XR z&;K)3(_bKS;~Q8V?Xll^kA3ba9@;%vLU`pRKIxU2<48A0g$(GUkgdZwb>3>6_T;(g z6=@Ot?zFcup8s*F8*L%uKJk;+jryccSJg&QFa7R-h1a>VPsn-ZtM;O)!S0fODe(|a z|FH_L{7c5qv0t|w68c;c|4q7IXDZG;jNCs}kut`C)4EB2{(9G<*)zQCT_Bfp{Yjgl z#0z_OnFDj;9?KuaI?L+-i0SOOLQ_1~9}f*-T9J9un7EUpIdP_#_Z0%3$h8b>PM|WE ztE7kL9+DP#ZN`0}u1XIeuXz3ibcP=mlazK&+9h8U(BfPd$mIne%G^*cK?!W0qvzE6 zggGPX*2Tui8MHj~*e!{2fh7f353C56qNZZb7H-i;wYK1RlfOLc17UIGw-w;eoJ9PT z9z69DdST(b>`~#on6s!w;UI3VIxGq|=o4CB(0_`)jr6EeqtqZt$lZ!dKo4S?6g_C^ zaixzz!Y8B-ffXK@-j1hJIJ!4^#Qz2>;Pt@es2^hJ^TInaNJ6Y^?~v^iJLLE}7w>kbEvvl`w!8*~m}j0<_t`-@w= z*ZW}eIuIJPCb3++>B$BEolpty*T=Ljb_(pv@enZd;_i|gF%IOo3;gsh>(S?56Goh~3-0q`oXsNE&8K<9#ba{VAmFc3K7zXdblP3%`Z8!zX%UrpYB*3B4$T+I!I# z(O#Y5j4jOgI?>-KPu`(7jt8qPy|&I~Sd;Cu zdiz5^3Qwl1ZDJKA!>is|D^sT+N?@=e!)d8C_hMrFmf`e^qMdvEluu}DE^oHR<0Z{% zO_etV8C^m+XFKaCJVyiWkPh#+722&;{8?jH##vJFylz4~ITu=vIq>6W6+boq z9Wv8bplsBmoN|gFE5)e9#1qMg>!s(OA2T;D)=_nbNZ@$v0mUg3SAYRWBFqR z3H1?iy~gq6sH%*qx=vq)R#fAuo+Up>Jb~yNI;Q&zdYDw{p*?=0<*3T5wBEDr;mif2 zpJ|%YXU=q@6?m(jpjEO)kI*_aO2*Hep1jYVwLIaOZxcQXcOCxg0v^QQj;yDYON%p> z{bc>KL<#0~oQwzYb0HrKn)%wnJ%cd)K^*dIjl_&q@^i};}dkO9%uMFpZlt)Q-( zGVG29-?Bg9zoD!Tvrym2E3TVV=Ml^|!?}{lJvQoj z)>76N=!cc3`S2_s+@P0m?v7NyOio1kkN^_PaF#UByV%-rzLV)EoMl>SIgUg^D$0xS zoFlA5GSO~3+SFQEC7sZ~CVcM2+r&V9h}dQDitZZ+>i)GrY6-x-bq>hJ#9NF#5E=nQ*EZ)GfnBUP21Y)$}=~AItUQ=~WiS zm&)?zlYS4RoLRn>g}oH_yseb zt*|Y>Y#R;Ha%|%`o?Iq!b=()W$oTV0S;Yr!t)76ocD-kKgWqZ_6QZv8r*uX*x0)W> z!+GhO7^jhUlO?C;NT0q<*|VwB7mufBZ-ddGJb{vRp~W9enSScqFN&;f73aEn##3EY zpYQcj@eHGUYtrwf+vg$gnzxjf(JUD`kv{OW1AHpxclxbKm#0mBj`#cKz__o}E9e>M zS*Ba;{ZdARwHq|UNl9+=t2LlXPswF}d%M9@RZTfoPZ*nQ;xrVrpGC$4E~J;B4-4$I zSR-eTk3+H?S>s3>+m=RW`b-o5=gt3f`-Yl=dX1B75wM zyRFG?^-<{Pig9?A_6aVH)9Dk@5*}8L(g~l1_JS6jY}Lta5$SJp?0`=2q>D{5pLc>4 z80p#06q_-9MGnOFRM^%bk?A$a=#+g$$=x`4^SZ zz=p>yRhbXJO^x~~ZPH)IO3BCE-oln=x7*3-cQ(TiInPeDr^o40XT8W;*dsg_IpgQ- z{;lUqXZ$tjjXLBG^mn&A92^M1oVsgU8>`p4Rf5e?e=ni3CB9pg?T`WkYF zFOhagcWHxC| zpS7Xda*(bno!!(x$r1gri=xQ+vK?fa3o%AO6i19gOSt8I#8c#t^hYV%2{WFRi8HAl zTb#^SrVT#D$KfU4AWhix=YS7)#tHbKaTYlY(daty83 z;e_Xwxxp~%1D()!TQ^SU8uU7^>)bS^h-9GfG#SUU4KuGfaf2Zevre~(_+ae+uuBy@ zqt21;T&~yBG`|cO7*7tZuwAFse7Q<>rw;h-&Xu7}1(+>{v}z{D>c%9>$u`7VGwR*vsSiyHLMgmy6i z(idPP$tf7s&ctYKZPFWx3S-rI&H{R_y%o{*I^~E z#oEg|<7a(owTtcD@=Q8axJM_a=iU$KSwLH;{l+*UIem2;&flAyEoFuuvpd7@bnfrV z@LwaCd>p8o*8t9+S#q{PGaiurU|r?J&oI$po1 zcbzEzH~slE;Iu3+9LF<&^{5ZoW@`jRUC_86mUuAF^@(#oZ;T^;foHzKhAXe3RLere zmZx<#t;~-+pnfy&jhe@JIei{$3~& z(w}i}E9&r_`o{m&KPTu#!ZQ6vai0HUF-y)Er!(ifMdw53%HBL>JYS0R0(wf9*_Ghh z^;l;no(g!s3H7QxM-`ky`xG-hcch;~f}qEyp$r_i?_`Wo&xMjXh(hrI}};~eCC~V>(NWo;`_Uz z->cVv(@xcaG3tWi4PU18j^*kwyx9R);q_wqd6uN|iQ%nuqy3^4z8e=U`FwWk69u{2 z9$%JnAF(`-w)`}VZsE~`d>PN7M-lT;pTuX6cEEz$WKCAFSJN5zJkOquw8vL$MdZu^ zR_vtO1Pl4|DW|)^dW6^imzH66PCU!>8tv45NKaca=U9mGfPAxEe}!3Gh@7#v-*K9N z?lX=b5a+>YtM50`(}}h6191uJ-9_^6GGVvpTGN5lEiBiMlBGWB)I-)KW?UIz-8PHR z0ou2L-})l)4B(fAaUcHcgvSKeNV;LAeM~OGD6K#IP+%QQJa^{O*c(3qi}#{%P3-i? zoYv@WKj`$iyCpp#+57HaQZCoaUa`}|SttkBOIr1Mp(l0&6SQo?bO#<9Tgd?P>Clp{2|4d6CfwpN8x> zBD+y3#ktrI$x|-QHOi51-je87-)6tXeR_O9_|Rsp-UdnZ$R)BgJ+0SRx7^_W?%Zi~ ziS1X$ayaPA3zKW~*6_c;d-_TJyyyh~yX{%$2!|^veds;=@FaYRa`l2S!VZ*BdXeW+ zE!JLxCz$QWXD@2hKC^HsHXo^ zqT3e$&vT%10b1zCG19rjm)YaGRC-exrz+( zrKwXp^@RkF>2#ga`;i*(_YoFno9nL_cdVRihXdt7xm4-I>Y(2uj{zIJN$sD2hcm8x zj?#7DSKgQL@3GVeIc!zFEsEW;4EU~ctR@O$^Wj_`^qZIa?Y;p09qBn-QqdvMf8@vY zk|(rVdeT*P(0kI=daeFPSQZBSYWq3(+~-UD%}C#W?y`Ksxv%R0WH1Ox9065})6IGy zVO1)1*<+FAXbaTCd3JuJzR_#(TImM1Uj3aci&y!l{oj32x(axnaHeigTm{T}+Z>z1 zX?C-kUuwPSuv{9t?Z)(vb_M>s6na5=y8Q_5!FVgY{zwycn>qP&ad8-_;h*OR07J>} zB>yP)1qObmf0Mr0ga4lp%43-wiI-S!ywQG+Nelh!mIv%^wrx2T0oE1sHA#*1+)M< zegR(6Nj&h|GsK83e|_0D>*ORljz2Ozz1&{*P0saM#BYg1!fS709GB;GRHv&Zo=dei z4LiJb&oRm*o-`t(xOOE*qB;yqIsFPUoac^|S3E3Z ziqUPFB8PyQqC&Qp{#XU-=%qNwh3hwzFT5qLKR8L~0t zIHreD_FAinqDOQ)u02|w3ZqZsdyP(3#NbJc;J*uAM!XKE5l38OliHDlbD}Ti)3|G7GVZ4(^MLSCJ*1;LHHl)MgY3XghfF=_w_)TvT`8|& zA5HX?9L9z7a#7yeqRyU0iV+_RI87YSgT6Zn#-b%31d#@vydZp6st0eVC)5vmVDenN zSD;CgW1TVmGd|>qdd$4je}S)4p@pPp59Yq`R1NgtI_RUAbwHy*Pw?&OK2S9b@5$%% zUOf?`X3_WR!N8Nw9>g^ko(;p$t7*vh2+E1F>Yl`yYmiq_>n9fE+in>O+x6Z=9+8H+ zP+!#h!LU1)E*I#YncxXUS;I+th6%rHfTx0FZp9j;Jzr*Xj$_JK-(q!3Li>h#zjio03+IXT?+tr-&&iG&U z9b^5P;18+K>C5_6Y5-f}d;R|S*MYUXj+Z@akE9X1A17Zt;=}2e`nQ2t(7NIMU4b}8 z@H`xL1=g>6IfAHLJHr_Gz9$SR+J_)2kvn(BP!o6Pm=4DwIb>s42dVMgE|LFZAwZgx z5=)i!YS`Ekux!uRy;kEV72Kw=ftxXopNl)>1ep%{xnB$Xk7IE++K>N2EhGP{?dP6^ zUIh6ck};oYEqb9s!@?s-ncK?4VYjwucPYmq&7Rvled8J6th0B88c?t&?XVqjSfK4F zZ$6KM9DT($$|m1ze-Rk(Dz}GOzHALMw~r*~kJcC9zp!t~_lW;0v41%^G5wHJLvo$r zS=-dB`tU-mwqh*z5!{sfFqNcOnk#nP3)@vKK^a{B`ri%usd?kM+OF`l>`6Q)rOsdQVc(s0C}qs^&c@IW&OVx+WgW7e z{xn?-@ol@o?N#>N)kFEf!lD-Un@4g1@32)f2_e2^lh$hV)EL38kV8sp(^Z z@|~hninn4J0$1)c`d?M$j()r#wG;JpD)P#C4x=4Ah;d7MKtvlm9Jb57{&2y_UORy2 zVaWZxBI$^XL1KH;gUbC8&&M&F?#CC1`0Gi)9sjm5Qp>Bb)XuW`u*@7z0sI|K-wodl z+(kJIJ)BM$056?cadig)Ts36$Yt`^L8TS-%hc{;4t3$(8|a4Q|REdR0u3 z=WqfrMoVdrjoGer7@rMcmQudCHH0>YQT2PSixI8jInMvPK&|sp zC6~9eG%Q!Bld0$-_rx*dO}_2)I-l(9zpCvFB~X>iN#U6|=EGr^eOsxeM{u(aF+JN2 zre)a<>aNg$9O@kW^!wwzp(;m?i;k0;M9R?aMciprUI?S{oq_$-k;qo8TJN5bQJWbi zd&&R65}>x=e$IAd1KBQ~0L+w1u6Bx|tAB?m`QGgu#Uc^k&%IHLEW^xpx7 z3B8&+PR|Y-2KI+Q#i*d&7Uo-Rv&WD>rF1;x#Z{F5^FsV9z_(#P%PP%hV6WEfanBZ* zkhNNk?DYWNXZk$*Nti`$)_ZgV)&MiSjHMICU}M`9hQpe0_gm5rhsTP&;V$?vtwvrM z599Cb)t@5&jpcoJ33ueW2JnsekF@c(YWhs$o8j2>O%!#ia9t>w7JjA80bD~4;d__ibD8r!F|-=xXXAw?DMQm z=ceCik9GUmux6}A?^4=1W8FA*YWSYSdiu9E&&s$u&NyYGX#{zU2-~KI1ETH#Pm`AT z17XmN@O?n$CY+yRfctKw$Cw_U4}-$FX*|6krIqRJ;Z(84L^~2AJ0jOmj`*O}j7I@q zw8U5fjP}m^d)}N_rbe4v{Kha>#!Z?CCq4AHe?5#w;<-;q6X*$Z(K2!!5&fvcmLDhl zP8m;Lbp#jE%9uPX`<3Hcu3R@6Xk^~_d>A&HTB|eW%{cSq@|cb(qRe}Z9k0aGB)b%4 z3T686W383rfCu<(6c|8fq*V3;i^MX0PR%#ML-M58hPvWd53X2{YF?bT=TBPqkM*}a zS}u$axWlCM^(s<8nCd@KmT?&Kh86pD+VfE z(33jJemEulpqm`#=fmL%7hF~R8OqOx!;gU7wp7f{y!i7t#V# zcvzoMj;pi0vghE0-yrp;Ns+5lr*M9d?+?cnwTf6S*5soy<`}EVp7@X)NE~m|H@-!8 z1<1F=|NZcU)?=Khu^Bl-hJK%o=!AT;Csmb}lKM~!dI0x|mu@(`h%3yQ_Fu>lzZo}j>mJEo3zoIK_zOuu+-mA++8y{H3gPyG>!#~ zhw%&R7kV{=Hkdklc$VzG_#N9HPD-^3{RvG0{1LWQW6<0E3H2^j^!{)3d@>-^INPPJ=>@b8+t?gzCE5`KeRJLQ)~-7 zc^JI*G5@|lA+57JKf)ilb2v_m8I_2x>l@(Up2XTyfkrcGe1}kiz;AmD(Bi!Q4fja6 zGy)#ZD6Yl3ly0LONVC&`Hm4=BHO(`?MZtu_y3H~@OLL*~#Z(0@zhlb$b6Sd$D}UkVC6*6YD%YBQsx zH-Y~ppOa!;brg8oFN$0L|2M%JF@W^@4Q2wt<5mk2}I?ftdcm zD`_}f8irFPoEdHkV~OX~x9VdB`@oBQhjIOMg%N*qRPY&nm-gZ2de+J`Dy`ZQ+wAZ0 ze-(aAj6d5K31@j*1frD7c3uh-jDb9q%PY{zN8NW=egdTD*mHHEuEV#aIAx( zb;gN_fM7?8|3*gPQ8sEgTSI=G8nI?PVn`|UmiV-NNSDLTwY=nJSGd?#D?Hx)!?1BY zs}nsT{dMbwdw=I3mnCQ|>D`|FH!xn4PnPXAzZqJT0-u6=Vf-XgHpxQN%g(S2wYXF3 zBK;+9LAj(i=P#?+a2Hs-(D)$%ECzh zhfkI84DIxOUt!%!|Bye0Csr#`E=(QBvtO}aCi2Z&WwW&>(}j^^Iz~zBGVlTPj9{#_ zC~(D>(e!T6?t;0oKGY*MVtAB!Un>_0`L@DFbaKovc$c7L7fBy##VwJxHN#qGcepfi z=ilOjss7ZrSgSHu-pgZAVp~w$sP`9Bl=NdQS3B)mzqH_9z+0XDMNZFnKAo8FcNyu~ z8M))GOBThY`29M-2&X>P0G|2DbbX1ZBBLisHOeSFxb0HADJ)X1+kPUActg0j#L0DK z@{Kfn#rz8e)qOe+)0B;D5Im-4CI`X%)H8P4c*ok($!;EW0Vb|N%G z;1>X%UFGB7hF5Xt#^&%N4z*dt|*}kgnpaMm;2n94n1bvr(<7d|V7=ZJq5oZK?0t8GLorvfRUk?1X#5P0~Uf-4x3Aplq`Lj7S z>4Qr9|FPpGMO9M!n-nbAu(22B|BX>2=NCL@kmF>w&H2K-GFIV3-h_)|sg{Djwx=>Z zdY6iEUu2VG{tIY}JdB=Y)JD*zw_2OE0LJvko?Fza89(>`ogYV$FRz@AzhwA`?DQae z(AwY%TBrhU^Zc(dO2Js!(N|cGf6I58{5zhm|O)7JCp2?Q!VLRSr584ne^lHR}Yl41K$zF$7GoE~t<>Ff0x6o5$uWMiz?yQD= zNx4cjQ7*zO_8stkoK9dN&zO5NW>H)L*iq)!=yk93>p`scwpM}3vbv>Ot%=~A* zE&2ek(3_z-QY*70d0r0YiJ(4s6*^b=8}$}cDtlA*?yU;l!8o8TJdBafm< zO+p%|&s;a0peOU;I|l9x@RvEa1;(yzPUk6C+$j6zM6GR#6{SDcnd#e-({pEV*)BQ8 z@!^jG>lf_0LTgH%_Z_1@_>HM}wG?QByb`_}c1Ny@o#E#}dTb$}RlrGlSo07&AhsD| z?iQKizlkM&YxYK^KiKKo;y7hBepm82S(ppQ_Ys%oees`-KgFDd`{EIAANPtlQC?!A z4sfP%x9fNj}VV*e&7J&S)X@_Eq0k)WP;&30>htjFpzB>wI~-!mf{( zV#m|I0q)?{7dW<+_v-NZaX9Jc+q{R1q40o)v<;)wTEJJq z(nzbs_jMg`tpVJW`O-c<@m9wFhq_(=Z`^xfp-05D@Pl!BYQiJPk*WFCSM`Am5A$^x z&>?*Q)Mbp@@XfRlsa^*q4=K-^fbC2F75OebnlCy11-!Yge6utBG59zZ$cx?JJ>eUH zr%UJaKVYV$vQ3_Jb^#BiwGlLtDx}uTw_4QcyTk9oM*W$-0VviJkiJvT(Yw>{zyr35 z4~P3f+gA!&2{yIJrf{6I==nV#ndsL7R zAL4lOPw{j-VNa9hRF6FRBKI|&Cf(4c$w`EJUx=5xUr5Cg-JtZ-*oM(%gH5qD-sO{o zQSjFw4nU1`pf=RVU9vFJuG*eBs;dzJUd1Q);dQtw-i@`BX+_?B%X0v~Bnzd%8$kDv z)`F(NR4cV|cg*LM3CiT4Yn61$eEhP>GQ3tgb(Pj6;7=`>MXb?2%o*wxJ_ztKr{CRC zcsLf`DUCw^tW|Om>}a*t1iT#G@?1hheDr$fxnR|DkxrJ2d|T+5{;rb#Rnm`{81QJ9 zPEvR}1)RR6jZyrYKH#&{DPeOMfUV>YbSY}X%vf)0FzVz9RBNmc|8aNUdOTNor*Un2 z6}T|@7(R4)#p(e6f*^jDP4ZS*1TE48KBH}_k@cw?rJahhcgq?`hy27YC7WU7(EKzB zqwNi*O3ssxnVFt+iY`%}vsNdo!J!$_5Wj5KK%Q-}S15PzRpv>(Zz?)uY7|p&V-@nN zlZVoWmA%If{jk1I&np(lTEUKz*e5MA1>gHX+Z1a>dGC_rKu^|(Rnlcsy#{*HW$TkD z_+|}W3oYtI8cH9#3;rer<*CbX>1PxTGHRNe!*OtJ;~1(YId=bX4v zc>W>xUkrqM3ckNB8uB|n-lHbeFXEq{1lScNS_8gME&1OUz2ti*KI>#XBCoasJ~iUB zNQ2*$KBC=_>PcAb>qq}l7jpdJs-Caa1;+KxM#=Fm$p4E_8txXOhR!h7i)ltJgx`U# zPd)f-2xk;oKdI+Dvt($bD*bv?k*76JwgY*EpmtQ_=^Z+skwov}>03q%GPcEEijX zd}868I9Yn3lhB*g2`cJrwGAe$>Bpn>2>hY6bNp1+q}-k`PVbyBL$_-A3@3+t&LHK) z_H9mFg*Q)#ZPF`WleuX<YJ{2!;_wn zhmc|{e-Pa@3u>TZ?;b|&?CpAcIEb$t;`(oX+Fvg zJ@@tA?Ngogn(!I8`$2gP=>GyVZ<@6S@|hCqw{<9uV1?!;)T=*2Uw3o*BWaVH&?|lj z9A=FX`BF5Y&jzgiwpNdmDt~e-#~cP@_8`vf25WX-tVbQm{ONNAJp!HYlo{6G&87Yv zFBf8rb6vO)`uzy(oE#Z`LPxYa)%rRgObvblG?E;dpBBnGpHWb6CxLF(E>b@S_}HFo zOC3VKZ4S!=>+j4k5ZJD+@~gZ)ObL&~Za)>AZt))QzCls1iz)h!Vy&{BoSG`yX?Ho- z#n_U~iPH@27O>YMKjN>KE%ACtkWtN7;`3Bk*Vo#+bhUTeG@Tk(L;lm9H9Ob$dRq

O5+#lr=_m&@VYbymTfsN0mGusJLx`xvJio`xs*&s8;2+HEZVCg=?Lw=f~@eVm^HILr2m<1v;D z^&Rz!+-0kCY`q{n^K(v`p{u=5YK`NuwRWu{|t$4ofS9hvN&I6$zMW$-h(&h zTL*Nk%C~ocl4?C3goLKWI)6CyfLrs^I=wQzS5Hr@FAW9dMCc|+k*#F4zEi#{(b{qS z;S-#7+b7bnEk@ckX(gz-FpZ(Tx-is-t86Sx(HeV5ZjNn!q3?<}A*Rde_CN;jZdiPB+W88ud2Im*X;=lZ*G}VMhL8!xL8a`<*A< zb;^9u_l?MYihB5Aj0m-8@UO;xpB>Nft+CW=8BCjereS0S2~YKUul5Wp6Z;GBA+i7F zsF>~9@p5JOg1uYcgO+wNsGsJ06GnD%I{38_nl=qu(XSWC>BU3(@$kpRtZ z&{j|`9G{eQ+Fzx9d#}$(e}!?;{D5{cN2=H!r6ayu+3Fl`)uNO;)X%zE0{KJNIp~o)XT&el(`1@9;z<5T@3c z@vMYY1|2r+*sn{C@d^lEqm0NPfYJ+~yvy_(frq}x>VvjX(VN>HCH^YB;wvNbVw{SM ze>P;h9Q)B`rx)=Yu&pH?rkO5#Lp9bQ_fs={6;F$I+1}6q>&L$qRXQ2>fIFKTbmAP7 zYWlN5&uVSSf%6nR=2 z(aSaBlOx&ns3ROzp8)@6js>z!?r8edfZZ8$BkjMigh@ZrS7%K>#;mE=dLz$#Gt`w5 zKQKKluzzW*@(gO?;rRBwsUhq~ugM*|{ox~JdgL3$Yvh-aHcV2}o|wK)9+qpBtwbG|6Q6>9bFHP{mXzr^ z%6Jdz*U#+gxXkiJJRR039N!+&d6sRonf@O9&+*DZZBH%b-BOUA)jkk-KE>l{u@5*` z!Wg;H*n~CGP zpVK$+sa(Z!j?@fOZm)b0QSKN0r{a`H1mC%nW&P@=kC*n8k-o(8(v0a*z8vH5i z_Dj-$UyewhJja<<0QR#-BJJRqJdY9m zm*TTlDY#k|tyNm%@2$<>M8E(0fVC326lGou{=bl5z1PEOoqyF2C$1!%sr%#4iY~;8 z`Ks~BmX)n0ti@<=Vd>F)y_s;fD*oq{+q75ogNmL)H|i2q+-oA%xsd;hhV{@$@1g;z z=zxA1^kaRK7DXcmHsQ%r$krIsH^O6mDfFn{H+jET!azX$9Hg(vt2%)H25hqpgn2q3 zTT{hxg;xTwJ4R@@=Y`9|=7KF?lfUc(_92D$4rE1-hqZv>im%BsT+7o&y-ep7v?##Z zj~4c|v{aWWPnqoxq?7b>J&|;>HX`4W&h;sm>t!dMD6cF9hNbdlQEReBdj;tRP$#~I zPYtx#F+HPigHFKctC8cnm-HZCo^-H0(P}Xd&&`_S8z07O7CQs*IfmALENm^QPMD55u~Co3&vl~a^rG}T;{p&rV!!+5qM}Wvpr8EdH;kFB2~R|d5p~2r*ClZ| z^4OS`3(rVclbR#fb6$(=DL6x19&^7*?DLd-Sf1!@)h}}s^@rXQjE2lrnNe8O$HL-b zMAsDE!uTGCl+axPKDgSWgg43-v^P_vBmNc2GQppUHF!`2DK(X8h z(pKCUCxAaC|Ls@teuGD??TTZz7;DgLKrMUw*CP4G@ydYl%)HHj^Ou)odHKsGzdW?r zWrh>Ckwcl@peIPbR2XsT%L$_Zn;T!Y%Od(;$a^{H;FBwgpeHb{!t%691|0pkuklR( ztH#x;WhEZ=%WGw#9iU$HTJ>DE>~-?2?TlQ%tLo3TWJRC%>T_0Ik=u!Pw)g6ce64@Lsj};#XUn>~5g!EMRH<6wP{EH<$E#Wm8kmYFr^?DH04fqx-CtY+e$hw@MZQUTKkn~KNrgP61{R3#OH+jMt8;$@WP-&TMGKgEU+Vq z+{wP$i^7O}y#aB6hs z|Ep;@uq_`8zfHa9D+j^=R_7lm%hii=jm161n882Y7W=5)oth(a{*5lPe(6u!LVs!w zSENnhP0SpoOJh<+oa9(1^tNBE9G~ZJJgr_!82>*}%D6x_1N{ zj?1g@KU=NeTkX%$H}RJY$Lzs5UPa1cvY#r?;ti&+!fAy*S5B14Qdi>Pet)cjD7*>6 zx#9UxDJoLY>(PHbA1jumXgQ_vT6b~;Ocg3kiup^6Rpb{X(7QW;&+^T9bZ8X z^V3g-`0Ml;gU@cFAIr-&JDp=s*$i7@ESJh|NS@`Yp5MDaaDQ=o%6wqH^V3gcrrn^= zqrK${_0ISbay?uA$!FOg=(U1<_tu<-oh#d~_)I@P{WCs4ny~*G@NzZXU$u9Iv*qVD z-9I6(#x1fZZ9waK$iE2Ljh8sGeK^^Ehg$cbQg&51PK8fwH`H&lbvgmBmH$pHkjnkV zDwL#EZ%L!2T(}RbMNt=JeStIE!p+6~p;iB>IFjfQ%+>K1Wp+FZ^A()PjJP69-=@35 z?yy!52l}dxSzGvN$TJJ>mRT#mDq8g>+mqVt=dm`t5Szk%1$psWoZ;ukr+iLYVZ@X9 z`Bls%a1J@%JPrPwDk}72Pv!GP5jl&4EBx1ty2?|tXaRdk5H%HEq>}~J$IP~-glDI{ zWHpGE8?7dCTy#;|EC=zP`Ag9Ee9i^oowC)R@g~0*{dR3QFYGJowNca;BK@;cK@E5X zb%G~{)R*~YdYJFa#A63Q9L9ChqhD8?1LZw(NT$f?`VU&4NT=B*FX_|?IypA%OPirB z^h|uk>Y$-Nigg&X%(Dfy#f~ICU$se*`A!D+c^>rE#CdB8H=ZX_s~lH!***SzQWX6) zP;!?32%l{KJHw^`>3FXnNwwjeurJknhrnK_qwpr^!(8l;PSI8+{p>e8Wi#?seG5I{ zZ>MjzUj>yu^v{!H^&FN;>XuFNTsp(LEYrUa)RLZyZKMCPXq1KVC7C4Wr$?m*d?UZM zr9;}Ddh|$|Bu(a~LWxetPRMSj-cNj`T=Pg)BPiYL=0`WJdAQNB;&lcU~+ zakD)iDM!d9o(KM)kj$_0&GEa4e1+aU{JYMyKk=VJtJx2()jhyDm>kp+&tvgK?Mqni z0{lts(e=>ADUbut0bzWwHL&6SKVeZ?7k&jzYx5_iA@O{THMR?pi+a*J?AkpcwLoth zw8bjkkv8gor+KmXvr{KTBy>#Q$z%a_xL97w%ko&8FYKJB+@WqKP=Zzxy2o(>z%34!HZ z<)gYkuwJmdZQ;kEzF1=2?y@)X97dO4#94Np{S0}~lXhF$0muTQR?La-^PkxyB|Y6? zE830b)a9@E)N~f~fw@DU(>DTJxrOmXnVQa)$L$2I$_4clIRhTgwI4vA$>;TH6teE} z_2>(xrbc-Zc7FOBf3X+~kIKdV_2QQz-mWoD73}SFQc|s7)CcZ7qdt5S{ppkGYQ0PU zBg_it`hVCvOFBE`8-cx5=G*y^^iZ#Q^e+qIF(E%Q|5<+**w*-*HAnId^$Y2zg7?eg z|3t6$s4Pt1z&O1@PLKO-cFN`2ATOX?mqOpBrhGn2ds$A@h>{PlK(gnAA0l7aG|+4A zO+1g1e4b(F*yDbRaWq1!YNOoAZ-Vm*j5F*CdOF^piM9S_LhMc(2zL}0s|eTVF&Fh7 z=@CBpzX+ng8a!L9Nogs~_ELT_T?O_^^p}o)6Te{&uNXxL?H;^-U4E)x;K`3en%97n z*DK@CbHfv1T2Uh}fkSMC%BRAcwP1Z@q)@i?EsB$NjMurg&!%{7nV!Eec3u<8caG!4 z3K63!Ih3kvCi*M#LlnYA*ZjeyJJGFc*xd(OgJ& zsTpUS3q+V$+;PuZf?D zxxD+?5{Qb42tt4X;rsuehrvh-*{v@?BDUwR%wbQ?PdA%8c#h zdvR~nFdZ&$NDF*YZLpnf`D;#iDUA&R$&$a#=#lxFF`FBqFvk2Xjm}=o&ufy&On=U> zLy%s>xP#uRZ)$7)ngI{XNAz^rmU6stS8NCuqlWJIGk+iWwmr4r8%^oYsD-bY;OEJ) zz|T9Tw)^DR85;eDTrNZ9-B?6}?(wrTYGpCbs!WWy0afVJrrd{N9(^+A#H2ru-jCa) zNtz>1S5S^4VY@C$^>T&3g}%?Mi#PboJ|+!={19zuJi|=vj4q@cc}}0FA)3)+;6=45 zn9&eE1oEwPmV3vlb4eEC6y~d_Yf5U>H{%p-Nt1jI#+@@WW~nH=q)AY3xFp^H`1_%6 zJG9AKr6K-Vv9i)uBYxy<%jxH7kt7Cu^}>6XPC^UVu12{yQC^oOoVp0lz`hmjZSY2W zEiZkMv-}XDz7=xEr(?~i6ZGfsGM=6ez+!S%Q?!@a7ddYkDmy?Q^C%wCJcnXf8eY;5 zWs>c}I+yJy{sz!B$A0A>%>EAF@3gDpRC!0Pio5~icK?-))}djCwRw{@gzYHLdza<} zj(5zzK|IWj2rW8>=Y8PAuGA`%Vk`LFYWT$N*$Z|CC?fwUKfslIpd3$!ya>Mre;4pp zotr2Z=Cz={HQLSqe{yQ{oBV%Ck=Furdn3Nr>CJ%8O3(NyiS@#387>KLYFi+FWPJ>y z0`py5EiKZT-VQiBl$d+{=l&s-r`)M2`y;jGJb4kYA;NqVQ$SIJ?*fiO-#DKcCVxte zdP%s#wue?>yRY;7ByrA1v?#ubR<+6{VRrlt#$WLxX&O0?@=bDS;th?zNuLfUu3Ne0 zgRaA3o@GbVOkiz`??Ptuad#W-?Ku%Qmf>l`|6K?A#jP?W-3mV6DyO9Pbd+A6wM#oz z^X%jM^T*Ia`a~8QrERHMc57qUWA*aatWz(|7AUxzPC4G2^i*Lz$kUsP;$VJON3}i9(~|RbHNMSP^`O?mYvA0^90pn@8|eamQ_wkI zdllzCGJb=6=9t5JZ^`SeR7RVl-Bv04Q!e+gCX&x};oOYnIkr@#h5BXd@!}Lpbt0X+ zrB=az8_XZnk>jsU3-l&k2OC9B)(G{gRuAg{dJD!bw$$CHsECu__ zS+XqBZ%8lR(;>GYHcTp{kYj~hD~l4_RpGdOQdQ1LmAXgk!WXk{{eD&#DBrPJu@^TV zD@)#&G)g`yXK97T1ilIP5y;PZgZQ9nyj1EzE6LnA&&%zFw#b-RvUj{XU9XGMTBX+? zdYk2TBff)Hc0(h|a;y;M-&f2X>%z=1&qIK%^$Hm))HkKPY;J^pYOR68R-@FS>H&Sj zYN3$JVERW1Z(87OU)O=|>R18$pgO}BLLVrXoDcDkbjWRKwDlXKPRg8y%uoXT4%E{Q zus2hVv;%daKTywaPUUmfXAAX&T0%QKH=!RH%U4IXm-&0EW6|HKf3-R$hpKR_UKDQt zKY4zgd;j%vQM}wRcd(n|@8m_yH?F}bOm8#jxBaQYW|0pz#tS^TeN)hx_v>|Otn!5P z`C8D6IRWIgz>0I;LZrhy7_K@XCe_gm$Zw$RUKG9;azwqo8^I&6q zH0pnKBoE5vdD@xwu%L(9T$jdKKjbqvF19|avnr|8a})baahvH(w73Vq7dw_^dr1BN za_S4*f#(^ci_#K#H1^w=*nxHSfLw}mL;J!xai-tmk9qmrP*Y^S?VVYRd>)z3p2zQ( zd8@VMegN19{dl?_78LeVt5ThumkPOXZG`a%{4dL;MygVc9s(6NhQ;tZmSa1>IVXpz zV>dWTJ6|j33HYT|rp|F^fz4LpDfEP&T$9nx4CWj8%2A{SIyZ2h{S)aLZ;4Ydj(1>& zll;|urh^-uQ-SY9Ia2bu9wIXnJj1>;_2CmSYCb*{eCFJl{9L1TVQj{y(yP>Ox5zHLkGM*Fuo*6J|sk3~C(iTXJUE#92U(HEqr&|B)&x;RG0hB_Og1Mpd> zc{AERF6UiSs#V@>-<9srO6AOnASmx)p#nDTppkLLv6ee?8E<5mZc)| z2V-~ecVG|f_i-4HmW94BE}j#{WuHX-{MJE8dEPO(7vowjAmd^GnPq@{DC`UO>Z(J# zJ()W6k@PouU9P#DF(D4cIYZdhXF{00{) z##P&&&UVf>W~Cl{7U$i@_{X#AxX0m956jYOd^_&}p;4w_KE5lq*_5~w-pEF82Ib98 zK6BKs3%92m!DpNh1>Y;=JQTLmwb7`?%g17t4l-{1CCuJ^?w<+OouLVNL)&_?_qP zPF$yuJH;HEpnrkg7y|yHB^alTUK5Xmk$y*FyunRgC+>HAM7Y-BICF~c z1wR^naW)mJovk+7;qUf)GZC&{8e#Jo5Ab9>(@Oa3KIp~%)FRCoGp9kSTf&*4RvWN0 zH$-;hd%WSRLpuF&{gCl~^?QZ+1Dm6PXX~|BXDdph)Cw(^U##5E-C`fLDuYKaNw(kX zwJ~%X_F?S@{^6u**e%n-Z}p|;A$FCKJAuzP_q|!Kb5v? zd45ih0W;ZfZT2a6CyIFj@$Unjy}-|t#@l=Vz6TuaRm>^7GYRt}?WG&=YAs5;XtyPZKq;n4>H&fR~jPmfRZ&&ms)xc4~Jo8Py*WuOj zKS9@3bN&eK`ml9rH!$!H0O}xXAw4(fy0{y^m*Jd8?X@;vjsKpV@#cyF{_K;coIlmz z&yG0WDy%})=SR+gn4<|dc419LT^}Z-^KjM{HYbig6LhB*F^i0U;H?`x7yOQ#lgQ`GE`YVw0;esK+on99{ zka(SKyW`v5nC|eAVJh(4A8!YqBYGI{ zTf8GZ>X!yV`M!v~%WMzIW7pGfO0|9j@Y`b}$~OUzxCG?%^<7qH^od~BN zV5F!oivw_K%m<~g+GTAa6~L1k1Rh)X2Y--B+%FH|^+?+559P1D&baaX9s$JNd`EZd z{n`ED0sX7quW|zZl9jv-^sC2gpk72wr$$|+?YdNl#0vR)Yf{|BAjm!iA8!$LJ#i48 zbLHo$xRLm!tWpN>6cJql?2PFeDW|3(I$zI7XX)=0HaB&ESLc#%pz~@k`Jn6ucXz?QNP{7pPV>^0qt--?XEz4-l2?bYEK{j|j`3%eZm z4B&fj*ycFg2JlzNt-jLQ!PNx%IgaGHALMnc3K(_sdJKa7i12n?NIRl9wDe8pa`ZP*=)k z)UeSv1eAxpW}GDXzIB6e6zt}7n;H) z8SHB6&~DJv4=Vcu?nMJ-hqKQ~MS4%y>Q8is{&QFlJbwCx zpp|_+mY``Xbyupe@tDn&|1(-Tq(hh3gMNnm4g5yDWo@*MN+ToVEN_jE2z)bXKi=8O zk!hq)#p||oKU(^Kr9CJ+TF*$Ml{1TVagVJ5_JRAeI9^u)eo$7+e}^NpnloRn+NW%X zaVHQnugE#sy0{k)XII;SO@-sWdPRCH>`y(RHhm6#rR13Z`#97(KCRcIX+1tCU{1jm z0%Pk54;UMIjQ6AM!rZ%<|5Gj%u!j|pO(`yO>I>t<2FH00k$(Wk3V5Zy5E%uT63{uAx$DY95j_XB!L8ZFxm^FQ4o#Y!LYkqZ4- z%1azCH8TEDJ`-QpbMfClVEr;T{mQP4+#}*mO6@u^X*SKV!=9x86(**V zy_g!XX8oCSmuFUd#+oDdm*37d!1DE_U0&l$)APO*^)3yTVP24MZXm)sIPZF3ztGI| zL^ykODKuuwPk@ii=O_<`BiYas;No?Bg}ST(`U~t%?20ZSW@Vc0}_^ zhkaKoY%Ti4TH6*QQ~{2{n$hn#i=q?0O8ya4;N;(rF^-hs#L(@X&bdngpPt%fVb148v0WHp|AWNx(^Ho&)Goa=EXX>Q zudNxq%O&SLsC+YZaUN}`bj!5VsmOJRn&+c#P=tDidbf4J7fK3|rz)ae#KHa`rxPa# z$qXK*tqqMeNAi0y{2SM6yLr4i@~uyFzd6Cz1SN3ybys ze7)4B`ZW31WAwM_?aDlds6Dh5at9uIBo;X1r5Et`aB230=5q9Qfkf;w&G`@hA)g@d zU#?v?AG{kZ-(p_3A-tg*LLcliqmkF^4H@u&`;-@@c1!5YI`P|99daBqwPhJNj)>>< z1081FsI|iv7$fD$|I4*q$p3jxedt#BCA?@?yZuOqX}2LJIzgIvElPavu&qWsfJbT< z@s#C0nErOT*$e!SLtcx39rcFxi1*kYz(xNd#?v0-9I}|%VV)Bn%h)dBDfoY7pk7Un z?Lz)gF74VGx{ZDk(#&!6aWCla)SF{Yt>^ThUljbAp2+#>VPWhFmxfONiIcy`i3qIM zqy;uT7V+R)BjMx@Gj}cooTnkW&@Z6Rel`9x_`Soopxzx>ulDL+@^{WT*LV-S0z=T= zPMs>GhrP8Otts@JGo`n2Y!6oNS0JG}xIF_(ZuB&~8x2zClaWVeS5-jFJ3< z>m{}Dhh>$RKQ!8H-WGmnqUF_w#e97c*2#9^Tz!TwjW%uq?>1qL(P!(zt>_n6KiKBPRmmFt ziy?1cTob|uo-F`P&8!w&mtS799F z=*XGx5rgFdw9^@1@j=BnC7j7tS|*QqkN+7|zGru#JZ@`DwJ0xAjLYO`l{@dR3p{#uyxuc@vHW6>oRz5 ztTS7W^}vC+0_)7*Yp-p{dgJeGRbagz%jZ0p@nGCRma1d^jVv1#-?LG6BwH@G##1pT z;C$dzo1kTQ58xHnj<$|;+~0iyd?lb=cDr}kH*^HrJ3?-Y#V1Dzj&v#Uw|qs7|6XZr z#s{a8Z6$mQr|MB~bbQ*FZ3q~xpwSyM-j><#^zkm%NrJIR`2GWH6yDOoNG|AL!YIO5 z_P7v!KrAB5Zo~>9;Zcsi1su1&+RfGx*^6>}8;_Mo4L7Gw$C#67_ntgfo>4c8U`ZeY zXAM8j;RgjiUZHiH%KzZ?ldPbJzTX9gvpO~%(CPMr$bG#UN4`qI*@ggbqF$~Y@NZK; znb(oMYICYkoEFPkHF{` zR|5N_beD2Jx0_jYLJSA_e0HS%OyEqvwp@t^w=;iQMXeY0c#QaWu4R;nsy zh}Ju1NkmGRWnrD0u;vNna~wSxzsqstPW&JHgOPbw*|Gx8c5(eRK5nr!M$5xh6z#@x zE4Qmx*TFx*-J=3tBiw&vX1PAyl)*`uu6YAIrF=yfWw8?beiTM{kDb7M$M_L1`{WMnBYrA7y=k zdcqyR%X0jTb*7aD0THA&!>|?NO)A<*sBE+SO%uNACZAA_d=Q-^YK( zf*Y4YL+?rZQ-f^Oj`$P5G(H{%_(T1yGV%cWVBB}TI=0!@BV*$D@civ<@j~b6Hts9Q z|Ibf{tyJ0*dcKQuTh}D!upylD=jrh>TZDedo;c5je(lR%9AAqB`>-5kWrUzuY$_C(5oTr<4iWVmpQW*|!duo!a zV)6M^G2w0Q@bSvIa)ShX7B3U-<8YVk0-GCq1iL%R_#DD_!zN;9Bq3f-uz%@{12I>B z$ItXqy1;Mp9xvrD?rBxP^ZemhfpKqcLV1DSB-H}`v6REnlVDMdI@REa{*ezu?>-S3 zM^|MfN34l9f`a|&Z}9z3#5u4M@Iv8tp6RKSchi|#YZaKmY}9hxlx5Y@9qxe(*-y2$=eAr->B6WhZ%p)q_p{5s>f!7-&pms^AH zLWz2rg|lvin{fS8kMEIhyltBCX|QUE9J&)FlAM#6jr=7imMQ6Co22yA50??beH(hX zF}mpe0eM?wxSSsO&Y0%`xYz+ZEsaE9tTdjh=YOV#`@)I-AAAFN0QbU=TIg<}!$tW5 zQh0sZ%#Pz38LQ=5*_^k%8m%bfq1T-r*}_vhK+ka4rVbryCu4NIKO2CT`wQFW`Z1}{ z=MuA_)TTzcA2X(z77Q^F$Ll=^o7Ha**n4)rKWr~x{#Ve?^QrK9qTb7Vu484MihF9_ z@AK0rWn={U1s;)3>i{1{$$N=DiBWdgD{O|A`E#|k+4gjeU7!6Tb{g}f6nt3j*Q9dJ zrq1wB*~qNGkNI%C)DHTk+0C)i81FMoN&hf-B8EA*2RlIj;LSjpXEK~8Jzk!kmsi4-utE>$Cj|Q%&c4~`3lP`NdFF!95=H{+{zyHo zm-+H);#fK#&k&Z6@GYXBElMwij?ksIYKIPsWw{ie1O9^{!u?wGOW=PcaW1n6?>u=* zc!f0CLY%9a9#MnN*Qp8klUk)=o|AqVk*&iPSc^&I{t;}BG^gWqg682a@U<%FG~oTE zO?9knrAv4(He+N;c5x(r*nZ$?%ovBi8>Oow+x1GqN>wm#N}|K8i03!_{jzaYIUh8? zpL|FqP}+nw+^-YoTnn{L&y4I>N7HB@qyLGz2HHDJ7%N%_{@fg20`_UC8}CEGImE^~ z&wkC5SJ>K|pV&{y%KTrH%KX1HI~jDo;|ffq=Ou8V!{?!G%n!-^a@beW>0NTEEYMCp zDGhbRI)%zGB`xvaL-&|7yfJ}4dQ@pYR)wRXSPSk{+*q5H+gmU5{MCfHn=HU{N+g}M zP_4SqekEKx({nLgd7k1NsSNdcOZp|?Tp=T4Og4C5V}J`FPk8QN66W@A<@M5|v0icR zz$y2VUK|!8TW;=q(&=efj-Tf>>QUeS$+(K+e0CT{$-hRl%Xyo_{}Zl`9e#7@$aqg{ z5$A9xJ~=b$)i-qw&Z*&?ivhn+hCYy=g-3vK`_NnAc(M%i55f;V7yMk7eg)0xiVHEL zABFP7Qz5MP*LFo{ms_meKPbQhXmez*;Mt`vgFb`GQ!qMmylRf!@=Cf~JHi5;t`bRS zBWk@5D^AX6NM~<`eLCn2qGh7VqWCge+G&gM`{{}JdHw>oc%eYy_@#)PuHi}e*yKRqt64u?LYUD%t5 zjAWsnfIq0~^u%>{qg|XKO_(9-tbU(2sY%QfZyRqWg;m+X?814%P^xFc6-S6+py^!N; z;0d*Zo~3OL?~-p1>obl}%kj{zvc=_ROk85CVuw~>{uc(pS?`1LkdeaTHhTOXAF`aD zSnT@WPulX|F%Qh^f~PTVaO|z&!JV(+yBYiYL-rj9Hh(zn(T8(7zY99|0Q)0pw>}IU z2ju}o5$wi$LH}ymVVsMVua9r$H)?6qAH-kZ2xaKkI8T`i2QIGTDwn@w~^CzttL`299!^t`PG4L!QX zUh_>^c^`bc(R)VOt?}))UU?q>h;{jvtUMwYpXGa#w+X#Z3FYbC{az~XkG~$df+U_G z#8bYXm)31vWO?#-gBJd!^~&;PKN!FDLEC0M{%`3m<+}3iumO1ww}nTKl|RuR1^jj_ zw^Lk&xkyKLG|sSgYl+;SIF$2wy&nL#`8wb${3PcrqtS|oeO$pIt~z#XBQ=mdIUrxa#70BSiPY8u0|;JSYZZ0UKZ|8l@94csxN_FSp8_ zaw}%f6?#x{3Ir>_3NidF!M^GetHi4xPmP^x710DaSD<2xotnn8xHW#RS2*#^2cG?r zzp)nHV}*5(HiRYNE0;xowO`e0{5%;eEpk1^oZ8j-YFQ#zG{1+?G3)i>!r94tEl(xw8t7CsR20Jn-)9TC1b2=P`k?Ib3Oo1gLmQN zRg1D+-5>yp~Tbecllmx#di@4YEu!r zNZukQG~ERbUxcqsO=?Kbv$O zgKv{Yo8qtG??#)OOzVX!m*x77K!c%I7fFZC(E7ykccSy{G|t}NRb;obIo2Kr(J#54 zc$Z$UEuew?0iD7)1boX|WsY}dI5TVA(9doDc~G%G)`PBVh4jqO`)sK1LQT!_&oVt4 z`R|aIE(&*Ij6LATjo!5gdBl6GqbW>UXPP)dfaaGP|vi+Xd(0au>N?% zF9H2KW1HU++OtY6$}=xz6TZtiJnw;P(FVCLenW=$9j3!apqddH?uGKavz3vwZ_T5-5b3t-XPNx^y!N7}LGSlF?_aQ63df1x#+FSG+}7b2l^ zdZ2GU!&im(#ckf;7e}07_J%;dHOefE+oNPxr1x-}fqOPXE|CVg2ztK43p;~eaNIsq z5AT#c)~L;C5AeY50nem3(;Rr-O7&S&wlj1D-qY6rnhU+n`*osKZ1)*9SsT$?m#6<5 za~taI9z2a{PUsM7`*JH*g$uEXPCLMd{c+`M;7sbLZHOGC*ap8-UQ8Zf=VLu~#<^lZOY1jGW zY)ZVr?u*00VXnSe%Z;H$N21i1(<(bH{>46TlkBb7W|Qp(BmZf)?*?ZWr$l|54v9CS z-821rX_#-r8m>{;yUX`H&P{juFnbd<*5|E5Y`jgiWA)lD(i4+k1OM7gulHuiZBhIx zFc*4z5ynBvcX0U@%-Ao9#XXN@d;3;s&FP;Mihc@xh8-9kb|^B1#%;ngWZi-G3iAzF z4$BEX%Rqmjby*ad$Y(!fxD`UK8B=m>ty5XT|t}{0-Sk{Xj-aXeS%BxYyFMxxPwIwq1ZuN!x&@&GP#$ zL8l9|MliGPHt5M@za?vw!cLx^c37+C{mvS5J!$mo(?9A5Y`ZrD@|Sd}H5ujJ;E->C zeme9a>_TgrY=%#^DQUK@RIFCe|Jw8|Jd@HKotEft?)JMeBCrP*QbzfV(kS$n?d=bg z=4@@v8hlo|*H1~PH#Iu!fHkDT4tz0wOG*EfXu2yRqiZV0(=VkJu>XI_m@Q;LE-ebX zB&VnC#yQn4aJMbY3C!<6JAVo^q)FT24sVN%;Re4*$gRcUZUN^}?_MW;GabB2GyJ|Z zBJ9H7%`u@AGiOZFR&bD*UPr5nc1@4h;=j#tCZtQR1^X|`H*NPUK39G_!Qp!UgS;U8zH-!0t^64LUa%+6RvuT3pso zlXmcdHk{IZU)mWuZBiJJJK?LG_IU~@f}IREW>aMZFmZgpFJYz%imB&?KA1Jzd|Pdd z#)Sva7>m$uU$c7Qc)|UuaiQ=y)8~6%!uV{9Qjhb5-(D}_oj&)w)0w{AOQ96twe|(h z9jYQ9#VC1ADq=O}nN`9Q_K#{+#_SP<(@%R)s^fgQ5#E+srN4fZy@pSm^^!4uos)tB zen#A8TwxuG3OqMykJ8In($T)naFUq#b+*ofm!VdPd(kBw_(L!oDZD`st))(tn<(HpQlRg z({A06X6PAdyNroEr`&BDz@cf8{@Yt}JUnCHAI^c@nw!@6_%znWsbs$NEz?} zX`CYa?3)-<_u04fk@zq;^{|~1hx;Cfm&BPd5%K@lr(0zM;!%mG1M{5jzzF(=(Cwom z;!)x4L+%*i>b~rap?#vBGnV9C!%jiuuESKlGE7wm{?jqqoTS6y)51wzpP0BKAXz;) zGQ%cW8_xU1G?f^`HKvBG65fx z=IMq2X6En-HU{hZwphf+UK9-Ukj^D`kBxv$q8I25;2Eyx#`pW~^ngAP9?Op1wE=d|qPTw9$41d}f^Rq_7zHaRwuf1wFVu zDZXzIJ#JTH{CyDZdN4laze%_QGTnuCA>TXXf)o5XpU0sO{14Qtknfk$X?kinsSVL;4Xi_QB^JJM1Ks2R*0r5^D(}WV zn`TSE2g*^=t{>}jz+aP&hMKfA)WxG-myYO7ps6;e2QopueQ4v6RMMI0Bl@Q}+?FN_ zovAY{jj+J!3u-9e6%ikozNAltQQ&8n^rF4jr{Ov;jx_2U@f?YWdI$ZtgU&4x*)YJj zUx9D!;9EP|TTj`?3Ogu>ruDusGaF3*?cl>lz=w|T1MsIWJ*!Wl{8O>sut#7o`6FqI zez^lB*|=q+zw2$G571vfR` zO&k`Z44;@Pu;yAV6;dyE4}!z~>I_|@m6&PWbsRo7(jPht_PJy&_JEi1T#N75V#Mgx zT4h`ov8x~gRp_lGyiPmNe+xKHC>!sdxn9=dTdjJ3D&XsFS>l}-bK`ovPl+q6jDK0e ziFKQ8y?Af2JCEVn9B)9m@pxa4cZ2OM%J*Q^$z9i*BO^gbKk?Vd<~R@EuLYjXRujwj ztxrsAz=82OAJ#?kfu1GYf&;G1#e2!-IwDi7Xcr;{r(qo~ZpLgou z3~{(A_TaM-)_th()Z?oWt8UoOS5t#FW#xO)O@5aDH~+tMS!Z|@c$TF`?7%i+ZquPJ z;(J)HfX@Z~&2ff|2j*pv==jJCrA2$!z_(N9pRyVHGE``6?c{xn0Xv@U+pdt+tb4N(O>&-fQWQKSE#{QV1QxtGh& z)^VX0Gd+&KyqPVB+d3ydt89)wol1U@d^Zvg+uH^!bVYm#+-QT_Xfn1koJ@P#l(S7aCgb3V6uvv95Xl1=e4A4;+z zE;gKOf<1rC$0f$a<#-J85N45k6*xJ6BmK)#hrQs-67L>)hP46Xk8`-mf5jqK-G9a6 z?vMv_JO=r;S+g(6UPbFbDOz37`D$#ntE|=j-`I9sz7xR_>dE+6==ntO^jkUoEx_Mp zS7)7aN5uUt*6ACwGCf^r&*Jo=^Gsrkuk;+hzZwy>0(y&jc_V09E;F1bx#m(&Qj^`I z1)ic@qrWKB$2R}RW92ttw#?nzIpLVR67kds;TPDrz)T^S;T*$L4?3rVx+}9^$4U!_kR(VH(7!hjp^X!9qA=Q zoV+349`F`l8lQ(fJ|1nr|f>|3{ASd~S_Ph=e?y)?eH9j0C+|{N!&t-o^(lNL? z_InJoK-4CRS1ihxoclhUxp9|fn4W~ch-XYhbhsc#dlWw%`z$Z!@DR*K!LGG}t_p3# zu0auR^MIw}oGb2CyLc5)V zv(<>nG(>sZ?KU}w_XM6cKAN~oWT2D}%l8CELGs(&?PB!w{2U%ai|zNd_JnP;wfcnj z+Go)6ay(&;%#-!_t9Tjg*$=3;zhz!Q0@ zvWOde9G`quN6KZ7kH&Y;(+qLAYWX?^SSm0-A7#j+YID=$z+T4RsymDk9M{TEg)7kV zi&@DS?^mOk!zRT~HQo#SXM(a%MdB~nvA9HG{)fMD=5M_z8-O>X1oPlCPI6X!LK&~f z_0j$4#eYl{a)sZRp7R@g612Y4uS@0fjO)8r9+&D^ArmX^XH8SSOlZG370?DyaUSLlWP7W5cApx7;a{M=gO0v?b(;lObp`?uTLQYA1yA(NF zWY#~-_ppMf3roU=fZTjp;WMbRh4?lj&u&$~LrqqcADfFD`l40(kBud{Pwo;}LOr`sT#eth048`3%Y3E0GCSVtd? zrz&rJD6AzpCBVWc#d*h`%OH=DeuguiVS3~_L7o?5_HKC|oN)^sVOrv;v3UY`*b_!sehw%N+~aUG zo$s~jsEac{2lw=g$Z={AsUHS?yE$>En=;}qcxAv}R;j}QH?No5Qioy&ix*-gjrSs* zk;D(mNsw#-zYOrZbR^)1(ULRL5*-R@p>O%E)`s%97syx2DbNafCUAPk4?+(o0eY=W zN)vQ+_z+GNb%e|OVLLy^kBC`mM)}cUEN0Lnz1E%u{&DD2t8@G#!f4b`;K$0@-u8U` z7>)!B7!PfjeI$%b588vyH8!$8;Xw?E_1V|LVbqBe!f4keXzvJ6v>x>LX=6gp72r7n zZ9-|3|Bc;+@>sdqr@awt)V_cuv#!HQH{_Lk?(qUPTIWe;7daV@rD+E1W5Gx~mF@I#Od`6zn%X7_7=u!NIdi@z2 zt{gu}&xX(!%k=y_49#daU?Iq1ybfhJy`iWfqn=O$38fwayW^IWOk*|bIv6*z)>O?} z^?8-N-bz1g>y??Pkmb`R*b9(6qDAoPht+w^4>+ha=A#y6jBte=us-X>yJq9!r|mft zQymjD90;IO5nTc4e;R9sla#ZqV)i1C(E#7*6Rl2pjFQo_!+L)nhZ@^O3&{wmL#b%h z&(lz4yO@`FLj)gUWgHhLpxz-dZ?7Qci1JE|KA8~yT}NbPJmdpop7@{7rWcg(f^P*B z*%%=Ap&7MdOnML8>5aKm5~LzSL^J4vP)|_a%KSMcQNECiZB)=18Qn6$pBM3h{|Aje zMMS;$xb$hPx=u+PQ%im@;WTJC97>>OBKSWvTLkD>ztE{;gZWd?dBFQZZ)CJ&jemx6 zQBWDjN`FA4R$4Dd6E*a6;khj5k0bU=5u@Y-^&$@(zI(topyqzm3jSaoG}5V6$WRr? zpQ9;qE0#XdY>KEGJl{y zfMdjyUhC8Mtio#1`}6x#w88*)#t{zC3BEb_sg!%4A4(;!@rj^QoU0eEyxRS;40*z1 zdELiZDNmx5FsD0_ZjU{u{qK#`L-o2iA^ai?apn!K(8B>yjEVhvd@kQ1juF^-5^+Of|IMY6%aq)KJ_E~U zaA{1ev(LsCY-lX&KlItC|G*=ZZ%M0Sl^m6|X`}78D!eYVXVD)uu&#G}latPKqQ>*X ze`Z5bFatA_%8G_-revoVQ1hV5OC_Ev^*X+kLUxf-+`wqB*4 z@J!`r-zIe#S!tT*d4n?gc$vyXxa;%VX@gMAYe_sacpH=D6Y@;F< z2JqDBXE1UQ&h^lt5M+}=j-f96LwEu9s^pcf>8SKbPuj1Ld%`-`J`_2R7?Tc0Wd8A- z9-9FCLyh`|Onc6V%fsL-^hfjli_+{zMWpB0yj?GZq1j-+?uq>coPd57{KQ#H|7`kc z92y4ab^L}7*zJ<>{L?$axZA>R{C)Nu_(^MCX$R5T!VaK+fj=BaC>PKJPO~=>Kka}D z^ufz;+NcTf7h#mMwK@IA%TLh%gq^1xEB&DIlq2V>wF-Gbe+aJ?&~MB+GA>eHypMo* zpbt)cpuNI)muPRx?W*%$yJS$i%5>5$^#@puP|!&(^S(dU%Phyt_QU&e2&MhR?h$Hd zYd#~q&!vzT?MAO1w2BD39iQ`)675E1IN;zdJ^=p)=n2Ma*jw-? zGDFH#_#*bCQ>EnmKW5o@igtk>E%USJkAZT3`Pp99PSD zDs)VMT%7w8{c()ffS=FD_kkYvm;G1+t;0MYt(5cZ*>GAY=*Rp47!FIppBKVO;73t@ zwQNpB9@&CF=r0NOlkG*VddC_Kel4xkpQbW=NJOSdyqE>1#a3tmKhsWe%(Ox4`wem3aTstF^n-f|esCQH zEWgn6Vi^zDc^Em2xy!c2p#$||oTtb2ST4BZ^$zxdaZO*Yw}d(=8?L{|k1~G9B((@5 zu})9JWw0HQZv#j zJVH0r)F#Gqd6oAPGrCtPB4pFIwG3~N@v*pjvDP#AIm>VrGssox-J^eR0KPxchqc{G z#vS^i-UeIZ7s(ZRZ7R#YfR}O|C5+On&{)PFcR>=Z@lC0P_91iBG5DEQoQxk>cNg_e zw0e0u4g*EQK+7=uTPfp576nMKLN%PH&+35wkQ4B&csZ9{QJ#8Pj1}w?ACcF~^q?*D zsUTCDl$7^Zvfc-+I5kxEae@)CfMb-DY3XI-`MY*$@X1+$pLOy%nz-^-uW(A2kYXK9 zs*1dVWq#6|O%FUyVL^BK7r#;Dj^qw=f($7~!h4_t zKbG+ymzD6u)p9G~dCp6@%IfV4-WjgS?$Uxkq=Z-p_`~v#dD*{Q$c-fm{#S#y*Q7@I zkH~!cXmK$KaI1 zHCWwWgLU+Dv|xS4@{|j+7cSLKzuiBB_CBa(JoLnzj1@wo&G2^p+A%yW+4uAT<@0Jb zLPqOr$KcEwwk)>dJMD^Fko3DbyvIlCujAwB!4KffD$gtrHS&!bRy>t<9(1S8%5oWK z7w2u{UO^9SG;Mq8M_W9LCeiDFLyey3=58y?E6Z0YNT z{fGPFMV^E!V+fzkTRFHqbU(TB%q`+rP=26)7Fxvo?J5fOQ z=lRijHr@6?pWt1DH)^Uq9)UlRYT(g+1%ACkm=A4my@yaoLH~EOQkKZ1^d;ht2Qfa* zPWVl}EhAwKmcS=I7nGvCi2Pzcjc=*?lF%9p{J^7ViMD~B>V$Kv31@+`{oa`t;i3Nj zIIE8Ivdsn7Npe6KZO4{>FO{%+!~AaGkMRsBPqH%qQl&4#{9zetJ&I>pB9wX7D}?!) zxc9a{@@#0k&|md*sx*|x)2Z*q4qa#+-W5B-6Fy8hQaqC}BQ5(b{<4=bYe8(4w1XCo zk0<*8ygdFj>9^4v2H?X`rsN;So)!H+1MtClEC<6+%uAX72Yv6i*@|qs5A(fVLiFaUraAT-`MH(!u<31fg7iQXVtM=#-x3U znWQ!ckE?~ZdNS5^8_G3?9T+oOVQ1KL%45zbI|}|i6;93IUv>5M-W`fFPuL3muoT7~0ex>Q2z zW~GnIzBtyoLsi26$0}wo$cA*iRocFU{Sjo?sZM$1BOpIOuPE68uS5LCR^$8|cO|6? zeIi~j;}Ul@iXAG9w6Qu?+T$o+8TNXuUki;L1N^mGiBhOH77>xN;^V-NyHK)^$0~aw z-sI!JpK}6tv`PUteQ0@}W%yYZ5npZ%-tJkpKjN&gJc3sBgx^Bj3yTl?9EV$*)#52z zPtKItGzhUc9*rPxe;dlf(Iwx!jb=DUCN!j0T4qWXX zlxgu&`vdBp7Ppwl{x}3}LQEyzhv0p+6n7BvZdSs-2P-rTdn>Eud}lV1BdNxYSRY=` zV#nl2@x&A0={OuKlOtARSjXB1do~`2NAUv=o0ND%`0vB2gq0=6v6ZPPe+1=$ACZnn z0v>!a%Pb=J9RBn4tl#B;0dkiEZrJfs?2q`f;jRc6zmth`7vfN4R(OA06%L1$F4-a1&~Lr69{5*Szpbp1;Gr9V}pL|@t*{wsVvy%+8y{*0?w&d)Za z-^zXIfUnAV@%3~{IuPI|^o?mfG9a%)U8_*{swhtH>7leK|HeJ3XxDw9pWYGrDR`GN z;C@efPgkZ>viHImJlse4efYW|Te%*vdwhr;%D}hOYp5AznZ=y@fIJUACLIB^kNiZ5 z6_WGKb3TI_^7GzsKv*|UensvQ?^E0hudk%9%3s6E_}6f!4|RI=3ct!Ph4K4$$2|@@ zGw>6*%5<{c0|L1S36ajQu{-?*ZEhmkH%fJ z!cq>CYA?yFnDONMAmO>}MEGDoKUXib-Yn0R4(9UK5;kU6=m7j-xjY@gKK;KUd&pgb z;6w9y+GJgfK8)Kmbt+z$X^QNp*x|H2UYX8E6y{pn>hw=i4|BLxr}GU_*0$BKA7@3M zegxd(NQpdozQ(uOb4vJw{*WC|?lf$*p4cN>^?xPep$*t0W6~$J4>fE7bf^xsJ@$}2 zoDLgqy|b;bG(D^#rw6wjU{*RF9$;qwd&2(RhDV9K$Khd&RlJ1-aQ%t?RCv!U;}#y$ zcfj#V+v1N3YxpT-@`kKW{}y(_@=XZrO-~i~1$$mT>~&_wB7U}abV0u`e+A-iBIw8K z$@om(-bW&B7~)Z+$W!>ZyqFjt`!Dif*sWvJxsdQ0-{ScmmhTOS%J+R?Y*xYYX*J&I ziQEV3nYn^|+u}LjAnoC{&+o_U-E_8>V27DUVypZ-743S^c6+6jl=%YJ*cM2D`3D|J z_X}en>H_hsmMyTKIXv<#0R1LU=vwRXAK5dyKO)lyp;FQxVph1?wkrIV4tb>qfT_5B znRyU5C(_B&0gpsRI8+FskNOkFcr)-bZ3J7%o#Dy~h4%hG>Orveiw0-qU6ajvY3l=^?fVKzecru)OcguSs8kKvCm_(;dx zHhnjM&QJ>uJ(+q?*H#CApdsH&&=a)mQ=oHm`l09d)ykWSy^EB<fkl%@lD~0@J#qX#*<2$Qx9r6Unhdf&0&ka7$owf*c#uEUQ_NMYzoY8^Yb)7k*k=zyzWcILsLGHlo%LqVh7qkGp=*&MeT{nd`?K7jeg`$Xj;e79XI_2pOtD_o~9=xLx? zr8xy}m+JJgUVstc0)1IOjI(8x-hft4PiOnfeqsDgxB#DL`b@9%DQMU9SVGL{1$fSb z4Ib?`WsETSKIWoh!z<}rc{zMCqI~#brZ&M^(esuXG9G2q07UH zckdwP7k&1(io9LvAsG`7IQJj1#}In859b$5Z;lTJuCn@y$NS=A;Uj4v|JBE&QkJ0~ zO$2T9AI|^(y1KsDIEy2`Ifnv4f`+yd>PyEL8ywOW0-+>E$YaM;j-xhlav^^}@Ccp~sKwS9KViy4g3Oq7$V@gDe|_UkDx zBAEr85z~9@ZbhD&)SPxJ=bhHvv((Rj95o<3w~xVfS&H=_&j7K8Da| zxi2vErJ&2KfWI4;hcVLj!LTKjYoMQ$h0>BGGFg^B()mJHvb7 zEqP07kO^bG{|v{aCbzkSKPHa(+yz5x?Ng;4bytpm&d*CDmY@;S@zV@;qufq>&*?}h zn+dR`WL$9aF!cF-I}07Cr#qkxRh-d=I7_@UTZQr9te#7CErB}V5jK;qkX7lu@HR@W z>#fe*9hTcjD|D5=FK6+u;em75SGvQi~t-dmFKNtN;ZTJ>&{U*G| zJyy|iNP?cGZvj_Q>;73}`Dz>9I^XFJ+0ArX@m#TEu!7t8)cF^omEHP8wiMp>FI`N% zSdafZFPGZM(~QXj`!l0^yz{r=1CZNfK!yuiy?B<#b+B6oIF30pgQmTXk*Y4sF^*nK zkf%%pMC`*9>}-x%C0!RUi(-5`iM9qTF)BT0!PZ+cj!P#^@Hev-NT(!^`K$mA{CvCu zjAfKUZ@3yX9Uwk%FBr$LdMxOmT%A;|0IJaAYNB5E>TKQyC#4Ubiv^4?g*I{=V!0Ec zET9vXmb*AU2aca}0l6$`S>U>r_^-L3Oz<9Zep-A2UaV|Lr{N{(mDx>tz8MI$4($H-_}sUOkK0ZQf%H{Db~U zVRVXlI2h}7nXcEA3OVPIWG}|^l5GgH1%6EcrrFOjv`E(IKKz5Kr$*6A{e(7gm%VUKa!GE0d752DY zgZ@Ac#(9%6Kuldb65G8$97q#^nOPU5ma5=0*arPjG`tYbctMA>8hWQb6t4*N=Tydd zc{=0V48M{hV?{TnQ9YHoX1)-pyA3NrZdbCUa7Odd)8$dWO8WkWtd>Tc!UOv8HbI7h z^oQrttJLRO*G!g2+D+vuY*85i3Ta%*HA-YZwxj<6{2 zRb=9%dcvcn^k_^GJ9Xn}rJa!Lb3{AFq93u}6)Wak&oOUo&{@=X43=iMHq%U?9kSrX z&Jv#6_#2n7D1W>I^y;$p>vKA(<+PANNAw*=CpV&L@p$;scHhHEjy`)LUe2xEwS)Xp<2h6!0@|g`T5c zj)J- zEHjP+{LMmIt`EcB?uY;Ix*pSty`bf#{n}pe*RhtGi|E&pGP=Wi1-MReaeBEJD-P3{-xfU z9TQDKtedDl>EG|LTG*Tc_vIsfoakupp%zx_xU} z2)Osei=0}<0Qhw2Hqfu=A)`ifUgIW9m8%8T?5fN%JoayY*$XN;n4(x$#7 zhhe9;o;`Xv@!T%JvqNEXA{_B2-6O;wGTiTDoI#JsupE)ih+W}Z-z3fWYdM_p{-_~& zJ`TyQ>`=DZhV6#EWY0sF7zx9jJ=vbPFYOGKFdt4h&%GT(9miyc?-t$Vyqmuyt8|JV-J`LfaeOcHuMIJ&MKVM~uW*;QczSPF2E!tkk z-CS;aHQA=aRn*V@T;97n(FR4ijK-12KKont4Xk`x@UMr=F#Dvk?K8&f+jLm!R{f5x zMBT8P=&O1Kz=w6gziAJLPnOiTi+Y;|?YTIZ{S;OoTjiMVNzXX4ggxy-~+il_h$PQ+tGi*20!Cqgl;P(}sNwAR9 z+g?vIv99O*U92st@Pl;e-PXDzrLM_7&!A&Y=Y`m&P@I0X=%gnqG}J zA|i*8S+*KVn$ zvOccKR%=xX8xMU;fS)=Qb9D|s60mffMqgnb?0TC`-;GlS8(zr| zW(38pnFJ8Vh{ z&ZhJ_<~E+EzF@RS3#+sqEAjR0>tRFcv7=V3ERR|q2eKg(JLn?`v#%8+RtdDWhS&Um D_^r3p diff --git a/bsp/stm32_radio/resource/hzk16.fnt b/bsp/stm32_radio/resource/hzk16.fnt deleted file mode 100644 index 8661219da1c56b74e7151fe78789121816537027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267616 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 z 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 z�g1&*Qo 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 EFCiZe$N&HU diff --git a/bsp/stm32_radio/rtc.c b/bsp/stm32_radio/rtc.c deleted file mode 100644 index 283aa4d240..0000000000 --- a/bsp/stm32_radio/rtc.c +++ /dev/null @@ -1,227 +0,0 @@ -#include -#include - -static struct rt_device rtc; -static rt_err_t rt_rtc_open(rt_device_t dev, rt_uint16_t oflag) -{ - if (dev->rx_indicate != RT_NULL) - { - /* Open Interrupt */ - } - - return RT_EOK; -} - -static rt_size_t rt_rtc_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) -{ - return 0; -} - -static rt_err_t rt_rtc_control(rt_device_t dev, rt_uint8_t cmd, void *args) -{ - rt_time_t *time; - RT_ASSERT(dev != RT_NULL); - - switch (cmd) - { - case RT_DEVICE_CTRL_RTC_GET_TIME: - time = (rt_time_t *)args; - /* read device */ - *time = RTC_GetCounter(); - break; - - case RT_DEVICE_CTRL_RTC_SET_TIME: - { - time = (rt_time_t *)args; - - /* Enable PWR and BKP clocks */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); - - /* Allow access to BKP Domain */ - PWR_BackupAccessCmd(ENABLE); - - /* Wait until last write operation on RTC registers has finished */ - RTC_WaitForLastTask(); - - /* Change the current time */ - RTC_SetCounter(*time); - - /* Wait until last write operation on RTC registers has finished */ - RTC_WaitForLastTask(); - - BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); - } - break; - } - - return RT_EOK; -} - -/******************************************************************************* -* Function Name : RTC_Configuration -* Description : Configures the RTC. -* Input : None -* Output : None -* Return : 0 reday,-1 error. -*******************************************************************************/ -int RTC_Configuration(void) -{ - u32 count=0x200000; - - /* Enable PWR and BKP clocks */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); - - /* Allow access to BKP Domain */ - PWR_BackupAccessCmd(ENABLE); - - /* Reset Backup Domain */ - BKP_DeInit(); - - /* Enable LSE */ - RCC_LSEConfig(RCC_LSE_ON); - /* Wait till LSE is ready */ - while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count) ); - if ( count == 0 ) - { - return -1; - } - - /* Select LSE as RTC Clock Source */ - RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); - - /* Enable RTC Clock */ - RCC_RTCCLKCmd(ENABLE); - - /* Wait for RTC registers synchronization */ - RTC_WaitForSynchro(); - - /* Wait until last write operation on RTC registers has finished */ - RTC_WaitForLastTask(); - - /* Set RTC prescaler: set RTC period to 1sec */ - RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ - - /* Wait until last write operation on RTC registers has finished */ - RTC_WaitForLastTask(); - - return 0; -} - -void rt_hw_rtc_init(void) -{ - rtc.type = RT_Device_Class_RTC; - - if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) - { - rt_kprintf("rtc is not configured\n"); - rt_kprintf("please configure with set_date and set_time\n"); - if ( RTC_Configuration() != 0) - { - rt_kprintf("rtc configure fail...\r\n"); - return ; - } - } - else - { - /* Wait for RTC registers synchronization */ - RTC_WaitForSynchro(); - } - - /* register rtc device */ - rtc.init = RT_NULL; - rtc.open = rt_rtc_open; - rtc.close = RT_NULL; - rtc.read = rt_rtc_read; - rtc.write = RT_NULL; - rtc.control = rt_rtc_control; - - /* no private */ - rtc.private = RT_NULL; - - rt_device_register(&rtc, "rtc", RT_DEVICE_FLAG_RDWR); - - return; -} - -#ifdef RT_USING_FINSH -#include -#include -time_t time(time_t* t) -{ - rt_device_t device; - time_t time; - - device = rt_device_find("rtc"); - if (device != RT_NULL) - { - rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time); - if (t != RT_NULL) *t = time; - } - - return time; -} - -void set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day) -{ - time_t now; - struct tm* ti; - rt_device_t device; - - ti = RT_NULL; - /* get current time */ - time(&now); - - ti = localtime(&now); - if (ti != RT_NULL) - { - ti->tm_year = year - 1900; - ti->tm_mon = month - 1; /* ti->tm_mon = month; 0~11 */ - ti->tm_mday = day; - } - - now = mktime(ti); - - device = rt_device_find("rtc"); - if (device != RT_NULL) - { - rt_rtc_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now); - } -} -FINSH_FUNCTION_EXPORT(set_date, set date. e.g: set_date(2010,2,28)) - -void set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second) -{ - time_t now; - struct tm* ti; - rt_device_t device; - - ti = RT_NULL; - /* get current time */ - time(&now); - - ti = localtime(&now); - if (ti != RT_NULL) - { - ti->tm_hour = hour; - ti->tm_min = minute; - ti->tm_sec = second; - } - - now = mktime(ti); - device = rt_device_find("rtc"); - if (device != RT_NULL) - { - rt_rtc_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now); - } -} -FINSH_FUNCTION_EXPORT(set_time, set time. e.g: set_time(23,59,59)) - -void list_date() -{ - time_t now; - - time(&now); - rt_kprintf("%s\n", ctime(&now)); -} -FINSH_FUNCTION_EXPORT(list_date, show date and time.) -#endif diff --git a/bsp/stm32_radio/rtc.h b/bsp/stm32_radio/rtc.h deleted file mode 100644 index 29154aef94..0000000000 --- a/bsp/stm32_radio/rtc.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __RTC_H__ -#define __RTC_H__ - -void rt_hw_rtc_init(void); - -#endif diff --git a/bsp/stm32_radio/rtconfig.h b/bsp/stm32_radio/rtconfig.h deleted file mode 100644 index 5df75de88d..0000000000 --- a/bsp/stm32_radio/rtconfig.h +++ /dev/null @@ -1,184 +0,0 @@ -/* RT-Thread config file */ -#ifndef __RTTHREAD_CFG_H__ -#define __RTTHREAD_CFG_H__ - -/* RT_NAME_MAX*/ -#define RT_NAME_MAX 8 - -/* RT_ALIGN_SIZE*/ -#define RT_ALIGN_SIZE 4 - -/* PRIORITY_MAX*/ -#define RT_THREAD_PRIORITY_MAX 32 - -/* Tick per Second*/ -#define RT_TICK_PER_SECOND 100 - -/* SECTION: RT_DEBUG */ -/* Thread Debug*/ -#define RT_DEBUG -/* #define RT_THREAD_DEBUG */ - -#define RT_USING_OVERFLOW_CHECK - -/* Using Hook*/ -#define RT_USING_HOOK - -/* SECTION: IPC */ -/* Using Semaphore*/ -#define RT_USING_SEMAPHORE - -/* Using Mutex*/ -#define RT_USING_MUTEX - -/* Using Event*/ -#define RT_USING_EVENT - -/* Using MailBox*/ -#define RT_USING_MAILBOX - -/* Using Message Queue*/ -#define RT_USING_MESSAGEQUEUE - -/* SECTION: Memory Management */ -/* Using Memory Pool Management*/ -#define RT_USING_MEMPOOL - -/* Using Dynamic Heap Management*/ -#define RT_USING_HEAP - -/* Using Small MM*/ -#define RT_USING_SMALL_MEM - -/* Using SLAB Allocator*/ -/* #define RT_USING_SLAB */ - -/* SECTION: Device System */ -/* Using Device System*/ -#define RT_USING_DEVICE -#define RT_USING_UART1 -// #define RT_USING_UART2 -// #define RT_USING_UART3 - -/* SECTION: Console options */ -/* the buffer size of console*/ -#define RT_CONSOLEBUF_SIZE 128 - -/* SECTION: FinSH shell options */ -/* Using FinSH as Shell*/ -#define RT_USING_FINSH -/* Using symbol table */ -#define FINSH_USING_SYMTAB -#define FINSH_USING_DESCRIPTION -#define FINSH_DEVICE_NAME "uart1" - -/* SECTION: C++ support */ -/* Using C++ support*/ -/* #define RT_USING_CPLUSPLUS */ - -#define RT_USING_DFS -/* #define RT_USING_DFS_EFSL */ -/* byte alignment for EFSL */ -#define BYTE_ALIGNMENT - -#define RT_USING_DFS_ELMFAT -#define RT_DFS_ELM_WORD_ACCESS -#define RT_DFS_ELM_DRIVES 2 - -/* SECTION: DFS options */ -/* the max number of mounted filesystem */ -#define DFS_FILESYSTEMS_MAX 2 -/* the max number of opened files */ -#define DFS_FD_MAX 8 -/* the max number of cached sector */ -#define DFS_CACHE_MAX_NUM 4 - -/* SECTION: lwip, a lighwight TCP/IP protocol stack */ -/* Using lighweight TCP/IP protocol stack */ -#define RT_USING_LWIP - -/* Trace LwIP protocol */ -/* #define RT_LWIP_DEBUG */ - -/* LwIP uses RT-Thread Memory Management */ -#define RT_LWIP_USING_RT_MEM - -/* Enable ICMP protocol */ -#define RT_LWIP_ICMP - -/* Enable IGMP protocol */ -/* #define RT_LWIP_IGMP */ - -/* Enable UDP protocol */ -#define RT_LWIP_UDP - -/* Enable TCP protocol */ -#define RT_LWIP_TCP - -/* the number of simulatenously active TCP connections */ -#define RT_LWIP_TCP_PCB_NUM 3 - -/* TCP sender buffer space */ -#define RT_LWIP_TCP_SND_BUF 2048 - -/* TCP Window Size */ -#define RT_LWIP_TCP_WND (1024 * 20) - -/* Enable SNMP protocol */ -/* #define RT_LWIP_SNMP */ - -/* Using DHCP */ -#define RT_LWIP_DHCP - -/* Using DNS */ -#define RT_LWIP_DNS - -/* ip address of target */ -#define RT_LWIP_IPADDR0 192 -#define RT_LWIP_IPADDR1 168 -#define RT_LWIP_IPADDR2 1 -#define RT_LWIP_IPADDR3 30 - -/* gateway address of target */ -#define RT_LWIP_GWADDR0 192 -#define RT_LWIP_GWADDR1 168 -#define RT_LWIP_GWADDR2 1 -#define RT_LWIP_GWADDR3 1 - -/* mask address of target */ -#define RT_LWIP_MSKADDR0 255 -#define RT_LWIP_MSKADDR1 255 -#define RT_LWIP_MSKADDR2 255 -#define RT_LWIP_MSKADDR3 0 - -/* tcp thread options */ -#define RT_LWIP_TCPTHREAD_PRIORITY 10 -#define RT_LWIP_TCPTHREAD_MBOX_SIZE 4 -#define RT_LWIP_TCPTHREAD_STACKSIZE 1024 - -/* ethernet if thread options */ -#define RT_LWIP_ETHTHREAD_PRIORITY 12 -#define RT_LWIP_ETHTHREAD_MBOX_SIZE 4 -#define RT_LWIP_ETHTHREAD_STACKSIZE 512 - -/* SECTION: RT-Thread/GUI */ -#define RT_USING_RTGUI - -/* name length of RTGUI object */ -#define RTGUI_NAME_MAX 12 -/* support 16 weight font */ -#define RTGUI_USING_FONT16 -/* support Chinese font */ -#define RTGUI_USING_FONTHZ -/* use DFS as file interface */ -#define RTGUI_USING_DFS_FILERW -/* use font file as Chinese font */ -#define RTGUI_USING_HZ_FILE -/* use small size in RTGUI */ -#define RTGUI_USING_SMALL_SIZE -/* use mouse cursor */ -/* #define RTGUI_USING_MOUSE_CURSOR */ -/* default font size in RTGUI */ -#define RTGUI_DEFAULT_FONT_SIZE 16 - -#endif diff --git a/bsp/stm32_radio/sch/module/codec/codec_layout_size.pdf b/bsp/stm32_radio/sch/module/codec/codec_layout_size.pdf deleted file mode 100644 index 1ca0e509c92132460e0c98a4fe07f4e669d5fb7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16280 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%0APG&on+tKd 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 diff --git a/bsp/stm32_radio/sch/module/lcd/lcd_layout_size.pdf b/bsp/stm32_radio/sch/module/lcd/lcd_layout_size.pdf deleted file mode 100644 index 505ff54be4f0a42a05f81c1521b0e4221457dbf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12859 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 diff --git a/bsp/stm32_radio/sch/module/lcd/lcd_model.pdf b/bsp/stm32_radio/sch/module/lcd/lcd_model.pdf deleted file mode 100644 index b31022e6ef94d83cb444a596f33b0ba400817e8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94078 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ℑJ!#`tJ@BRl6s|ShtK03vZ^ad=}4D*2Y5I|1UVQ9j) zxXGont*p2F3UL?^=URn7$rN&c*^7ykk>zb-4C`{te=sPV3Ulk(9sH6&ID5%WMuu|D z(DJYB=(k+a$*l0j>!mijcDXRF<>;pZYD_q~lAbk7b_oT(>WPOdLy!C~GdGyV6kXVj zKWPZj;{d!T%hosvO2I0#z#g8dN)U+aDN6lV&81j7GeaMjY5fO@;j@tP8gJGFLYYL` z!Yd#C89^y6y!_*dE?hf4@J-r@dCsxscdo%BWfSHRFQveZlQyTeO2!LY%hK=$_FJCEdPx*G-H zrFWMl2Y}^OI!bWIOQijZ46cWXV&am}j3q8;1eAE72f=kN9n-wrM>$R(q{i=KR~<)G zUMj`a>cqJvYUdSq_bW!+{&oq}U#NyZVOHJKUQ=7&1n7R&+V3k#@b(3IJ!7!S9iUB% zTaJFQ&=29Hx2=*ydRFB%wYU^)y8P}(QeLHuk{xm}c^R@tL`2;J^amS~<@L6)Hoq-0 zjV3C=$)fQtNVu=!4kU-(ZOWay?8T>9No$yo>w<+DuXP;KmHxlzRtm>Bo5OK^>t9E` zm;n@@VqAterNIrz(R8K>doyB`18TY~m6FS_^kKWS6YsQx$G?k8^b})>DXrz|mOEj$K#APyngr(Jizu@N|gp;Gm%IRe(3{v#$P_Dbozmc$EsYM3-aDU7_4& zhN7aV-;Hn>enr8WMi5~3)*SV4J^(d_DLP<9Jy9t;47qP-N3Wi; zx|Z6_D&aeik-k#mH;h39e zN4%F<0Qi_hoiCYW!NeL?eD=PP{#PxxP0?!IbR*TWSN5{D9ok-r(0V@TM8<8l)ZQ%8 zUIos9xed76|Eul5tXBcJF>gDjaN??Z#5mARvQ+%D77i^0<(pS{IW?P#Y$l4-@($IY#mf3e@sWRVJc}q_mWw+RC~T z{{yLIU|-SbJjUZ;YG54$k$a_~yVXp?4!h+;W&~sCfP)iqh-1t~v_kONsxJ6S*v9gEWj7jkJ{8jB3-XLvr{v9en2fm(R@piMXNr3#{+**(_ zQiKkj(Z@z0`+r<#l6W^xME=BHSwUxi6P*PAqW*j6$rNh$@fF=yO#``;;GmSp6jYRfE)BSJgT*vnS;xUBu4{bAyM+{)i-QR;#PW^y{to{F~bABdFp6 z!G1kfd7Pw}(7ysiHjtJv3|As*A#mgj&hde+u(C$9^Zh%?c z{Ez2Yz=Fa%tZxyoLf|lxe*3$ZMY?hDq<8i?_v^od1>l0r4m+-J%tHk7g&F#T1VLuy zTJ5bJhyl?Rz))a2W|_{9_kJo(f&SD{Fw+6E*vdxt{TjRBtnTG{U@Py!O}(yr$;*4B zqs)UjqsP<4s9FjK;x#D$ACOU-0b53$U1p>_F!x9EH5+A2z-rg_8IAI^8FC2qi zT^Fh7ZGPb^GLNZvaM{;2Wh21DPJ3asZvT;lo!&(Iso{;|WTofy5M#*G6}M^mp`Fvk zp4|S<-LU&;`Dd)uG%z=sEB9-fqObkZe!v0fDgzLbX`j4z6kl6s+$V9h87rhCmPXaQ z5#M}V&3mn={);_rC$y+&96bQOfs7+V>s|z?BJG72k!+DwPvPh8I1iM zd7F;z_G6tkn4A2isEs9N=sYrjY#E45U~J$>XLPda%Ujeb4>pGlYM8MoZyp{e(Qj6* zR^&AQRZ!JV%y&R9>aNeF7L&3HX8G*-(hl_MqTtV1Wp$@Y^X545`nN`F;R90MLGGd# ztZq6p6<1C6M#5`5uns*t<}QF+n<+&TD2y{Y+m3ALB@C~-f-i+?&l!Qs>C^7>0StNl z%8)t}DDAY;tC7U(DG)E(LLOl6#LL4GNP6m`+^k9#3f8bti)ZZ?kd-OG7?(x*3l&`? zrox2t4xm(tR2I+7v03+o4M0gSx&2T1cmMpBKKaCA5Wd&D{At>EwBcV`EKHBJkp{Hl z6uN)K*)O2jj(N=QQ8!PansQaw5((rP$LjBEq^~=DlS;a@8=`0^ zrI)EHMBkfIMmK3R{Od5W^#;&$aFD1S?N?B9TXnN{s66Pjg#5j&p3Ge zFUxq_WzcIuQTlK!>!_VwwIJ z$GM?XwIM*thSvd1&?wm8WQ^S}H*-~*$9l3Rp7d7f246@$lOM>Ewdj7Q*UFEZ|JGf5 zt60TacXXLW9?(>M=~+y@nt>X_iaH8woaFGWcUdQiBJ-^hoD6>MpIowxCx1?Nszbj2 zQX#zPi~JsZC@LY7x~WdQApZD|i!9#bASQ)+ch_1qiv<2Zi3P)T7_aX!M3+JNA=?9C zj%2ry!kRm748&dk2C%2eIixVjb1tp8-CgaD*_Pa`Z()gfU--Bm){uwTq5intG_G`==47>NV zFQ_BA_bb*SOTsXPwozQYi&k4%(O*rk+DdzybeeY*{fBItwPqPiTOhD4WECf*7jis= zAMsO=%?7jq;ZMb3o?M1;(F6#IMOjJ2->_+}SX)^uof#6Lh#j}*wbmPZMOfP>cQ>|n z&q(BCpzES*(LZr?dUUqBL^Z$R+G{A6CpvW{TJciISp<>_dbq9W6boLNq&B3>myzu}7JJ0jtX_&`Mq z^(J^I4PGU^UzFoQzm_)v>XD*eM=_`2ScP@JGB-gcZ#nZaO1H4$c|1EAx5lpK-y&R{ z)lM%2>2;#=8O>^A3k$(w4C={nV1@%kS|u2%Owy4;GCAinZ($HaC5jMD?qI}hJ$`ci zJhsTMXf%;OH5X7s2ZnLUSbqodtY*x{=_tT1rr zTJi*Ong3!U#V_5n$9A~xmHYm~d6ZB$|G!q*Q2WLA1z=gm_6D3m$MEqFb7bDEBDVvM z4%n`~+IY!Lcqfd1B2SzI-vfq!`n`DztagrkJ-W}z;6_PQ5+#a*5QxN$edhya1JqF_Ui7Orm2OneM9dZj%M)w8PZwxHAm_Z0mWcbxo? z+pBMfi#a5Eb{VTK6QCHlK|3mD0>p`y#LUwSx)L7WlthdUyjS|>VKsOCRO#>qCTWAo zNX3Qu)42s#jD6cqZOyMydYu6d*0~Q#Hge4W?ZB*Uq%}se(|smR>^N8s8!oE;JkOI! zqd`;%QmZ7)Q}sxD&M-T%s}w$hqWQRk%Bbz>lV|u0_8`HQ>`fmv;QA|UZgDFsACTm> zeGF_+J9XCt5A{1khx`@Lxj^!li8l^bu9E&OKhn2tT``8?6{!p)n5ftJdhxYF<>WJ7 zr)ZNbHS>G3^mpl;o8xuNDru4$#l>`Gc-2!{KI?Y0? zS^Q+%WDN~WjQG17;7I`VvSaxUd4pDz0S zvO>4>ckiw?Mv8KW@0rVm`fN_!2*D_ilM!!rN_>wMrbXZeC9{&ZnI}0Rk46=I&((J` z=W?xNj1>v<8f=ERU;mQIPes=NBPS(efNMz&9};z0q3+m9r?4+#LJx^wiAhJ1{6=jp2058Kh5}QuB(8MAxxzAk?Tx|z&PhTOIuF7 zLN1pH6mpI94Xv~T_?^h#gJN4g(w% z%Ig3)Cc+dAVehPSB7<-jMZ1Y0=zHx5^pQH+@ROCSb1-QcSof`TpkqSd_E(8>Xvac^M2RiACAguU8bnf?WQ(v+O^bfkdc+k_BG> z1gZ|@WEl_I^4r*!D+uu8=oWNfXxu+((E-4G(L&~#+!WrW3lzF`H=*Y>xV-x{5=>{k zZ3h;-Y;T^9B}#Qxg14WPQx8`3V{B$1lc|jw{jWGmR}0OHd^72?2!QN%91zUz=N(uo zV#uJpRXRP5PJI12;aDu5T+l|V&sm21D{2?s<9=@LCU99TlNn$oEY7#Iuw*>j@4p>I z9S6V;;NPkr3TEhDx>1iD7jD1kw5TqzVMuSy82iwU1Bn#NoM-MXJh!92YPxhoG0NTq z{cb=ou`1KZSlfXQcPI+L3>n@!iS0&rqJ#QHG>c^~) z#Q@Q&Fg^pw0et2YS$egbg_uH3EUi=-t68c)O71ZO2tn3M@d3pqA$SnrzrH8S4mbGd zWtS`bvmgHAfZ8jbc+01qnBaF0op&WZNx5jN!$?OycTqU@iRnVdozldH^_Gpl-d7us zpWE=H4khtKJ3myI`job4w_EUX0#tjrxrMWoUw(SXdNimGbVu*m4D-&%_c{iHRI5Hd zdJb4NWCjB1-fzsl&I0lm*q$jC+VG8VMlU{#EFVGftdo8mK^1wjz?)+ZH@OB@tQZgV z%~JIjBRWkQ!ocp1?S8E8M#1^j-nomeq^Uhl-gfa0x~I}UCq-Y_G?pX?;um!2b!=k# zXW|U*_36|vtEFF54(POsi~MP*b8wBca@!M68&;)Ok193XE@oONrP0W5YahDxOiz~H z5#2#_?fGyPwWe})4YiZ^8x5f&9#fv)@`_FIqK=4%^bz5YC@nmmOR^kn(DS|G;aECZ zvh}~em-nsc{P=Og@Rq~I5$hiB+|hK=Nu@%MgO5yqX*y!#nWa)%1E%9?HTSNM$#YH) zt{lM|sfO+d@<2Cw-w}p3ROQn&K53#e`|bXbVx1N5L~MsO=y6Y6mDw)Kol+a2$V{|a zy~Q-8k`%SVzQ0w;fItPbr!C8%w_`Cdai9vU1VvKv6y@DCQ*DJ{-0YArzM7-}<~}2a zddw=druyBy>hdGW?lvYnj_tCEYia}lC8E8L9z6{TN1d7$@m1YBy0y6D3H@LeA~bW? z)h-p?5(EQtA3W7cfO@IlstsG|Ka8kl$LSQam8yJB99_Qc=1h8UvK1;ES4#EYBbs!a*>z}JuM&anv>!^K-gwbFviJ_nXVr^7Xgi(9#I zQco;*fn#%Y$2xiqz&>am&7Y7wC~(+A<8(7p@BZ@|-4)XKW`3^~p5v__Yq-^z~bz_WR-8wCcEfPc`Xi!g_XbSlO$u-nK2KIJwY_peI#BsSX3G zZ)c3wQC#qFuN_EdqdM_@wzYRMX3L+-?w}<{z&~w&4OHl}Q)Ra(3FR74&mpR7$+=FI z!j{zMZoybTRLb+U{99Q|RB^oaDPdOr{ENp9l1rjX^O_a$?_uCN1N?)DTl#71sHXM1 z=if#<-L9{cOjEa^PFj+$SM(3Mlu6b4kQ0-u-ND9rUb{7fDFn_mU2;#H<^=Ck z!^!Wf!XMMj=RW3q70Bcx-tCG#NYOD>N0$&N-sI1p_NSVD=m6$JhZ~MrerjU>R6b?U zcHHtlcgvnD-v54h+g`25)YYN)2g>j}tNQ8Tk3 zKXnV)Z81muWOcXbW*ukj4H)?DpPcn17mt^R;}g^-@k^S5vELZ*E=xYrFS`=w#>t~msKj*d`BP0z@SKU-;ZvR zG%-Se*O>1BE0CDJw6*3klEj&Dia4OGm`mQ)Los%PoWopim)>R`{1mEVUl zte>GT6q3FOlwlruoq0j+8077QStDa&o*U6|Deh$Ky6*OIIBq$C&28zoJ3zFLpnM4u zW`b#gf<}V7lfT_gYzlLiV!@8_?Y_!Xdm;I6Rc@4npSV(5YBF(sMo=P<+^)X3<{XP< zcSjnT8|g-*mObiJf;t{@t63cNr%3117ZcvSHKZQTbjGMZZYe3-)=p4wp_SBnD>@d5 zCm-A@OkLE1oOyLTSo?^PreUjjzE4>@e%LROK|XdqM(;g|S>4JU8{StRIPDtqklLQ? zs$JTtu=$vR18Qy2{z<6LA4cA}i@pIH{?Tu}?Wi%sii467ev9d%5TQYGXHeMD`<{>Bq5?T@HL8KFXj-DIapdGv9oSLe%t3X+qW^w|p`h>Hd!mJ} z+|&X@nx6txbm*Lh6_*7nm&kp$=-LTN4Az&0W&5|DoME#Z(OUf^w#Nwd`TiMc$}=OZ^kmFvp9|oSK>z-%8qV^*Soh^DE7VpXim)u^;=oc?|Gf)adLE z^PR0M*~%>K8~Bc$mwVgSBpz$X;F}q#*6PV|jtzgi6&$+ZS(0yQg!z>?Txqi{=RH}2 z+DP)nOtLMYQw%W*T~WCT!y9=Fl}DY3^W&qjJjoLTioJZ>#)wx1wWu}5s5#6=EzxRx zp6j=IG`tRGtvwH1Ka3WXTLN$BUbt^ejZYV!!L2L51!PJydpWE=Jv5*gdQ58Y@NRY~ zf%?cK{*t&sX$@%w_B=-LgBd z9TGj@jms&r`gRSWWCw02LXs$=JD$P%TgzLTcK;rdc;ni!N$n`e=|_#0Vt=x!(Cl~F z)Zi0qU#li{gDuOks%V~3z9j!%^PnjMh?u7?@}zTkqWI9a8wM9Uv0il;{d<4>M9&SY zTPdy;%8P`5LY?Py^K(@GfbLAapEZF%GxkYuD_uy&ZAQrco!q!Rn(u#y)541$E_WZ1 z^lRM3hremMT=}aU>@>A|(WIu;{kSC0zc;DYZGUQT3lwuu!8>_JRqLVjw$QVP0P2Gc z(}%tpXF7T$V?r=brRwZ>`Kb4!;cKM#TT4vTA^rdqrBG!>1h8UMBDXhd4B*q2b_a5F z-dh^&;*zXAd$=x-qWH<*3%kvtbzu2Bs|$0uEO<7V_cxb8z0OH=yfo4y*{HNo%<)_# zzZUIf6!J@sE*N#B1?nNaSF!M^S|mTS42PTXQJ(8#G2kKqz+l5OzBAdlL;rQms>kH1 z?y&7n*PhBgj@H83lkvLPg-5dj`dC3A75K18a)DxdwAo(X{c%#rhE`8O&d2~hcJ*eJ zh58Ss^&*Z0`^}!@suL-9PehP^nd(R@Pa@SW+isq(Q(?M4IktUnL&#aDtG7S}rz+8o zQ_$)iR46G(Uu<$hm1q=<&q~)fj6r?{I&OQLAZjN*CPORZdb&5wKZD^VVu_3E3$}f1 z>O~H&e|)O**S0LS&rpPm`-^XB+b%j3CR5qMpYCeb=;D|y$5H2)I9?WI#}_tFe)`pJ zRXf_8?4Qwoyz4As(mLHj-|ic>~)O%VcwcFM8_(uAbV5< zR=$v&9@@9H8Y+!%gK77+XJlY75*+f#TvQQrxBe~alf7-xES75ZzEcs+GiHIb%5q^r z{zRT)=~)OpscV#<$03wi@libQpp-PV{W7HeV*0$g{Fbml+Kn^88EGkPcHTbgi32^# zJYtVK$##5NaM@%!7MIgk2^X1rT)&0xu^ENbKW@W@o}G_Kaxr>7*OByW&PXj7mac!| zQH+M~<~7dDi@r)qoAL0_Xq0dCx))Qfc(a+ z*X$pae-sUNuQXE`?%LfcUA_0BQDeSByZL4q#*u$NGMa16V|4A60;MyS1S_}%SENVk zLN+{mVyMrI8rCSX7*Ds;-5fSgxcxPtTvgpIjrok2+%*5;utWrBj{i%>vg$!Qj}gs2 zq?}si-M+xLz?s-Rv+@|9AVIn|UL~Cc!YPi;;OOi(pS<-`wekk#rHjD8xqTZX?tv_N zt@J#9mC`ArIM<8r_YahxZ8^Q+kPfoouioPNY+fRd)Ph}eJ0Gj7MABJ8uYa$_2D$(R z^WXCjzZmH9AMQ3P4^Y(sC$Ucrqcxw7Xyap1NzV%IKc*#~)Ci1(>$ZAtSrx7H?J|&A9;21{AP8+eOg{ra5vWhI)|@F zH~)1u$!*r-UXy7X6s}b{lJpCD;?15w>}_!8c~!MT4fQlAMqQ(~mHps>TR-0d#9tOq%1^E1F1S98Z_=e}%EZlMR=Wck*xPwCH>;)^@Io@Nfv+NCgt@slk@{(&B+iq4WqU?VGN z1oa~w9G@A@@iZTng#U8URIejkm7QCm--gcxWljfyQqt#GE%%hQkhv_m_9mDfHgE3dWljkFKfZ3Dntx zOA1k>wgCrYr(7t?kWYhCJ4)r?+K(`LQSttzC=;>vvp@H;k~{TE3+|!{d7g5X4Ct?+ zL825k_V)aSHvONv>{2eqCB>;d4Q~Pmf#1rn!9|hY`SW*N3vVoy&%Y??4$&EB7N_pw zKH||eyCG99XqKs(mE7GbeVe!i;j&w>eeEU<=e>%LEZ;O3d)&(2q~{RuKd$|LA-U`s z3svE}8#S756iq%^?rkC<+_RF=0-bS9*l0tkmMFD-c0<32IgVh-njD?|xwHz)$7brJ zunpK}T6bFSMVPuV+2}fg3t7j1B=pWeto!w+GvE&y#CKiZBf;#+y^SUByE5)*3zYHL z4qq?BtQmv%QP%^q>rH?|$Y-_LO;y z(6xj~P!nXoc`eRZ4feM4;6RR((q5DN>)Lj_=g+wc!*IDG0^9h&o?r#o;*$-d-I5P@ z-+!aKI4V%|Vs+Ge@|6BJPJuIYqU1C{ww;&9wWjb$|8pg>X2H67-*V_d|2+$vK0R@z zFX}0@usTeK|G9p~V^Y16s?58-uNVh>yC5*0P)P&s^_KW99_MMRdz*(Z%F4 zevyzLZBb#v_iV!0%CEEWyk~`~|AL!Ja8Ib(4LsYR+H~fFdw<+3m!IFa3R>`F;AYXZtfOKuEbIR|>zdSf2Ve!lUnA)BPc1yS&>3(X4P-^EE{m z!%DOfxUOzpR(`$}2-ubZ*1QiNw&5?J!>J9baJ54)HMF==>+_tOln1=O4At~y{}Au6 z6o!&BqfC-s4Q{kf4T3VFZlxEz7EHg$iCy+8_^m&lB-pzO?1rHTQ%|E-Sh-_UOyNks zr~pfpDA@wzi|8(X1w$qEwlmZS2NulCXT>nfZD=58UFD|%RjhetsLa9}gGh<;vq^im z9z!lT^2B8Je0c;FIaL5&%?Rfm4XrqRT{(i1%zCC2cIzHDsR7B-FHDf~_7g|6=#r1E z?{UpYYQU?%){}-`zQLN^0w@{MfGK>}htW27AK(i{2=s{g{%B*PA*Z@?2l$?#bhZD= z;R}fHtru@rJZS~P8iCOxlJhfbX3tOT>#?5?8rtsDOQt*g?%*hpZuRIhgLrJe*|qSW z+S#$pKWU^YPd}*KqmGz(U)IWcEhy)P5w_D<1I!?z{^^^>wfWzqQzAi%)N#rZlS8?| zli?mMlbqDJ2xlJeQ98#;FC%N~!AZJbx2T6HKb|z2>>k;A|BZG6J}%Hgsdd{Os~n}( zvsnuFu;lU$W7AaxIS#Hf-(e$AO;S> zwN-&@+fJ3K*4xj)xKh-G=vIs@}@XK2cYaSRh@?gaxchZgv1~$MVZ^i2^JL}N_w3-D?U{L=$hOZ)O^fn5Uea;J|m;L&;{duJx+j;C9#8@!>Mq-QwrBVEF z_=Syy;L95YN}fBpj{D1_7D3$K zbZRob-vtpLe>DTii7RbJm{f4}*bS#7oJKGhkxOX?OXWrj9h;KgtI+^`i4_tEaDqqMIG z-up1*-P~0EQjo1`2J5|-50B?Vflrp$VHvtQ5>3A_rZ!&9N5Rf$rrO+|nx2}~#Kc*>rz@K@kZ-rIZp$ zS&$BCMFHttYAL0=I|TtjLb^eucUfYIrAz6O?vRwFI~U%|`+n}<6Yu`Jd+jxG&diya z^Zg7g154Fs0;iORhREdIF!x{!`B z+N2u=WkG4CaKaof?*02!5O?0{S&ksK)=wE*b^}aviA`onr3oUiJ&qP1#z$ikbu5dQ z;2L>SceEIjFT?&+OP8+jcgBjU4+Z$0#*5h(IOZxn%^KgJ{9@n5qSPo`JAJ);2r}#- zmqSpd@f9a7EjIIA*W)#Pb_4DWl}5)VGC)DtkJMUb0M7#fPWnr)G=68NQWe4btPeF} zspHh=+70o5kSER)ZV{>bP61erKYnN)A_Q5UWh^0l2-z>p{y4#7U*L74_Z-C&T0lWC zw1(Zu>``|l&%7(iBD^jDC+jY6$@rXCp+DBQ8Q5`Q*~O-ioQ1`Ncukb#M~7?S z=Zn#6*fEG$EH-8$c@ylI^KgRE9^&-E&#-)#F+NRe=HNlML3$J{@{YldCTCWuJPoV4 zfH49-5D1d#Uc-0L7g46nT$2SHvoyz9ZGyu?32&2x1#V%J0Kb!441+@+A?FRS-(jMcw+rn4dW2^~iy;AG%B#6iQO%eEIov-ueR#iBd2^R1EMre#jQKAEoU##Wkpt0 zCCAG4z{M@W@mN#%@MWI%a?_bubo^_(6q8J0n5GK9graNV4`s*=U%xxT@bhl4WwA}N zmR=im?IvEA_W4W9METtl*qrDo;rM+{#||??MQ^VD!D8RB1y_u^mIOq^yb1aSBg|_> zlrAZAoi{w`Mk9zcuj$NtlPWj3)wN?fj@+fOgP0y@IgqxVbi*o#hRLr9g*%# zh4Tu`ZY0j8!ykl2WInTUXyH4wNhlplxjFMC5v%j7H6QXV zS+z2|@e>Gxz2+J@B$Bqnx2=zBy%M(7dyhMNOt8pYtWET_x@(7yJ`Nz8q zvGzDN^~YR}(RRp1ekh#R+Bo7#HsGjM>$7-lY~WpBzVe36QrDM>C}EOdm9mlDt+b-l z?3y3g4&p%B;uR-mZH|TR{Hmd!aUXHImTRu=b(@=V&l%G=)`xhXTM2R)9&z8cUBpMS87u4ihe(6%lnOgz0ESZ`Y_TOZDK@_w_tK z1fxo&6E$ATqMvUn&rHBY@2&JzvEsUa^lIqJ%gE_9x9v5tj8bnJrJj;(^n;9SYe9=f z6rR@__}8?uaVnh5^R*;+0jn=Vxt{P#35c@-1Oo_6;c2I4Cj}|b;c{BK1g$ev3;z9E z%~L)je9jqC+2qY;iXw-NFjKQ*w}h#yQyY#2s;Ty-?C#HfO0;`QL!BbN?13|>bj0yP zl0(KiiN;a=47X4)h4-`1Zf~R8Fuk1u!H2=H^<0>$a#-;EMK%X)YV)LBl$h^bR#OM@ z#E zw`MX7{VcI%(n15Hn>sgBF+gDf;-mRyx$W zEuAhO|Ce2Jr4=4+`@_)frhH{I-5&dG3AZaO<&N7vus{-E_c!CkCTYRyci-jo`a3}p zzq`o+o#3h~N3j~aAX^j#H625J;)Mabj8k_lbWUuJXJ&nc$*Y;oasr>qR=G+pKSB9$ zx4nT(w7&g)y~kYBMN~amm{}HUu+H&3L5d&7hZ_|Ro^@jAZ#myFJ*m?6;WS&|-G2@t zkL!>5h8ZcAg31X`&&{TTg=h^7*ldF~wZ**&H{52qU3O9UDA@`A`g(^O8Ca3r&<5sE zT`bbo0eiFpzr@kI-|3P-{pQ0!aob2_D2r4=u{^!J(3r-NnfLC`c`TH8B5T}DIa?YE z*5h~e6FAO^^Kn;KeaycD{rY#Y8#C^GXZV5BI%TH^{ICc__y`AfLDS66|B+yT8~@bcrzn+ zCd3ja-ernZQR|CnwSC}lC88gk{W$#kEBfuu(KaTsdan)}`MBeXBXD;2C{cTsVya;3 zdB036W}lSrM#yADD^Xl-B3wM!_5QhElfzbX^{1<_?pW3b6R+Q>lesG_%yIwRPA>Si z(_nJiwb49$_(j5S5lD@b>pmm&;u#jGzGr&)Yd7rLPrn?cEGR+b%5oDctT?7-o#ZWd z|4__#>awV@xwDf!Azr0bs=jus?SWrXtl!$uevQ5UeS#FlkdcJP4Q8sLJmI_tqVIa! z)=AFg(+@Qmr0}2eBcFw?yTKo^awN@Y4w_b<7+Goeb@3mM%=W+2AmHYah)DQmPFi$t zD-p9{fif-~uVP=CT;=vo!7yD`e?82|riE zUW0aJgG}kwj`W?BOGl zS!T`!^NpEhoNVqj*VpI|N!G7w+{z(ubRLkI$SXIGh6_}~5~)IB~Y5Y$U4)tRv&tafRkn+GPB z`-vn)@m4IfgLIu4ak~1Q?mU`}m;2dHw#DgvTKpBUN%9H4pPv+!#Cca5**&6EvY!q9 zCUwEoghLsWt(6GrvUs?l^|@t?N}@;3VS6BUoDOJ=C(3ZgKQ`Z0R^XOWp!2#KGjN3<{eIzf$8hiE zsk?;1uc#y!jkLzqFnsCeQ}&wrVWVx6!kk~-K_e*nvB)q@-p0HPv0>Sq8eBC(pW4zV2kDy&HQdZwv=Z#xi2Ib*`6!C}ATpp_i`9?Ss{E9XGOZ*ORT1T1C zD#=?r3}=d#$F3_Qb@PyOjD+Byv9Tv+f_6ils__X)@R4YGzNe6Cs!%LakcI!^=p7G zKZFj>T^FT$xVDzYk!qgR1K7LzF1KaPsSgN*OnmLDTFjjXj!K7J5F8=!geTX*>@1C1 z*+jHfM)$%lcfX1pQnu@(886kol2XxukdJIzpMH5%I3L+I_$~@8PwCuswP2v*Xyq2d z{Ema|Zc&b!CnPzf*o*c)Gy%Zzm_HnURk;v(lkP*AV6F$rgHW*bZTQ=CH$2!$;qDyu z#%gUMs-Js@(i;90jIaKBl{ix0KIul>rwV>)itv(~ZPuR1Yko_i^i>F>4p%T0)rr87 z4|xt-QHPbb8GrH9BZ=16i%3A21c*<^5u{U3c5;#7V4f4)(CdH0fCa zrJ~KMDBA^XmR9gNh8Re{;f;}y`K!5A>rfra&Px2{3Q#JRtUECNjcgK|=ZB+@#hWf! z1`ZAb7v9h%1yT9zY??J~#}G#;e*XQix2yBWV^k16HFG)r7KhfK6N+z;HTmX<$LM!b zFC%%+Gq~SKAH_a~aoG@uDWz{>bBujLBs$b8+^&Uy)sC9e?s?Us4_BH34J~aK*qf(k z0~Osb7d3Qcb>Q0dAyW&!jW#{4JM&A~UMtO#PtlD$(drka(fdqW1S+M$HuyYU$%%X;e8=>6 z(gWsU%Vo9vq)It1S^u7w*wVOGZl=2-enE_h?ArbOMC0#nT2mW+8j>AZa=z6E=Y!9w zWGc7=hZp*HWn>CB|W{VbF zrz9I$W&|^ZeZE`$-BOWip|f|PaSx|wHy=@pH|p(Gxz7#X+l^GjrKI-K=sR+#(V3_h z)YREu5izS?JASB~M4a^C7a{U#iE)?UE3fh+F-<+uGpXUja9R)2&rFkR&daHXSB3O? z#|l^4(~msrxwG#;ZMqI-eQ{}f8sPVVq|>gOFhK0{mP1P|?#*$S&`99c={U_jO=c>^ z(y6_XMT!r_UJw5^Y@^$1$F!MR!4(Rpx39Eu#F8$)nnK`AsV^fkWp|Q;5S@bga#8Zn z4*i=r6$4eq2-kCdc)DcuD0uBB#00si;ksa;_18gukKf^B_A6}0PokYSsP27#9_=$lJt{xVjp zNT(7So18FOV)4_TRR0>D zTVwSC@5Cp5Ake<_nl{HxjI}+bcek(YnLn|{TVBE~LJs>*W_#^(iDY>24Ux-FyKyKx z9d&4`vWMjh6I;LfNH=!n6mDF<$3tz&ze<4ct+`ruXD$kQF)wPi|D_`Ot8P38dNn$4 zz-RuSMwS9YYZ5r<4X&N`Cx4`U>j58pPA(s=>CP!Z=JzUWmDcqd{;pJ2G?lPs`ss#2 zLYDE+j(5gB&1}2Cg#>?GBJYr)F!ZZQf{!U8%&Q!`ixU~EdrEyQhYz}=R7SRe%$BkC zY$>_J;Cuo?5E3m5?B0_9!I=P%nOeEBz1nwEk8*ch_3yf0osSJz&?<*M*v+qwLCQtD z*7%O$_deITijvH;%_94@umQg;123rr2VJh5daDNNE!1B7iglI(;sUkYZQmp?^h$d0 z_P;qIRPX{-ThBIvc)l5M#%^YdZ(#6ZA2Y|#qJ^ja$t&|KA0rp9mE8lHN;A-}o^=ZQ zl;>RQX!ZDuY}QWwvWcL^PjnaV-wETx1k)e4-= zW~|1uZmyFH!O|l}XU5jV3Tysfgx@m04~esNY;5S3HT@hN7n%7rxMuUw88a@&Y!i^n zgWiD4S~YGxv%P0GcKnt%?A|lmE*J~IB+~gSb2-`T zMraEax{WrjlDL}mYTES46-%3Togs4%wXNr<<W8iRrd=2s5K*sV$ zX=m_4t14XVv(v|i5_{8He!|0sgJgg{EzPD7!b;9YU^2G+dNVBd;mSYmJ6d0yqCXE- zGD{pvXw;DoEuL_iS?>%_C$zo4^}F7jJo1=vF60&C^MHn*L>?<;Tg|fd@9G8}U(UnA zc)zynQ;CuMTZd+20{Nb}D{rQ`T(nDyur3CV&98QJS>Keg=3J)}OVKAcM$DYow-dsqMMc%3~H?w}q;>l{ z(gB(Ck~XICqh$YX(jDXi;m6m?>CZ^&FXPtw-?sioFR4Iz7dC-|F|KM@L&*SzE&a@E z9VwY7P3igg5!rX2j%Yb5(J*=^_j#zutvF`!J>CC0>oXk9srLg6E+|eOF&g)9iZfW< zFlOj9c2Dxs)5y}3yApeCIwmCYqEhEXftAc7pfaI(b&xE<={Q_IuLq- z`2A>^`A<~!59jHXC%k3{ujWE~nq7H6@SU9l@{_KXnOUJuO^Lhl&SqaozEcaL4sUAc zR?a9BW}DsNG&f)L{O_=3u?Ns5rv5~r{b}nQkM0zUa4Vr_uJ;xb#aNLklmBUf0Mlzq z6$N7}k*$X)b|C6XD=t#VG=NQhJ9#UGaz+x7pkgmTz3?XvHM%_zhKNO?6;S8_<)yfg zJ|MH46csF8AwvHr1wZAV24yma$GTl9T>7zAhnovJyoKe-?NpPKA5zC@j zY)Gjn%O^w~SssrvhK;49<$KUS#4F8t*kCpgneil{&;sd2w;i&azCOz*oG#8H{x=_L zZ2;jlQ4UFI@@WUUKCXYgqaNax(^sXJj>)SVYLb()^t@1|B#XF=2Vejo6z;z;QAS_A z)`9Gr>e5EahI}8lX(6;7+o*Sak7h~zp&Z*IThA`kiv$5VB>?*I*ghZ1Q?oi+KK!oVVoxs!^T#tN zKZ%`+5tKvJZ#B2`{!>4$myPmIV~%cbB{Iz-x?F4$9+T{8rZS36=OAJ6-|)#JZ%J|U ze=8uni(t9+ujT`EwUL6W-q_W|FUwcH4$5)7mwRsPjV*vCHMeV5VE)eb3P&xgy1^yo znqfv9kPhUBTnc@BHY*J<(kEd&e+e(5piE<`%BXNOM+OQeFvG!LqMu+vr#r4p17zmk z`JZ}PSPLNKh^uTg<*B;5Dq=0eehMT3>?VbIaA}dpg^jD!9X@PiAQjO2_uj+v@%&=e z0fFd0lgt82_nRjAtwG~#ZvVl_-cPdHB)@Wm&J3e~b#ueYL_0}~y9;AruLt{O)8 zml|{sIsXXN!{K)IhE!L?5(OIy2OBtEH9%aHU8bE2CP+q9gOm7qxdpW6)f)xJGMgX2g|Dm{j0w#HcY2%3iO9Htez~h)$CXu=zJNF_fS(XR=8Is*sDpk_j(+Ur<;x9Qz3|4D6@{{2#{5K@+ett6FE- zgOu9U9_f}mM|hyoNxdli-O!8wDtrXuAt3M>4d0yuXY;;}ah=FwTi0~l$$a=C>*^32 z1E#dV!v*-XcEs=DJ%7o>J;kuJV1kAdv6}i18goh5`8Fuify`FLivk0GrT_YC8|yUz znnK;@U09~`%Y|TTxv5s`PtaBItfu^jV4f^A?hj2%AWUg-`6uvv(TSL*t!}C+J@iA1 z$A2cMw$>`nVY?wxTDKWj(dHu}#re1JJZL%<5CW$S9$)XNcWu47VjET{?7TheV+W`k z5oHf^PYo|SnVLp|y9Lf&iAm4W|Eux;(6;!#>5L~-zVM?@ZU0DloSzu?CT@}rv5_&T zYM}D5IO)Hv=qo~JUaa;BiAp!&j(rh;`lj*DfnEz_QHe2sohB7@gs4XR76mN{tQ-IX*AKk-sd~FP9 z--H=q0LT?in)CAG6B4fb#)6Fu#I)^qkUby1fsEw-iA#Y{APLykNsF$ELg1S~hQG-i zYFg6d8N*Fx>wAk!=3oyJAeM%6*N{_{-odT0|FW<@puE4JH&9CxSE&VOq<*%(YJLg6 zyJe>iEivNu#m{VVqyI5BN)i<@yfHwj6|>o^dhqcu!)eoLb=d(`Qdw(N@o4~R7jlQX zck}1#%i|<08hJ_i7XUxi!5a`*0I1tPh=fzQrtw`iCp`D8Pb=!#n#CjXexvH=8bTVn zwEt7Hx6lf=Ou!V{23R{a+Ye+5$*cvL>9%hKJ9M^vU~$C>vGxC7Z+-8)ZKDw??q}0I zTgMiQLNgPNNXnRw#RdIWliB>G7|Af5Ta&&^e!4@#VwX6|)wYf}u#WT=ma$6++Xep= zyLwXj@xNyw51WK|h`gpLd2}kklk^Hv@rtN}SpySS=QA#jL|G0?W4IrY zgqajWk=@rKB+pkU6_AdH_pbpVqH&=gz7;2$iq*;lpy`V9Vt}lja+k*QmA;69Q-saz zbB0NzzUuMqBkL5qK;xtKw-EJF%16(?TT_(SX;Vn{=0pf&z*FG_ReE3kTKqcry1%Se; zZGg0~JBv2-07Xa70oxJ?=CBhb$gB85*z!#4H^+aPJMdEf(Mnq*c`y>&ocmdH=vKeX z9PG$XHv*xSWg{*qY@eXU6XA))3p13meI_UqP5j9B2ZCl|TT=`G{{qxTAfhvF_Fg98 z&{bqQx=&X*ONVTsyK{Vd<*ymKUd+Z{BQQ8~Sn_k6W^5JP4pBYk7t7SdJw6Cu99jHB zTc*AN+-LZpd|+{(904V(ye0Ye0|6J8eZrU5&o3vzXvK0P602BYNygqfKY>L-53Wyq zWXE6YI*T@T@Xq=S{%^E=zw3T467hZ>fvlh_ZF!u|%lx$)>Wc1OM;3Q#T^DLXI%V>< zHs?6V{~DHQ#}SlQXZfaMhEI?KMM%kOWrqiMBJm0bnnFT~JC`yk#!b7E1N{8zZs4j; zaBUr`_}NGQn#Kl$Iy7C)DYn8AAcxa;u7yoaZ^4J1ZY}cJEowSez0W8StcF6YHh5)j zq0n#s%w}OS&hR@COO!)?tF;$9{I;N6KM=^A*F)hY0Nb=hj5ZJ70JOEZ8ptn>&Zoml zV#awumg7JDO3PmjMt}81qb0jxg2!`>Vq~*HU&~u+_1XX-lL+(Ty}{{so`p#Kzd}G@ z2Jir4bZQMlwv%e@$$at3ix0iLjP_)LVpto=0o_Y}nv)Hj6a6(1pHcIVY7BG*8%uGE zY<$>mzv42!;I6+&J6^c2bwqr;F&n5sOcS ze$5oa&6gP7POe%VYLS|aeZ4oQ(}$|X+sr~^P1z6a)%2CvVx z50INM>6ckV@pbxwFG6#&6B!ywBir<*+s2{~lwPU^bS_@enyZ^#*g#sG$X&kEFBZjB%C~dvHg`Id3d#_4Z7+1FqIA{|E z6><8So4YoBXvHaaI(#OUwV|SZkKm{LI}ym*h@*&!1=(L2m_k>CtWW%si7GafUC_FQ00WO3DyMVKh8OE5ga2 zVZ#0j4O+h6hhU$2Xoe2LFQCci7pfOpBcrGnTyiory`Hlkzx)U;hJ@_KWKjXvLh~Ck zqsQ2T-$5w3%s65Dv4Us>TDOVdh-ODE)18u4g zqP}OM7(6aD3(IMG99glQQ(ph1yY)LSU3E_vc$(x((TIpnx|iXa!nh|K0PVFIP@wK= z4WjdQWFDTzyC@Ma-~x|uSog6s@oBBT=gNwqad4nXL&`x8kp(^ybK6QD_O$2MYN=-pGhu~tvL92v-Qm?~#K zYb|8($_U^J@4Zd;LN)UG`K?$tHy=BS5}?F0S_=tx@CrL_kCsDpb#vv(mywmlYGPQ? zyVgsKvA|&2V$7w4dkz%~`hz=S%;qT`5c=phA-mZ9fZFu!Jb3lR_Mf8|wnHXrqCl4J z@sS9KTa(hj&ywCZHHsac-A~fEem*1`75YOyz1+1}C|7IfFM4oyD$*p0eS8HrV5p+w znj>HBZ!`83FSrgMg#3O>Efamaiu$)10QuoChASiF3`f12&F%bjE|MSFZWU zf{N+?l+7Ws0bd5?Rw*$(H0I4AN`r#=+t&}LAI`xtdu6bR1BmXdBHlB%w$+Cr)EL;L z4#H)24Ma8o3YysjaQBm+eH%Jp5{v^Zju=!A0)?F(=k-#z8Q2UJn4=3_5JsFwBYMg$ zX~YK38X~n4Ia|t=AlzQqH74Q0LKO522zrXAq*oEh&#twQR?lY|v_sSN5EFt^_qwI? zb|6|Dltlq|%Ul$3OqE@FlksCK1=$71DOn?2^P#Kwq5v6WeG=5g!&MFLhLVXtEZ0zX zL~^*oSG)o%*lKo`LC=2yxDeWa93cp@H@jlqB@zz!h706@|n{QRc+cu#nufo8c8fxG*>q^6Jx>7wcek?{^u z!-gFk-JFplGwIyTS`YCZ)gX=GH!|GN_0=_t#y1A>y?zh>=n5A{K&6x`w(1Ogi(0M4 zwMG&2yFl&etL1>z?A{}j-8CB2?x?Zsg1lIlQikEQh`bYIH zHjpP2<=(O&zV#oPh#~-bXa|tQkxOD(xqms|o`;G)p9jGZiA8DEoZPB6Xs6R5 zeVWWL!{mB!QfO~7`Nu9q-6osc%VUwrW$dpkx8`7Sg4iWt)JsFcM{|7>{&%ZKjj<0R z^6ToYskI7$Wdv==voHCBwKS_(FY5Mld>6a~aOxNo5=XtmlCs_g27d;j@D;uQ8^l1y z_5lO11|1`1*?ri$%_6zMO$jwkT)H9(g5QVc0i(Q!5z@DFILdg=cS^W=%kH`|nak zzXL9P$l|Q?-ZxJp@^*i#aEliRtyI*36CHMYV5K@`rXv{bE z$=-I<43X3?zeUaLd~7XKAdVAdsRcIj1RBqi$8Y>RDIuoDL$+J@!VvV0T0ZRKz5rMU zh+kTafBF(7QO-rJ8KNzA*`!SJ>>$(h8*52?j}HIf#>^2oFO`A27wVoWuOf6sN`(%K zNtNnPn%w5J(oo@Pyy^A)JF6vnM3x@HfL*t~INn&KWbv^~%hN8MJvg@qCO0zD8ZdCp zLwd1pV`*|NkGf8RXuS|l9^kjPP~cC9RN5&e;hzsFfw_vY&bNT?J#2+8qpozc0NvrK zL%DPn=ie4&3Z%}7Rl{afZ_}B2*g)C^rV&d`IAt}lsm4lX0|L9u_6gNx=|X-Tr!^cp z{!Ql4mhZQ8aA=cbd*s%SB)0W$G9HRWhjZYe&|cQZLbxCYfSdYWPScmh4FDsSdL7~* z!5*65b`Q4c>Tk|nyXl!%FKz>gfrG45J$pi>{9VA9?c%b@=DK8@jXPXG`@1wl4*Gei z=-UO0Rvdk`RhRDEkRvD;V4yNlVM$D^p!+K?r2JDWxaDxs8ktO&tn;Rd#P;!J&yWjk+2kgu=k=W7e9ZXn$7O%opP zw~7%el_Hvt`jV}}3L2LHv;F?XmF3%dK3`jSMlx#q%a8ZRL#k8zjz{@K?-E@B_|_v} zBdFw{5+e5d`ycSK7}oatM&*idgpG1beF%OS#?OEAdo9x!$l}e(0C|Hg4gU9^Dk?w! ze7LwAfKORj8CO}E!(Llk>tCO?76Yiic&v?}B4wxL{OSHOYm^B*h22+NSo}hv;qh}T z;P^^^J*(XQ3C|RtmC&GbWMaGS@x0pM%`pg1=1h}y6Kkv&HmRGCK$CWN3$@2=6!QXR zC>wN-xIi1u-UUAMSz%_ijE?ow+&#cbKDE!<&rOw>VQYe{v$`((icq(*HbEBreF@x4 zQ+sJp-N>_xE2bX^uT8m4Qw{mqwYkvZK&TP=UQ@L2prd&Q3aya$yMOUTlnzPRvj+Py zEqg~w(IQEU<1=BqL={UCQw-`5fsZpPY>1uCv;m4keY6YpiKuaj1P%1YH?Mko2i)=< zUC<)&ffI4Kc6n!jc2{!+u|j2A&cvFEgx;+7_+ic!FEop|CHmlW6c15F#o^^y*o$%8 zy!aHmwWkFGyb0@j6-)~ewC%bHr<1j%(_v&m(6z!E$N&lrU4gDPj z)Z{v<>x32QtA0F(!o#-;YFzR_;>oOOYMBEPv>utc#Gbppj0+?`Q0OmeIVT+{_E@cgmhFkDDlgZ@bxd``vJ4MvAmWFw#tiV1E!drC_l8}uUQiT36N&o#&yEZaxP=6C z?^};4uzGR5$cS6g#9Z0ss+K7iJsZ?kwbd(Znv#7fwj%sv*Ejep6ZRFU13_O}_WULZ za3xl0mDLXsf(4j+B4uQ@D)q_btrhBBD1_YK@P>SPt{7Y;R=d&oj%w{PT%z=5i?Ux9 z_iM>Et&IHbGuFlNM>K8=o90Zs{zosOs?d>YYAV@9i#act?H~(xPdQ6(cCvP*$8WoM zdXeP?Ba!u570ip6!<|xA3!+f%EiF#C-MP{m&DQ76;mV_~2ZQkg~Yd5)~9Yt-7xJ~4wmVTxLN3@%Ckzb{2 z5|0`CCXlJ?ll-}W#CoiK)4A24$ zw~}`OW2Vr7?FmYK8oiG3pHyq;xJILjsOPWX_J`(JHP5u+!+jQD?EnTJc;&E?rlCxYdmjF|t3+o(e02H!Y3EAeL$ap(FIEeDt^1(p zGhYw~);KtHyYTcj)@nH=Cgw&9qfrEm&{=(TMShKah<06YF72n9W zkbQM$O8KKQ{FcSy`nF_NKXcnY zX_{-=G2Bgao2aC6*1LRPy=I)LG0^P3(Tryo26V~G1K|h2El!IMO~m2l%Q3r$)>G>; z&cW|Xp3^=^eAS(C5K=V!W)@vJVprj5F+HAZc(V;Pe>^E#nbt!!RXo*Gt4b!B^Ax^# zWdtnbcT_;y+(n$B@sRyqX?dk%#c%0DmMW47l`8y-3~QHlJA!?naj79z_@$eATJ)0d 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∨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
© COPYRIGHT 2009 STMicroelectronics
- */ - -/* Includes ------------------------------------------------------------------*/ -#include "sdcard.h" -#include - -/** @addtogroup STM32F10x_StdPeriph_Examples - * @{ - */ - -/** @addtogroup SDIO_Example - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define NULL 0 -#define SDIO_STATIC_FLAGS ((uint32_t)0x000005FF) -#define SDIO_CMD0TIMEOUT ((uint32_t)0x00002710) -#define SDIO_FIFO_Address ((uint32_t)0x40018080) - -/* Mask for errors Card Status R1 (OCR Register) */ -#define SD_OCR_ADDR_OUT_OF_RANGE ((uint32_t)0x80000000) -#define SD_OCR_ADDR_MISALIGNED ((uint32_t)0x40000000) -#define SD_OCR_BLOCK_LEN_ERR ((uint32_t)0x20000000) -#define SD_OCR_ERASE_SEQ_ERR ((uint32_t)0x10000000) -#define SD_OCR_BAD_ERASE_PARAM ((uint32_t)0x08000000) -#define SD_OCR_WRITE_PROT_VIOLATION ((uint32_t)0x04000000) -#define SD_OCR_LOCK_UNLOCK_FAILED ((uint32_t)0x01000000) -#define SD_OCR_COM_CRC_FAILED ((uint32_t)0x00800000) -#define SD_OCR_ILLEGAL_CMD ((uint32_t)0x00400000) -#define SD_OCR_CARD_ECC_FAILED ((uint32_t)0x00200000) -#define SD_OCR_CC_ERROR ((uint32_t)0x00100000) -#define SD_OCR_GENERAL_UNKNOWN_ERROR ((uint32_t)0x00080000) -#define SD_OCR_STREAM_READ_UNDERRUN ((uint32_t)0x00040000) -#define SD_OCR_STREAM_WRITE_OVERRUN ((uint32_t)0x00020000) -#define SD_OCR_CID_CSD_OVERWRIETE ((uint32_t)0x00010000) -#define SD_OCR_WP_ERASE_SKIP ((uint32_t)0x00008000) -#define SD_OCR_CARD_ECC_DISABLED ((uint32_t)0x00004000) -#define SD_OCR_ERASE_RESET ((uint32_t)0x00002000) -#define SD_OCR_AKE_SEQ_ERROR ((uint32_t)0x00000008) -#define SD_OCR_ERRORBITS ((uint32_t)0xFDFFE008) - -/* Masks for R6 Response */ -#define SD_R6_GENERAL_UNKNOWN_ERROR ((uint32_t)0x00002000) -#define SD_R6_ILLEGAL_CMD ((uint32_t)0x00004000) -#define SD_R6_COM_CRC_FAILED ((uint32_t)0x00008000) - -#define SD_VOLTAGE_WINDOW_SD ((uint32_t)0x80100000) -#define SD_HIGH_CAPACITY ((uint32_t)0x40000000) -#define SD_STD_CAPACITY ((uint32_t)0x00000000) -#define SD_CHECK_PATTERN ((uint32_t)0x000001AA) -#define SD_VOLTAGE_WINDOW_MMC ((uint32_t)0x80FF8000) - -#define SD_MAX_VOLT_TRIAL ((uint32_t)0x0000FFFF) -#define SD_ALLZERO ((uint32_t)0x00000000) - -#define SD_WIDE_BUS_SUPPORT ((uint32_t)0x00040000) -#define SD_SINGLE_BUS_SUPPORT ((uint32_t)0x00010000) -#define SD_CARD_LOCKED ((uint32_t)0x02000000) -#define SD_CARD_PROGRAMMING ((uint32_t)0x00000007) -#define SD_CARD_RECEIVING ((uint32_t)0x00000006) -#define SD_DATATIMEOUT ((uint32_t)0xFFFFFFFF) -#define SD_0TO7BITS ((uint32_t)0x000000FF) -#define SD_8TO15BITS ((uint32_t)0x0000FF00) -#define SD_16TO23BITS ((uint32_t)0x00FF0000) -#define SD_24TO31BITS ((uint32_t)0xFF000000) -#define SD_MAX_DATA_LENGTH ((uint32_t)0x01FFFFFF) - -#define SD_HALFFIFO ((uint32_t)0x00000008) -#define SD_HALFFIFOBYTES ((uint32_t)0x00000020) - -/* Command Class Supported */ -#define SD_CCCC_LOCK_UNLOCK ((uint32_t)0x00000080) -#define SD_CCCC_WRITE_PROT ((uint32_t)0x00000040) -#define SD_CCCC_ERASE ((uint32_t)0x00000020) - -/* Following commands are SD Card Specific commands. - SDIO_APP_CMD should be sent before sending these commands. */ -#define SDIO_SEND_IF_COND ((uint32_t)0x00000008) - -#define SDIO_INIT_CLK_DIV ((uint8_t)0xB2) -#define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x1) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -static uint32_t CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1; -static uint32_t CSD_Tab[4], CID_Tab[4], RCA = 0; -static uint32_t DeviceMode = SD_POLLING_MODE; -static uint32_t TotalNumberOfBytes = 0, StopCondition = 0; -uint32_t *SrcBuffer, *DestBuffer; -volatile SD_Error TransferError = SD_OK; -__IO uint32_t TransferEnd = 0; -__IO uint32_t NumberOfBytes = 0; -SDIO_InitTypeDef SDIO_InitStructure; -SDIO_CmdInitTypeDef SDIO_CmdInitStructure; -SDIO_DataInitTypeDef SDIO_DataInitStructure; - -/* Private function prototypes -----------------------------------------------*/ -static SD_Error CmdError(void); -static SD_Error CmdResp1Error(uint8_t cmd); -static SD_Error CmdResp7Error(void); -static SD_Error CmdResp3Error(void); -static SD_Error CmdResp2Error(void); -static SD_Error CmdResp6Error(uint8_t cmd, uint16_t *prca); -static SD_Error SDEnWideBus(FunctionalState NewState); -static SD_Error IsCardProgramming(uint8_t *pstatus); -static SD_Error FindSCR(uint16_t rca, uint32_t *pscr); -static uint8_t convert_from_bytes_to_power_of_two(uint16_t NumberOfBytes); -static void GPIO_Configuration(void); -static void DMA_TxConfiguration(uint32_t *BufferSRC, uint32_t BufferSize); -static void DMA_RxConfiguration(uint32_t *BufferDST, uint32_t BufferSize); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Initializes the SD Card and put it into StandBy State (Ready - * for data transfer). - * @param None - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_Init(void) -{ - SD_Error errorstatus = SD_OK; - - /* Configure SDIO interface GPIO */ - GPIO_Configuration(); - - /* Enable the SDIO AHB Clock */ - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO, ENABLE); - - /* Enable the DMA2 Clock */ - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); - - SDIO_DeInit(); - - errorstatus = SD_PowerON(); - - if (errorstatus != SD_OK) - { - /* CMD Response TimeOut (wait for CMDSENT flag) */ - return(errorstatus); - } - - errorstatus = SD_InitializeCards(); - - if (errorstatus != SD_OK) - { - /* CMD Response TimeOut (wait for CMDSENT flag) */ - return(errorstatus); - } - - /* Configure the SDIO peripheral */ - /* HCLK = 72 MHz, SDIOCLK = 72 MHz, SDIO_CK = HCLK/(2 + 1) = 24 MHz */ - SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV; - SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; - SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; - SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; - SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b; - SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Enable; - SDIO_Init(&SDIO_InitStructure); - - return(errorstatus); -} - -/** - * @brief Enquires cards about their operating voltage and configures - * clock controls. - * @param None - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_PowerON(void) -{ - SD_Error errorstatus = SD_OK; - uint32_t response = 0, count = 0; - bool validvoltage = FALSE; - uint32_t SDType = SD_STD_CAPACITY; - - /* Power ON Sequence -------------------------------------------------------*/ - /* Configure the SDIO peripheral */ - SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV; /* HCLK = 72MHz, SDIOCLK = 72MHz, SDIO_CK = HCLK/(178 + 2) = 400 KHz */ - SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; - SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; - SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; - SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b; - SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; - SDIO_Init(&SDIO_InitStructure); - - /* Set Power State to ON */ - SDIO_SetPowerState(SDIO_PowerState_ON); - - /* Enable SDIO Clock */ - SDIO_ClockCmd(ENABLE); - - /* CMD0: GO_IDLE_STATE -------------------------------------------------------*/ - /* No CMD response required */ - SDIO_CmdInitStructure.SDIO_Argument = 0x0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_GO_IDLE_STATE; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdError(); - - if (errorstatus != SD_OK) - { - /* CMD Response TimeOut (wait for CMDSENT flag) */ - return(errorstatus); - } - - /* CMD8: SEND_IF_COND --------------------------------------------------------*/ - /* Send CMD8 to verify SD card interface operating condition */ - /* Argument: - [31:12]: Reserved (shall be set to '0') - - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V) - - [7:0]: Check Pattern (recommended 0xAA) */ - /* CMD Response: R7 */ - SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_COND; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp7Error(); - - if (errorstatus == SD_OK) - { - CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0; /* SD Card 2.0 */ - SDType = SD_HIGH_CAPACITY; - } - else - { - /* CMD55 */ - SDIO_CmdInitStructure.SDIO_Argument = 0x00; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SDIO_APP_CMD); - } - /* CMD55 */ - SDIO_CmdInitStructure.SDIO_Argument = 0x00; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SDIO_APP_CMD); - - /* If errorstatus is Command TimeOut, it is a MMC card */ - /* If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch) - or SD card 1.x */ - if (errorstatus == SD_OK) - { - /* SD CARD */ - /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */ - while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL)) - { - - /* SEND CMD55 APP_CMD with RCA as 0 */ - SDIO_CmdInitStructure.SDIO_Argument = 0x00; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_APP_CMD); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_OP_COND; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp3Error(); - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - response = SDIO_GetResponse(SDIO_RESP1); - validvoltage = (bool) (((response >> 31) == 1) ? 1 : 0); - count++; - } - if (count >= SD_MAX_VOLT_TRIAL) - { - errorstatus = SD_INVALID_VOLTRANGE; - return(errorstatus); - } - - if (response &= SD_HIGH_CAPACITY) - { - CardType = SDIO_HIGH_CAPACITY_SD_CARD; - } - }/* else MMC Card */ - else - { - CardType = SDIO_MULTIMEDIA_CARD; - - /* Send CMD1 SEND_OP_COND with Argument 0x80FF8000 */ - while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL)) - { - /* SEND CMD55 APP_CMD with RCA as 0 */ - SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_MMC; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_OP_COND; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp3Error(); - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - response = SDIO_GetResponse(SDIO_RESP1); - validvoltage = (bool) (((response >> 31) == 1) ? 1 : 0); - count++; - } - if (count >= SD_MAX_VOLT_TRIAL) - { - errorstatus = SD_INVALID_VOLTRANGE; - return(errorstatus); - } - } - - return(SD_OK); -} - -/** - * @brief Turns the SDIO output signals off. - * @param None - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_PowerOFF(void) -{ - SD_Error errorstatus = SD_OK; - - /* Set Power State to OFF */ - SDIO_SetPowerState(SDIO_PowerState_OFF); - - return(errorstatus); -} - -/** - * @brief Intialises all cards or single card as the case may be. - * Card(s) come into standby state. - * @param None - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_InitializeCards(void) -{ - SD_Error errorstatus = SD_OK; - uint16_t rca = 0x01; - - if (SDIO_GetPowerState() == SDIO_PowerState_OFF) - { - errorstatus = SD_REQUEST_NOT_APPLICABLE; - return(errorstatus); - } - - if (SDIO_SECURE_DIGITAL_IO_CARD != CardType) - { - /* Send CMD2 ALL_SEND_CID */ - SDIO_CmdInitStructure.SDIO_Argument = 0x0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_ALL_SEND_CID; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp2Error(); - - if (SD_OK != errorstatus) - { - return(errorstatus); - } - - CID_Tab[0] = SDIO_GetResponse(SDIO_RESP1); - CID_Tab[1] = SDIO_GetResponse(SDIO_RESP2); - CID_Tab[2] = SDIO_GetResponse(SDIO_RESP3); - CID_Tab[3] = SDIO_GetResponse(SDIO_RESP4); - } - if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_SECURE_DIGITAL_IO_COMBO_CARD == CardType) - || (SDIO_HIGH_CAPACITY_SD_CARD == CardType)) - { - /* Send CMD3 SET_REL_ADDR with argument 0 */ - /* SD Card publishes its RCA. */ - SDIO_CmdInitStructure.SDIO_Argument = 0x00; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_REL_ADDR; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp6Error(SDIO_SET_REL_ADDR, &rca); - - if (SD_OK != errorstatus) - { - return(errorstatus); - } - } - if (SDIO_MULTIMEDIA_CARD == CardType) - { - /* Send CMD3 SET_REL_ADDR with argument 0 */ - /* SD Card publishes its RCA. */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)(rca << 16); - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_REL_ADDR; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp2Error(); - - if (SD_OK != errorstatus) - { - return(errorstatus); - } - } - - if (SDIO_SECURE_DIGITAL_IO_CARD != CardType) - { - RCA = rca; - - /* Send CMD9 SEND_CSD with argument as card's RCA */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)(rca << 16); - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_CSD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp2Error(); - - if (SD_OK != errorstatus) - { - return(errorstatus); - } - - CSD_Tab[0] = SDIO_GetResponse(SDIO_RESP1); - CSD_Tab[1] = SDIO_GetResponse(SDIO_RESP2); - CSD_Tab[2] = SDIO_GetResponse(SDIO_RESP3); - CSD_Tab[3] = SDIO_GetResponse(SDIO_RESP4); - } - - errorstatus = SD_OK; /* All cards get intialized */ - - return(errorstatus); -} - -/** - * @brief Returns information about specific card. - * @param cardinfo : pointer to a SD_CardInfo structure - * that contains all SD card information. - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo) -{ - SD_Error errorstatus = SD_OK; - uint8_t tmp = 0; - - cardinfo->CardType = (uint8_t)CardType; - cardinfo->RCA = (uint16_t)RCA; - - /* Byte 0 */ - tmp = (uint8_t)((CSD_Tab[0] & 0xFF000000) >> 24); - cardinfo->SD_csd.CSDStruct = (tmp & 0xC0) >> 6; - cardinfo->SD_csd.SysSpecVersion = (tmp & 0x3C) >> 2; - cardinfo->SD_csd.Reserved1 = tmp & 0x03; - - /* Byte 1 */ - tmp = (uint8_t)((CSD_Tab[0] & 0x00FF0000) >> 16); - cardinfo->SD_csd.TAAC = tmp; - - /* Byte 2 */ - tmp = (uint8_t)((CSD_Tab[0] & 0x0000FF00) >> 8); - cardinfo->SD_csd.NSAC = tmp; - - /* Byte 3 */ - tmp = (uint8_t)(CSD_Tab[0] & 0x000000FF); - cardinfo->SD_csd.MaxBusClkFrec = tmp; - - /* Byte 4 */ - tmp = (uint8_t)((CSD_Tab[1] & 0xFF000000) >> 24); - cardinfo->SD_csd.CardComdClasses = tmp << 4; - - /* Byte 5 */ - tmp = (uint8_t)((CSD_Tab[1] & 0x00FF0000) >> 16); - cardinfo->SD_csd.CardComdClasses |= (tmp & 0xF0) >> 4; - cardinfo->SD_csd.RdBlockLen = tmp & 0x0F; - - /* Byte 6 */ - tmp = (uint8_t)((CSD_Tab[1] & 0x0000FF00) >> 8); - cardinfo->SD_csd.PartBlockRead = (tmp & 0x80) >> 7; - cardinfo->SD_csd.WrBlockMisalign = (tmp & 0x40) >> 6; - cardinfo->SD_csd.RdBlockMisalign = (tmp & 0x20) >> 5; - cardinfo->SD_csd.DSRImpl = (tmp & 0x10) >> 4; - cardinfo->SD_csd.Reserved2 = 0; /* Reserved */ - - if ((CardType == SDIO_STD_CAPACITY_SD_CARD_V1_1) || (CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0)) - { - cardinfo->SD_csd.DeviceSize = (tmp & 0x03) << 10; - - /* Byte 7 */ - tmp = (uint8_t)(CSD_Tab[1] & 0x000000FF); - cardinfo->SD_csd.DeviceSize |= (tmp) << 2; - - /* Byte 8 */ - tmp = (uint8_t)((CSD_Tab[2] & 0xFF000000) >> 24); - cardinfo->SD_csd.DeviceSize |= (tmp & 0xC0) >> 6; - - cardinfo->SD_csd.MaxRdCurrentVDDMin = (tmp & 0x38) >> 3; - cardinfo->SD_csd.MaxRdCurrentVDDMax = (tmp & 0x07); - - /* Byte 9 */ - tmp = (uint8_t)((CSD_Tab[2] & 0x00FF0000) >> 16); - cardinfo->SD_csd.MaxWrCurrentVDDMin = (tmp & 0xE0) >> 5; - cardinfo->SD_csd.MaxWrCurrentVDDMax = (tmp & 0x1C) >> 2; - cardinfo->SD_csd.DeviceSizeMul = (tmp & 0x03) << 1; - /* Byte 10 */ - tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8); - cardinfo->SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7; - - cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) ; - cardinfo->CardCapacity *= (1 << (cardinfo->SD_csd.DeviceSizeMul + 2)); - cardinfo->CardBlockSize = 1 << (cardinfo->SD_csd.RdBlockLen); - cardinfo->CardCapacity *= cardinfo->CardBlockSize; - } - else if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) - { - /* Byte 7 */ - tmp = (uint8_t)(CSD_Tab[1] & 0x000000FF); - cardinfo->SD_csd.DeviceSize = (tmp & 0x3F) << 16; - - /* Byte 8 */ - tmp = (uint8_t)((CSD_Tab[2] & 0xFF000000) >> 24); - - cardinfo->SD_csd.DeviceSize |= (tmp << 8); - - /* Byte 9 */ - tmp = (uint8_t)((CSD_Tab[2] & 0x00FF0000) >> 16); - - cardinfo->SD_csd.DeviceSize |= (tmp); - - /* Byte 10 */ - tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8); - - cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024; - cardinfo->CardBlockSize = 512; - } - - - cardinfo->SD_csd.EraseGrSize = (tmp & 0x40) >> 6; - cardinfo->SD_csd.EraseGrMul = (tmp & 0x3F) << 1; - - /* Byte 11 */ - tmp = (uint8_t)(CSD_Tab[2] & 0x000000FF); - cardinfo->SD_csd.EraseGrMul |= (tmp & 0x80) >> 7; - cardinfo->SD_csd.WrProtectGrSize = (tmp & 0x7F); - - /* Byte 12 */ - tmp = (uint8_t)((CSD_Tab[3] & 0xFF000000) >> 24); - cardinfo->SD_csd.WrProtectGrEnable = (tmp & 0x80) >> 7; - cardinfo->SD_csd.ManDeflECC = (tmp & 0x60) >> 5; - cardinfo->SD_csd.WrSpeedFact = (tmp & 0x1C) >> 2; - cardinfo->SD_csd.MaxWrBlockLen = (tmp & 0x03) << 2; - - /* Byte 13 */ - tmp = (uint8_t)((CSD_Tab[3] & 0x00FF0000) >> 16); - cardinfo->SD_csd.MaxWrBlockLen |= (tmp & 0xC0) >> 6; - cardinfo->SD_csd.WriteBlockPaPartial = (tmp & 0x20) >> 5; - cardinfo->SD_csd.Reserved3 = 0; - cardinfo->SD_csd.ContentProtectAppli = (tmp & 0x01); - - /* Byte 14 */ - tmp = (uint8_t)((CSD_Tab[3] & 0x0000FF00) >> 8); - cardinfo->SD_csd.FileFormatGrouop = (tmp & 0x80) >> 7; - cardinfo->SD_csd.CopyFlag = (tmp & 0x40) >> 6; - cardinfo->SD_csd.PermWrProtect = (tmp & 0x20) >> 5; - cardinfo->SD_csd.TempWrProtect = (tmp & 0x10) >> 4; - cardinfo->SD_csd.FileFormat = (tmp & 0x0C) >> 2; - cardinfo->SD_csd.ECC = (tmp & 0x03); - - /* Byte 15 */ - tmp = (uint8_t)(CSD_Tab[3] & 0x000000FF); - cardinfo->SD_csd.CSD_CRC = (tmp & 0xFE) >> 1; - cardinfo->SD_csd.Reserved4 = 1; - - - /* Byte 0 */ - tmp = (uint8_t)((CID_Tab[0] & 0xFF000000) >> 24); - cardinfo->SD_cid.ManufacturerID = tmp; - - /* Byte 1 */ - tmp = (uint8_t)((CID_Tab[0] & 0x00FF0000) >> 16); - cardinfo->SD_cid.OEM_AppliID = tmp << 8; - - /* Byte 2 */ - tmp = (uint8_t)((CID_Tab[0] & 0x000000FF00) >> 8); - cardinfo->SD_cid.OEM_AppliID |= tmp; - - /* Byte 3 */ - tmp = (uint8_t)(CID_Tab[0] & 0x000000FF); - cardinfo->SD_cid.ProdName1 = tmp << 24; - - /* Byte 4 */ - tmp = (uint8_t)((CID_Tab[1] & 0xFF000000) >> 24); - cardinfo->SD_cid.ProdName1 |= tmp << 16; - - /* Byte 5 */ - tmp = (uint8_t)((CID_Tab[1] & 0x00FF0000) >> 16); - cardinfo->SD_cid.ProdName1 |= tmp << 8; - - /* Byte 6 */ - tmp = (uint8_t)((CID_Tab[1] & 0x0000FF00) >> 8); - cardinfo->SD_cid.ProdName1 |= tmp; - - /* Byte 7 */ - tmp = (uint8_t)(CID_Tab[1] & 0x000000FF); - cardinfo->SD_cid.ProdName2 = tmp; - - /* Byte 8 */ - tmp = (uint8_t)((CID_Tab[2] & 0xFF000000) >> 24); - cardinfo->SD_cid.ProdRev = tmp; - - /* Byte 9 */ - tmp = (uint8_t)((CID_Tab[2] & 0x00FF0000) >> 16); - cardinfo->SD_cid.ProdSN = tmp << 24; - - /* Byte 10 */ - tmp = (uint8_t)((CID_Tab[2] & 0x0000FF00) >> 8); - cardinfo->SD_cid.ProdSN |= tmp << 16; - - /* Byte 11 */ - tmp = (uint8_t)(CID_Tab[2] & 0x000000FF); - cardinfo->SD_cid.ProdSN |= tmp << 8; - - /* Byte 12 */ - tmp = (uint8_t)((CID_Tab[3] & 0xFF000000) >> 24); - cardinfo->SD_cid.ProdSN |= tmp; - - /* Byte 13 */ - tmp = (uint8_t)((CID_Tab[3] & 0x00FF0000) >> 16); - cardinfo->SD_cid.Reserved1 |= (tmp & 0xF0) >> 4; - cardinfo->SD_cid.ManufactDate = (tmp & 0x0F) << 8; - - /* Byte 14 */ - tmp = (uint8_t)((CID_Tab[3] & 0x0000FF00) >> 8); - cardinfo->SD_cid.ManufactDate |= tmp; - - /* Byte 15 */ - tmp = (uint8_t)(CID_Tab[3] & 0x000000FF); - cardinfo->SD_cid.CID_CRC = (tmp & 0xFE) >> 1; - cardinfo->SD_cid.Reserved2 = 1; - - return(errorstatus); -} - -/** - * @brief Enables wide bus opeartion for the requeseted card if - * supported by card. - * @param WideMode: Specifies the SD card wide bus mode. - * This parameter can be one of the following values: - * @arg SDIO_BusWide_8b: 8-bit data transfer (Only for MMC) - * @arg SDIO_BusWide_4b: 4-bit data transfer - * @arg SDIO_BusWide_1b: 1-bit data transfer - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_EnableWideBusOperation(uint32_t WideMode) -{ - SD_Error errorstatus = SD_OK; - - /* MMC Card doesn't support this feature */ - if (SDIO_MULTIMEDIA_CARD == CardType) - { - errorstatus = SD_UNSUPPORTED_FEATURE; - return(errorstatus); - } - else if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType)) - { - if (SDIO_BusWide_8b == WideMode) - { - errorstatus = SD_UNSUPPORTED_FEATURE; - return(errorstatus); - } - else if (SDIO_BusWide_4b == WideMode) - { - errorstatus = SDEnWideBus(ENABLE); - - if (SD_OK == errorstatus) - { - /* Configure the SDIO peripheral */ - SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV; - SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; - SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; - SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; - SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_4b; - SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; - SDIO_Init(&SDIO_InitStructure); - } - } - else - { - errorstatus = SDEnWideBus(DISABLE); - - if (SD_OK == errorstatus) - { - /* Configure the SDIO peripheral */ - SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV; - SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; - SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; - SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; - SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b; - SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; - SDIO_Init(&SDIO_InitStructure); - } - } - } - - return(errorstatus); -} - -/** - * @brief Sets device mode whether to operate in Polling, Interrupt or - * DMA mode. - * @param Mode: Specifies the Data Transfer mode. - * This parameter can be one of the following values: - * @arg SD_DMA_MODE: Data transfer using DMA. - * @arg SD_INTERRUPT_MODE: Data transfer using interrupts. - * @arg SD_POLLING_MODE: Data transfer using flags. - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_SetDeviceMode(uint32_t Mode) -{ - SD_Error errorstatus = SD_OK; - - if ((Mode == SD_DMA_MODE) || (Mode == SD_INTERRUPT_MODE) || (Mode == SD_POLLING_MODE)) - { - DeviceMode = Mode; - } - else - { - errorstatus = SD_INVALID_PARAMETER; - } - return(errorstatus); - -} - -/** - * @brief Selects od Deselects the corresponding card. - * @param addr: Address of the Card to be selected. - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_SelectDeselect(uint32_t addr) -{ - SD_Error errorstatus = SD_OK; - - /* Send CMD7 SDIO_SEL_DESEL_CARD */ - SDIO_CmdInitStructure.SDIO_Argument = addr; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEL_DESEL_CARD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SEL_DESEL_CARD); - - return(errorstatus); -} - -/** - * @brief Allows to read one block from a specified address in a card. - * @param addr: Address from where data are to be read. - * @param readbuff: pointer to the buffer that will contain the - * received data - * @param BlockSize: the SD card Data block size. - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_ReadBlock(uint32_t addr, uint32_t *readbuff, uint16_t BlockSize) -{ - SD_Error errorstatus = SD_OK; - uint32_t count = 0, *tempbuff = readbuff; - uint8_t power = 0; - - if (NULL == readbuff) - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - TransferError = SD_OK; - TransferEnd = 0; - TotalNumberOfBytes = 0; - - /* Clear all DPSM configuration */ - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = 0; - SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Disable; - SDIO_DataConfig(&SDIO_DataInitStructure); - SDIO_DMACmd(DISABLE); - - if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) - { - errorstatus = SD_LOCK_UNLOCK_FAILED; - return(errorstatus); - } - - if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512; - addr /= 512; - } - if ((BlockSize > 0) && (BlockSize <= 2048) && ((BlockSize & (BlockSize - 1)) == 0)) - { - power = convert_from_bytes_to_power_of_two(BlockSize); - - /* Set Block Size for Card */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN); - - if (SD_OK != errorstatus) - { - return(errorstatus); - } - } - else - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = BlockSize; - SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) power << 4; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; - SDIO_DataConfig(&SDIO_DataInitStructure); - - TotalNumberOfBytes = BlockSize; - StopCondition = 0; - DestBuffer = readbuff; - - /* Send CMD17 READ_SINGLE_BLOCK */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)addr; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_READ_SINGLE_BLOCK; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_READ_SINGLE_BLOCK); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - /* In case of single block transfer, no need of stop transfer at all.*/ - if (DeviceMode == SD_POLLING_MODE) - { - /* Polling mode */ - while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))) - { - if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET) - { - for (count = 0; count < 8; count++) - { - *(tempbuff + count) = SDIO_ReadData(); - } - tempbuff += 8; - } - } - - if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT); - errorstatus = SD_DATA_TIMEOUT; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL); - errorstatus = SD_DATA_CRC_FAIL; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_RXOVERR); - errorstatus = SD_RX_OVERRUN; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_STBITERR); - errorstatus = SD_START_BIT_ERR; - return(errorstatus); - } - while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET) - { - *tempbuff = SDIO_ReadData(); - tempbuff++; - } - - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - } - else if (DeviceMode == SD_INTERRUPT_MODE) - { - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR, ENABLE); - while ((TransferEnd == 0) && (TransferError == SD_OK)) - {} - if (TransferError != SD_OK) - { - return(TransferError); - } - } - else if (DeviceMode == SD_DMA_MODE) - { - rt_tick_t tick; - - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE); - SDIO_DMACmd(ENABLE); - tick = rt_tick_get(); - DMA_RxConfiguration(readbuff, BlockSize); - while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) - { - if ((TransferError != SD_OK) || (rt_tick_get() - tick > 10)) - { - errorstatus = SD_ERROR; - // rt_kprintf("sd error\n"); - break; - } - } - } - return(errorstatus); -} - -/** - * @brief Allows to read blocks from a specified address in a card. - * @param addr: Address from where data are to be read. - * @param readbuff: pointer to the buffer that will contain the - * received data. - * @param BlockSize: the SD card Data block size. - * @param NumberOfBlocks: number of blocks to be read. - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_ReadMultiBlocks(uint32_t addr, uint32_t *readbuff, uint16_t BlockSize, uint32_t NumberOfBlocks) -{ - SD_Error errorstatus = SD_OK; - uint32_t count = 0, *tempbuff = readbuff; - uint8_t power = 0; - - if (NULL == readbuff) - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - TransferError = SD_OK; - TransferEnd = 0; - TotalNumberOfBytes = 0; - - /* Clear all DPSM configuration */ - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = 0; - SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Disable; - SDIO_DataConfig(&SDIO_DataInitStructure); - SDIO_DMACmd(DISABLE); - - if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) - { - errorstatus = SD_LOCK_UNLOCK_FAILED; - return(errorstatus); - } - - if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512; - addr /= 512; - } - - if ((BlockSize > 0) && (BlockSize <= 2048) && (0 == (BlockSize & (BlockSize - 1)))) - { - power = convert_from_bytes_to_power_of_two(BlockSize); - - /* Set Block Size for Card */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN); - - if (SD_OK != errorstatus) - { - return(errorstatus); - } - } - else - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - if (NumberOfBlocks > 1) - { - /* Common to all modes */ - if (NumberOfBlocks * BlockSize > SD_MAX_DATA_LENGTH) - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - TotalNumberOfBytes = NumberOfBlocks * BlockSize; - StopCondition = 1; - DestBuffer = readbuff; - - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize; - SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) power << 4; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; - SDIO_DataConfig(&SDIO_DataInitStructure); - - /* Send CMD18 READ_MULT_BLOCK with argument data address */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)addr; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_READ_MULT_BLOCK; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_READ_MULT_BLOCK); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - if (DeviceMode == SD_POLLING_MODE) - { - /* Polling mode */ - while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DATAEND | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR))) - { - if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET) - { - for (count = 0; count < SD_HALFFIFO; count++) - { - *(tempbuff + count) = SDIO_ReadData(); - } - tempbuff += SD_HALFFIFO; - } - } - - if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT); - errorstatus = SD_DATA_TIMEOUT; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL); - errorstatus = SD_DATA_CRC_FAIL; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_RXOVERR); - errorstatus = SD_RX_OVERRUN; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_STBITERR); - errorstatus = SD_START_BIT_ERR; - return(errorstatus); - } - while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET) - { - *tempbuff = SDIO_ReadData(); - tempbuff++; - } - - if (SDIO_GetFlagStatus(SDIO_FLAG_DATAEND) != RESET) - { - /* In Case Of SD-CARD Send Command STOP_TRANSMISSION */ - if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType)) - { - /* Send CMD12 STOP_TRANSMISSION */ - SDIO_CmdInitStructure.SDIO_Argument = 0x0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_STOP_TRANSMISSION; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_STOP_TRANSMISSION); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - } - } - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - } - else if (DeviceMode == SD_INTERRUPT_MODE) - { - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR, ENABLE); - while ((TransferEnd == 0) && (TransferError == SD_OK)) - {} - if (TransferError != SD_OK) - { - return(TransferError); - } - } - else if (DeviceMode == SD_DMA_MODE) - { - rt_tick_t tick; - - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE); - SDIO_DMACmd(ENABLE); - tick = rt_tick_get(); - DMA_RxConfiguration(readbuff, (NumberOfBlocks * BlockSize)); - while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) - { - if ((TransferError != SD_OK) || (rt_tick_get() - tick > 10)) - { - errorstatus = SD_ERROR; - // rt_kprintf("sd error\n"); - return errorstatus; - } - } - while ((TransferEnd == 0) && (TransferError == SD_OK)) - {} - if (TransferError != SD_OK) - { - return(TransferError); - } - } - } - return(errorstatus); -} - -/** - * @brief Allows to write one block starting from a specified address - * in a card. - * @param addr: Address from where data are to be read. - * @param writebuff: pointer to the buffer that contain the data to be - * transferred. - * @param BlockSize: the SD card Data block size. - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_WriteBlock(uint32_t addr, uint32_t *writebuff, uint16_t BlockSize) -{ - SD_Error errorstatus = SD_OK; - uint8_t power = 0, cardstate = 0; - uint32_t timeout = 0, bytestransferred = 0; - uint32_t cardstatus = 0, count = 0, restwords = 0; - uint32_t *tempbuff = writebuff; - - if (writebuff == NULL) - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - TransferError = SD_OK; - TransferEnd = 0; - TotalNumberOfBytes = 0; - - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = 0; - SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Disable; - SDIO_DataConfig(&SDIO_DataInitStructure); - SDIO_DMACmd(DISABLE); - - if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) - { - errorstatus = SD_LOCK_UNLOCK_FAILED; - return(errorstatus); - } - - if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512; - addr /= 512; - } - - /* Set the block size, both on controller and card */ - if ((BlockSize > 0) && (BlockSize <= 2048) && ((BlockSize & (BlockSize - 1)) == 0)) - { - power = convert_from_bytes_to_power_of_two(BlockSize); - - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - } - else - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - /* Wait till card is ready for data Added */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) (RCA << 16); - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SEND_STATUS); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - cardstatus = SDIO_GetResponse(SDIO_RESP1); - - timeout = SD_DATATIMEOUT; - - while (((cardstatus & 0x00000100) == 0) && (timeout > 0)) - { - timeout--; - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) (RCA << 16); - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SEND_STATUS); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - cardstatus = SDIO_GetResponse(SDIO_RESP1); - } - - if (timeout == 0) - { - return(SD_ERROR); - } - - /* Send CMD24 WRITE_SINGLE_BLOCK */ - SDIO_CmdInitStructure.SDIO_Argument = addr; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_WRITE_SINGLE_BLOCK; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_WRITE_SINGLE_BLOCK); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - TotalNumberOfBytes = BlockSize; - StopCondition = 0; - SrcBuffer = writebuff; - - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = BlockSize; - SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) power << 4; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; - SDIO_DataConfig(&SDIO_DataInitStructure); - - /* In case of single data block transfer no need of stop command at all */ - if (DeviceMode == SD_POLLING_MODE) - { - while (!(SDIO->STA & (SDIO_FLAG_DBCKEND | SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR))) - { - if (SDIO_GetFlagStatus(SDIO_FLAG_TXFIFOHE) != RESET) - { - if ((TotalNumberOfBytes - bytestransferred) < 32) - { - restwords = ((TotalNumberOfBytes - bytestransferred) % 4 == 0) ? ((TotalNumberOfBytes - bytestransferred) / 4) : (( TotalNumberOfBytes - bytestransferred) / 4 + 1); - - for (count = 0; count < restwords; count++, tempbuff++, bytestransferred += 4) - { - SDIO_WriteData(*tempbuff); - } - } - else - { - for (count = 0; count < 8; count++) - { - SDIO_WriteData(*(tempbuff + count)); - } - tempbuff += 8; - bytestransferred += 32; - } - } - } - if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT); - errorstatus = SD_DATA_TIMEOUT; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL); - errorstatus = SD_DATA_CRC_FAIL; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_TXUNDERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_TXUNDERR); - errorstatus = SD_TX_UNDERRUN; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_STBITERR); - errorstatus = SD_START_BIT_ERR; - return(errorstatus); - } - } - else if (DeviceMode == SD_INTERRUPT_MODE) - { - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE); - while ((TransferEnd == 0) && (TransferError == SD_OK)) - {} - if (TransferError != SD_OK) - { - return(TransferError); - } - } - else if (DeviceMode == SD_DMA_MODE) - { - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE); - DMA_TxConfiguration(writebuff, BlockSize); - SDIO_DMACmd(ENABLE); - while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) - {} - while ((TransferEnd == 0) && (TransferError == SD_OK)) - {} - if (TransferError != SD_OK) - { - return(TransferError); - } - } - - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - - /* Wait till the card is in programming state */ - errorstatus = IsCardProgramming(&cardstate); - - while ((errorstatus == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING))) - { - errorstatus = IsCardProgramming(&cardstate); - } - - return(errorstatus); -} - -/** - * @brief Allows to write blocks starting from a specified address in - * a card. - * @param addr: Address from where data are to be read. - * @param writebuff: pointer to the buffer that contain the data to be - * transferred. - * @param BlockSize: the SD card Data block size. - * @param NumberOfBlocks: number of blocks to be written. - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_WriteMultiBlocks(uint32_t addr, uint32_t *writebuff, uint16_t BlockSize, uint32_t NumberOfBlocks) -{ - SD_Error errorstatus = SD_OK; - uint8_t power = 0, cardstate = 0; - uint32_t bytestransferred = 0; - uint32_t count = 0, restwords = 0; - uint32_t *tempbuff = writebuff; - - if (writebuff == NULL) - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - TransferError = SD_OK; - TransferEnd = 0; - TotalNumberOfBytes = 0; - - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = 0; - SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Disable; - SDIO_DataConfig(&SDIO_DataInitStructure); - SDIO_DMACmd(DISABLE); - - if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) - { - errorstatus = SD_LOCK_UNLOCK_FAILED; - return(errorstatus); - } - - if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512; - addr /= 512; - } - - /* Set the block size, both on controller and card */ - if ((BlockSize > 0) && (BlockSize <= 2048) && ((BlockSize & (BlockSize - 1)) == 0)) - { - power = convert_from_bytes_to_power_of_two(BlockSize); - - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - } - else - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - /* Wait till card is ready for data Added */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) (RCA << 16); - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SEND_STATUS); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - if (NumberOfBlocks > 1) - { - /* Common to all modes */ - if (NumberOfBlocks * BlockSize > SD_MAX_DATA_LENGTH) - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType)) - { - /* To improve performance */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) (RCA << 16); - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - - errorstatus = CmdResp1Error(SDIO_APP_CMD); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - /* To improve performance */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)NumberOfBlocks; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCK_COUNT; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SET_BLOCK_COUNT); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - } - - /* Send CMD25 WRITE_MULT_BLOCK with argument data address */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)addr; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_WRITE_MULT_BLOCK; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_WRITE_MULT_BLOCK); - - if (SD_OK != errorstatus) - { - return(errorstatus); - } - - TotalNumberOfBytes = NumberOfBlocks * BlockSize; - StopCondition = 1; - SrcBuffer = writebuff; - - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize; - SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) power << 4; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; - SDIO_DataConfig(&SDIO_DataInitStructure); - - if (DeviceMode == SD_POLLING_MODE) - { - while (!(SDIO->STA & (SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DATAEND | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR))) - { - if (SDIO_GetFlagStatus(SDIO_FLAG_TXFIFOHE) != RESET) - { - if (!((TotalNumberOfBytes - bytestransferred) < SD_HALFFIFOBYTES)) - { - for (count = 0; count < SD_HALFFIFO; count++) - { - SDIO_WriteData(*(tempbuff + count)); - } - tempbuff += SD_HALFFIFO; - bytestransferred += SD_HALFFIFOBYTES; - } - else - { - restwords = ((TotalNumberOfBytes - bytestransferred) % 4 == 0) ? ((TotalNumberOfBytes - bytestransferred) / 4) : - ((TotalNumberOfBytes - bytestransferred) / 4 + 1); - - for (count = 0; count < restwords; count++, tempbuff++, bytestransferred += 4) - { - SDIO_WriteData(*tempbuff); - } - } - } - } - - if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT); - errorstatus = SD_DATA_TIMEOUT; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL); - errorstatus = SD_DATA_CRC_FAIL; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_TXUNDERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_TXUNDERR); - errorstatus = SD_TX_UNDERRUN; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_STBITERR); - errorstatus = SD_START_BIT_ERR; - return(errorstatus); - } - - if (SDIO_GetFlagStatus(SDIO_FLAG_DATAEND) != RESET) - { - if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType)) - { - /* Send CMD12 STOP_TRANSMISSION */ - SDIO_CmdInitStructure.SDIO_Argument = 0x0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_STOP_TRANSMISSION; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - - errorstatus = CmdResp1Error(SDIO_STOP_TRANSMISSION); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - } - } - } - else if (DeviceMode == SD_INTERRUPT_MODE) - { - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_TXFIFOHE | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE); - while ((TransferEnd == 0) && (TransferError == SD_OK)) - {} - if (TransferError != SD_OK) - { - return(TransferError); - } - } - else if (DeviceMode == SD_DMA_MODE) - { - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE); - SDIO_DMACmd(ENABLE); - DMA_TxConfiguration(writebuff, (NumberOfBlocks * BlockSize)); - while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) - {} - while ((TransferEnd == 0) && (TransferError == SD_OK)) - {} - if (TransferError != SD_OK) - { - return(TransferError); - } - } - } - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - - /* Wait till the card is in programming state */ - errorstatus = IsCardProgramming(&cardstate); - - while ((errorstatus == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING))) - { - errorstatus = IsCardProgramming(&cardstate); - } - - return(errorstatus); -} - -/** - * @brief Gets the cuurent data transfer state. - * @param None - * @retval SDTransferState: Data Transfer state. - * This value can be: - * - SD_NO_TRANSFER: No data transfer is acting - * - SD_TRANSFER_IN_PROGRESS: Data transfer is acting - */ -SDTransferState SD_GetTransferState(void) -{ - if (SDIO->STA & (SDIO_FLAG_TXACT | SDIO_FLAG_RXACT)) - { - return(SD_TRANSFER_IN_PROGRESS); - } - else - { - return(SD_NO_TRANSFER); - } -} - -/** - * @brief Aborts an ongoing data transfer. - * @param None - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_StopTransfer(void) -{ - SD_Error errorstatus = SD_OK; - - /* Send CMD12 STOP_TRANSMISSION */ - SDIO_CmdInitStructure.SDIO_Argument = 0x0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_STOP_TRANSMISSION; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_STOP_TRANSMISSION); - - return(errorstatus); -} - -/** - * @brief Allows to erase memory area specified for the given card. - * @param startaddr: the start address. - * @param endaddr: the end address. - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr) -{ - SD_Error errorstatus = SD_OK; - uint32_t delay = 0; - __IO uint32_t maxdelay = 0; - uint8_t cardstate = 0; - - /* Check if the card coomnd class supports erase command */ - if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0) - { - errorstatus = SD_REQUEST_NOT_APPLICABLE; - return(errorstatus); - } - - maxdelay = 72000 / ((SDIO->CLKCR & 0xFF) + 2); - - if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) - { - errorstatus = SD_LOCK_UNLOCK_FAILED; - return(errorstatus); - } - - if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) - { - startaddr /= 512; - endaddr /= 512; - } - - /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */ - if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType)) - { - /* Send CMD32 SD_ERASE_GRP_START with argument as addr */ - SDIO_CmdInitStructure.SDIO_Argument = startaddr; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_ERASE_GRP_START; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SD_ERASE_GRP_START); - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - /* Send CMD33 SD_ERASE_GRP_END with argument as addr */ - SDIO_CmdInitStructure.SDIO_Argument = endaddr; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_ERASE_GRP_END; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SD_ERASE_GRP_END); - if (errorstatus != SD_OK) - { - return(errorstatus); - } - } - - /* Send CMD38 ERASE */ - SDIO_CmdInitStructure.SDIO_Argument = 0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_ERASE; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_ERASE); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - for (delay = 0; delay < maxdelay; delay++) - {} - - /* Wait till the card is in programming state */ - errorstatus = IsCardProgramming(&cardstate); - - while ((errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate))) - { - errorstatus = IsCardProgramming(&cardstate); - } - - return(errorstatus); -} - -/** - * @brief Returns the current card's status. - * @param pcardstatus: pointer to the buffer that will contain the SD - * card status (Card Status register). - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_SendStatus(uint32_t *pcardstatus) -{ - SD_Error errorstatus = SD_OK; - - if (pcardstatus == NULL) - { - errorstatus = SD_INVALID_PARAMETER; - return(errorstatus); - } - - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - - errorstatus = CmdResp1Error(SDIO_SEND_STATUS); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - *pcardstatus = SDIO_GetResponse(SDIO_RESP1); - - return(errorstatus); -} - -/** - * @brief Returns the current SD card's status. - * @param psdstatus: pointer to the buffer that will contain the SD - * card status (SD Status register). - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_SendSDStatus(uint32_t *psdstatus) -{ - SD_Error errorstatus = SD_OK; - uint32_t count = 0; - - if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) - { - errorstatus = SD_LOCK_UNLOCK_FAILED; - return(errorstatus); - } - - /* Set block size for card if it is not equal to current block size for card. */ - SDIO_CmdInitStructure.SDIO_Argument = 64; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - /* CMD55 */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SDIO_APP_CMD); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = 64; - SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_64b; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; - SDIO_DataConfig(&SDIO_DataInitStructure); - - /* Send ACMD13 SD_APP_STAUS with argument as card's RCA.*/ - SDIO_CmdInitStructure.SDIO_Argument = 0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_STAUS; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SDIO_SD_APP_STAUS); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))) - { - if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET) - { - for (count = 0; count < 8; count++) - { - *(psdstatus + count) = SDIO_ReadData(); - } - psdstatus += 8; - } - } - - if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT); - errorstatus = SD_DATA_TIMEOUT; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL); - errorstatus = SD_DATA_CRC_FAIL; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_RXOVERR); - errorstatus = SD_RX_OVERRUN; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_STBITERR); - errorstatus = SD_START_BIT_ERR; - return(errorstatus); - } - - while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET) - { - *psdstatus = SDIO_ReadData(); - psdstatus++; - } - - /* Clear all the static status flags*/ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - psdstatus -= 16; - for (count = 0; count < 16; count++) - { - psdstatus[count] = ((psdstatus[count] & SD_0TO7BITS) << 24) |((psdstatus[count] & SD_8TO15BITS) << 8) | - ((psdstatus[count] & SD_16TO23BITS) >> 8) |((psdstatus[count] & SD_24TO31BITS) >> 24); - } - return(errorstatus); -} - -/** - * @brief Allows to process all the interrupts that are high. - * @param None - * @retval SD_Error: SD Card Error code. - */ -SD_Error SD_ProcessIRQSrc(void) -{ - uint32_t count = 0, restwords = 0; - - if (DeviceMode == SD_INTERRUPT_MODE) - { - if (SDIO_GetITStatus(SDIO_IT_RXFIFOHF) != RESET) - { - for (count = 0; count < SD_HALFFIFO; count++) - { - *(DestBuffer + count) = SDIO_ReadData(); - } - DestBuffer += SD_HALFFIFO; - NumberOfBytes += SD_HALFFIFOBYTES; - } - else if (SDIO_GetITStatus(SDIO_IT_TXFIFOHE) != RESET) - { - if ((TotalNumberOfBytes - NumberOfBytes) < SD_HALFFIFOBYTES) - { - restwords = ((TotalNumberOfBytes - NumberOfBytes) % 4 == 0) ? - ((TotalNumberOfBytes - NumberOfBytes) / 4) : - ((TotalNumberOfBytes - NumberOfBytes) / 4 + 1); - - for (count = 0; count < restwords; count++, SrcBuffer++, NumberOfBytes += 4) - { - SDIO_WriteData(*SrcBuffer); - } - } - else - { - for (count = 0; count < SD_HALFFIFO; count++) - { - SDIO_WriteData(*(SrcBuffer + count)); - } - - SrcBuffer += SD_HALFFIFO; - NumberOfBytes += SD_HALFFIFOBYTES; - } - } - } - - if (SDIO_GetITStatus(SDIO_IT_DATAEND) != RESET) - { - if (DeviceMode != SD_DMA_MODE) - { - while ((SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET) && (NumberOfBytes < TotalNumberOfBytes)) - { - *DestBuffer = SDIO_ReadData(); - DestBuffer++; - NumberOfBytes += 4; - } - } - - if (StopCondition == 1) - { - TransferError = SD_StopTransfer(); - } - else - { - TransferError = SD_OK; - } - SDIO_ClearITPendingBit(SDIO_IT_DATAEND); - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | - SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | - SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE); - TransferEnd = 1; - NumberOfBytes = 0; - return(TransferError); - } - - if (SDIO_GetITStatus(SDIO_IT_DCRCFAIL) != RESET) - { - SDIO_ClearITPendingBit(SDIO_IT_DCRCFAIL); - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | - SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | - SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE); - NumberOfBytes = 0; - TransferError = SD_DATA_CRC_FAIL; - return(SD_DATA_CRC_FAIL); - } - - if (SDIO_GetITStatus(SDIO_IT_DTIMEOUT) != RESET) - { - SDIO_ClearITPendingBit(SDIO_IT_DTIMEOUT); - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | - SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | - SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE); - NumberOfBytes = 0; - TransferError = SD_DATA_TIMEOUT; - return(SD_DATA_TIMEOUT); - } - - if (SDIO_GetITStatus(SDIO_IT_RXOVERR) != RESET) - { - SDIO_ClearITPendingBit(SDIO_IT_RXOVERR); - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | - SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | - SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE); - NumberOfBytes = 0; - TransferError = SD_RX_OVERRUN; - return(SD_RX_OVERRUN); - } - - if (SDIO_GetITStatus(SDIO_IT_TXUNDERR) != RESET) - { - SDIO_ClearITPendingBit(SDIO_IT_TXUNDERR); - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | - SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | - SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE); - NumberOfBytes = 0; - TransferError = SD_TX_UNDERRUN; - return(SD_TX_UNDERRUN); - } - - if (SDIO_GetITStatus(SDIO_IT_STBITERR) != RESET) - { - SDIO_ClearITPendingBit(SDIO_IT_STBITERR); - SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | - SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR | - SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE); - NumberOfBytes = 0; - TransferError = SD_START_BIT_ERR; - return(SD_START_BIT_ERR); - } - - return(SD_OK); -} - -/** - * @brief Checks for error conditions for CMD0. - * @param None - * @retval SD_Error: SD Card Error code. - */ -static SD_Error CmdError(void) -{ - SD_Error errorstatus = SD_OK; - uint32_t timeout; - - timeout = SDIO_CMD0TIMEOUT; /* 10000 */ - - while ((timeout > 0) && (SDIO_GetFlagStatus(SDIO_FLAG_CMDSENT) == RESET)) - { - timeout--; - } - - if (timeout == 0) - { - errorstatus = SD_CMD_RSP_TIMEOUT; - return(errorstatus); - } - - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - - return(errorstatus); -} - -/** - * @brief Checks for error conditions for R7. - * response. - * @param None - * @retval SD_Error: SD Card Error code. - */ -static SD_Error CmdResp7Error(void) -{ - SD_Error errorstatus = SD_OK; - uint32_t status; - uint32_t timeout = SDIO_CMD0TIMEOUT; - - status = SDIO->STA; - - while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) && (timeout > 0)) - { - timeout--; - status = SDIO->STA; - } - - if ((timeout == 0) || (status & SDIO_FLAG_CTIMEOUT)) - { - /* Card is not V2.0 complient or card does not support the set voltage range */ - errorstatus = SD_CMD_RSP_TIMEOUT; - SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); - return(errorstatus); - } - - if (status & SDIO_FLAG_CMDREND) - { - /* Card is SD V2.0 compliant */ - errorstatus = SD_OK; - SDIO_ClearFlag(SDIO_FLAG_CMDREND); - return(errorstatus); - } - return(errorstatus); -} - -/** - * @brief Checks for error conditions for R1. - * response - * @param cmd: The sent command index. - * @retval SD_Error: SD Card Error code. - */ -static SD_Error CmdResp1Error(uint8_t cmd) -{ - SD_Error errorstatus = SD_OK; - uint32_t status; - uint32_t response_r1; - - status = SDIO->STA; - - while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))) - { - status = SDIO->STA; - } - - if (status & SDIO_FLAG_CTIMEOUT) - { - errorstatus = SD_CMD_RSP_TIMEOUT; - SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); - return(errorstatus); - } - else if (status & SDIO_FLAG_CCRCFAIL) - { - errorstatus = SD_CMD_CRC_FAIL; - SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); - return(errorstatus); - } - - /* Check response received is of desired command */ - if (SDIO_GetCommandResponse() != cmd) - { - errorstatus = SD_ILLEGAL_CMD; - return(errorstatus); - } - - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - - /* We have received response, retrieve it for analysis */ - response_r1 = SDIO_GetResponse(SDIO_RESP1); - - if ((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO) - { - return(errorstatus); - } - - if (response_r1 & SD_OCR_ADDR_OUT_OF_RANGE) - { - return(SD_ADDR_OUT_OF_RANGE); - } - - if (response_r1 & SD_OCR_ADDR_MISALIGNED) - { - return(SD_ADDR_MISALIGNED); - } - - if (response_r1 & SD_OCR_BLOCK_LEN_ERR) - { - return(SD_BLOCK_LEN_ERR); - } - - if (response_r1 & SD_OCR_ERASE_SEQ_ERR) - { - return(SD_ERASE_SEQ_ERR); - } - - if (response_r1 & SD_OCR_BAD_ERASE_PARAM) - { - return(SD_BAD_ERASE_PARAM); - } - - if (response_r1 & SD_OCR_WRITE_PROT_VIOLATION) - { - return(SD_WRITE_PROT_VIOLATION); - } - - if (response_r1 & SD_OCR_LOCK_UNLOCK_FAILED) - { - return(SD_LOCK_UNLOCK_FAILED); - } - - if (response_r1 & SD_OCR_COM_CRC_FAILED) - { - return(SD_COM_CRC_FAILED); - } - - if (response_r1 & SD_OCR_ILLEGAL_CMD) - { - return(SD_ILLEGAL_CMD); - } - - if (response_r1 & SD_OCR_CARD_ECC_FAILED) - { - return(SD_CARD_ECC_FAILED); - } - - if (response_r1 & SD_OCR_CC_ERROR) - { - return(SD_CC_ERROR); - } - - if (response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR) - { - return(SD_GENERAL_UNKNOWN_ERROR); - } - - if (response_r1 & SD_OCR_STREAM_READ_UNDERRUN) - { - return(SD_STREAM_READ_UNDERRUN); - } - - if (response_r1 & SD_OCR_STREAM_WRITE_OVERRUN) - { - return(SD_STREAM_WRITE_OVERRUN); - } - - if (response_r1 & SD_OCR_CID_CSD_OVERWRIETE) - { - return(SD_CID_CSD_OVERWRITE); - } - - if (response_r1 & SD_OCR_WP_ERASE_SKIP) - { - return(SD_WP_ERASE_SKIP); - } - - if (response_r1 & SD_OCR_CARD_ECC_DISABLED) - { - return(SD_CARD_ECC_DISABLED); - } - - if (response_r1 & SD_OCR_ERASE_RESET) - { - return(SD_ERASE_RESET); - } - - if (response_r1 & SD_OCR_AKE_SEQ_ERROR) - { - return(SD_AKE_SEQ_ERROR); - } - return(errorstatus); -} - -/** - * @brief Checks for error conditions for R3 (OCR). - * response. - * @param None - * @retval SD_Error: SD Card Error code. - */ -static SD_Error CmdResp3Error(void) -{ - SD_Error errorstatus = SD_OK; - uint32_t status; - - status = SDIO->STA; - - while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))) - { - status = SDIO->STA; - } - - if (status & SDIO_FLAG_CTIMEOUT) - { - errorstatus = SD_CMD_RSP_TIMEOUT; - SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); - return(errorstatus); - } - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - return(errorstatus); -} - -/** - * @brief Checks for error conditions for R2 (CID or CSD). - * response. - * @param None - * @retval SD_Error: SD Card Error code. - */ -static SD_Error CmdResp2Error(void) -{ - SD_Error errorstatus = SD_OK; - uint32_t status; - - status = SDIO->STA; - - while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CTIMEOUT | SDIO_FLAG_CMDREND))) - { - status = SDIO->STA; - } - - if (status & SDIO_FLAG_CTIMEOUT) - { - errorstatus = SD_CMD_RSP_TIMEOUT; - SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); - return(errorstatus); - } - else if (status & SDIO_FLAG_CCRCFAIL) - { - errorstatus = SD_CMD_CRC_FAIL; - SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); - return(errorstatus); - } - - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - - return(errorstatus); -} - -/** - * @brief Checks for error conditions for R6 (RCA). - * response. - * @param cmd: The sent command index. - * @param prca: pointer to the variable that will contain the SD - * card relative address RCA. - * @retval SD_Error: SD Card Error code. - */ -static SD_Error CmdResp6Error(uint8_t cmd, uint16_t *prca) -{ - SD_Error errorstatus = SD_OK; - uint32_t status; - uint32_t response_r1; - - status = SDIO->STA; - - while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CTIMEOUT | SDIO_FLAG_CMDREND))) - { - status = SDIO->STA; - } - - if (status & SDIO_FLAG_CTIMEOUT) - { - errorstatus = SD_CMD_RSP_TIMEOUT; - SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); - return(errorstatus); - } - else if (status & SDIO_FLAG_CCRCFAIL) - { - errorstatus = SD_CMD_CRC_FAIL; - SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); - return(errorstatus); - } - - /* Check response received is of desired command */ - if (SDIO_GetCommandResponse() != cmd) - { - errorstatus = SD_ILLEGAL_CMD; - return(errorstatus); - } - - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - - /* We have received response, retrieve it. */ - response_r1 = SDIO_GetResponse(SDIO_RESP1); - - if (SD_ALLZERO == (response_r1 & (SD_R6_GENERAL_UNKNOWN_ERROR | SD_R6_ILLEGAL_CMD | SD_R6_COM_CRC_FAILED))) - { - *prca = (uint16_t) (response_r1 >> 16); - return(errorstatus); - } - - if (response_r1 & SD_R6_GENERAL_UNKNOWN_ERROR) - { - return(SD_GENERAL_UNKNOWN_ERROR); - } - - if (response_r1 & SD_R6_ILLEGAL_CMD) - { - return(SD_ILLEGAL_CMD); - } - - if (response_r1 & SD_R6_COM_CRC_FAILED) - { - return(SD_COM_CRC_FAILED); - } - - return(errorstatus); -} - -/** - * @brief Enables or disables the SDIO wide bus mode. - * @param NewState: new state of the SDIO wide bus mode. - * This parameter can be: ENABLE or DISABLE. - * @retval SD_Error: SD Card Error code. - */ -static SD_Error SDEnWideBus(FunctionalState NewState) -{ - SD_Error errorstatus = SD_OK; - - uint32_t scr[2] = {0, 0}; - - if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) - { - errorstatus = SD_LOCK_UNLOCK_FAILED; - return(errorstatus); - } - - /* Get SCR Register */ - errorstatus = FindSCR(RCA, scr); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - /* If wide bus operation to be enabled */ - if (NewState == ENABLE) - { - /* If requested card supports wide bus operation */ - if ((scr[1] & SD_WIDE_BUS_SUPPORT) != SD_ALLZERO) - { - /* Send CMD55 APP_CMD with argument as card's RCA.*/ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_APP_CMD); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */ - SDIO_CmdInitStructure.SDIO_Argument = 0x2; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_SD_SET_BUSWIDTH; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_APP_SD_SET_BUSWIDTH); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - return(errorstatus); - } - else - { - errorstatus = SD_REQUEST_NOT_APPLICABLE; - return(errorstatus); - } - } /* If wide bus operation to be disabled */ - else - { - /* If requested card supports 1 bit mode operation */ - if ((scr[1] & SD_SINGLE_BUS_SUPPORT) != SD_ALLZERO) - { - /* Send CMD55 APP_CMD with argument as card's RCA.*/ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - - errorstatus = CmdResp1Error(SDIO_APP_CMD); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */ - SDIO_CmdInitStructure.SDIO_Argument = 0x00; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_SD_SET_BUSWIDTH; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_APP_SD_SET_BUSWIDTH); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - return(errorstatus); - } - else - { - errorstatus = SD_REQUEST_NOT_APPLICABLE; - return(errorstatus); - } - } -} - -/** - * @brief Checks if the SD card is in programming state. - * @param pstatus: pointer to the variable that will contain the SD - * card state. - * @retval SD_Error: SD Card Error code. - */ -static SD_Error IsCardProgramming(uint8_t *pstatus) -{ - SD_Error errorstatus = SD_OK; - __IO uint32_t respR1 = 0, status = 0; - - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - status = SDIO->STA; - while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))) - { - status = SDIO->STA; - } - - if (status & SDIO_FLAG_CTIMEOUT) - { - errorstatus = SD_CMD_RSP_TIMEOUT; - SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); - return(errorstatus); - } - else if (status & SDIO_FLAG_CCRCFAIL) - { - errorstatus = SD_CMD_CRC_FAIL; - SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); - return(errorstatus); - } - - status = (uint32_t)SDIO_GetCommandResponse(); - - /* Check response received is of desired command */ - if (status != SDIO_SEND_STATUS) - { - errorstatus = SD_ILLEGAL_CMD; - return(errorstatus); - } - - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - - - /* We have received response, retrieve it for analysis */ - respR1 = SDIO_GetResponse(SDIO_RESP1); - - /* Find out card status */ - *pstatus = (uint8_t) ((respR1 >> 9) & 0x0000000F); - - if ((respR1 & SD_OCR_ERRORBITS) == SD_ALLZERO) - { - return(errorstatus); - } - - if (respR1 & SD_OCR_ADDR_OUT_OF_RANGE) - { - return(SD_ADDR_OUT_OF_RANGE); - } - - if (respR1 & SD_OCR_ADDR_MISALIGNED) - { - return(SD_ADDR_MISALIGNED); - } - - if (respR1 & SD_OCR_BLOCK_LEN_ERR) - { - return(SD_BLOCK_LEN_ERR); - } - - if (respR1 & SD_OCR_ERASE_SEQ_ERR) - { - return(SD_ERASE_SEQ_ERR); - } - - if (respR1 & SD_OCR_BAD_ERASE_PARAM) - { - return(SD_BAD_ERASE_PARAM); - } - - if (respR1 & SD_OCR_WRITE_PROT_VIOLATION) - { - return(SD_WRITE_PROT_VIOLATION); - } - - if (respR1 & SD_OCR_LOCK_UNLOCK_FAILED) - { - return(SD_LOCK_UNLOCK_FAILED); - } - - if (respR1 & SD_OCR_COM_CRC_FAILED) - { - return(SD_COM_CRC_FAILED); - } - - if (respR1 & SD_OCR_ILLEGAL_CMD) - { - return(SD_ILLEGAL_CMD); - } - - if (respR1 & SD_OCR_CARD_ECC_FAILED) - { - return(SD_CARD_ECC_FAILED); - } - - if (respR1 & SD_OCR_CC_ERROR) - { - return(SD_CC_ERROR); - } - - if (respR1 & SD_OCR_GENERAL_UNKNOWN_ERROR) - { - return(SD_GENERAL_UNKNOWN_ERROR); - } - - if (respR1 & SD_OCR_STREAM_READ_UNDERRUN) - { - return(SD_STREAM_READ_UNDERRUN); - } - - if (respR1 & SD_OCR_STREAM_WRITE_OVERRUN) - { - return(SD_STREAM_WRITE_OVERRUN); - } - - if (respR1 & SD_OCR_CID_CSD_OVERWRIETE) - { - return(SD_CID_CSD_OVERWRITE); - } - - if (respR1 & SD_OCR_WP_ERASE_SKIP) - { - return(SD_WP_ERASE_SKIP); - } - - if (respR1 & SD_OCR_CARD_ECC_DISABLED) - { - return(SD_CARD_ECC_DISABLED); - } - - if (respR1 & SD_OCR_ERASE_RESET) - { - return(SD_ERASE_RESET); - } - - if (respR1 & SD_OCR_AKE_SEQ_ERROR) - { - return(SD_AKE_SEQ_ERROR); - } - - return(errorstatus); -} - -/** - * @brief Find the SD card SCR register value. - * @param rca: selected card address. - * @param pscr: pointer to the buffer that will contain the SCR value. - * @retval SD_Error: SD Card Error code. - */ -static SD_Error FindSCR(uint16_t rca, uint32_t *pscr) -{ - uint32_t index = 0; - SD_Error errorstatus = SD_OK; - uint32_t tempscr[2] = {0, 0}; - - /* Set Block Size To 8 Bytes */ - /* Send CMD55 APP_CMD with argument as card's RCA */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)8; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - /* Send CMD55 APP_CMD with argument as card's RCA */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_APP_CMD); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = 8; - SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_8b; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; - SDIO_DataConfig(&SDIO_DataInitStructure); - - - /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */ - SDIO_CmdInitStructure.SDIO_Argument = 0x0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_SEND_SCR; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - - errorstatus = CmdResp1Error(SDIO_SD_APP_SEND_SCR); - - if (errorstatus != SD_OK) - { - return(errorstatus); - } - - while (!(SDIO->STA & (SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))) - { - if (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET) - { - *(tempscr + index) = SDIO_ReadData(); - index++; - } - } - - if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT); - errorstatus = SD_DATA_TIMEOUT; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL); - errorstatus = SD_DATA_CRC_FAIL; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_RXOVERR); - errorstatus = SD_RX_OVERRUN; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_STBITERR); - errorstatus = SD_START_BIT_ERR; - return(errorstatus); - } - - /* Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); - - *(pscr + 1) = ((tempscr[0] & SD_0TO7BITS) << 24) | ((tempscr[0] & SD_8TO15BITS) << 8) | ((tempscr[0] & SD_16TO23BITS) >> 8) | ((tempscr[0] & SD_24TO31BITS) >> 24); - - *(pscr) = ((tempscr[1] & SD_0TO7BITS) << 24) | ((tempscr[1] & SD_8TO15BITS) << 8) | ((tempscr[1] & SD_16TO23BITS) >> 8) | ((tempscr[1] & SD_24TO31BITS) >> 24); - - return(errorstatus); -} - -/** - * @brief Converts the number of bytes in power of two and returns the - * power. - * @param NumberOfBytes: number of bytes. - * @retval None - */ -static uint8_t convert_from_bytes_to_power_of_two(uint16_t NumberOfBytes) -{ - uint8_t count = 0; - - while (NumberOfBytes != 1) - { - NumberOfBytes >>= 1; - count++; - } - return(count); -} - -/** - * @brief Configures the SDIO Corresponding GPIO Ports - * @param None - * @retval None - */ -static void GPIO_Configuration(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - /* GPIOC and GPIOD Periph clock enable */ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); - - /* Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_Init(GPIOC, &GPIO_InitStructure); - - /* Configure PD.02 CMD line */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; - GPIO_Init(GPIOD, &GPIO_InitStructure); -} - -/** - * @brief Configures the DMA2 Channel4 for SDIO Tx request. - * @param BufferSRC: pointer to the source buffer - * @param BufferSize: buffer size - * @retval None - */ -static void DMA_TxConfiguration(uint32_t *BufferSRC, uint32_t BufferSize) -{ - DMA_InitTypeDef DMA_InitStructure; - - DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 | DMA2_FLAG_GL4); - - /* DMA2 Channel4 disable */ - DMA_Cmd(DMA2_Channel4, DISABLE); - - /* DMA2 Channel4 Config */ - DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_Address; - DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferSRC; - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; - DMA_InitStructure.DMA_BufferSize = BufferSize / 4; - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_InitStructure.DMA_Priority = DMA_Priority_High; - DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; - DMA_Init(DMA2_Channel4, &DMA_InitStructure); - - /* DMA2 Channel4 enable */ - DMA_Cmd(DMA2_Channel4, ENABLE); -} - -/** - * @brief Configures the DMA2 Channel4 for SDIO Rx request. - * @param BufferDST: pointer to the destination buffer - * @param BufferSize: buffer size - * @retval None - */ -static void DMA_RxConfiguration(uint32_t *BufferDST, uint32_t BufferSize) -{ - DMA_InitTypeDef DMA_InitStructure; - - DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 | DMA2_FLAG_GL4); - - /* DMA2 Channel4 disable */ - DMA_Cmd(DMA2_Channel4, DISABLE); - - /* DMA2 Channel4 Config */ - DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_Address; - DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferDST; - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; - DMA_InitStructure.DMA_BufferSize = BufferSize / 4; - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_InitStructure.DMA_Priority = DMA_Priority_High; - DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; - DMA_Init(DMA2_Channel4, &DMA_InitStructure); - - /* DMA2 Channel4 enable */ - DMA_Cmd(DMA2_Channel4, ENABLE); -} - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ - -/* - * RT-Thread SD Card Driver - * 20090417 Bernard - */ -#include -#include - -/* set sector size to 512 */ -#define SECTOR_SIZE 512 - -static struct rt_device sdcard_device; -static SD_CardInfo SDCardInfo; -static struct dfs_partition part; -static struct rt_semaphore sd_lock; -static rt_uint8_t _sdcard_buffer[SECTOR_SIZE]; - -/* RT-Thread Device Driver Interface */ -static rt_err_t rt_sdcard_init(rt_device_t dev) -{ - NVIC_InitTypeDef NVIC_InitStructure; - - NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - if (rt_sem_init(&sd_lock, "sdlock", 1, RT_IPC_FLAG_FIFO) != RT_EOK) - { - rt_kprintf("init sd lock semaphore failed\n"); - } - - return RT_EOK; -} - -static rt_err_t rt_sdcard_open(rt_device_t dev, rt_uint16_t oflag) -{ - return RT_EOK; -} - -static rt_err_t rt_sdcard_close(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_size_t rt_sdcard_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) -{ - SD_Error status; - rt_uint32_t nr = size / SECTOR_SIZE, retry; - - rt_sem_take(&sd_lock, RT_WAITING_FOREVER); - - retry = 3; - while(retry) - { - /* read all sectors */ - if (((rt_uint32_t)buffer % 4 != 0) || - ((rt_uint32_t)buffer > 0x20080000)) - { - rt_uint32_t index; - - /* which is not alignment with 4 or chip SRAM */ - for (index = 0; index < nr; index ++) - { - status = SD_ReadBlock((part.offset + index) * SECTOR_SIZE + pos, - (uint32_t*)_sdcard_buffer, SECTOR_SIZE); - - if (status != SD_OK) break; - - /* copy to the buffer */ - rt_memcpy(((rt_uint8_t*)buffer + index * SECTOR_SIZE), _sdcard_buffer, SECTOR_SIZE); - } - } - else - { - if (nr == 1) - { - status = SD_ReadBlock(part.offset * SECTOR_SIZE + pos, - (uint32_t*)buffer, SECTOR_SIZE); - } - else - { - status = SD_ReadMultiBlocks(part.offset * SECTOR_SIZE + pos, - (uint32_t*)buffer, SECTOR_SIZE, nr); - } - } - - if (status == SD_OK) break; - - retry --; - } - rt_sem_release(&sd_lock); - - if (status == SD_OK) return size; - - rt_kprintf("read failed: %d, buffer 0x%08x\n", status, buffer); - return 0; -} - -static rt_size_t rt_sdcard_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) -{ - SD_Error status; - rt_uint32_t nr = size / SECTOR_SIZE; - - rt_sem_take(&sd_lock, RT_WAITING_FOREVER); - - /* read all sectors */ - if (((rt_uint32_t)buffer % 4 != 0) || - ((rt_uint32_t)buffer > 0x20080000)) - { - rt_uint32_t index; - - /* which is not alignment with 4 or chip SRAM */ - for (index = 0; index < nr; index ++) - { - /* copy to the buffer */ - rt_memcpy(_sdcard_buffer, ((rt_uint8_t*)buffer + index * SECTOR_SIZE), SECTOR_SIZE); - - status = SD_WriteBlock((part.offset + index) * SECTOR_SIZE + pos, - (uint32_t*)_sdcard_buffer, SECTOR_SIZE); - - if (status != SD_OK) break; - } - } - else - { - if (nr == 1) - { - status = SD_WriteBlock(part.offset * SECTOR_SIZE + pos, - (uint32_t*)buffer, SECTOR_SIZE); - } - else - { - status = SD_WriteMultiBlocks(part.offset * SECTOR_SIZE + pos, - (uint32_t*)buffer, SECTOR_SIZE, nr); - } - } - - rt_sem_release(&sd_lock); - - if (status == SD_OK) return size; - - rt_kprintf("write failed: %d, buffer 0x%08x\n", status, buffer); - return 0; -} - -static rt_err_t rt_sdcard_control(rt_device_t dev, rt_uint8_t cmd, void *args) -{ - return RT_EOK; -} - -void rt_hw_sdcard_init() -{ - if (SD_Init() == SD_OK) - { - SD_Error status; - rt_uint8_t *sector; - - status = SD_GetCardInfo(&SDCardInfo); - if (status != SD_OK) goto __return; - - status = SD_SelectDeselect((u32) (SDCardInfo.RCA << 16)); - if (status != SD_OK) goto __return; - - SD_EnableWideBusOperation(SDIO_BusWide_1b); - SD_SetDeviceMode(SD_DMA_MODE); - - /* get the first sector to read partition table */ - sector = (rt_uint8_t*) rt_malloc (512); - if (sector == RT_NULL) - { - rt_kprintf("allocate partition sector buffer failed\n"); - return; - } - status = SD_ReadBlock(0, (uint32_t*)sector, 512); - if (status == SD_OK) - { - /* get the first partition */ - if (dfs_filesystem_get_partition(&part, sector, 0) != 0) - { - /* there is no partition */ - part.offset = 0; - part.size = 0; - } - } - else - { - /* there is no partition table */ - part.offset = 0; - part.size = 0; - } - - /* release sector buffer */ - rt_free(sector); - - /* register sdcard device */ - sdcard_device.init = rt_sdcard_init; - sdcard_device.open = rt_sdcard_open; - sdcard_device.close = rt_sdcard_close; - sdcard_device.read = rt_sdcard_read; - sdcard_device.write = rt_sdcard_write; - sdcard_device.control = rt_sdcard_control; - - /* no private */ - sdcard_device.private = &SDCardInfo; - - rt_device_register(&sdcard_device, "sd0", - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); - - return; - } - -__return: - rt_kprintf("sdcard init failed\n"); -} diff --git a/bsp/stm32_radio/sdcard.h b/bsp/stm32_radio/sdcard.h deleted file mode 100644 index fd89d94afb..0000000000 --- a/bsp/stm32_radio/sdcard.h +++ /dev/null @@ -1,285 +0,0 @@ -/** - ****************************************************************************** - * @file SDIO/sdcard.h - * @author MCD Application Team - * @version V3.1.2 - * @date 09/28/2009 - * @brief This file contains all the functions prototypes for the SD Card - * driver firmware library. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2009 STMicroelectronics

- */ - -/** @addtogroup STM32F10x_StdPeriph_Examples - * @{ - */ - -/** @addtogroup SDIO_Example - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SDCARD_H -#define __SDCARD_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" - -/* Exported types ------------------------------------------------------------*/ -typedef enum -{ - /* SDIO specific error defines */ - SD_CMD_CRC_FAIL = (1), /* Command response received (but CRC check failed) */ - SD_DATA_CRC_FAIL = (2), /* Data bock sent/received (CRC check Failed) */ - SD_CMD_RSP_TIMEOUT = (3), /* Command response timeout */ - SD_DATA_TIMEOUT = (4), /* Data time out */ - SD_TX_UNDERRUN = (5), /* Transmit FIFO under-run */ - SD_RX_OVERRUN = (6), /* Receive FIFO over-run */ - SD_START_BIT_ERR = (7), /* Start bit not detected on all data signals in widE bus mode */ - SD_CMD_OUT_OF_RANGE = (8), /* CMD's argument was out of range.*/ - SD_ADDR_MISALIGNED = (9), /* Misaligned address */ - SD_BLOCK_LEN_ERR = (10), /* Transferred block length is not allowed for the card or the number of transferred bytes does not match the block length */ - SD_ERASE_SEQ_ERR = (11), /* An error in the sequence of erase command occurs.*/ - SD_BAD_ERASE_PARAM = (12), /* An Invalid selection for erase groups */ - SD_WRITE_PROT_VIOLATION = (13), /* Attempt to program a write protect block */ - SD_LOCK_UNLOCK_FAILED = (14), /* Sequence or password error has been detected in unlock command or if there was an attempt to access a locked card */ - SD_COM_CRC_FAILED = (15), /* CRC check of the previous command failed */ - SD_ILLEGAL_CMD = (16), /* Command is not legal for the card state */ - SD_CARD_ECC_FAILED = (17), /* Card internal ECC was applied but failed to correct the data */ - SD_CC_ERROR = (18), /* Internal card controller error */ - SD_GENERAL_UNKNOWN_ERROR = (19), /* General or Unknown error */ - SD_STREAM_READ_UNDERRUN = (20), /* The card could not sustain data transfer in stream read operation. */ - SD_STREAM_WRITE_OVERRUN = (21), /* The card could not sustain data programming in stream mode */ - SD_CID_CSD_OVERWRITE = (22), /* CID/CSD overwrite error */ - SD_WP_ERASE_SKIP = (23), /* only partial address space was erased */ - SD_CARD_ECC_DISABLED = (24), /* Command has been executed without using internal ECC */ - SD_ERASE_RESET = (25), /* Erase sequence was cleared before executing because an out of erase sequence command was received */ - SD_AKE_SEQ_ERROR = (26), /* Error in sequence of authentication. */ - SD_INVALID_VOLTRANGE = (27), - SD_ADDR_OUT_OF_RANGE = (28), - SD_SWITCH_ERROR = (29), - SD_SDIO_DISABLED = (30), - SD_SDIO_FUNCTION_BUSY = (31), - SD_SDIO_FUNCTION_FAILED = (32), - SD_SDIO_UNKNOWN_FUNCTION = (33), - - /* Standard error defines */ - SD_INTERNAL_ERROR, - SD_NOT_CONFIGURED, - SD_REQUEST_PENDING, - SD_REQUEST_NOT_APPLICABLE, - SD_INVALID_PARAMETER, - SD_UNSUPPORTED_FEATURE, - SD_UNSUPPORTED_HW, - SD_ERROR, - SD_OK, -} SD_Error; - -/* SDIO Commands Index */ -#define SDIO_GO_IDLE_STATE ((uint8_t)0) -#define SDIO_SEND_OP_COND ((uint8_t)1) -#define SDIO_ALL_SEND_CID ((uint8_t)2) -#define SDIO_SET_REL_ADDR ((uint8_t)3) /* SDIO_SEND_REL_ADDR for SD Card */ -#define SDIO_SET_DSR ((uint8_t)4) -#define SDIO_SDIO_SEN_OP_COND ((uint8_t)5) -#define SDIO_HS_SWITCH ((uint8_t)6) -#define SDIO_SEL_DESEL_CARD ((uint8_t)7) -#define SDIO_HS_SEND_EXT_CSD ((uint8_t)8) -#define SDIO_SEND_CSD ((uint8_t)9) -#define SDIO_SEND_CID ((uint8_t)10) -#define SDIO_READ_DAT_UNTIL_STOP ((uint8_t)11) /* SD Card doesn't support it */ -#define SDIO_STOP_TRANSMISSION ((uint8_t)12) -#define SDIO_SEND_STATUS ((uint8_t)13) -#define SDIO_HS_BUSTEST_READ ((uint8_t)14) -#define SDIO_GO_INACTIVE_STATE ((uint8_t)15) -#define SDIO_SET_BLOCKLEN ((uint8_t)16) -#define SDIO_READ_SINGLE_BLOCK ((uint8_t)17) -#define SDIO_READ_MULT_BLOCK ((uint8_t)18) -#define SDIO_HS_BUSTEST_WRITE ((uint8_t)19) -#define SDIO_WRITE_DAT_UNTIL_STOP ((uint8_t)20) /* SD Card doesn't support it */ -#define SDIO_SET_BLOCK_COUNT ((uint8_t)23) /* SD Card doesn't support it */ -#define SDIO_WRITE_SINGLE_BLOCK ((uint8_t)24) -#define SDIO_WRITE_MULT_BLOCK ((uint8_t)25) -#define SDIO_PROG_CID ((uint8_t)26) /* reserved for manufacturers */ -#define SDIO_PROG_CSD ((uint8_t)27) -#define SDIO_SET_WRITE_PROT ((uint8_t)28) -#define SDIO_CLR_WRITE_PROT ((uint8_t)29) -#define SDIO_SEND_WRITE_PROT ((uint8_t)30) -#define SDIO_SD_ERASE_GRP_START ((uint8_t)32) /* To set the address of the first write - block to be erased. (For SD card only) */ -#define SDIO_SD_ERASE_GRP_END ((uint8_t)33) /* To set the address of the last write block of the - continuous range to be erased. (For SD card only) */ -#define SDIO_ERASE_GRP_START ((uint8_t)35) /* To set the address of the first write block to be erased. - (For MMC card only spec 3.31) */ - -#define SDIO_ERASE_GRP_END ((uint8_t)36) /* To set the address of the last write block of the - continuous range to be erased. (For MMC card only spec 3.31) */ - -#define SDIO_ERASE ((uint8_t)38) -#define SDIO_FAST_IO ((uint8_t)39) /* SD Card doesn't support it */ -#define SDIO_GO_IRQ_STATE ((uint8_t)40) /* SD Card doesn't support it */ -#define SDIO_LOCK_UNLOCK ((uint8_t)42) -#define SDIO_APP_CMD ((uint8_t)55) -#define SDIO_GEN_CMD ((uint8_t)56) -#define SDIO_NO_CMD ((uint8_t)64) - -/* Following commands are SD Card Specific commands. - SDIO_APP_CMD should be sent before sending these - commands. */ -#define SDIO_APP_SD_SET_BUSWIDTH ((uint8_t)6) /* For SD Card only */ -#define SDIO_SD_APP_STAUS ((uint8_t)13) /* For SD Card only */ -#define SDIO_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22) /* For SD Card only */ -#define SDIO_SD_APP_OP_COND ((uint8_t)41) /* For SD Card only */ -#define SDIO_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42) /* For SD Card only */ -#define SDIO_SD_APP_SEND_SCR ((uint8_t)51) /* For SD Card only */ -#define SDIO_SDIO_RW_DIRECT ((uint8_t)52) /* For SD I/O Card only */ -#define SDIO_SDIO_RW_EXTENDED ((uint8_t)53) /* For SD I/O Card only */ - -/* Following commands are SD Card Specific security commands. - SDIO_APP_CMD should be sent before sending these commands. */ -#define SDIO_SD_APP_GET_MKB ((uint8_t)43) /* For SD Card only */ -#define SDIO_SD_APP_GET_MID ((uint8_t)44) /* For SD Card only */ -#define SDIO_SD_APP_SET_CER_RN1 ((uint8_t)45) /* For SD Card only */ -#define SDIO_SD_APP_GET_CER_RN2 ((uint8_t)46) /* For SD Card only */ -#define SDIO_SD_APP_SET_CER_RES2 ((uint8_t)47) /* For SD Card only */ -#define SDIO_SD_APP_GET_CER_RES1 ((uint8_t)48) /* For SD Card only */ -#define SDIO_SD_APP_SECURE_READ_MULTIPLE_BLOCK ((uint8_t)18) /* For SD Card only */ -#define SDIO_SD_APP_SECURE_WRITE_MULTIPLE_BLOCK ((uint8_t)25) /* For SD Card only */ -#define SDIO_SD_APP_SECURE_ERASE ((uint8_t)38) /* For SD Card only */ -#define SDIO_SD_APP_CHANGE_SECURE_AREA ((uint8_t)49) /* For SD Card only */ -#define SDIO_SD_APP_SECURE_WRITE_MKB ((uint8_t)48) /* For SD Card only */ - -typedef enum -{ - SD_NO_TRANSFER = 0, - SD_TRANSFER_IN_PROGRESS -} SDTransferState; - -typedef struct -{ - uint16_t TransferredBytes; - SD_Error TransferError; - uint8_t padding; -} SDLastTransferInfo; - -typedef struct /* Card Specific Data */ -{ - __IO uint8_t CSDStruct; /* CSD structure */ - __IO uint8_t SysSpecVersion; /* System specification version */ - __IO uint8_t Reserved1; /* Reserved */ - __IO uint8_t TAAC; /* Data read access-time 1 */ - __IO uint8_t NSAC; /* Data read access-time 2 in CLK cycles */ - __IO uint8_t MaxBusClkFrec; /* Max. bus clock frequency */ - __IO uint16_t CardComdClasses; /* Card command classes */ - __IO uint8_t RdBlockLen; /* Max. read data block length */ - __IO uint8_t PartBlockRead; /* Partial blocks for read allowed */ - __IO uint8_t WrBlockMisalign; /* Write block misalignment */ - __IO uint8_t RdBlockMisalign; /* Read block misalignment */ - __IO uint8_t DSRImpl; /* DSR implemented */ - __IO uint8_t Reserved2; /* Reserved */ - __IO uint32_t DeviceSize; /* Device Size */ - __IO uint8_t MaxRdCurrentVDDMin; /* Max. read current @ VDD min */ - __IO uint8_t MaxRdCurrentVDDMax; /* Max. read current @ VDD max */ - __IO uint8_t MaxWrCurrentVDDMin; /* Max. write current @ VDD min */ - __IO uint8_t MaxWrCurrentVDDMax; /* Max. write current @ VDD max */ - __IO uint8_t DeviceSizeMul; /* Device size multiplier */ - __IO uint8_t EraseGrSize; /* Erase group size */ - __IO uint8_t EraseGrMul; /* Erase group size multiplier */ - __IO uint8_t WrProtectGrSize; /* Write protect group size */ - __IO uint8_t WrProtectGrEnable; /* Write protect group enable */ - __IO uint8_t ManDeflECC; /* Manufacturer default ECC */ - __IO uint8_t WrSpeedFact; /* Write speed factor */ - __IO uint8_t MaxWrBlockLen; /* Max. write data block length */ - __IO uint8_t WriteBlockPaPartial; /* Partial blocks for write allowed */ - __IO uint8_t Reserved3; /* Reserded */ - __IO uint8_t ContentProtectAppli; /* Content protection application */ - __IO uint8_t FileFormatGrouop; /* File format group */ - __IO uint8_t CopyFlag; /* Copy flag (OTP) */ - __IO uint8_t PermWrProtect; /* Permanent write protection */ - __IO uint8_t TempWrProtect; /* Temporary write protection */ - __IO uint8_t FileFormat; /* File Format */ - __IO uint8_t ECC; /* ECC code */ - __IO uint8_t CSD_CRC; /* CSD CRC */ - __IO uint8_t Reserved4; /* always 1*/ -} SD_CSD; - -typedef struct /*Card Identification Data*/ -{ - __IO uint8_t ManufacturerID; /* ManufacturerID */ - __IO uint16_t OEM_AppliID; /* OEM/Application ID */ - __IO uint32_t ProdName1; /* Product Name part1 */ - __IO uint8_t ProdName2; /* Product Name part2*/ - __IO uint8_t ProdRev; /* Product Revision */ - __IO uint32_t ProdSN; /* Product Serial Number */ - __IO uint8_t Reserved1; /* Reserved1 */ - __IO uint16_t ManufactDate; /* Manufacturing Date */ - __IO uint8_t CID_CRC; /* CID CRC */ - __IO uint8_t Reserved2; /* always 1 */ -} SD_CID; - -typedef struct -{ - SD_CSD SD_csd; - SD_CID SD_cid; - uint32_t CardCapacity; /* Card Capacity */ - uint32_t CardBlockSize; /* Card Block Size */ - uint16_t RCA; - uint8_t CardType; -} SD_CardInfo; - -/* Exported constants --------------------------------------------------------*/ -#define SD_DMA_MODE ((uint32_t)0x00000000) -#define SD_INTERRUPT_MODE ((uint32_t)0x00000001) -#define SD_POLLING_MODE ((uint32_t)0x00000002) - -/* Supported Memory Cards */ -#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x0) -#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x1) -#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x2) -#define SDIO_MULTIMEDIA_CARD ((uint32_t)0x3) -#define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x4) -#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x5) -#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x6) -#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x7) - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -SD_Error SD_Init(void); -SD_Error SD_PowerON(void); -SD_Error SD_PowerOFF(void); -SD_Error SD_InitializeCards(void); -SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo); -SD_Error SD_EnableWideBusOperation(uint32_t WideMode); -SD_Error SD_SetDeviceMode(uint32_t Mode); -SD_Error SD_SelectDeselect(uint32_t addr); -SD_Error SD_ReadBlock(uint32_t addr, uint32_t *readbuff, uint16_t BlockSize); -SD_Error SD_ReadMultiBlocks(uint32_t addr, uint32_t *readbuff, uint16_t BlockSize, uint32_t NumberOfBlocks); -SD_Error SD_WriteBlock(uint32_t addr, uint32_t *writebuff, uint16_t BlockSize); -SD_Error SD_WriteMultiBlocks(uint32_t addr, uint32_t *writebuff, uint16_t BlockSize, uint32_t NumberOfBlocks); -SDTransferState SD_GetTransferState(void); -SD_Error SD_StopTransfer(void); -SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr); -SD_Error SD_SendStatus(uint32_t *pcardstatus); -SD_Error SD_SendSDStatus(uint32_t *psdstatus); -SD_Error SD_ProcessIRQSrc(void); - -#endif /* __SDCARD_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/spi_flash.c b/bsp/stm32_radio/spi_flash.c deleted file mode 100644 index d5b0e06d4f..0000000000 --- a/bsp/stm32_radio/spi_flash.c +++ /dev/null @@ -1,317 +0,0 @@ -#include -#include "board.h" -#include "spi_flash.h" -#include "rtthread.h" - -/* - * WARNING: !!! ENABLING DMA MODE MAY DESTROY YOUR DATA IN THE SPI FLASH !!! - * Don't set SPI_FLASH_USE_DMA to 1 unless you know what you're doing! - * However, readonly access is just fine. :) - */ -#define SPI_FLASH_USE_DMA 0 -#define SECTOR_SIZE 512 - -extern uint8_t SPI_WriteByte(unsigned char data); - -#if SPI_FLASH_USE_DMA -static uint8_t dummy = 0; -static uint8_t _spi_flash_buffer[SECTOR_SIZE]; -#endif - -/********************** hardware *************************************/ -/* SPI_FLASH_CS PA4 */ -/* SPI_FLASH_RST PA3 */ -#define FLASH_RST_0() GPIO_ResetBits(GPIOA,GPIO_Pin_3) -#define FLASH_RST_1() GPIO_SetBits(GPIOA,GPIO_Pin_3) - -#define FLASH_CS_0() GPIO_ResetBits(GPIOA,GPIO_Pin_4) -#define FLASH_CS_1() GPIO_SetBits(GPIOA,GPIO_Pin_4) -/********************** hardware *************************************/ - -static void GPIO_Configuration(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); - - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - FLASH_RST_0(); // RESET - FLASH_CS_1(); - FLASH_RST_1(); -} - -#if SPI_FLASH_USE_DMA -static void DMA_RxConfiguration(rt_uint32_t addr, rt_size_t size) -{ - DMA_InitTypeDef DMA_InitStructure; - - DMA_ClearFlag(DMA1_FLAG_TC2 | DMA1_FLAG_TE2 | DMA1_FLAG_TC3 | DMA1_FLAG_TE3); - dummy = 0; - - /* DMA Channel configuration ----------------------------------------------*/ - DMA_Cmd(DMA1_Channel2, DISABLE); - DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(SPI1->DR)); - DMA_InitStructure.DMA_MemoryBaseAddr = (u32) addr; - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; - DMA_InitStructure.DMA_BufferSize = size; - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; - DMA_Init(DMA1_Channel2, &DMA_InitStructure); - - DMA_Cmd(DMA1_Channel2, ENABLE); - - /* Dummy TX channel configuration */ - DMA_Cmd(DMA1_Channel3, DISABLE); - DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(SPI1->DR)); - DMA_InitStructure.DMA_MemoryBaseAddr = (u32)(&dummy); - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; - DMA_InitStructure.DMA_BufferSize = size; - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; - DMA_Init(DMA1_Channel3, &DMA_InitStructure); - - DMA_Cmd(DMA1_Channel3, ENABLE); -} -#endif - -static uint8_t SPI_HostReadByte(void) -{ - //return SPI_WriteByte(0x00); - //Wait until the transmit buffer is empty - //while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); - while( (SPI1->SR & SPI_I2S_FLAG_TXE) == RESET); - // Send the byte - SPI_I2S_SendData(SPI1, 0); - - //Wait until a data is received - //while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); - while( (SPI1->SR & SPI_I2S_FLAG_RXNE) == RESET); - // Get the received data - return SPI_I2S_ReceiveData(SPI1); - -} - -static void SPI_HostWriteByte(uint8_t wByte) -{ - SPI_WriteByte(wByte); -} - -/*****************************************************************************/ -/*Status Register Format: */ -/* ------------------------------------------------------------------------- */ -/* | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | */ -/* |--------|--------|--------|--------|--------|--------|--------|--------| */ -/* |RDY/BUSY| COMP | device density | X | X | */ -/* ------------------------------------------------------------------------- */ -/* 0:busy | | AT45DB041:0111 | protect|page size */ -/* 1:ready | | AT45DB161:1011 | */ -/* --------------------------------------------------------------------------*/ -/*****************************************************************************/ -static uint8_t AT45DB_StatusRegisterRead(void) -{ - uint8_t i; - - FLASH_CS_0(); - SPI_HostWriteByte(AT45DB_READ_STATE_REGISTER); - i = SPI_HostReadByte(); - FLASH_CS_1(); - - return i; -} - -static void wait_busy(void) -{ - uint16_t i = 0; - while (i++ < 10000) - { - if (AT45DB_StatusRegisterRead() & 0x80) - { - return; - } - } - rt_kprintf("\r\nSPI_FLASH timeout!!!\r\n"); -} - -static void read_page(uint32_t page, uint8_t *pHeader) -{ -#if SPI_FLASH_USE_DMA - rt_sem_take(&spi1_lock, RT_WAITING_FOREVER); - - DMA_RxConfiguration((rt_uint32_t) pHeader, SECTOR_SIZE); - - FLASH_CS_0(); - - SPI_HostWriteByte(AT45DB_MM_PAGE_READ); - SPI_HostWriteByte((uint8_t)(page >> 6)); - SPI_HostWriteByte((uint8_t)(page << 2)); - SPI_HostWriteByte(0x00); - - // 4 don't care bytes - SPI_HostWriteByte(0x00); - SPI_HostWriteByte(0x00); - SPI_HostWriteByte(0x00); - SPI_HostWriteByte(0x00); - - SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_RXNE); - SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx | SPI_I2S_DMAReq_Rx, ENABLE); - while (DMA_GetFlagStatus(DMA1_FLAG_TC2) == RESET); - - FLASH_CS_1(); - - SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx | SPI_I2S_DMAReq_Rx, DISABLE); - - rt_sem_release(&spi1_lock); -#else - uint16_t i; - - rt_sem_take(&spi1_lock, RT_WAITING_FOREVER); - - FLASH_CS_0(); - - SPI_HostWriteByte(AT45DB_MM_PAGE_READ); - SPI_HostWriteByte((uint8_t)(page >> 6)); - SPI_HostWriteByte((uint8_t)(page << 2)); - SPI_HostWriteByte(0x00); - - // 4 don't care bytes - SPI_HostWriteByte(0x00); - SPI_HostWriteByte(0x00); - SPI_HostWriteByte(0x00); - SPI_HostWriteByte(0x00); - - for (i = 0; i < SECTOR_SIZE; i++) - { - *pHeader++ = SPI_HostReadByte(); - } - - FLASH_CS_1(); - - rt_sem_release(&spi1_lock); -#endif -} - -static void write_page(uint32_t page, uint8_t *pHeader) -{ - uint16_t i; - - rt_sem_take(&spi1_lock, RT_WAITING_FOREVER); - - FLASH_CS_0(); - - SPI_HostWriteByte(AT45DB_MM_PAGE_PROG_THRU_BUFFER1); - SPI_HostWriteByte((uint8_t) (page >> 6)); - SPI_HostWriteByte((uint8_t) (page << 2)); - SPI_HostWriteByte(0x00); - - for (i = 0; i < SECTOR_SIZE; i++) - { - SPI_HostWriteByte(*pHeader++); - } - - FLASH_CS_1(); - - wait_busy(); - - rt_sem_release(&spi1_lock); -} - - -#include -/* SPI DEVICE */ -static struct rt_device spi_flash_device; - -/* RT-Thread Device Driver Interface */ -static rt_err_t rt_spi_flash_init(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t rt_spi_flash_open(rt_device_t dev, rt_uint16_t oflag) -{ - - return RT_EOK; -} - -static rt_err_t rt_spi_flash_close(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t rt_spi_flash_control(rt_device_t dev, rt_uint8_t cmd, void *args) -{ - return RT_EOK; -} - -static rt_size_t rt_spi_flash_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) -{ - rt_uint32_t index, nr; - - nr = size / SECTOR_SIZE; - - for (index = 0; index < nr; index++) - { - /* only supply single block read: block size 512Byte */ -#if SPI_FLASH_USE_DMA - read_page((pos / SECTOR_SIZE + index), _spi_flash_buffer); - rt_memcpy(((rt_uint8_t *) buffer + index * SECTOR_SIZE), _spi_flash_buffer, SECTOR_SIZE); -#else - read_page((pos / SECTOR_SIZE + index), ((rt_uint8_t *) buffer + index * SECTOR_SIZE)); -#endif - } - - return nr * SECTOR_SIZE; -} - -static rt_size_t rt_spi_flash_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) -{ - rt_uint32_t index, nr; - - nr = size / SECTOR_SIZE; - - for (index = 0; index < nr; index++) - { - /* only supply single block write: block size 512Byte */ - write_page((pos / SECTOR_SIZE + index), ((rt_uint8_t *) buffer + index * SECTOR_SIZE)); - } - - return nr * SECTOR_SIZE; -} - -void rt_hw_spi_flash_init(void) -{ - GPIO_Configuration(); - -#if SPI_FLASH_USE_DMA - /* Enable the DMA1 Clock */ - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); -#endif - - /* register spi_flash device */ - spi_flash_device.type = RT_Device_Class_Block; - spi_flash_device.init = rt_spi_flash_init; - spi_flash_device.open = rt_spi_flash_open; - spi_flash_device.close = rt_spi_flash_close; - spi_flash_device.read = rt_spi_flash_read; - spi_flash_device.write = rt_spi_flash_write; - spi_flash_device.control = rt_spi_flash_control; - - /* no private */ - spi_flash_device.private = RT_NULL; - - rt_device_register(&spi_flash_device, "spi0", - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); -} diff --git a/bsp/stm32_radio/spi_flash.h b/bsp/stm32_radio/spi_flash.h deleted file mode 100644 index 66a38285fe..0000000000 --- a/bsp/stm32_radio/spi_flash.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef SPI_FLASH_H_INCLUDED -#define SPI_FLASH_H_INCLUDED - -/* -user for AT45DB161. -copy form : http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=737106 -thanks to gxlujd. -*/ - -#define AT45DB_BUFFER_1_WRITE 0x84 /* дÈëµÚÒ»»º³åÇø */ -#define AT45DB_BUFFER_2_WRITE 0x87 /* дÈëµÚ¶þ»º³åÇø */ -#define AT45DB_BUFFER_1_READ 0xD4 /* ¶ÁÈ¡µÚÒ»»º³åÇø */ -#define AT45DB_BUFFER_2_READ 0xD6 /* ¶ÁÈ¡µÚ¶þ»º³åÇø */ -#define AT45DB_B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83 /* ½«µÚÒ»»º³åÇøµÄÊý¾ÝдÈëÖ÷´æ´¢Æ÷£¨²Á³ýģʽ£©*/ -#define AT45DB_B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86 /* ½«µÚ¶þ»º³åÇøµÄÊý¾ÝдÈëÖ÷´æ´¢Æ÷£¨²Á³ýģʽ£©*/ -#define AT45DB_MM_PAGE_TO_B1_XFER 0x53 /* ½«Ö÷´æ´¢Æ÷µÄÖ¸¶¨Ò³Êý¾Ý¼ÓÔØµ½µÚÒ»»º³åÇø */ -#define AT45DB_MM_PAGE_TO_B2_XFER 0x55 /* ½«Ö÷´æ´¢Æ÷µÄÖ¸¶¨Ò³Êý¾Ý¼ÓÔØµ½µÚ¶þ»º³åÇø */ -#define AT45DB_PAGE_ERASE 0x81 /* ҳɾ³ý£¨Ã¿Ò³512/528×Ö½Ú£© */ -#define AT45DB_SECTOR_ERASE 0x7C /* ÉÈÇø²Á³ý£¨Ã¿ÉÈÇø128K×Ö½Ú£©*/ -#define AT45DB_READ_STATE_REGISTER 0xD7 /* ¶Áȡ״̬¼Ä´æÆ÷ */ -#define AT45DB_MM_PAGE_READ 0xD2 /* ¶ÁÈ¡Ö÷´¢´æÆ÷µÄÖ¸¶¨Ò³ */ -#define AT45DB_MM_PAGE_PROG_THRU_BUFFER1 0x82 /* ͨ¹ý»º³åÇøÐ´ÈëÖ÷´¢´æÆ÷ */ - -extern void rt_hw_spi_flash_init(void); - -#endif /* SPI_FLASH_H_INCLUDED */ diff --git a/bsp/stm32_radio/startup.c b/bsp/stm32_radio/startup.c deleted file mode 100644 index 39ff800b2f..0000000000 --- a/bsp/stm32_radio/startup.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - * File : startup.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006, RT-Thread Develop Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://openlab.rt-thread.com/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2006-08-31 Bernard first implementation - */ - -#include -#include - -#include "board.h" -#include "rtc.h" -#include "spi_flash.h" - -#include - -#ifdef RT_USING_LWIP -#include -#include "dm9000.h" -#endif - -/** - * @addtogroup STM32 - */ - -/*@{*/ -#ifdef __CC_ARM -extern int Image$$RW_IRAM1$$ZI$$Limit; -#elif __ICCARM__ -#pragma section="HEAP" -#else -extern int __bss_end; -#endif - -#ifdef RT_USING_FINSH -extern void finsh_system_init(void); -extern void finsh_set_device(const char* device); -#endif -extern int rt_application_init(void); -extern rt_err_t codec_hw_init(void); -extern rt_err_t codec_hw_init(void); -#ifdef DEBUG -/******************************************************************************* -* Function Name : assert_failed -* Description : Reports the name of the source file and the source line number -* where the assert error has occurred. -* Input : - file: pointer to the source file name -* - line: assert error line source number -* Output : None -* Return : None -*******************************************************************************/ -void assert_failed(u8* file, u32 line) -{ - rt_kprintf("\n\r Wrong parameter value detected on\r\n"); - rt_kprintf(" file %s\r\n", file); - rt_kprintf(" line %d\r\n", line); - - while (1) ; -} -#endif - -/** - * This function will startup RT-Thread RTOS. - */ -void rtthread_startup(void) -{ - /* init board */ - rt_hw_board_init(); - - /* show version */ - rt_show_version(); - - /* init tick */ - rt_system_tick_init(); - - /* init kernel object */ - rt_system_object_init(); - - /* init timer system */ - rt_system_timer_init(); - -#ifdef RT_USING_HEAP -#if STM32_EXT_SRAM - rt_system_heap_init((void*)STM32_EXT_SRAM_BEGIN, (void*)STM32_EXT_SRAM_END); -#else -#ifdef __CC_ARM - rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)STM32_SRAM_END); -#elif __ICCARM__ - rt_system_heap_init(__segment_end("HEAP"), (void*)STM32_SRAM_END); -#else - /* init memory system */ - rt_system_heap_init((void*)&__bss_end, (void*)STM32_SRAM_END); -#endif -#endif -#endif - - /* init scheduler system */ - rt_system_scheduler_init(); - - codec_hw_init(); - - /* init hardware device */ -#ifdef RT_USING_DFS - GPIO_ResetBits(GPIOC,GPIO_Pin_6); /* SD card power up */ - rt_hw_sdcard_init(); - rt_hw_spi_flash_init(); -#endif - - /* init all device */ - rt_device_init_all(); - - /* init application */ - rt_application_init(); - -#ifdef RT_USING_FINSH - /* init finsh */ - finsh_system_init(); - finsh_set_device("uart1"); -#endif - - /* init idle thread */ - rt_thread_idle_init(); - - /* start scheduler */ - rt_system_scheduler_start(); - - /* never reach here */ - return ; -} - -int main(void) -{ - rt_uint32_t UNUSED level; - - /* disable interrupt first */ - level = rt_hw_interrupt_disable(); - rtthread_startup(); - - return 0; -} - -/*@}*/ diff --git a/bsp/stm32_radio/station_list.c b/bsp/stm32_radio/station_list.c deleted file mode 100644 index 08758f5cd5..0000000000 --- a/bsp/stm32_radio/station_list.c +++ /dev/null @@ -1,221 +0,0 @@ -#include -#include -#include "station_list.h" - -static rt_uint32_t read_line(int fd, char* line, rt_uint32_t line_size) -{ - char *pos, *next; - rt_uint32_t length; - - length = read(fd, line, line_size); - if (length > 0) - { - pos = strstr(line, "\r\n"); - if (pos == RT_NULL) - { - pos = strstr(line, "\n"); - next = pos ++; - } - else next = pos + 2; - - if (pos != RT_NULL) - { - *pos = '\0'; - - /* move back */ - lseek(fd, -(length - (next - line)), SEEK_CUR); - - length = pos - line; - } - else length = 0; - } - - return length; -} - -static char *strncasestr(const char *haystack, const char *needle) -{ - size_t nl=strlen(needle); - size_t hl=strlen(haystack); - size_t i; - - if (!nl) goto found; - if (nl>hl) return 0; - for (i=hl-nl+1; i; --i) - { - if (*haystack==*needle && !strncasecmp(haystack,needle,nl)) -found: - return (char*)haystack; - ++haystack; - } - return 0; -} - -/* - station list file format: - - [playlist] - numberofentries=1 - File1=http://67.159.5.47:8110 - Title1=(#1 - 7/500) The Dominican.net Radio - */ -struct station_list* station_list_create(const char* fn) -{ - int fd; - rt_uint32_t length, index; - struct station_list* list; - char *line, *pos, prefix[8]; - - list = (struct station_list*)rt_malloc(sizeof(struct station_list)); - if (list == RT_NULL) goto _return0; /* no memory */ - list->count = 0; list->items = RT_NULL; - -#define LINE_BUFFER_SIZE 128 - line = rt_malloc(LINE_BUFFER_SIZE); - if (line == RT_NULL) - goto _return1; /* no memory */ - - fd = open(fn, O_RDONLY, 0); - if (fd < 0) goto _return2; /* open file failed */ - - length = read_line(fd, line, LINE_BUFFER_SIZE); - pos = strncasestr(line, "[playlist]"); - if (pos == RT_NULL) - { - station_list_destroy(list); - list = RT_NULL; - goto _return2; - } - - length = read_line(fd, line, LINE_BUFFER_SIZE); - pos = strncasestr(line, "numberofentries="); - if (pos != RT_NULL) - { - list->count = (int)strtol(pos + strlen("numberofentries="), RT_NULL, 10); - if (list->count > 0) - { - list->items = (struct station_item*) rt_malloc (sizeof(struct station_item) * list->count); - rt_memset(list->items, 0, sizeof(struct station_item) * list->count); - } - } - else - { - station_list_destroy(list); - list = RT_NULL; - goto _return2; - } - - if (list->items == RT_NULL) - { - station_list_destroy(list); - list = RT_NULL; - goto _return2; - } - - index = 0; - while (index < list->count) - { - length = read_line(fd, line, LINE_BUFFER_SIZE); - if (length > 0) - { - rt_snprintf(prefix, sizeof(prefix), "File%d", index + 1); - pos = strncasestr(line, prefix); - if (pos != RT_NULL) - strncpy(list->items[index].url, pos + strlen(prefix) + 1, 128); - - rt_snprintf(prefix, sizeof(prefix), "Title%d", index + 1); - pos = strncasestr(line, prefix); - if (pos != RT_NULL) - { - strncpy(list->items[index].title, pos + strlen(prefix) + 1, 40); - index ++; - } - } - else break; - } - -_return2: - close(fd); -_return1: - rt_free(line); - -_return0: - return list; -} - -void station_list_destroy(struct station_list* list) -{ - /* release memory */ - rt_free(list->items); - rt_free(list); -} - -/* update station list file from network */ -void station_list_update(struct rtgui_workbench* workbench) -{ -} - -static void station_list_selected(void* parameter) -{ - rtgui_list_view_t *view; - - view = RTGUI_LIST_VIEW(parameter); - - if (view->current_item != 0) - rtgui_view_end_modal(RTGUI_VIEW(view), RTGUI_MODAL_OK); - else - rtgui_view_end_modal(RTGUI_VIEW(view), RTGUI_MODAL_CANCEL); -} - -/* select a station from list */ -struct station_item* station_list_select(struct station_list* list, struct rtgui_workbench* workbench) -{ - rt_size_t index; - rtgui_rect_t rect; - rtgui_list_view_t *view; - struct rtgui_list_item* items; - struct station_item* station; - char exit_str[] = "·µ»Ø.."; - - RT_ASSERT(list != RT_NULL); - RT_ASSERT(workbench != RT_NULL); - - station = RT_NULL; - - items = (struct rtgui_list_item*) rt_malloc (sizeof(struct rtgui_list_item) * (list->count + 1)); - if (items == RT_NULL) return RT_NULL; /* no memory */ - - /* create view */ - rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); - view = rtgui_list_view_create(items, list->count + 1, &rect); - - items[0].image = RT_NULL; - items[0].action = station_list_selected; - items[0].name = exit_str; - items[0].parameter = view; - - for (index = 1; index < list->count + 1; index ++) - { - items[index].image = RT_NULL; - items[index].action = station_list_selected; - items[index].name = list->items[index - 1].title; - items[index].parameter = view; - } - - /* add view to workbench */ - rtgui_workbench_add_view(workbench, RTGUI_VIEW(view)); - - /* show view as modal */ - if (rtgui_view_show(RTGUI_VIEW(view), RT_TRUE) == RTGUI_MODAL_OK) - { - station = &list->items[view->current_item - 1]; - } - - /* destroy view */ - rtgui_list_view_destroy(view); - /* release items */ - rt_free(items); - - return station; -} - diff --git a/bsp/stm32_radio/station_list.h b/bsp/stm32_radio/station_list.h deleted file mode 100644 index 6f7956ec84..0000000000 --- a/bsp/stm32_radio/station_list.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __STATION_LIST_H__ -#define __STATION_LIST_H__ - -#include -#include -#include -#include - -struct station_item -{ - char title[40]; - char url[128]; -}; - -struct station_list -{ - rt_uint32_t count; - struct station_item* items; -}; - -struct station_list* station_list_create(const char* fn); -void station_list_destroy(struct station_list* list); - -/* update station list file from network */ -void station_list_update(struct rtgui_workbench* workbench); - -/* select a station from list */ -struct station_item* station_list_select(struct station_list* list, struct rtgui_workbench* workbench); - -#endif - diff --git a/bsp/stm32_radio/stm32f10x_conf.h b/bsp/stm32_radio/stm32f10x_conf.h deleted file mode 100644 index 84733f44dc..0000000000 --- a/bsp/stm32_radio/stm32f10x_conf.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - ****************************************************************************** - * @file Project/Template/stm32f10x_conf.h - * @author MCD Application Team - * @version V3.1.0 - * @date 06/19/2009 - * @brief Library configuration file. - ****************************************************************************** - * @copy - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2009 STMicroelectronics

- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_CONF_H -#define __STM32F10x_CONF_H - -/* Includes ------------------------------------------------------------------*/ -/* Uncomment the line below to enable peripheral header file inclusion */ -/* #include "stm32f10x_adc.h" */ -#include "stm32f10x_bkp.h" -/* #include "stm32f10x_can.h" */ -/* #include "stm32f10x_crc.h" */ -/* #include "stm32f10x_dac.h" */ -/* #include "stm32f10x_dbgmcu.h" */ -#include "stm32f10x_dma.h" -#include "stm32f10x_exti.h" -#include "stm32f10x_flash.h" -#include "stm32f10x_fsmc.h" -#include "stm32f10x_gpio.h" -/* #include "stm32f10x_i2c.h" */ -/* #include "stm32f10x_iwdg.h" */ -#include "stm32f10x_pwr.h" -#include "stm32f10x_rcc.h" -#include "stm32f10x_rtc.h" -#include "stm32f10x_sdio.h" -#include "stm32f10x_spi.h" -#include "stm32f10x_tim.h" -#include "stm32f10x_usart.h" -/* #include "stm32f10x_wwdg.h" */ -#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Uncomment the line below to expanse the "assert_param" macro in the - Standard Peripheral Library drivers code */ -/* #define USE_FULL_ASSERT 1 */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT - -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ -#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ -void assert_failed(uint8_t* file, uint32_t line); -#else -#define assert_param(expr) ((void)0) -#endif /* USE_FULL_ASSERT */ - -#endif /* __STM32F10x_CONF_H */ - -/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/stm32f10x_it.c b/bsp/stm32_radio/stm32f10x_it.c deleted file mode 100644 index 907fa8d4c5..0000000000 --- a/bsp/stm32_radio/stm32f10x_it.c +++ /dev/null @@ -1,668 +0,0 @@ -/******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** -* File Name : stm32f10x_it.c -* Author : MCD Application Team -* Version : V1.1.2 -* Date : 09/22/2008 -* Description : Main Interrupt Service Routines. -* This file provides template for all exceptions handler -* and peripherals interrupt service routine. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include -#include -#include "board.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -extern void rt_hw_timer_handler(void); -extern void rt_hw_interrupt_thread_switch(void); - -/******************************************************************************* -* Function Name : NMIException -* Description : This function handles NMI exception. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void NMIException(void) -{ -} - -/******************************************************************************* -* Function Name : HardFaultException -* Description : This function handles Hard Fault exception. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void HardFaultException(void) -{ - /* Go to infinite loop when Hard Fault exception occurs */ - rt_kprintf("hard fault exception\n"); - while (1) - { - } -} - -/******************************************************************************* -* Function Name : MemManageException -* Description : This function handles Memory Manage exception. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void MemManageException(void) -{ - /* Go to infinite loop when Memory Manage exception occurs */ - rt_kprintf("memory manage exception\n"); - while (1) - { - } -} - -/******************************************************************************* -* Function Name : BusFaultException -* Description : This function handles Bus Fault exception. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void BusFaultException(void) -{ - /* Go to infinite loop when Bus Fault exception occurs */ - rt_kprintf("bus fault exception\n"); - while (1) - { - } -} - -/******************************************************************************* -* Function Name : UsageFaultException -* Description : This function handles Usage Fault exception. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void UsageFaultException(void) -{ - /* Go to infinite loop when Usage Fault exception occurs */ - rt_kprintf("usage fault exception\n"); - while (1) - { - } -} - -/******************************************************************************* -* Function Name : DebugMonitor -* Description : This function handles Debug Monitor exception. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void DebugMonitor(void) -{ -} - -/******************************************************************************* -* Function Name : SVCHandler -* Description : This function handles SVCall exception. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void SVCHandler(void) -{ -} - -/******************************************************************************* -* Function Name : SysTickHandler -* Description : This function handles SysTick Handler. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void SysTickHandler(void) -{ - /* handle os tick */ - rt_hw_timer_handler(); -} - -/******************************************************************************* -* Function Name : WWDG_IRQHandler -* Description : This function handles WWDG interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void WWDG_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : PVD_IRQHandler -* Description : This function handles PVD interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void PVD_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : TAMPER_IRQHandler -* Description : This function handles Tamper interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void TAMPER_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : RTC_IRQHandler -* Description : This function handles RTC global interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void RTC_IRQHandler(void) -{ - if (RTC_GetITStatus(RTC_IT_SEC) != RESET) - { - /* Clear the RTC Second interrupt */ - RTC_ClearITPendingBit(RTC_IT_SEC); - - /* Wait until last write operation on RTC registers has finished */ - RTC_WaitForLastTask(); - - /* Reset RTC Counter when Time is 23:59:59 */ - if (RTC_GetCounter() == 0x00015180) - { - RTC_SetCounter(0x0); - /* Wait until last write operation on RTC registers has finished */ - RTC_WaitForLastTask(); - } - } -} - -/******************************************************************************* -* Function Name : FLASH_IRQHandler -* Description : This function handles Flash interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void FLASH_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : RCC_IRQHandler -* Description : This function handles RCC interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void RCC_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : EXTI0_IRQHandler -* Description : This function handles External interrupt Line 0 request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void EXTI0_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : EXTI2_IRQHandler -* Description : This function handles External interrupt Line 2 request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void EXTI2_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : EXTI3_IRQHandler -* Description : This function handles External interrupt Line 3 request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void EXTI3_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : EXTI4_IRQHandler -* Description : This function handles External interrupt Line 4 request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void EXTI4_IRQHandler(void) -{ -#ifdef RT_USING_LWIP - extern void rt_dm9000_isr(void); - - /* enter interrupt */ - rt_interrupt_enter(); - - rt_dm9000_isr(); - - /* Clear the Key Button EXTI line pending bit */ - EXTI_ClearITPendingBit(EXTI_Line4); - - /* leave interrupt */ - rt_interrupt_leave(); - rt_hw_interrupt_thread_switch(); -#endif -} - -/******************************************************************************* -* Function Name : DMA1_Channel1_IRQHandler -* Description : This function handles DMA1 Channel 1 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void DMA1_Channel1_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : DMA1_Channel2_IRQHandler -* Description : This function handles DMA1 Channel 2 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void DMA1_Channel2_IRQHandler(void) -{ -#ifdef RT_USING_UART3 - extern struct rt_device uart3_device; - - /* enter interrupt */ - rt_interrupt_enter(); - - if (DMA_GetITStatus(DMA1_IT_TC2)) - { - /* transmission complete, invoke serial dma tx isr */ - rt_hw_serial_dma_tx_isr(&uart3_device); - } - - /* clear DMA flag */ - DMA_ClearFlag(DMA1_FLAG_TC2 | DMA1_FLAG_TE2); - - /* leave interrupt */ - rt_interrupt_leave(); - rt_hw_interrupt_thread_switch(); -#endif -} - -/******************************************************************************* -* Function Name : DMA1_Channel3_IRQHandler -* Description : This function handles DMA1 Channel 3 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void DMA1_Channel3_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : DMA1_Channel4_IRQHandler -* Description : This function handles DMA1 Channel 4 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void DMA1_Channel4_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : DMA1_Channel5_IRQHandler -* Description : This function handles DMA1 Channel 5 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void DMA1_Channel5_IRQHandler(void) -{ -#if !CODEC_USE_SPI3 - extern void codec_dma_isr(void); - - /* enter interrupt */ - rt_interrupt_enter(); - - if (DMA_GetITStatus(DMA1_IT_TC5)) - { - /* clear DMA flag */ - DMA_ClearFlag(DMA1_FLAG_TC5 | DMA1_FLAG_TE5); - - // rt_kprintf("DMA\n"); - /* transmission complete, invoke serial dma tx isr */ - codec_dma_isr(); - } - - /* leave interrupt */ - rt_interrupt_leave(); -#endif -} - -/******************************************************************************* -* Function Name : DMA1_Channel6_IRQHandler -* Description : This function handles DMA1 Channel 6 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void DMA1_Channel6_IRQHandler(void) -{ -#ifdef RT_USING_UART2 - extern struct rt_device uart2_device; - - /* enter interrupt */ - rt_interrupt_enter(); - - /* clear DMA flag */ - DMA_ClearFlag(DMA1_FLAG_TC6 | DMA1_FLAG_TE6); - rt_hw_serial_dma_rx_isr(&uart2_device); - - /* leave interrupt */ - rt_interrupt_leave(); - rt_hw_interrupt_thread_switch(); -#endif -} - -/******************************************************************************* -* Function Name : EXTI9_5_IRQHandler -* Description : This function handles External lines 9 to 5 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void EXTI9_5_IRQHandler(void) -{ -#ifdef RT_USING_LWIP - extern void rt_dm9000_isr(void); - - /* enter interrupt */ - rt_interrupt_enter(); - - rt_dm9000_isr(); - - /* Clear the Key Button EXTI line pending bit */ - EXTI_ClearITPendingBit(EXTI_Line7); - - /* leave interrupt */ - rt_interrupt_leave(); - rt_hw_interrupt_thread_switch(); -#endif -} - -/******************************************************************************* -* Function Name : USART1_IRQHandler -* Description : This function handles USART1 global interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void USART1_IRQHandler(void) -{ -#ifdef RT_USING_UART1 - extern struct rt_device uart1_device; - /* enter interrupt */ - rt_interrupt_enter(); - - rt_hw_serial_isr(&uart1_device); - - /* leave interrupt */ - rt_interrupt_leave(); - rt_hw_interrupt_thread_switch(); -#endif -} - -/******************************************************************************* -* Function Name : USART2_IRQHandler -* Description : This function handles USART2 global interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void USART2_IRQHandler(void) -{ -#ifdef RT_USING_UART2 - extern struct rt_device uart2_device; - - /* enter interrupt */ - rt_interrupt_enter(); - - rt_hw_serial_isr(&uart2_device); - - /* leave interrupt */ - rt_interrupt_leave(); - rt_hw_interrupt_thread_switch(); -#endif -} - -/******************************************************************************* -* Function Name : USART3_IRQHandler -* Description : This function handles USART3 global interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void USART3_IRQHandler(void) -{ -#ifdef RT_USING_UART3 - extern struct rt_device uart3_device; - - /* enter interrupt */ - rt_interrupt_enter(); - - rt_hw_serial_isr(&uart3_device); - - /* leave interrupt */ - rt_interrupt_leave(); - rt_hw_interrupt_thread_switch(); -#endif -} - -/******************************************************************************* -* Function Name : EXTI15_10_IRQHandler -* Description : This function handles External lines 15 to 10 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void EXTI15_10_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : RTCAlarm_IRQHandler -* Description : This function handles RTC Alarm interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void RTCAlarm_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : USBWakeUp_IRQHandler -* Description : This function handles USB WakeUp interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void USBWakeUp_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : TIM8_BRK_IRQHandler -* Description : This function handles TIM8 Break interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void TIM8_BRK_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : TIM8_UP_IRQHandler -* Description : This function handles TIM8 overflow and update interrupt -* request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void TIM8_UP_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : TIM8_TRG_COM_IRQHandler -* Description : This function handles TIM8 Trigger and commutation interrupts -* requests. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void TIM8_TRG_COM_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : TIM8_CC_IRQHandler -* Description : This function handles TIM8 capture compare interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void TIM8_CC_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : ADC3_IRQHandler -* Description : This function handles ADC3 global interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ADC3_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : FSMC_IRQHandler -* Description : This function handles FSMC global interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void FSMC_IRQHandler(void) -{ -} - -/******************************************************************************* -* Function Name : SDIO_IRQHandler -* Description : This function handles SDIO global interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void SDIO_IRQHandler(void) -{ -#ifdef RT_USING_DFS - extern int SD_ProcessIRQSrc(void); - - /* enter interrupt */ - rt_interrupt_enter(); - - /* Process All SDIO Interrupt Sources */ - SD_ProcessIRQSrc(); - - /* leave interrupt */ - rt_interrupt_leave(); - rt_hw_interrupt_thread_switch(); -#endif -} - -/******************************************************************************* -* Function Name : DMA2_Channel2_IRQHandler -* Description : This function handles DMA2 Channel 2 interrupt request. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void DMA2_Channel2_IRQHandler(void) -{ -#if CODEC_USE_SPI3 - extern void codec_dma_isr(void); - - /* enter interrupt */ - rt_interrupt_enter(); - - if (DMA_GetITStatus(DMA2_IT_TC2)) - { - /* clear DMA flag */ - DMA_ClearFlag(DMA2_FLAG_TC2 | DMA2_FLAG_TE2); - - /* transmission complete, invoke serial dma tx isr */ - codec_dma_isr(); - } - - /* leave interrupt */ - rt_interrupt_leave(); -#endif -} - -/* add on 2009-12-31 for usb */ -extern void CTR_HP(void); -extern void USB_Istr(void); -void USB_HP_CAN1_TX_IRQHandler(void) -{ - CTR_HP(); -} - -void USB_LP_CAN1_RX0_IRQHandler(void) -{ - USB_Istr(); -} - -/* add on 2010-01-02 for remote */ -extern void remote_isr(void); -void TIM5_IRQHandler(void) -{ - remote_isr(); -} diff --git a/bsp/stm32_radio/stm32f10x_it.h b/bsp/stm32_radio/stm32f10x_it.h deleted file mode 100644 index bb7c9d06ae..0000000000 --- a/bsp/stm32_radio/stm32f10x_it.h +++ /dev/null @@ -1,110 +0,0 @@ -/******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** -* File Name : stm32f10x_it.h -* Author : MCD Application Team -* Version : V2.0.3 -* Date : 09/22/2008 -* Description : This file contains the headers of the interrupt handlers. -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F10x_IT_H -#define __STM32F10x_IT_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x_lib.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -void NMIException(void); -void HardFaultException(void); -void MemManageException(void); -void BusFaultException(void); -void UsageFaultException(void); -void DebugMonitor(void); -void SVCHandler(void); -void rt_hw_pend_sv(void); -void SysTickHandler(void); -void WWDG_IRQHandler(void); -void PVD_IRQHandler(void); -void TAMPER_IRQHandler(void); -void RTC_IRQHandler(void); -void FLASH_IRQHandler(void); -void RCC_IRQHandler(void); -void EXTI0_IRQHandler(void); -void EXTI1_IRQHandler(void); -void EXTI2_IRQHandler(void); -void EXTI3_IRQHandler(void); -void EXTI4_IRQHandler(void); -void DMA1_Channel1_IRQHandler(void); -void DMA1_Channel2_IRQHandler(void); -void DMA1_Channel3_IRQHandler(void); -void DMA1_Channel4_IRQHandler(void); -void DMA1_Channel5_IRQHandler(void); -void DMA1_Channel6_IRQHandler(void); -void DMA1_Channel7_IRQHandler(void); -void ADC1_2_IRQHandler(void); -void USB_HP_CAN1_TX_IRQHandler(void); -void USB_LP_CAN1_RX0_IRQHandler(void); -void CAN1_RX1_IRQHandler(void); -void CAN1_SCE_IRQHandler(void); -void EXTI9_5_IRQHandler(void); -void TIM1_BRK_IRQHandler(void); -void TIM1_UP_IRQHandler(void); -void TIM1_TRG_COM_IRQHandler(void); -void TIM1_CC_IRQHandler(void); -void TIM2_IRQHandler(void); -void TIM3_IRQHandler(void); -void TIM4_IRQHandler(void); -void I2C1_EV_IRQHandler(void); -void I2C1_ER_IRQHandler(void); -void I2C2_EV_IRQHandler(void); -void I2C2_ER_IRQHandler(void); -void SPI1_IRQHandler(void); -void SPI2_IRQHandler(void); -void USART1_IRQHandler(void); -void USART2_IRQHandler(void); -void USART3_IRQHandler(void); -void EXTI15_10_IRQHandler(void); -void RTCAlarm_IRQHandler(void); -void USBWakeUp_IRQHandler(void); -/****** HD ******/ -void TIM8_BRK_IRQHandler(void); -void TIM8_UP_IRQHandler(void); -void TIM8_TRG_COM_IRQHandler(void); -void TIM8_CC_IRQHandler(void); -void ADC3_IRQHandler(void); -void FSMC_IRQHandler(void); -void SDIO_IRQHandler(void); -void TIM5_IRQHandler(void); -void SPI3_IRQHandler(void); -void UART4_IRQHandler(void); -void UART5_IRQHandler(void); -void TIM6_IRQHandler(void); -void TIM7_IRQHandler(void); -void DMA2_Channel1_IRQHandler(void); -void DMA2_Channel2_IRQHandler(void); -void DMA2_Channel3_IRQHandler(void); -void DMA2_Channel4_5_IRQHandler(void); -/********* CL **********/ -void DMA2_Channel5_IRQHandler(void); -void ETH_IRQHandler(void); -void ETH_WKUP_IRQHandler(void); -void CAN2_TX_IRQHandler(void); -void CAN2_RX0_IRQHandler(void); -void CAN2_RX1_IRQHandler(void); -void CAN2_SCE_IRQHandler(void); -void OTG_FS_IRQHandler(void); - -#endif /* __STM32F10x_IT_H */ - -/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32_radio/stop.hdh b/bsp/stm32_radio/stop.hdh deleted file mode 100644 index 9271b7ec9a..0000000000 --- a/bsp/stm32_radio/stop.hdh +++ /dev/null @@ -1,107 +0,0 @@ -static const unsigned char stop_hdh[] = { - 0x48, 0x44, 0x43, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0x9d, 0xae, 0xdf, 0xef, 0xbf, 0xe7, 0xbf, 0xe7, - 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, - 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, - 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, - 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0xbf, 0xe7, 0x9d, 0xae, - 0x9d, 0xae, 0xdf, 0xef, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0xdf, 0xef, 0x9d, 0xae, 0x7d, 0xae, 0xbf, 0xef, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, 0x9f, 0xdf, - 0xbf, 0xef, 0x7d, 0xae, 0x7d, 0xae, 0xbf, 0xe7, 0x7f, 0xd7, 0x7f, 0xd7, - 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, - 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, - 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, - 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0x7f, 0xd7, 0xbf, 0xe7, 0x7d, 0xae, - 0x7d, 0xa6, 0xbf, 0xe7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, - 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0xfb, 0x8d, 0x3c, 0x96, - 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, - 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, 0x5f, 0xd7, - 0x5f, 0xd7, 0x5f, 0xd7, 0xbf, 0xe7, 0x7d, 0xa6, 0x5d, 0xa6, 0x9f, 0xe7, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, - 0x5f, 0xcf, 0x5f, 0xcf, 0xf9, 0x4c, 0x3a, 0x55, 0x5a, 0x65, 0x9d, 0xae, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, - 0x9f, 0xe7, 0x5d, 0xa6, 0x5d, 0xa6, 0x9f, 0xdf, 0x5f, 0xcf, 0x5f, 0xcf, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, - 0xf9, 0x4c, 0x5b, 0x55, 0x3b, 0x55, 0x1a, 0x4d, 0xba, 0x7d, 0x1e, 0xc7, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, - 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x5f, 0xcf, 0x9f, 0xdf, 0x5d, 0xa6, - 0x5c, 0xa6, 0x9f, 0xdf, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, - 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0xd9, 0x4c, 0x3b, 0x4d, - 0x3b, 0x4d, 0x3b, 0x4d, 0x1a, 0x4d, 0xf9, 0x4c, 0xfb, 0x8d, 0x3f, 0xc7, - 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, 0x3f, 0xc7, - 0x3f, 0xc7, 0x3f, 0xc7, 0x9f, 0xdf, 0x5c, 0xa6, 0x3c, 0xa6, 0x7f, 0xdf, - 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, - 0x3e, 0xc7, 0x3e, 0xc7, 0xb8, 0x44, 0x1a, 0x4d, 0x1a, 0x4d, 0x1a, 0x4d, - 0x1a, 0x4d, 0x1a, 0x4d, 0xd9, 0x44, 0x19, 0x5d, 0x7c, 0xa6, 0x3e, 0xc7, - 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, 0x3e, 0xc7, - 0x7f, 0xdf, 0x3c, 0xa6, 0x3c, 0x9e, 0x7f, 0xd7, 0x1e, 0xbf, 0x1e, 0xbf, - 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, - 0x98, 0x44, 0xfa, 0x44, 0xfa, 0x44, 0xfa, 0x44, 0xfa, 0x44, 0xfa, 0x44, - 0xf9, 0x44, 0xd9, 0x44, 0x98, 0x44, 0x39, 0x6d, 0x1e, 0xbf, 0x1e, 0xbf, - 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x1e, 0xbf, 0x7f, 0xd7, 0x3c, 0x9e, - 0x1c, 0x9e, 0x7f, 0xd7, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0x77, 0x3c, 0xd9, 0x44, - 0xd9, 0x44, 0xd9, 0x44, 0xd9, 0x44, 0xd9, 0x44, 0xb9, 0x44, 0xb8, 0x3c, - 0x77, 0x3c, 0x38, 0x6d, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0x7f, 0xd7, 0x1c, 0x9e, 0x1c, 0x9e, 0x5e, 0xcf, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0x56, 0x34, 0x98, 0x3c, 0x98, 0x3c, 0x98, 0x3c, - 0x98, 0x3c, 0x98, 0x3c, 0x77, 0x3c, 0xb7, 0x4c, 0x3c, 0x96, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0x5e, 0xcf, 0x1c, 0x9e, 0xfc, 0x95, 0x5e, 0xcf, 0xfe, 0xb6, 0xfe, 0xb6, - 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, - 0x36, 0x34, 0x78, 0x34, 0x78, 0x34, 0x78, 0x34, 0x57, 0x34, 0x56, 0x3c, - 0x9a, 0x7d, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, - 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb6, 0x5e, 0xcf, 0xfc, 0x95, - 0xfb, 0x95, 0x3e, 0xcf, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, - 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0x15, 0x2c, 0x57, 0x34, - 0x37, 0x34, 0x16, 0x2c, 0xf8, 0x5c, 0x9d, 0xae, 0xde, 0xb6, 0xde, 0xb6, - 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, 0xde, 0xb6, - 0xde, 0xb6, 0xde, 0xb6, 0x3e, 0xcf, 0xfb, 0x95, 0xdb, 0x95, 0x3e, 0xc7, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, - 0xbe, 0xae, 0xbe, 0xae, 0xd4, 0x2b, 0xf5, 0x2b, 0x56, 0x44, 0xfb, 0x8d, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, - 0x3e, 0xc7, 0xdb, 0x95, 0xdb, 0x95, 0x3e, 0xc7, 0xbe, 0xae, 0xbe, 0xae, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, - 0xf8, 0x64, 0x39, 0x6d, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, - 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0xbe, 0xae, 0x3e, 0xc7, 0xdb, 0x95, - 0xdb, 0x8d, 0x1e, 0xc7, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x1e, 0xc7, 0xdb, 0x8d, 0xbb, 0x8d, 0x1e, 0xbf, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x1e, 0xbf, 0xbb, 0x8d, 0xbb, 0x8d, 0x1e, 0xbf, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, - 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x9d, 0xa6, 0x1e, 0xbf, 0xbb, 0x8d, - 0xbb, 0x8d, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, - 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xbb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, 0xdb, 0x8d, - 0xdb, 0x8d, 0xdb, 0x8d, -}; diff --git a/bsp/stm32_radio/today.c b/bsp/stm32_radio/today.c deleted file mode 100644 index 2bc0df2fc5..0000000000 --- a/bsp/stm32_radio/today.c +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include - -#include -#include - -static rtgui_image_t *background = RT_NULL; -static rt_bool_t view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) -{ - if (event->type == RTGUI_EVENT_PAINT) - { - struct rtgui_dc* dc; - struct rtgui_rect rect; - - dc = rtgui_dc_begin_drawing(widget); - if (dc == RT_NULL) return RT_FALSE; - rtgui_widget_get_rect(widget, &rect); - - rtgui_dc_fill_rect(dc, &rect); - - if (background != RT_NULL) - rtgui_image_blit(background, dc, &rect); - - rtgui_dc_draw_text(dc, "Radio Today", &rect); - - rtgui_dc_end_drawing(dc); - - return RT_FALSE; - } - - return rtgui_view_event_handler(widget, event); -} - -static void today_entry(void* parameter) -{ - rt_mq_t mq; - struct rtgui_view* view; - struct rtgui_workbench* workbench; - - mq = rt_mq_create("qToday", 256, 4, RT_IPC_FLAG_FIFO); - rtgui_thread_register(rt_thread_self(), mq); - - /* create background image */ - background = rtgui_image_create_from_file("png", - "/bg.png", RT_FALSE); - - workbench = rtgui_workbench_create("main", "workbench"); - if (workbench == RT_NULL) return; - - view = rtgui_view_create("Today"); - rtgui_widget_set_event_handler(RTGUI_WIDGET(view), view_event_handler); - - rtgui_workbench_add_view(workbench, view); - - rtgui_view_show(view); - - rtgui_workbench_event_loop(workbench); - - rtgui_thread_deregister(rt_thread_self()); - rt_mq_delete(mq); -} - -void today_init() -{ - rt_thread_t tid; - - tid = rt_thread_create("today", - today_entry, RT_NULL, - 2048, 25, 10); - - if (tid != RT_NULL) rt_thread_startup(tid); -} diff --git a/bsp/stm32_radio/touch.c b/bsp/stm32_radio/touch.c deleted file mode 100644 index 730b67f931..0000000000 --- a/bsp/stm32_radio/touch.c +++ /dev/null @@ -1,143 +0,0 @@ -#include "stm32f10x.h" -#include "rtthread.h" -#include "board.h" - -#if (LCD_VERSION == 2) -/* -MISO PA6 -MOSI PA7 -CLK PA5 -CS PC4 -*/ - -#define CS_0() GPIO_ResetBits(GPIOC,GPIO_Pin_4) -#define CS_1() GPIO_SetBits(GPIOC,GPIO_Pin_4) - -/* -7 6 - 4 3 2 1-0 -s A2-A0 MODE SER/DFR PD1-PD0 -*/ -#define TOUCH_MSR_Y 0x90 //¶ÁXÖá×ø±êÖ¸Áî addr:1 -#define TOUCH_MSR_X 0xD0 //¶ÁYÖá×ø±êÖ¸Áî addr:3 - - -extern unsigned char SPI_WriteByte(unsigned char data); - -//SPIдÊý¾Ý -static void WriteDataTo7843(unsigned char num) -{ - SPI_WriteByte(num); -} - -//´¥Ãþ´¦Àí -void Go_Touch(void) -{ - unsigned int X; - unsigned int Y; - - CS_0(); - WriteDataTo7843(TOUCH_MSR_X | 1); /* ·¢ËͶÁX×ø±êÃüÁî²¢¹Ø±ÕÖÐ¶Ï */ - X = SPI_WriteByte(0x00)<<4; /* ¶ÁÈ¡µÚÒ»×Ö½ÚMSB */ - X |= ((SPI_WriteByte(TOUCH_MSR_Y | 1)>>4)&0x0F );/* ¶ÁÈ¡µÚ¶þ×Ö½Ú Í¬Ê±·¢ËͶÁYÖá×ø±êÃüÁîÐÐ*/ - Y = SPI_WriteByte(0x00)<<4; /* ¶ÁÈ¡µÚÒ»×Ö½ÚMSB */ - Y |= ((SPI_WriteByte(1<<7)>>4)&0x0F ); /* ¶ÁÈ¡µÚ¶þ×Ö½Ú²¢ÖØÐ´ò¿ªÖÐ¶Ï */ - CS_1(); - - rt_kprintf("\r\nX: %04d Y: %04d",X,Y); -} - -static void NVIC_Configuration(void) -{ - NVIC_InitTypeDef NVIC_InitStructure; - - /* Enable the EXTI0 Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -} - -static void exti_int_config(void) -{ - EXTI_InitTypeDef EXTI_InitStructure; - - /* PB1 touch INT */ - { - GPIO_InitTypeDef GPIO_InitStructure; - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); - - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(GPIOB,&GPIO_InitStructure); - } - - GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1); - - /* Configure EXTI */ - EXTI_InitStructure.EXTI_Line = EXTI_Line1; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//FallingϽµÑØ RisingÉÏÉý - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); - - EXTI_ClearITPendingBit(EXTI_Line1); -} - -#include -void touch_test(void) -{ - SPI_InitTypeDef SPI_InitStructure; - - rt_kprintf("\r\ntouch testing....\r\n"); - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); - - /* Enable SPI_MASTER */ - SPI_Cmd(SPI1, DISABLE); - - /*------------------------ SPI1 configuration ------------------------*/ - SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI_Direction_1Line_Tx; - SPI_InitStructure.SPI_Mode = SPI_Mode_Master; - SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; - SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; - SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;/* 72M/64=1.125M */ - SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; - SPI_InitStructure.SPI_CRCPolynomial = 7; - - SPI_I2S_DeInit(SPI1); - SPI_Init(SPI1, &SPI_InitStructure); - - /* Enable SPI_MASTER */ - SPI_Cmd(SPI1, ENABLE); - - NVIC_Configuration(); - exti_int_config(); - - /* PC4 touch CS */ - { - GPIO_InitTypeDef GPIO_InitStructure; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; - GPIO_Init(GPIOC,&GPIO_InitStructure); - CS_1(); - } - CS_0(); - WriteDataTo7843( 1<<7 ); /* ´ò¿ªÖÐ¶Ï */ - CS_1(); -} -FINSH_FUNCTION_EXPORT(touch_test, touch_test) - -void EXTI1_IRQHandler(void) -{ - EXTI_ClearITPendingBit(EXTI_Line1); - Go_Touch(); -} -#endif diff --git a/bsp/stm32_radio/usart.c b/bsp/stm32_radio/usart.c deleted file mode 100644 index bc05e93c77..0000000000 --- a/bsp/stm32_radio/usart.c +++ /dev/null @@ -1,340 +0,0 @@ -/* - * File : usart.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2009, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-01-05 Bernard the first version - * 2010-03-29 Bernard remove interrupt Tx and DMA Rx mode - */ - -#include "usart.h" -#include -#include - -/* - * Use UART1 as console output and finsh input - * interrupt Rx and poll Tx (stream mode) - * - * Use UART2 with interrupt Rx and poll Tx - * Use UART3 with DMA Tx and interrupt Rx -- DMA channel 2 - * - * USART DMA setting on STM32 - * USART1 Tx --> DMA Channel 4 - * USART1 Rx --> DMA Channel 5 - * USART2 Tx --> DMA Channel 7 - * USART2 Rx --> DMA Channel 6 - * USART3 Tx --> DMA Channel 2 - * USART3 Rx --> DMA Channel 3 - */ - -#ifdef RT_USING_UART1 -struct stm32_serial_int_rx uart1_int_rx; -struct stm32_serial_device uart1 = -{ - USART1, - &uart1_int_rx, - RT_NULL -}; -struct rt_device uart1_device; -#endif - -#ifdef RT_USING_UART2 -struct stm32_serial_int_rx uart2_int_rx; -struct stm32_serial_device uart2 = -{ - USART2, - &uart2_int_rx, - RT_NULL -}; -struct rt_device uart2_device; -#endif - -#ifdef RT_USING_UART3 -struct stm32_serial_int_rx uart3_int_rx; -struct stm32_serial_dma_tx uart3_dma_tx; -struct stm32_serial_device uart3 = -{ - USART3, - &uart3_int_rx, - &uart3_dma_tx -}; -struct rt_device uart3_device; -#endif - -#define USART1_DR_Base 0x40013804 -#define USART2_DR_Base 0x40004404 -#define USART3_DR_Base 0x40004804 - -/* USART1_REMAP = 0 */ -#define UART1_GPIO_TX GPIO_Pin_9 -#define UART1_GPIO_RX GPIO_Pin_10 -#define UART1_GPIO GPIOA -#define RCC_APBPeriph_UART1 RCC_APB2Periph_USART1 -#define UART1_TX_DMA DMA1_Channel4 -#define UART1_RX_DMA DMA1_Channel5 - -#if defined(STM32F10X_LD) || defined(STM32F10X_MD) || defined(STM32F10X_CL) -#define UART2_GPIO_TX GPIO_Pin_5 -#define UART2_GPIO_RX GPIO_Pin_6 -#define UART2_GPIO GPIOD -#define RCC_APBPeriph_UART2 RCC_APB1Periph_USART2 -#else /* for STM32F10X_HD */ -/* USART2_REMAP = 0 */ -#define UART2_GPIO_TX GPIO_Pin_2 -#define UART2_GPIO_RX GPIO_Pin_3 -#define UART2_GPIO GPIOA -#define RCC_APBPeriph_UART2 RCC_APB1Periph_USART2 -#define UART2_TX_DMA DMA1_Channel7 -#define UART2_RX_DMA DMA1_Channel6 -#endif - -/* USART3_REMAP[1:0] = 00 */ -#define UART3_GPIO_RX GPIO_Pin_11 -#define UART3_GPIO_TX GPIO_Pin_10 -#define UART3_GPIO GPIOB -#define RCC_APBPeriph_UART3 RCC_APB1Periph_USART3 -#define UART3_TX_DMA DMA1_Channel2 -#define UART3_RX_DMA DMA1_Channel3 - -static void RCC_Configuration(void) -{ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); - -#ifdef RT_USING_UART1 - /* Enable USART1 and GPIOA clocks */ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); -#endif - -#ifdef RT_USING_UART2 - -#if (defined(STM32F10X_LD) || defined(STM32F10X_MD) || defined(STM32F10X_CL)) - /* Enable AFIO and GPIOD clock */ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD, ENABLE); - - /* Enable the USART2 Pins Software Remapping */ - GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); -#else - /* Enable AFIO and GPIOA clock */ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); -#endif - - /* Enable USART2 clock */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); -#endif - -#ifdef RT_USING_UART3 - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); - /* Enable USART3 clock */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); - - /* DMA clock enable */ - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); -#endif -} - -static void GPIO_Configuration(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - -#ifdef RT_USING_UART1 - /* Configure USART1 Rx (PA.10) as input floating */ - GPIO_InitStructure.GPIO_Pin = UART1_GPIO_RX; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - GPIO_Init(UART1_GPIO, &GPIO_InitStructure); - - /* Configure USART1 Tx (PA.09) as alternate function push-pull */ - GPIO_InitStructure.GPIO_Pin = UART1_GPIO_TX; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_Init(UART1_GPIO, &GPIO_InitStructure); -#endif - -#ifdef RT_USING_UART2 - /* Configure USART2 Rx as input floating */ - GPIO_InitStructure.GPIO_Pin = UART2_GPIO_RX; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - GPIO_Init(UART2_GPIO, &GPIO_InitStructure); - - /* Configure USART2 Tx as alternate function push-pull */ - GPIO_InitStructure.GPIO_Pin = UART2_GPIO_TX; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(UART2_GPIO, &GPIO_InitStructure); -#endif - -#ifdef RT_USING_UART3 - /* Configure USART3 Rx as input floating */ - GPIO_InitStructure.GPIO_Pin = UART3_GPIO_RX; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - GPIO_Init(UART3_GPIO, &GPIO_InitStructure); - - /* Configure USART3 Tx as alternate function push-pull */ - GPIO_InitStructure.GPIO_Pin = UART3_GPIO_TX; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(UART3_GPIO, &GPIO_InitStructure); -#endif -} - -static void NVIC_Configuration(void) -{ - NVIC_InitTypeDef NVIC_InitStructure; - - /* Configure the NVIC Preemption Priority Bits */ - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); - -#ifdef RT_USING_UART1 - /* Enable the USART1 Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -#endif - -#ifdef RT_USING_UART2 - /* Enable the USART2 Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -#endif - -#ifdef RT_USING_UART3 - /* Enable the USART3 Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - /* Enable the DMA1 Channel2 Interrupt */ - NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -#endif -} - -static void DMA_Configuration(void) -{ -#if defined (RT_USING_UART3) - DMA_InitTypeDef DMA_InitStructure; - - /* fill init structure */ - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; - DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; - - /* DMA1 Channel5 (triggered by USART3 Tx event) Config */ - DMA_DeInit(UART3_TX_DMA); - DMA_InitStructure.DMA_PeripheralBaseAddr = USART3_DR_Base; - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; - DMA_InitStructure.DMA_MemoryBaseAddr = (u32)0; - DMA_InitStructure.DMA_BufferSize = 0; - DMA_Init(UART3_TX_DMA, &DMA_InitStructure); - DMA_ITConfig(UART3_TX_DMA, DMA_IT_TC | DMA_IT_TE, ENABLE); - DMA_ClearFlag(DMA1_FLAG_TC5); -#endif -} - -/* - * Init all related hardware in here - * rt_hw_serial_init() will register all supported USART device - */ -void rt_hw_usart_init() -{ - USART_InitTypeDef USART_InitStructure; - USART_ClockInitTypeDef USART_ClockInitStructure; - - RCC_Configuration(); - - GPIO_Configuration(); - - NVIC_Configuration(); - - DMA_Configuration(); - - /* uart init */ -#ifdef RT_USING_UART1 - USART_InitStructure.USART_BaudRate = 115200; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_Parity = USART_Parity_No; - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; - USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; - USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; - USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; - USART_Init(USART1, &USART_InitStructure); - USART_ClockInit(USART1, &USART_ClockInitStructure); - - /* register uart1 */ - rt_hw_serial_register(&uart1_device, "uart1", - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM, - &uart1); - - /* enable interrupt */ - USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); -#endif - -#ifdef RT_USING_UART2 - USART_InitStructure.USART_BaudRate = 115200; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_Parity = USART_Parity_No; - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; - USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; - USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; - USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; - USART_Init(USART2, &USART_InitStructure); - USART_ClockInit(USART2, &USART_ClockInitStructure); - - /* register uart2 */ - rt_hw_serial_register(&uart2_device, "uart2", - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM, - &uart2); - - /* Enable USART2 DMA Rx request */ - USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); -#endif - -#ifdef RT_USING_UART3 - USART_InitStructure.USART_BaudRate = 115200; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_Parity = USART_Parity_No; - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; - USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; - USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; - USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; - USART_Init(USART3, &USART_InitStructure); - USART_ClockInit(USART3, &USART_ClockInitStructure); - - uart3_dma_tx.dma_channel= UART3_TX_DMA; - - /* register uart3 */ - rt_hw_serial_register(&uart3_device, "uart3", - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_DMA_TX, - &uart3); - - /* Enable USART3 DMA Tx request */ - USART_DMACmd(USART3, USART_DMAReq_Tx , ENABLE); - - /* enable interrupt */ - USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); -#endif -} diff --git a/bsp/stm32_radio/usart.h b/bsp/stm32_radio/usart.h deleted file mode 100644 index 36c5f19b1e..0000000000 --- a/bsp/stm32_radio/usart.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * File : usart.h - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2009, RT-Thread Development Team - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE - * - * Change Logs: - * Date Author Notes - * 2009-01-05 Bernard the first version - */ - -#ifndef __USART_H__ -#define __USART_H__ - -#include -#include - -void rt_hw_usart_init(void); - -#endif diff --git a/bsp/stm32_radio/wav.c b/bsp/stm32_radio/wav.c deleted file mode 100644 index 18105834e1..0000000000 --- a/bsp/stm32_radio/wav.c +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include "netbuffer.h" -#include "stm32f10x.h" - -static rt_err_t wav_tx_done(rt_device_t dev, void *buffer) -{ - /* release memory block */ - sbuf_release(buffer); - - return RT_EOK; -} - -void wav(char* filename) -{ - int fd; - rt_size_t block_size; - - block_size = sbuf_get_size(); - block_size = (block_size / 512) * 512; - - fd = open(filename, O_RDONLY, 0); - if (fd >= 0) - { - rt_uint8_t* buf; - rt_size_t len; - rt_device_t device; - - /* open audio device and set tx done call back */ - device = rt_device_find("snd"); - rt_device_set_tx_complete(device, wav_tx_done); - rt_device_open(device, RT_DEVICE_OFLAG_WRONLY); - - do - { - buf = sbuf_alloc(); - len = read(fd, (char*)buf, block_size); - if (len > 0) rt_device_write(device, 0, buf, len); - else sbuf_release(buf); - } while (len != 0); - - /* close device and file */ - rt_device_close(device); - close(fd); - } -} -FINSH_FUNCTION_EXPORT(wav, wav test) - diff --git a/bsp/stm32_radio/wma.c b/bsp/stm32_radio/wma.c deleted file mode 100644 index cbed5ff89c..0000000000 --- a/bsp/stm32_radio/wma.c +++ /dev/null @@ -1,1049 +0,0 @@ -#include -#include - -#include "libwma/asf.h" -#include "libwma/wmadec.h" - -int packet_count=0; - -/* The output buffer containing the decoded samples (channels 0 and 1) - BLOCK_MAX_SIZE is 2048 (samples) and MAX_CHANNELS is 2. - */ - -static rt_uint32_t decoded[BLOCK_MAX_SIZE * MAX_CHANNELS]; - -/* NOTE: WMADecodeContext is 120152 bytes (on x86) */ -static WMADecodeContext wmadec; - -enum asf_error_e { - ASF_ERROR_INTERNAL = -1, /* incorrect input to API calls */ - ASF_ERROR_OUTOFMEM = -2, /* some malloc inside program failed */ - ASF_ERROR_EOF = -3, /* unexpected end of file */ - ASF_ERROR_IO = -4, /* error reading or writing to file */ - ASF_ERROR_INVALID_LENGTH = -5, /* length value conflict in input data */ - ASF_ERROR_INVALID_VALUE = -6, /* other value conflict in input data */ - ASF_ERROR_INVALID_OBJECT = -7, /* ASF object missing or in wrong place */ - ASF_ERROR_OBJECT_SIZE = -8, /* invalid ASF object size (too small) */ - ASF_ERROR_SEEKABLE = -9, /* file not seekable */ - ASF_ERROR_SEEK = -10, /* file is seekable but seeking failed */ - ASF_ERROR_ENCRYPTED = -11 /* file is encrypted */ -}; - -// #define DEBUGF rt_kprintf - -#ifndef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#endif - -/* always little endian */ -#define read_uint16le(stream,buf) stream_buffer_read((stream), (rt_uint8_t*)(buf), 2) -#define read_uint32le(stream,buf) stream_buffer_read((stream), (rt_uint8_t*)(buf), 4) -#define read_uint64le(stream,buf) stream_buffer_read((stream), (rt_uint8_t*)(buf), 8) - -#define ID3V2_BUF_SIZE 300 - -struct id3_tag -{ - char* title; - char* artist; - char* album; - char* year_string; - char* comment; - char* genre_string; - char* track_string; - char* albumartist; - char* composer; - - /* Musicbrainz Track ID */ - char* mb_track_id; - - int year; - int tracknum; - - rt_uint32_t bitrate; /* bit rate */ - rt_uint32_t frequency; /* sample frequency */ - rt_uint32_t length; /* length */ - - rt_size_t first_frame_offset; /* Byte offset to first real MP3 frame. - Used for skipping leading garbage to - avoid gaps between tracks. */ - - rt_uint32_t frame_count; /* number of frames in the file (if VBR) */ - rt_size_t offset; /* bytes played */ - - /* these following two fields are used for local buffering */ - char id3v2buf[ID3V2_BUF_SIZE]; - char id3v1buf[4][92]; - - rt_uint32_t user_data; /* user data */ -}; - -/* TODO: Just read the GUIDs into a 16-byte array, and use memcmp to compare */ -struct guid_s { - rt_uint32_t v1; - rt_uint16_t v2; - rt_uint16_t v3; - rt_uint8_t v4[8]; -}; -typedef struct guid_s guid_t; -typedef long long rt_uint64_t; - -struct asf_object_s { - guid_t guid; - rt_uint64_t size; - rt_uint64_t datalen; -}; -typedef struct asf_object_s asf_object_t; - -static const guid_t asf_guid_null = -{0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; - -/* top level object guids */ - -static const guid_t asf_guid_header = -{0x75B22630, 0x668E, 0x11CF, {0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C}}; - -static const guid_t asf_guid_data = -{0x75B22636, 0x668E, 0x11CF, {0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C}}; - -static const guid_t asf_guid_index = -{0x33000890, 0xE5B1, 0x11CF, {0x89, 0xF4, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB}}; - -/* header level object guids */ - -static const guid_t asf_guid_file_properties = -{0x8cabdca1, 0xa947, 0x11cf, {0x8E, 0xe4, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65}}; - -static const guid_t asf_guid_stream_properties = -{0xB7DC0791, 0xA9B7, 0x11CF, {0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65}}; - -static const guid_t asf_guid_content_description = -{0x75B22633, 0x668E, 0x11CF, {0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C}}; - -static const guid_t asf_guid_extended_content_description = -{0xD2D0A440, 0xE307, 0x11D2, {0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5E, 0xA8, 0x50}}; - -static const guid_t asf_guid_content_encryption = -{0x2211b3fb, 0xbd23, 0x11d2, {0xb4, 0xb7, 0x00, 0xa0, 0xc9, 0x55, 0xfc, 0x6e}}; - -static const guid_t asf_guid_extended_content_encryption = -{0x298ae614, 0x2622, 0x4c17, {0xb9, 0x35, 0xda, 0xe0, 0x7e, 0xe9, 0x28, 0x9c}}; - -/* stream type guids */ - -static const guid_t asf_guid_stream_type_audio = -{0xF8699E40, 0x5B4D, 0x11CF, {0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B}}; - -#define STREAM_BUFFER_SIZE 1024 -struct stream_buffer -{ - rt_uint32_t length; - rt_uint32_t position; /* current position in the buffer */ - - rt_uint8_t *buffer; - rt_size_t buffer_size; - - /* file descriptor of this stream buffer */ - int fd; - rt_bool_t eof; -}; - -struct stream_buffer* stream; -struct id3_tag _id3; -struct id3_tag* id3; - -rt_size_t stream_buffer_read(struct stream_buffer* stream, rt_uint8_t* ptr, rt_size_t len) -{ - rt_size_t rest_bytes; - - if (stream->position + len > stream->length) - { - rest_bytes = stream->length - stream->position; - memcpy(ptr, &stream->buffer[stream->position], rest_bytes); - ptr += rest_bytes; - - /* read more buffer */ - stream->length = read(stream->fd, &stream->buffer[0], stream->buffer_size); - - if (stream->length < len - rest_bytes) - { - stream->position = stream->length; - stream->eof = RT_TRUE; - } - else - stream->position = len - rest_bytes; - - memcpy(ptr, &stream->buffer[0], stream->position); - return rest_bytes + stream->position; - } - - memcpy(ptr, &stream->buffer[stream->position], len); - stream->position += len; - - return len; -} - -void stream_buffer_advance(struct stream_buffer* stream, rt_size_t size) -{ - if (stream->position + size < stream->length) - { - stream->position += size; - return; - } - - stream->position = size - (stream->length - stream->position); - stream->length = read(stream->fd, stream->buffer, stream->buffer_size); - if (stream->length < stream->position) stream->eof = RT_TRUE; -}; - -rt_uint8_t *stream_buffer_request(struct stream_buffer* stream, rt_size_t *r_size, rt_size_t size) -{ - rt_size_t rest_bytes, read_bytes, read_result; - - if (size > stream->buffer_size) return RT_NULL; /* request size more than the buffer size */ - - if (stream->position + size < stream->length) - { - *r_size = size; - return &stream->buffer[stream->position]; - } - - /* read more data */ - rest_bytes = stream->length - stream->position; - memmove(&stream->buffer[0], &stream->buffer[stream->position], rest_bytes); - - read_bytes = stream->buffer_size - rest_bytes; - read_bytes = (read_bytes / 512) * 512; /* align to 512 */ - - read_result = read(stream->fd, &stream->buffer[rest_bytes], read_bytes); - stream->position = 0; - stream->length = read_result + rest_bytes; - *r_size = size; - - return &stream->buffer[0]; -} - -struct stream_buffer* stream_buffer_create(int fd) -{ - struct stream_buffer* buffer = (struct stream_buffer*) rt_malloc(sizeof(struct stream_buffer)); - if (buffer != RT_NULL) - { - buffer->fd = fd; - buffer->eof = RT_FALSE; - - buffer->length = 0; - buffer->position = 0; - - buffer->buffer_size = STREAM_BUFFER_SIZE; - buffer->buffer = rt_malloc(buffer->buffer_size); - } - - return buffer; -} - -void stream_buffer_close(struct stream_buffer* stream) -{ - rt_free(stream->buffer); - close(stream->fd); -} - -static int asf_guid_match(const guid_t *guid1, const guid_t *guid2) -{ - if((guid1->v1 != guid2->v1) || - (guid1->v2 != guid2->v2) || - (guid1->v3 != guid2->v3) || - (rt_memcmp(guid1->v4, guid2->v4, 8))) - { - return 0; - } - - return 1; -} - -/* Read the 16 byte GUID from a file */ -static void asf_readGUID(struct stream_buffer* stream, guid_t* guid) -{ - read_uint32le(stream, &guid->v1); - read_uint16le(stream, &guid->v2); - read_uint16le(stream, &guid->v3); - stream_buffer_read(stream, guid->v4, 8); -} - -static void asf_read_object_header(asf_object_t *obj, struct stream_buffer* stream) -{ - asf_readGUID(stream, &obj->guid); - read_uint64le(stream, &obj->size); - obj->datalen = 0; -} - -/* Parse an integer from the extended content object - we always - convert to an int, regardless of native format. -*/ -static int asf_intdecode(struct stream_buffer* stream, int type, int length) -{ - rt_uint16_t tmp16; - rt_uint32_t tmp32; - rt_uint64_t tmp64; - - if (type==3) { - read_uint32le(stream, &tmp32); - stream_buffer_advance(stream,length - 4); - return (int)tmp32; - } else if (type==4) { - read_uint64le(stream, &tmp64); - stream_buffer_advance(stream,length - 8); - return (int)tmp64; - } else if (type == 5) { - read_uint16le(stream, &tmp16); - stream_buffer_advance(stream,length - 2); - return (int)tmp16; - } - - return 0; -} - -#define MASK 0xC0 /* 11000000 */ -#define COMP 0x80 /* 10x */ -static const unsigned char utf8comp[6] = -{ - 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC -}; -/* Encode a UCS value as UTF-8 and return a pointer after this UTF-8 char. */ -unsigned char* utf8encode(unsigned long ucs, unsigned char *utf8) -{ - int tail = 0; - - if (ucs > 0x7F) - while (ucs >> (5*tail + 6)) - tail++; - - *utf8++ = (ucs >> (6*tail)) | utf8comp[tail]; - while (tail--) - *utf8++ = ((ucs >> (6*tail)) & (MASK ^ 0xFF)) | COMP; - - return utf8; -} - -/* Decode a LE utf16 string from a disk buffer into a fixed-sized - utf8 buffer. -*/ -static void asf_utf16LEdecode(struct stream_buffer* stream, - rt_uint16_t utf16bytes, - unsigned char **utf8, - int* utf8bytes) -{ - unsigned long ucs; - int n; - unsigned char utf16buf[256]; - unsigned char* utf16 = utf16buf; - unsigned char* newutf8; - - n = stream_buffer_read(stream, utf16buf, MIN(sizeof(utf16buf), utf16bytes)); - utf16bytes -= n; - - while (n > 0) { - /* Check for a surrogate pair */ - if (utf16[1] >= 0xD8 && utf16[1] < 0xE0) { - if (n < 4) { - /* Run out of utf16 bytes, read some more */ - utf16buf[0] = utf16[0]; - utf16buf[1] = utf16[1]; - - n = stream_buffer_read(stream, utf16buf + 2, MIN(sizeof(utf16buf)-2, utf16bytes)); - utf16 = utf16buf; - utf16bytes -= n; - n += 2; - } - - if (n < 4) { - /* Truncated utf16 string, abort */ - break; - } - ucs = 0x10000 + ((utf16[0] << 10) | ((utf16[1] - 0xD8) << 18) - | utf16[2] | ((utf16[3] - 0xDC) << 8)); - utf16 += 4; - n -= 4; - } else { - ucs = (utf16[0] | (utf16[1] << 8)); - utf16 += 2; - n -= 2; - } - - if (*utf8bytes > 6) { - newutf8 = utf8encode(ucs, *utf8); - *utf8bytes -= (newutf8 - *utf8); - *utf8 += (newutf8 - *utf8); - } - - /* We have run out of utf16 bytes, read more if available */ - if ((n == 0) && (utf16bytes > 0)) { - n = stream_buffer_read(stream, utf16buf, MIN(sizeof(utf16buf), utf16bytes)); - utf16 = utf16buf; - utf16bytes -= n; - } - } - - *utf8[0] = 0; - --*utf8bytes; - - if (utf16bytes > 0) { - /* Skip any remaining bytes */ - stream_buffer_advance(stream, utf16bytes); - } - return; -} - -static int asf_parse_header(struct stream_buffer* stream, struct id3_tag* id3, - asf_waveformatex_t* wfx) -{ - asf_object_t current; - asf_object_t header; - rt_uint64_t datalen; - int i; - int fileprop = 0; - rt_uint64_t play_duration; - rt_uint16_t flags; - rt_uint32_t subobjects; - rt_uint8_t utf8buf[512]; - int id3buf_remaining = sizeof(id3->id3v2buf) + sizeof(id3->id3v1buf); - unsigned char* id3buf = (unsigned char*)id3->id3v2buf; - - asf_read_object_header((asf_object_t *) &header, stream); - - DEBUGF("header.size=%d\n",(int)header.size); - if (header.size < 30) { - /* invalid size for header object */ - return ASF_ERROR_OBJECT_SIZE; - } - - read_uint32le(stream, &subobjects); - - /* Two reserved bytes - do we need to read them? */ - stream_buffer_advance(stream, 2); - - DEBUGF("Read header - size=%d, subobjects=%d\n",(int)header.size, (int)subobjects); - - if (subobjects > 0) { - header.datalen = header.size - 30; - - /* TODO: Check that we have datalen bytes left in the file */ - datalen = header.datalen; - - for (i=0; i<(int)subobjects; i++) { - DEBUGF("Parsing header object %d - datalen=%d\n",i,(int)datalen); - if (datalen < 24) { - DEBUGF("not enough data for reading object\n"); - break; - } - - asf_read_object_header(¤t, stream); - - if (current.size > datalen || current.size < 24) { - DEBUGF("invalid object size - current.size=%d, datalen=%d\n",(int)current.size,(int)datalen); - break; - } - - if (asf_guid_match(¤t.guid, &asf_guid_file_properties)) { - if (current.size < 104) - return ASF_ERROR_OBJECT_SIZE; - - if (fileprop) { - /* multiple file properties objects not allowed */ - return ASF_ERROR_INVALID_OBJECT; - } - - fileprop = 1; - /* All we want is the play duration - uint64_t at offset 40 */ - stream_buffer_advance(stream, 40); - - read_uint64le(stream, &play_duration); - id3->length = play_duration / 10000; - - DEBUGF("****** length = %lums\n", id3->length); - - /* Read the packet size - uint32_t at offset 68 */ - stream_buffer_advance(stream, 20); - read_uint32le(stream, &wfx->packet_size); - - /* Skip bytes remaining in object */ - stream_buffer_advance(stream, current.size - 24 - 72); - } else if (asf_guid_match(¤t.guid, &asf_guid_stream_properties)) { - guid_t guid; - rt_uint32_t propdatalen; - - if (current.size < 78) - return ASF_ERROR_OBJECT_SIZE; - - asf_readGUID(stream, &guid); - - stream_buffer_advance(stream, 24); - read_uint32le(stream, &propdatalen); - stream_buffer_advance(stream, 4); - read_uint16le(stream, &flags); - - if (!asf_guid_match(&guid, &asf_guid_stream_type_audio)) { - DEBUGF("Found stream properties for non audio stream, skipping\n"); - stream_buffer_advance(stream,current.size - 24 - 50); - } else if (wfx->audiostream == -1) { - stream_buffer_advance(stream, 4); - DEBUGF("Found stream properties for audio stream %d\n",flags&0x7f); - - if (propdatalen < 18) { - return ASF_ERROR_INVALID_LENGTH; - } - - read_uint16le(stream, &wfx->codec_id); - read_uint16le(stream, &wfx->channels); - read_uint32le(stream, &wfx->rate); - read_uint32le(stream, &wfx->bitrate); - wfx->bitrate *= 8; - read_uint16le(stream, &wfx->blockalign); - read_uint16le(stream, &wfx->bitspersample); - read_uint16le(stream, &wfx->datalen); - - /* Round bitrate to the nearest kbit */ - id3->bitrate = (wfx->bitrate + 500) / 1000; - id3->frequency = wfx->rate; - - if (wfx->codec_id == ASF_CODEC_ID_WMAV1) { - stream_buffer_read(stream, wfx->data, 4); - stream_buffer_advance(stream, current.size - 24 - 72 - 4); - wfx->audiostream = flags&0x7f; - } else if (wfx->codec_id == ASF_CODEC_ID_WMAV2) { - stream_buffer_read(stream, wfx->data, 6); - stream_buffer_advance(stream,current.size - 24 - 72 - 6); - wfx->audiostream = flags&0x7f; - } else { - DEBUGF("Unsupported WMA codec (Pro, Lossless, Voice, etc)\n"); - stream_buffer_advance(stream,current.size - 24 - 72); - } - } - } else if (asf_guid_match(¤t.guid, &asf_guid_content_description)) { - /* Object contains five 16-bit string lengths, followed by the five strings: - title, artist, copyright, description, rating - */ - rt_uint16_t strlength[5]; - int i; - - DEBUGF("Found GUID_CONTENT_DESCRIPTION - size=%d\n",(int)(current.size - 24)); - - /* Read the 5 string lengths - number of bytes included trailing zero */ - for (i=0; i<5; i++) { - read_uint16le(stream, &strlength[i]); - DEBUGF("strlength = %u\n",strlength[i]); - } - - if (strlength[0] > 0) { /* 0 - Title */ - id3->title = id3buf; - asf_utf16LEdecode(stream, strlength[0], &id3buf, &id3buf_remaining); - } - - if (strlength[1] > 0) { /* 1 - Artist */ - id3->artist = id3buf; - asf_utf16LEdecode(stream, strlength[1], &id3buf, &id3buf_remaining); - } - - stream_buffer_advance(stream, strlength[2]); /* 2 - copyright */ - - if (strlength[3] > 0) { /* 3 - description */ - id3->comment = id3buf; - asf_utf16LEdecode(stream, strlength[3], &id3buf, &id3buf_remaining); - } - - stream_buffer_advance(stream, strlength[4]); /* 4 - rating */ - } else if (asf_guid_match(¤t.guid, &asf_guid_extended_content_description)) { - rt_uint16_t count; - int i; - int bytesleft = current.size - 24; - DEBUGF("Found GUID_EXTENDED_CONTENT_DESCRIPTION\n"); - - read_uint16le(stream, &count); - bytesleft -= 2; - DEBUGF("extended metadata count = %u\n",count); - - for (i=0; i < count; i++) { - rt_uint16_t length, type; - unsigned char* utf8 = utf8buf; - int utf8length = 512; - - read_uint16le(stream, &length); - asf_utf16LEdecode(stream, length, &utf8, &utf8length); - bytesleft -= 2 + length; - - read_uint16le(stream, &type); - read_uint16le(stream, &length); - - if (!strcmp("WM/TrackNumber",utf8buf)) { - if (type == 0) { - id3->track_string = id3buf; - asf_utf16LEdecode(stream, length, &id3buf, &id3buf_remaining); - id3->tracknum = atoi(id3->track_string); - } else if ((type >=2) && (type <= 5)) { - id3->tracknum = asf_intdecode(stream, type, length); - } else { - stream_buffer_advance(stream, length); - } - } else if ((!strcmp("WM/Genre",utf8buf)) && (type == 0)) { - id3->genre_string = id3buf; - asf_utf16LEdecode(stream, length, &id3buf, &id3buf_remaining); - } else if ((!strcmp("WM/AlbumTitle",utf8buf)) && (type == 0)) { - id3->album = id3buf; - asf_utf16LEdecode(stream, length, &id3buf, &id3buf_remaining); - } else if ((!strcmp("WM/AlbumArtist",utf8buf)) && (type == 0)) { - id3->albumartist = id3buf; - asf_utf16LEdecode(stream, length, &id3buf, &id3buf_remaining); - } else if ((!strcmp("WM/Composer",utf8buf)) && (type == 0)) { - id3->composer = id3buf; - asf_utf16LEdecode(stream, length, &id3buf, &id3buf_remaining); - } else if (!strcmp("WM/Year",utf8buf)) { - if (type == 0) { - id3->year_string = id3buf; - asf_utf16LEdecode(stream, length, &id3buf, &id3buf_remaining); - id3->year = atoi(id3->year_string); - } else if ((type >=2) && (type <= 5)) { - id3->year = asf_intdecode(stream, type, length); - } else { - stream_buffer_advance(stream, length); - } - } else if (!strncmp("replaygain_", utf8buf, 11)) { - char* value = id3buf; - int buf_len = id3buf_remaining; - int len; - asf_utf16LEdecode(stream, length, &id3buf, &id3buf_remaining); - len = 0; // parse_replaygain(utf8buf, value, id3, value, buf_len); - - if (len == 0) { - /* Don't need to keep the value */ - id3buf = value; - id3buf_remaining = buf_len; - } - } else if (!strcmp("MusicBrainz/Track Id", utf8buf)) { - id3->mb_track_id = id3buf; - asf_utf16LEdecode(stream, length, &id3buf, &id3buf_remaining); - } else { - stream_buffer_advance(stream, length); - } - bytesleft -= 4 + length; - } - - stream_buffer_advance(stream, bytesleft); - } else if (asf_guid_match(¤t.guid, &asf_guid_content_encryption) - || asf_guid_match(¤t.guid, &asf_guid_extended_content_encryption)) { - DEBUGF("File is encrypted\n"); - return ASF_ERROR_ENCRYPTED; - } else { - DEBUGF("Skipping %d bytes of object\n",(int)(current.size - 24)); - stream_buffer_advance(stream,current.size - 24); - } - - DEBUGF("Parsed object - size = %d\n",(int)current.size); - datalen -= current.size; - } - - if (i != (int)subobjects || datalen != 0) { - DEBUGF("header data doesn't match given subobject count\n"); - return ASF_ERROR_INVALID_VALUE; - } - - DEBUGF("%d subobjects read successfully\n", i); - } - - DEBUGF("header validated correctly\n"); - - return 0; -} - -rt_bool_t get_asf_metadata(struct stream_buffer* stream, struct id3_tag* id3) -{ - int res; - asf_object_t obj; - asf_waveformatex_t* wfx; - - wfx = (asf_waveformatex_t*) rt_malloc(sizeof(asf_waveformatex_t)); - if (wfx == RT_NULL) return RT_FALSE; - - wfx->audiostream = -1; - - res = asf_parse_header(stream, id3, wfx); - if (res < 0) { - DEBUGF("ASF: parsing error - %d\n",res); - return RT_FALSE; - } - - if (wfx->audiostream == -1) { - DEBUGF("ASF: No WMA streams found\n"); - rt_free(wfx); - return RT_FALSE; - } - - asf_read_object_header(&obj, stream); - - if (!asf_guid_match(&obj.guid, &asf_guid_data)) { - DEBUGF("ASF: No data object found\n"); - rt_free(wfx); - return RT_FALSE; - } - - /* Store the current file position - no need to parse the header - again in the codec. The +26 skips the rest of the data object - header. - */ - id3->first_frame_offset = 26; - /* set wfx to user data */ - id3->user_data = (rt_uint32_t)wfx; - - return RT_TRUE; -} - - -/* Read an unaligned 32-bit little endian long from buffer. */ -static unsigned long get_long_le(void* buf) -{ - unsigned char* p = (unsigned char*) buf; - - return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); -} - -/* Read an unaligned 16-bit little endian short from buffer. */ -static unsigned short get_short_le(void* buf) -{ - unsigned char* p = (unsigned char*) buf; - - return p[0] | (p[1] << 8); -} - -#define GETLEN2b(bits) (((bits) == 0x03) ? 4 : bits) - -#define GETVALUE2b(bits, data) \ - (((bits) != 0x03) ? ((bits) != 0x02) ? ((bits) != 0x01) ? \ - 0 : *(data) : get_short_le(data) : get_long_le(data)) - -static int asf_read_packet(rt_uint8_t** audiobuf, int* audiobufsize, int* packetlength, asf_waveformatex_t* wfx) -{ - rt_uint8_t tmp8, packet_flags, packet_property; - int stream_id; - int ec_length, opaque_data, ec_length_type; - int datalen; - rt_uint8_t data[18]; - rt_uint8_t* datap; - rt_uint32_t length; - rt_uint32_t padding_length; - rt_uint32_t send_time; - rt_uint16_t duration; - rt_uint16_t payload_count; - int payload_length_type; - rt_uint32_t payload_hdrlen; - int payload_datalen; - int multiple; - rt_uint32_t replicated_length; - rt_uint32_t media_object_number; - rt_uint32_t media_object_offset; - rt_uint32_t bytesread = 0; - rt_uint8_t* buf; - size_t bufsize; - int i; - /*DEBUGF("Reading new packet at %d bytes ", (int)ci->curpos);*/ - - if (stream_buffer_read(stream, &tmp8, 1) == 0) { - return ASF_ERROR_EOF; - } - bytesread++; - - /* TODO: We need a better way to detect endofstream */ - if (tmp8 != 0x82) { - DEBUGF("Read failed: packet did not sync\n"); - return -1; - } - - - if (tmp8 & 0x80) { - ec_length = tmp8 & 0x0f; - opaque_data = (tmp8 >> 4) & 0x01; - ec_length_type = (tmp8 >> 5) & 0x03; - - if (ec_length_type != 0x00 || opaque_data != 0 || ec_length != 0x02) { - DEBUGF("incorrect error correction flags\n"); - return ASF_ERROR_INVALID_VALUE; - } - - /* Skip ec_data */ - stream_buffer_advance(stream, ec_length); - bytesread += ec_length; - } else { - ec_length = 0; - } - - if (stream_buffer_read(stream, &packet_flags, 1) == 0) { return ASF_ERROR_EOF; } - if (stream_buffer_read(stream, &packet_property, 1) == 0) { return ASF_ERROR_EOF; } - bytesread += 2; - - datalen = GETLEN2b((packet_flags >> 1) & 0x03) + - GETLEN2b((packet_flags >> 3) & 0x03) + - GETLEN2b((packet_flags >> 5) & 0x03) + 6; - - if (stream_buffer_read(stream, data, datalen) == 0) { - return ASF_ERROR_EOF; - } - - bytesread += datalen; - - datap = data; - length = GETVALUE2b((packet_flags >> 5) & 0x03, datap); - datap += GETLEN2b((packet_flags >> 5) & 0x03); - /* sequence value is not used */ - GETVALUE2b((packet_flags >> 1) & 0x03, datap); - datap += GETLEN2b((packet_flags >> 1) & 0x03); - padding_length = GETVALUE2b((packet_flags >> 3) & 0x03, datap); - datap += GETLEN2b((packet_flags >> 3) & 0x03); - send_time = get_long_le(datap); - datap += 4; - duration = get_short_le(datap); - datap += 2; - /*DEBUGF("and duration %d ms\n", duration);*/ - - /* this is really idiotic, packet length can (and often will) be - * undefined and we just have to use the header packet size as the size - * value */ - if (!((packet_flags >> 5) & 0x03)) { - length = wfx->packet_size; - } - - /* this is also really idiotic, if packet length is smaller than packet - * size, we need to manually add the additional bytes into padding length - */ - if (length < wfx->packet_size) { - padding_length += wfx->packet_size - length; - length = wfx->packet_size; - } - - if (length > wfx->packet_size) { - DEBUGF("packet with too big length value\n"); - return ASF_ERROR_INVALID_LENGTH; - } - - /* check if we have multiple payloads */ - if (packet_flags & 0x01) { - if (stream_buffer_read(stream, &tmp8, 1) == 0) { - return ASF_ERROR_EOF; - } - payload_count = tmp8 & 0x3f; - payload_length_type = (tmp8 >> 6) & 0x03; - bytesread++; - } else { - payload_count = 1; - payload_length_type = 0x02; /* not used */ - } - - if (length < bytesread) { - DEBUGF("header exceeded packet size, invalid file - length=%d, bytesread=%d\n",(int)length,(int)bytesread); - /* FIXME: should this be checked earlier? */ - return ASF_ERROR_INVALID_LENGTH; - } - - - /* We now parse the individual payloads, and move all payloads - belonging to our audio stream to a contiguous block, starting at - the location of the first payload. - */ - - *audiobuf = NULL; - *audiobufsize = 0; - *packetlength = length - bytesread; - - buf = stream_buffer_request(stream, &bufsize, length); - datap = buf; - - if (bufsize != length) { - /* This should only happen with packets larger than 32KB (the - guard buffer size). All the streams I've seen have - relatively small packets less than about 8KB), but I don't - know what is expected. - */ - DEBUGF("Could not read packet (requested %d bytes, received %d), aborting\n", - (int)length,(int)bufsize); - return -1; - } - - for (i=0; i> 2) & 0x03) + - GETLEN2b((packet_property >> 4) & 0x03); - - //DEBUGF("payload_hdrlen = %d\n",payload_hdrlen); - if (payload_hdrlen > sizeof(data)) { - DEBUGF("Unexpectedly long datalen in data - %d\n",datalen); - return ASF_ERROR_OUTOFMEM; - } - - bytesread += payload_hdrlen; - media_object_number = GETVALUE2b((packet_property >> 4) & 0x03, datap); - datap += GETLEN2b((packet_property >> 4) & 0x03); - media_object_offset = GETVALUE2b((packet_property >> 2) & 0x03, datap); - datap += GETLEN2b((packet_property >> 2) & 0x03); - replicated_length = GETVALUE2b(packet_property & 0x03, datap); - datap += GETLEN2b(packet_property & 0x03); - - /* TODO: Validate replicated_length */ - /* TODO: Is the content of this important for us? */ - datap += replicated_length; - bytesread += replicated_length; - - multiple = packet_flags & 0x01; - - - if (multiple) { - int x; - - x = GETLEN2b(payload_length_type); - - if (x != 2) { - /* in multiple payloads datalen should be a word */ - return ASF_ERROR_INVALID_VALUE; - } - - payload_datalen = GETVALUE2b(payload_length_type, datap); - datap += x; - bytesread += x; - } else { - payload_datalen = length - bytesread - padding_length; - } - - if (replicated_length==1) - datap++; - - if (stream_id == wfx->audiostream) - { - if (*audiobuf == NULL) { - /* The first payload can stay where it is */ - *audiobuf = datap; - *audiobufsize = payload_datalen; - } else { - /* The second and subsequent payloads in this packet - that belong to the audio stream need to be moved to be - contiguous with the first payload. - */ - memmove(*audiobuf + *audiobufsize, datap, payload_datalen); - *audiobufsize += payload_datalen; - } - } - datap += payload_datalen; - bytesread += payload_datalen; - } - - if (*audiobuf != NULL) - return 1; - else - return 0; -} - -#include -/* this is the codec entry point */ -void wma(const char* filename) -{ - rt_uint32_t elapsedtime; - asf_waveformatex_t* wfx; - int i; - int wmares, res; - rt_uint8_t* audiobuf; - int audiobufsize; - int packetlength = 0; - int errcount = 0; - rt_device_t snd = RT_NULL; - - int fd; - - snd = rt_device_find("snd"); - if (snd == RT_NULL) - { - rt_kprintf("open audio device failed\n"); - return; - } - - rt_device_open(snd, RT_DEVICE_OFLAG_RDONLY); - - fd = open(filename, O_RDONLY, 0); - if (fd < 0) - { - rt_kprintf("open file: %s failed\n", filename); - return ; - } - - /* create stream */ - stream = stream_buffer_create(fd); - id3 = &_id3; - /* get meta information */ - get_asf_metadata(stream, id3); - - wfx = (asf_waveformatex_t*)id3->user_data; - - if (wma_decode_init(&wmadec, wfx) < 0) { - DEBUGF("WMA: Unsupported or corrupt file\n"); - goto exit; - } - - DEBUGF("**************** IN WMA.C ******************\n"); - - /* The main decoding loop */ - - res = 1; - while (res >= 0) - { - errcount = 0; -new_packet: - res = asf_read_packet(&audiobuf, &audiobufsize, &packetlength, wfx); - - if (res < 0) { - /* We'll try to recover from a parse error a certain number of - * times. If we succeed, the error counter will be reset. - */ - errcount++; - DEBUGF("read_packet error %d, errcount %d\n",wmares, errcount); - if (errcount > 5) { - goto done; - } else { - stream_buffer_advance(stream, packetlength); - goto new_packet; - } - } else if (res > 0) { - wma_decode_superframe_init(&wmadec, audiobuf, audiobufsize); - - for (i=0; i < wmadec.nb_frames; i++) - { - wmares = wma_decode_superframe_frame(&wmadec, - decoded, - audiobuf, audiobufsize); - - if (wmares < 0) { - /* Do the above, but for errors in decode. */ - errcount++; - DEBUGF("WMA decode error %d, errcount %d\n",wmares, errcount); - if (errcount > 5) { - goto done; - } else { - stream_buffer_advance(stream, packetlength); - goto new_packet; - } - } else if (wmares > 0) { - /* write to audio device */ - elapsedtime += (wmares*10)/(wfx->rate/100); - // ci->set_elapsed(elapsedtime); - } - } - } - - stream_buffer_advance(stream, packetlength); - } - -done: -exit: - stream_buffer_close(stream); - stream = RT_NULL; - - return ; -} -FINSH_FUNCTION_EXPORT(wma, wma decode test) -

=+4I}8w;Fb6(_SXx6MQfXE{2)ddKJ7! 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 diff --git a/bsp/stm32_radio/sch/module/sch/sch_codec_wm8978.pdf b/bsp/stm32_radio/sch/module/sch/sch_codec_wm8978.pdf deleted file mode 100644 index d5b4e5f739c782e2496036604d5e5c706c448374..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22234 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 Q-w{Ay5FZ%)D+TmF0IxHYfdBvi diff --git a/bsp/stm32_radio/sch/module/sch/sch_lcd_fmt0371.pdf b/bsp/stm32_radio/sch/module/sch/sch_lcd_fmt0371.pdf deleted file mode 100644 index c5b78c9b6253d937122972becd6d08981eb1b5dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14902 zcmeHuWn7fo7B>yT&?O-ZUBU!4ba#iOAj8Z6L&r!-BN76FC<>^g0#bq~AtBNT2ugz> zEg>OY@(!NRbFS~b=lA~ZhxfysFY`P*)>`|&*4lfoXRpm;sH!du5fLZnnVEg}ft(Zq z27-Ye_Ri$8vLIcwI|}ZN4n!e=5RfhqA|?fff((EVC`b(m0gFMvAbo6wDYila3a2hIm#V*Mh5sVKXOv2=no#MD1-+RWeE3n^TBdd@o>HB=I#R&0~vaw zkZ1(P!yC&^ULK^5cEzB)LF%q>4C=QoAT3pESrw>?syYOsA_jvt3CT|1Maz~>4t+4}# zg3n$YJb+SI`HVrjD0fGU6Hrq0Oc>wqqlAErJv=Z#2;_SM6D%}9Q836fz!L?sFh)6m z%&j3nC=h}jzYoS61$QGSb(*xdM^f3@+1qvD&;UXdBfQ9Biq3IcIEGtfgcImoNU{?l zDEAF-2~ujIO|k$a`4bGZb%1G+IQU%Bo0*#v>|r?gIPbH`h{#E?i2hFXcWiwyaBqyi zH_CyW6iiOa!=q-PPEPs<-dLE=hVi>9e}x}VN)oG87*@4^4%7rF3j2%fc6Of}?Cjnn zaqtHD00m*xF_!0H%t@`)+4sZYWcZZ$h(ep0(1&W*$Y~r&MN99K4KwtS4NekCL~wk& zaOac~_!{S&Fd*<3vVVv0cj5F<7&sD+fn%XN!`%?>h|-1Iqg;J}5`Px>0Ab&szhkX} zZS3md_`}K|XFY$XrsCm_LAhgmtRZ4&J+Sup+uwIuK#1gTZ{Mi_A>TEPRs8ot=y$c+ zfKck|p&oU#w+{v=3jISnV&X8YyNUm1YzFquCK$J$H5G3>9yboAI=LI* z%5H2E6y2KSKRh1AOD^<5__}OCV)}X4w9B%BTSxS#rQUTmkIIsAk<;9Y$d2IC{>WloB$z+z zGHx`ioOWS!@?M^?NU6BnelDW#;Bv`!Kvm2P9Rsdj zn2C0{QTply>#kDt)Z`_-eBO})_Kjkh(MG=sb>BEx8%=2g{Ysb7oA|B)zKVVXpS5}5 zrh~F}XG*f03Frt>6h;F#-6MP-fEbB$Xm3RfhWYqe>ghr1}Ou}$+?lR0T{K{3%jOqXG$G>|o1Ok@)VGx?J z#pZe@EK*eU@5=g&e9m*cXxMvs|N5Beo1r!z(Lz%kK8~B&5h;&-Lr)rpy6;0MC}20< zuoYUDO>N&xkL-lTY&{0=U$R`}PF)-xY}y=%F?ic`-gqP~4{%Py2u;(ZM&J6S?$845 zb(v|CRHKpPabz{E`b|muU417n+|I`Zbssp>i)mt?5IdQX;0N(tG0hY*&{A9doQFr@ zlppj4_iLQ8l#;#?h;2KC7FiNkhwr1Ccjd~Z56jO=D8^D>m!sa;E`82%I`nWI$=dkJ zR>nU@C?-E$CbxL&m3DgViE+JCQ5mdk(?!*z-=U0Ewu*n8tS*l84Q;SpE@n?3 zSDp8W&yyNXYdCA1PV}BGcXp5mm-4Q%++dYOUNcCv#m}*K$>6z1eo?KZH@X+)I=e?s zn;P-;Rob&o0Ty+MxoIL<4wo7C4LYvb#7}$x%5bBxG48QkZMID_!~<<=8OwPpJ!)6! z=Wn}+m0TXth^ts7vqb5QY4ox4PWXJPdUBa~%Dh{DqiANSD=Iiul&L@df$z4{v9`yk zKv4LrPQgHh?)t?@%EBtVsqVUL-$#^__j*aMJ$JfXAxK8a-$?W@+4^zz$9CZYx{XRo z;dgGkj@k)5U5PJPXI5+J0_@&pk>@9S5HTS1gqhb)Io!-wcB$y@JsPI6(eBE*%gIvG znRfD#za)6US3JcnAxHD;*YUx+kl}`>pYWpN(Xh%6^xVZtbf5fzt)zMpKco0D=esV! zj)0G!1XHRk9Ds;Lw}j$+rHyx}k4dRI9de0Ri!#`jYe(Dyn`Z#uo`LtTA8GxdjPsYQcxH437ckV=THT#n-MJBnZe@d}{T` zx-VWzqm>ab}p{oFkokxWzdH&dp~*y1|~`O=UACtsgcP_ z0*Li5n&ja%2WJDWJM~=G@+`^sO3QsoqH=Ejg*DNj+lQyO*}v>FkQ|$Zm&G4J$Z5wm zwfu}`3GKh;=!C**GqlaN#>$a!FOh`8?QY?Cf(xo^-C_$s);Y(|aS8~sGWu*=-SX_H|T6Eku%$Fj3FpX`>#$o_6 z;Jx5^Rc-?l^Dw{av4&mR{uS)Zgg>&#|ErnlY-#3Q9E$bT&ys&|JWvq|vqVsQRV zr#mo6&-5@eDelOUGA`zoK3_yD@X5GY5xc_5n%^K*jH<`$Yh~-hwb}~&CnL?lefAvH zhB(3`v2EGoJv^1On21CjMdGX$p1z#7`mp+d=A}v;jA=6~gQCWb@cul$Aw-D}kr<#m zQNO!h&_D|B3(edzb1ThP5*og~W}ZV1jo$w9^B+_AYgv@mJ3qL3-=gMxB8J?PV-l*2 zPx(MI7l}#Jn{<3jS1m)#-pOE#6SVKuOE?vpVKNsKH6g4dUl8@Y(?{R|XTDJ93?q>J z<)fOpqh3+9L~~h6vZNydio&po2;GQrp-=M(TYv{j5seonR;J{8B4=#86-w9?hRCgA ziad78)=~sD1vdPL?o{=s5HRAZx!?P=-93{)qpqJ_SNKQ^xIy@$4bmdNexYSUTgh4y z4?XCBOL4y?fi&yuWFXCJZB{Zm&u-K=BHXf+nAFeD;;q)m;&@lS%%~G`X(ZiTdF7jr z^9q17nKQHcGE~SWBFWUauVO9HWHw}Z(f8xK7f+NFRsCwdepuFd_`%=CrNRYK$u$4e zTq8{H=xU2Z1zu|X*pu3a?t!%?Y?HLa8ij535B}@1ss-z!FU%?esnz_PuxEQGYYH6 zD4|C=fjM_S>dQ*Vyg)Yhx` zpqxMk1KlC;RiqP}i1TS)D3PUP*zQL=l}PmmmLqE}yW)o-dvEdAZ6TS$6CucM7opBT z;{Nov+BtdzZmUw>YCB8@vAMap#UNumTZ(!h4K<6w+iyp}-bPuEYlj-IzbT%|Qb}eE z6MEXiE4xQlbN79l=NRk_eXMo_&@UV;ANLdQS{|f5jnT3bY`8ds(_hkL`K+@P_coPo zI&RZr)wPtTo$ATy+2@_pjAWmDyVosSr0*y!kTAGZFi|gr$U;}_o03I5p6D~8TyO@A z2od|X_zmXHaq9G7qH-@ps}nrF-1;RaCh$ky{CASxj%r`&UX+(^baeA;lOM@Vk8bB!ue zgd?pNb7^OIXa8wD)Y*Jcb?ipi&YrVLed}UA=dtMi3vAre<SoJv8 zNl#sarN!+AMaAp2%S_qC4}g@4S*!yNCl0-QfS7aXLykSBiaA*(`X8loVV-d-Gc=G) zhFIZB-*Ocfq!OlP=UvhpzSRq9GQtwLd&BnkWGf9;0%|0Jr7b%Xa|Y@)76d4Y3ol-s zi@UwvlKC~q(}4qjMN*H)LXTjiHk5fp;~dYt-1*k0>Y6PU6i-LZimZJGgI35Q6mfcl zCzI=3O3N!|OFKK3eTRFTHVURumrRuVnFSJjWiWz|)mgv_osEn18F(1}|Q$N=R^N zgK4l5CEN$%j1PCT7NKA2+f1VmC@17P*)1JYP(BZGw1^PC&(AR=a=Vvy_nwdLD0qQu zEr*ub@$H-S1lDc(D_(dzBKs^BxN?Qu+pW)(?_e$%m8|l-wlkvH^#LHZv+Ve}-~Aifjwp&=zyERIpx8j=y$kTdI&9qnqt7HcGWr5awYEs&4D1 z*X`?ftcm!5T9J2e=i7Kbc>P$?_BA8@MAL@UmR zg!x-{?6-uv6(N6Jd`}(kgF0UFKmk(je#QZQQaZ12vFL9hjsl%IbmP>wcl+KvQ!{=$ z@434)zV>uIo)mf8K>L}Ut zm+og}f;Ay@$LAuiOP+7xCv8jhkD&4(jiOW3#9;v5PnOXLcThBMqKtANUmqa#Fxob=RO~4QS;9KXpTAjd?wHQ{RkUU)OcP&X zOZK58B`9lRoT%%WbVg|9jk@5m6DJ!{=86qI#wMNIFjb4@*GvmL0n9^FHh%Zj0xpEJ zwshV&oVXgzL*~am{{(&stg8xX?ewSx-D9y|ExrO_(Y7=6(FRjw!t+K6EN4#@NQVN} zSqY;GkGTM>H5GSVBVb=~{V36C%RSPA_?paKuPnukC^86|oHsMLy%a=*w2)Cb#n~1? zEQ<)MF*B#cOEUNHyD6mWx$nDH-I4jGGvBLbYMU6*s>0KFd2Ro4&8*ve;uR6UNe4WO zCgLlrjQ!l`@{$mv<;y!E6Rd;l%@q`1Gx;M$xM9828Ez$0lT0loTgjg8jaTvy7Uaz{ zZKpKTbY0&V-FLYsMMxWbMfE`rc^v-w)J91)0mFM$Z4!lT&KL^AVEC0=Lxg$s=Lo_O zjRjA9m@;4Yp6|get16UG6G<*Bw!KWo9KD4bsjPT|I)41}Cs}oeE`f{CCiSG!f%xFp z{?EC+@s=bGmpX^&AKi~&x0k9a2LQta{1v@f(l=5s-%(fAdwX-bch`wQS-vvc=wav4 z)tLvX#J;J4JS&`*@x&?_0(Am6>l;HNB4raaG&^J$?Hyhdc{dH+1ZxfrnE=#Ij>l~3 zO)For4jd9c=outP7vQ)gF2`HLZNpu2(Y)n@ecW<__9>X|o#e4W@?=vRSF$^uw80V% zQPC~4K1A@t_=xK`p$|&9dqm!Nj>+`qbr~QMPE{-g7oQoF(XCi+eRiLXNb{x8i#!y5 zjgyqnk@PFi{r6vQfB)(u4w3qKqdJjVpNQS4hWW`6wqw9L#tNxJ-?Dr>L-2Ej4F`xX z%Wd!INY}PF@iC`nfDv9}YP z6ma0hw;cMeX4*t@EAefwVHW&8QuYk`18$3AGB0+CAKnqTt+ziRMMR_X2(@)`1dY?Po-&n_cYUu8xnFW*JmoncFkP>I)sVh$Wx?i#c+-3njRD!{;L2q0 zn%Z7IAqKCnNcvr|ZnpD{;K6yNhQvidfM3)cT zCxx$M)F0{@UDYlc_mceDmreVq?o~89jdX>)j`a9;p{M)doQ&t~0H2`X+Z4wk!O({C zd|3jF(=}}WG12n!)57*DUmGReFB~NhLZxq%RzP8{wPAk$ZVzc-!v`gEWeo}FwJY_TZ z7Bg?HFYH(_o=Yd=x2iOyAJOE0!jeth_wXJ0Eus@rHa7$R@I*V`jOqRBE%*;MNcf!D zndfNQ*!vDdzd5nI@v2fV%9q{bE9G>y%#wQKhL?a54EGP$7qJ*))Kp;5ctvP`6S}Ek zc24}uyZBy-P$Jk}`6X%!Vx;>O_MuY5WEo{HC2ii}HJ4O{$;8^9>t!YD^H2%*#U7G=3s;Q4a}pA+nxao&HKKGYCY{0Q zhGVWG{zL7oC}E6u>w^VCZ8h8~>#Vu*Z@5iW*wdgg)yBqO>GzGT=Z``ZakYX z+Wh3A+OQKw+-?36y;m6iK+Vb5*8QxW9eu-~d4+Nj-z0)X3Xyn=isRTPA&30P#W(r0 zpsg=XlNT)qZWikhG+8oI^^NWhkZ0=RTaMoVN{@%-l^5+Htwm*}NDkE>ljAc6qpd_K zFf+CTe$k^RDzRh1k1v-t$AdI5`HENL z6p|6y76iGH$Si>q$2blUUVg)b`S{?q+BMm*bN1xVCJ89ug@`L>%Cfx>y2Dnnl|0l@_~(p?|(Vs6HU6F zf082Szt^j9z?&n?@|pP^f{6LEE|LA^tdy`1p>|mWoi&c+Ed@_vUWDIw=NzjHFWrzu zVzr0@O6E3qB+V{hD_bKD0`Q}5Te$%nVx5|a(x(IZ6y+XvDK_*S)G4g+X1+3{N}}tn z3I1Zn8g&t6rzJgI1Xbqz^1@;7WYHr1}?Nqs4Wx(4VD=k3(2M&UKt!&H7+Rz>x6dKxAvU}?!FD9O63Pdex+a%2i@euU3+87}&U$@Y|Q9#`6?=;eg z2f&dZd!G0!+xqEzP3i0;)*XAU1yV)%q7f)#4dq`Q&;GtZLB+ABjQT*)AFGtpM z_8j~Lc9fb_hW6mNf&!%akakc&!210BUVHu2nB%(7-srW=7a};^2J9jr!c;t98s8`4 zK-dTKD2=}I6C5J{Fx)3NV9TY#2BozoMQ)HJV_WrBC zEtC`(>P>GP&%A07Y=Mlyvw~nor6w=WVXMY#6R%c8=a##(TTj+CZ)ge(FFacz^zTBloCTQR3IrG*$3oYwA3@~nN~tS8-{5RDnyi~dq} zY`lzP*B$5le1+1wI|N7iB_7c4lrm$11BY8J*rjo^HNa^mAeNED*eyOmR8%yfnl&}K zI;(LdRQi}acvFsR)3@a>!jq#?&)EIs-h?C8MVj-vj^_@TZo164oa+n2;l`!! zz^Bi`#e{Q!@y%W{!0;rW;q8apQBe%xF~ksehEYP5L`DFliqs>7yAj%k_{&OMPPlxE z#4vJ^u(zM2tIw^45!(^OM=shC)!}YY5x_a1s^N1Smo&+sVckF?BxQ|~ydjW|LQTbs zijqdTrjMb3L@-J)+p2*2kU^TzCahE$zfaDIE~m0SUVNh=0gTd= zGLEhU+Gv8j$(WR$B>V9L;v#Z#0Y)$R4NOVmqO?`q6zOvXjWmqD6tE2l5AZt^?VQt7 z7s@8@lW+oU3u0KMX>GzpG$gae`|kDm_04{kJP){Wqrb@lE(@8yPtYx`3t7Nef7u@a54Cmg|B4OxY(O05EYS&tYrS_)^nJ=dy9SSjyC3$=?+_s$S` z(N+i4(bP*_!63NrNom82ExsG{+xwRdq%j=SIp_3Yk8^BkS9F%-~ z|JW>o6V5%&)08^GZ^Y9t0^#3OrU4c5EOFPEK{YBaf6bdC??emK-FbQECY_0MBzE5> zPzW!yM8{PYR%T)Ub*rU8NR|7ustqmf2;T|p;^~6X zs|;ob8qpT04R{os3@}+TjiM^DD=aH6RX8FwoJjOC7Swcd?)K^T-EdmJ#}D$ddSh9E z(0Y5jiO0t~&O6bYwMMzdtVYIreSYby``6g7ujXau*afoaw(0Tcp!5`imyPe6N8H`Mi+6WO;DXt*N%|!-qg_M&OOs_mMgdk)Pi6{kXBj{7HbZIO&2cX4 zx+H8Omwy;9qT`pt*Dv&0ZktJ*N8CU>+p5H>ajdR3F)$|ZQDD&_7kLDc3YS@~Zmu;# z-Q>~-b5Zl>mRk)Bwl}ls%U&21nY-v)Yslzc%kYif%}acccuzl3|9P*9O+{&>d%F9> zH8;6u{TUHw3yfCu{Hd$`K&>=gJ7`19!k z>Yk2v{&xkyJls0F-Z8OCB{0ava({%`lW@wCE7~O`jR!dXaOKp9WomyJ~lQQ zn7e~s@smiEz{{YOXdGc4;~kS2)fXAI?6tIQ4C>bZn20uak+e6cy7f{4sW6kZ@ETL# z<3Cd{-Qnx%`M~qNkG7}u!uFfdmbCSW1#Cb!TQNCbCp5D>ZS{F+ZQc>7YVLid z821=(o{T9}3|a}nh;)k=i@752Za&>9DvcJp?$a#8^^7{3nwzCM!IKLRst;~g5PoWwRtt_oG%>vB{%`I*b?kJuYytB7+Qw%nd z{;_qB=BeAYe(=I^{<$s&ia)Ji(Lc2B_?IuRfG zd#?AyW`uT#b_(@etLJgmF>mnx_T;#{gv~mGjGJ_yuzB3IYS2}~ZP9&w3f_P?O*DvF zedD6Wt2VF39%tD)+yFg!I#U$&uw3Ry=b{e9+MCsxFU(_Ko*g+AV$k|aBWzQ0Ur^f> zZz_hbN=T3Z`x5lZD=;&Lw6~CynI%!h-EKvSyo7 zndj4U()XgPqt}K42VM@NhwrktvG&4_E9EO2_FUSA6Ua%))yUazZ6wCClFN>La2gyL z$r~_z50E6w$WK&bdv%boBKc7GhVYA$%AuUuPt_ay&pmP*FGx=Z=Nxg*BH#L1ONo29BG_a5B>97Leo=47BLOKLSVpMt^yS`~(XGP8 zd{B$c`IW@w5Kphc)^Rypxs!W!Ae)-ikOTWNll2-QUvvE{FKPmpnP;uqufARR63h_n zreJa0H{>xo71F${zNoj7VT1pcxR*j2U|T&OxboGlYd=mQ`&?Shm`#MiF|i?>l4@GfaR@&rHIVOp`{_&M>DUku!b&WSc;2&yM5|CJv?Ln zwJfpDcDMH0Q0VSv#+>AqPn5^}6kBk+|L~Fg>Pbt`0`Y2e+^sQ0%4?`hQE7f|`I0!RFvf!)N9FdqO?Ji9}xHbP@Jn zR>L@(4n=%@aj+j$6QW2Ye<8(B8{yw~xT4}PagfPXd(8JNKt0{xnEsK|_G8~GtKjbm zN4TIcKzo!U+Fg!w{Z%6;5RH`MG#A$c>v^i6oY0zq-YAnmeN#lB3qlIXsUS}(>o4u^ z=IMsbkOTU=xw`vE`^#~{v6+=9Y3%b^F^CiRy$Qxej#KHZ0%)OU2vqU#Mghe{pdt`q z1U6F>C=L}76@yAiNnFGxyMbXKus8@TDGUWmi@~J9;6HK(IpxpN2W7pH4${V|>c2C@ zzR7VqVKAQ3AdsJ*pNOBRh=;c$2qGmV1;XZoLZQOg7Q#LO?ijegu)7b}Z$$o}ql)rD zc%wZrXb*Sb8C|%&$5o6RC+DAeif6okADNrypN!mnM81zw1mWQZ@`rnZAR=JUpOnvt zV^NV-!RA+b$Az)!JR2V8@3V}*Pq0$hr5cmwD--!Iw@^3W0i-P(mG=6INI}KUT88Sa1^<54B z4+tU=e*)-v)!X&Eo{$I-$`$2ymJx{s5%O0MkqBuA4{tX(Mjr0z>54|c&-4WHL^{ZV zepLN5Qfwgxjd4Z&A>f(vem59wSoqh{KPp_&XZn?Pg}Xb-arz4*Q4a8{t{6^vLvIfZ z$`xpWa6(}PKqG!b!4>^iD!-NfmH2nz{w{|sRyM?M_V70fXW*Kky#8AHLppg+S9k!* z``@wuYwz#u|HkUSra~QD5q`ok7VV{t@YMWDRpl@Q(@_HYbP743sT zySk#hfl?x15ipS79F5Jz_VW>tJ=5%u_Wy0`!+M#X-miuK!-L)2{wn|XF4C$Vh^uD? zs--G_^(q=EjYJ|)2nbYE7=aW+2#cW{q=aDzdvRfegg6pvFYX`;6N7#CM?Jlt`~GC7 zztPol$7V>oBT#?P#pd#&U}7k7VM(Nvy|5U}!Cn{+bC3{r5JO6dLdD>cl3?*a=>F9A z-{SO};<2+OcB%&bIamLSt)02afBpAk!2fm9KM4Mh$qy|4!PEcX`UfEWX!1X}eqiwr zp8f~dKLF`RlmEf>1B-v~^gp=%0Z2cZ{5!Zve?)uO%UW`re%M&<7t!QDxdJ5iXG|-F zjcKv>?aty%gMYaIRAC4{3upa$K|Ml7;DNnfU4cXiF+5VD*5znZhP-8B?kD*Sj{1#yUDGWpc^6#Vx>MbXY1k*)Ln|C@WbJP%Bd=Ue@Dom2<>!p=K zMr6!2thqEUsj|4XD03{1KP2{a`~z!jSyNEb^;)X*x!Ly_*XtBq_;D-cQ>|8LC_Dvm z;-&*h+?pRy?cngf%%{A z9^&BfswZ3m=mO&16eHeIwk#7;pN7%2hvHZQ0P%_uOA1MLNE{L{PQptfmS3Rq(-lJq KMB>j&hW`gUn8(!s diff --git a/bsp/stm32_radio/sch/module/sch/sch_lcd_ili9325.pdf b/bsp/stm32_radio/sch/module/sch/sch_lcd_ili9325.pdf deleted file mode 100644 index e08faa5899c5199c767ab3538982028aae558aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17368 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 J<_4ld{{zwX&sG2c diff --git a/bsp/stm32_radio/sch/sch_rev0.02.pdf b/bsp/stm32_radio/sch/sch_rev0.02.pdf deleted file mode 100644 index 04ee081338e4effd2aa6c360c6d1ceb501c5559b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70105 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 a9q;69q=)6@jO#2^b` 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 WbT%_bLk59((2(iqq?D!6kpDlfh%{0F diff --git a/bsp/stm32_radio/sch/sch_rev2.01.pdf b/bsp/stm32_radio/sch/sch_rev2.01.pdf deleted file mode 100644 index 2a9263a9b7e66e2ef773dccd0ae25216119716c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53802 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